1.前言 2.select簡單查詢 3.單值函數 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 前言 ...
前言:
1.認識Oracle
oracle:商業運用第一的關係型資料庫,實質上就是一種關係型資料庫。
2.資料庫與關係型資料庫
資料庫:數據存儲的倉庫
關係型資料庫:資料庫中保存的對象之間可以存在一定的關聯關係,並非完全獨立。主要反映到以後學習的主外鍵.
關係資料庫是關係或二維表的集合:
Orcale資料庫
/ \
table_1 table_2
關係資料庫是:
由關係型資料庫對象組成的。
由關係操作管理。
受數據完整性約束控制。
3.三個名詞
(1) sql:結構化的查詢語句,操作oracle資料庫的語言
(Structured Query Language, SQL)
第四代編程語言,之關心做什麼,不關心怎麼做,結構化查詢,易學易用
(2) sqlplus:oracle軟體自帶的終端可以輸入sql,且將sql執行結果顯示
SQL*Plus
↓
SQL*Plus: 如同操作系統中的SHELL,SQL——>Oracle,就是說在Oracle資料庫執行SQL語句之前,需要SQL*Plus進行編譯。
(4) pl/sql:這是一種過程化語言,純SQL中沒有邏輯的控制,而在PL/SQL中存在邏輯控制
像存儲過程和函數就是一種典型的PL/SQL語言的實現
4.資料庫中的對象
table:表格(實體OR關係),由行和列組成,列又稱欄位,每一行內容為表格的一條完整的數據。
view: 視圖,一張表或者多張表的部分或者完整的映射,好比表格照鏡子,鏡子裡面的虛像就是view
除去常見的table和view兩種對象以外,oracle資料庫還支持如下四種對象
sequence:序列,生成主鍵值
index:索引,提高數據的訪問效率
synonym:同義,方便對象的操作
program unit:程式單元,pl/sql操作的對象
5.五種分類
sql的五大分類:
數據查詢(DQL):SELECT
數據操作(DML): INSERT, UPDATE, DELETE (增刪改) 需要commit
數據定義(DDL): CREATE, ALTER, DROP, RENAME, TRUNCATE
數據控制(DCL): GRANT, REVOKE
事務控制(DTL): COMMIT(事務提交), ROLLBACK(事務回滾), SAVEPOINT(設置回滾點)
delete,truncate區別:
delete: 刪除表中的一條或者多條記錄,該操作需要提交事務
truncate:清空表格,該操作不需要提交事務
oracle資料庫環境準備(一般現在使用mysql資料庫的是一種趨勢):
三種登錄方式:
sqlplus "/as sysdba"
sqlplus system/*******
sqlplus username/password
瞭解三張表以及相互關係
s_emp 員工表
s_dept 部門表
s_region 地區表
建表語句附在文檔最後
6.去重
distinct關鍵詞只能放在select關鍵詞後面.
如果distinct關鍵詞後面如果出現多列,表示多列聯合去重,即多列的值都相同的時候才會認為是重覆的記錄。
7.select語句永遠不對原始數據進行修改。
8.加減乘除有優先順序,加小括弧可以改變運算的順序
9.字元串拼接select id,first_name||' '||last_name||','||title as name from s_emp;
10.sqlplus 登錄之後,可以使用buff(緩存)來存儲/執行/修改要執行的sql語句
這裡的buff的特點:
1.buff中只能存儲一條sql語句(但是這條sql語句可能有很多行)
2.每次放入新的sql語句,會把之前的覆蓋掉
3.每次執行sql語句,都會把這個sql語句放到buff裡面
11.sqlplus基礎操作:
直接輸入該行的行號就是定位
l 查看緩存中的sql語句
a 在[定位]的那一行後面追加新的內容after
i 在[定位]的那一行下麵插入新的一行insert
c 替換[定位]的那一行中的某些字元串
c/老的字元串/新的字元串
del 刪除[定位]的那一行內容
n 後面加內容可以重寫這一行
! 後面接終端命令 !clear:清屏 windows中使用$符號 例如:$cls
/ 執行緩存sql命令
clear buffer:清空當前緩存的命令
save test.sql buff中的sql語句保存在test.sql文件中
get test.sql 把test.sql中的內容在載入到buff中,但是沒有運行
導入:
start test.sql 把test.sql中的內容在載入到buff中並且執行
@test.sql 把test.sql中的內容在載入到buff中並且執行
edit file_name 使用系統預設編輯器去編輯文件
錄製:
spool file_name //將接下來的sql語句以及sql的運行結果保存到文件
sql1
result1
sql2
result2
...
spool off 關閉spool功能
exit:退出
12.查詢結果不好看,通過column使我們的顯示界面好看:COLUMN last_name FORMAT a15; 可以簡寫為:col last_name for a15;
13.order by:desc(降序) asc(預設升序),優先順序最低
限制查詢:
14.邏輯比較運算符:
select col_name,...
from tb_name
where col_name 比較操作表達式
邏輯操作符and or not
col_name 比較操作表達式
...
15.邏輯比較操作符 = > < >= <= !=
不等於:三個都表示不等於的意思(經常用的是!=) != <> ^=
16.註意:
1.限制查詢條件,使用where子句
2.條件可以多個,使用邏輯操作符和()進行條件的邏輯整合
3.where子句的優先順序別最高
4.比較操作表達式由操作符和值組成
sql比較操作符:
17.between and:在什麼範圍之內
需求:查看員工工資在700 到 1500之間的員工id,和名字
select id,last_name,salary
from s_emp
where salary between 700 and 1500;
18.in(list):在一個列表中
需求:查看員工號1,3,5,7,9員工的工資
select id,last_name,salary
from s_emp
where id in (1,3,5,7,9);
19.like:模糊查詢,即值不是精確的值的時候使用
通配符,即可以代替任何內容的符號
% :通配0到多個字元
_ : 當且僅當通配一個字元
轉義字元:預設為\,可以指定 指定的時候用escape 符號指明即可,轉義字元只能轉義後面的一個字元
eg:查看員工名字中包換一個_的員工id和工資
select id,last_name,salary
from s_emp
where last_name like '%\_%' escape '\';
20.is null:對null值操作特定義的操作符,不能使用=
eg:查看員工提成為為空的員工的id和名字
select id,last_name,commission_pct
from s_emp
where commission_pct is null;
21.邏輯操作符,當條件有多個的時候使用
and:且邏輯
or:或邏輯
註意:and邏輯比or邏輯要高
not:非邏輯
函數:
單值函數
1.字元函數
2.日期函數
3.轉換函數
4.數字函數
分組函數
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22.字元函數
LOWER 把字元轉為小寫
UPPER 把字元轉換為大寫
INITCAP 把字元串首字母轉換為大寫
CONCAT 把倆個字元串連接在一起(類似之前的||的作用)
select concat('hello','world') msg from dual;
select 'hello'||'world' msg from dual;
SUBSTR 截取字元串
select last_name,substr(last_name,3) from s_emp;第二個參數從1開始為正;(從前往後)
select last_name,substr(last_name,-1) from s_emp;第二個參數從-1開始為負;(從後往前)
第三個字元表示截取多少個:
select last_name,substr(last_name,-3,2) from s_emp;
select last_name,substr(last_name,3,2) from s_emp;
LENGTH 獲得字元串長度
select length('world')from dual;
NVL 替換列中為null的值
select last_name,nvl(commission_pct,0)from s_emp;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23.數字函數
ROUND 四捨五入
select round(45.923,2) from dual;保留到小數點後面2位
select round(45.923,0) from dual;保留到個位 (個十百千萬...)
select round(45.923,-1) from dual;保留到十位 (個十百千萬...)
TRUNC 截取到某一位
select trunc(45.929,2) from dual;截取到小數點後面2位
select trunc(45.923,0) from dual;截取到個位 (個十百千萬...)
select trunc(45.923,-1) from dual;截取到十位 (個十百千萬...)
MOD 取餘
select mod(10,3) from dual;把10和3進行取餘 (10除以3然後獲取餘數)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24.日期函數(sysdate關鍵字,表示系統的當前時間
例如:顯示時間:當前時間
select sysdate from dual;
註意:sysdate進行加減操作的時候,單位是天)
MONTHS_BETWEEN 倆個日期之間相差多少個月(單位是月)
select months_between(sysdate+30,sysdate) from dual;
select months_between('01-2月-2019','01-2月-2019') from dual;
ADD_MONTHS 返回一個日期數據:表示一個時間點,往後推x月的日期
select add_months('01-2月-2019',2) from dual;
select add_months(sysdate,4) from dual;
註意:這個數字也可以是負數,表示往前推x月
NEXT_DAY 返回一個日期數據:表示一個時間點後的下一個星期幾在哪一天
select next_day(sysdate,'星期五') from dual;
select next_day('01-2月-2019','星期五') from dual;
如果要使用'FRIDAY',那麼需要把當前會話的語言環境修改為英文
alter session set nls_language=english;
alter session set nls_language='simplified chinese';
LAST_DAY 返回一個日期數據:表示一個日期所在月份的最後一天
select last_day(sysdate) from dual;當前日期所在月份的最後一天(月底) 15.16?
ROUND 對日期進四捨五入,返回操作後的日期數據
select round(sysdate,'MONTH') from dual;
//這個寫法是錯誤的
//數字函數也有一個round
//倆個ronnd函數有衝突
//所以這裡不能使用預設的日期格式
select round('01-2月-2019','MONTH')
from dual;
TRUNC 對日期進行截取 和round類似,但是只捨棄不進位
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25.四.類型轉換函數
TO_CHAR 把日期或數字轉換為字元
TO_NUMBER 把字元轉換為數字
TO_DATE 把字元轉換為日期
所以在日常的編程中若要向資料庫中存一個日期,我們可以使用to_date函數
若要將一個日期數據以字元串形式從資料庫中取出,我們可以使用to_char函數。
使用形式:fx(value,changed model);
附:建表語句
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alter session set nls_language=english; CREATE TABLE s_dept( id NUMBER(7) CONSTRAINT s_dept_id_nn NOT NULL, name VARCHAR2(25) CONSTRAINT s_dept_name_nn NOT NULL, region_id NUMBER(7), CONSTRAINT s_dept_id_pk PRIMARY KEY (id), CONSTRAINT s_dept_name_region_id_uk UNIQUE (name, region_id) ); CREATE TABLE s_emp( id NUMBER(7) CONSTRAINT s_emp_id_nn NOT NULL, last_name VARCHAR2(25) CONSTRAINT s_emp_last_name_nn NOT NULL, first_name VARCHAR2(25), userid VARCHAR2(8), start_date DATE, comments VARCHAR2(255), manager_id NUMBER(7), title VARCHAR2(25), dept_id NUMBER(7), salary NUMBER(11, 2), commission_pct NUMBER(4, 2), CONSTRAINT s_emp_id_pk PRIMARY KEY (id), CONSTRAINT s_emp_userid_uk UNIQUE (userid), CONSTRAINT s_emp_commission_pct_ck CHECK (commission_pct IN (10, 12.5, 15, 17.5, 20)) ); CREATE TABLE s_region( id NUMBER(7) CONSTRAINT s_region_id_nn NOT NULL, name VARCHAR2(50) CONSTRAINT s_region_name_nn NOT NULL, CONSTRAINT s_region_id_pk PRIMARY KEY (id), CONSTRAINT s_region_name_uk UNIQUE (name) ); INSERT INTO s_dept VALUES (10, 'Finance', 1); INSERT INTO s_dept VALUES (31, 'Sales', 1); INSERT INTO s_dept VALUES (32, 'Sales', 2); INSERT INTO s_dept VALUES (33, 'Sales', 3); INSERT INTO s_dept VALUES (34, 'Sales', 4); INSERT INTO s_dept VALUES (35, 'Sales', 5); INSERT INTO s_dept VALUES (41, 'Operations', 1); INSERT INTO s_dept VALUES (42, 'Operations', 2); INSERT INTO s_dept VALUES (43, 'Operations', 3); INSERT INTO s_dept VALUES (44, 'Operations', 4); INSERT INTO s_dept VALUES (45, 'Operations', 5); INSERT INTO s_dept VALUES (50, 'Administration', 1); INSERT INTO s_emp VALUES (1, 'Velasquez', 'Carmen', 'cvelasqu',to_date('03-MAR-90 8:30', 'dd-mon-yy hh24:mi'), NULL, NULL, 'President',50, 2500, NULL); INSERT INTO s_emp VALUES (2, 'Ngao', 'LaDoris', 'lngao','08-MAR-90', NULL, 1, 'VP, Operations',41, 1450, NULL); INSERT INTO s_emp VALUES (3, 'Nagayama', 'Midori', 'mnagayam','17-JUN-91', NULL, 1, 'VP, Sales',31, 1400, NULL); INSERT INTO s_emp VALUES (4, 'Quick-To-See', 'Mark', 'mquickto','07-APR-90', NULL, 1, 'VP, Finance',10, 1450, NULL); INSERT INTO s_emp VALUES (5, 'Ropeburn', 'Audry', 'aropebur','04-MAR-90', NULL, 1, 'VP, Administration',50, 1550, NULL); INSERT INTO s_emp VALUES (6, 'Urguhart', 'Molly', 'murguhar','18-JAN-91', NULL, 2, 'Warehouse Manager',41, 1200, NULL); INSERT INTO s_emp VALUES (7, 'Menchu', 'Roberta', 'rmenchu','14-MAY-90', NULL, 2, 'Warehouse Manager',42, 1250, NULL); INSERT INTO s_emp VALUES (8, 'Biri', 'Ben', 'bbiri','07-APR-90', NULL, 2, 'Warehouse Manager',43, 1100, NULL); INSERT INTO s_emp VALUES (9, 'Catchpole', 'Antoinette', 'acatchpo','09-FEB-92', NULL, 2, 'Warehouse Manager',44, 1300, NULL); INSERT INTO s_emp VALUES (10, 'Havel', 'Marta', 'mhavel','27-FEB-91', NULL, 2, 'Warehouse Manager',45, 1307, NULL); INSERT INTO s_emp VALUES (11, 'Magee', 'Colin', 'cmagee','14-MAY-90', NULL, 3, 'Sales Representative',31, 1400, 10); INSERT INTO s_emp VALUES (12, 'Giljum', 'Henry', 'hgiljum','18-JAN-92', NULL, 3, 'Sales Representative',32, 1490, 12.5); INSERT INTO s_emp VALUES (13, 'Sedeghi', 'Yasmin', 'ysedeghi','18-FEB-91', NULL, 3, 'Sales Representative',33, 1515, 10); INSERT INTO s_emp VALUES (14, 'Nguyen', 'Mai', 'mnguyen','22-JAN-92', NULL, 3, 'Sales Representative',34, 1525, 15); INSERT INTO s_emp VALUES (15, 'Dumas', 'Andre', 'adumas','09-OCT-91', NULL, 3, 'Sales Representative',35, 1450, 17.5); INSERT INTO s_emp VALUES (16, 'Maduro', 'Elena', 'emaduro','07-FEB-92', NULL, 6, 'Stock Clerk',41, 1400, NULL); INSERT INTO s_emp VALUES (17, 'Smith', 'George', 'gsmith','08-MAR-90', NULL, 6, 'Stock Clerk',41, 940, NULL); INSERT INTO s_emp VALUES (18, 'Nozaki', 'Akira', 'anozaki','09-FEB-91', NULL, 7, 'Stock Clerk',42, 1200, NULL); INSERT INTO s_emp VALUES (19, 'Patel', 'Vikram', 'vpatel','06-AUG-91', NULL, 7, 'Stock Clerk',42, 795, NULL); INSERT INTO s_emp VALUES (20, 'Newman', 'Chad', 'cnewman','21-JUL-91', NULL, 8, 'Stock Clerk',43, 750, NULL); INSERT INTO s_emp VALUES (21, 'Markarian', 'Alexander', 'amarkari','26-MAY-91', NULL, 8, 'Stock Clerk',43, 850, NULL); INSERT INTO s_emp VALUES (22, 'Chang', 'Eddie', 'echang','30-NOV-90', NULL, 9, 'Stock Clerk',44, 800, NULL); INSERT INTO s_emp VALUES (23, 'Patel', 'Radha', 'rpatel','17-OCT-90', NULL, 9, 'Stock Clerk',34, 795, NULL); INSERT INTO s_emp VALUES (24, 'Dancs', 'Bela', 'bdancs','17-MAR-91', NULL, 10, 'Stock Clerk',45, 860, NULL); INSERT INTO s_emp VALUES (25, 'Schwartz', 'Sylvie', 'sschwart','09-MAY-91', NULL, 10, 'Stock Clerk',45, 1100, NULL); INSERT INTO s_region VALUES (1, 'North America'); INSERT INTO s_region VALUES (2, 'South America'); INSERT INTO s_region VALUES (3, 'Africa / Middle East'); INSERT INTO s_region VALUES (4, 'Asia'); INSERT INTO s_region VALUES (5, '