一讹俊、select語句
日期和數(shù)值型字段可以進行加減乘除
關(guān)于NULL
NULL表示不可用丸卷,未賦值,不知道箩做,不適用虫腋,所以它既不是0骄酗,也不是空格。NULL和數(shù)值進行四則運算悦冀,結(jié)果是NULL趋翻。字符串連接符:“||”
去除重復(fù)行:“distinct”
二、條件和限制
- 比較操作符
比較操作符 意義
= 等于
> 大于
>= 大于等于
< 小于
<= 小于等于
<> 不等于
BETWEEN ..AND.. 在兩個值之間
IN(set) 在一個集合范圍內(nèi)
LIKE 匹配一個字符串樣子盒蟆,可以使用%通配符
- 使用
like
進行模糊匹配
可使用% 或者_(dá) 作為通配符:%
代表 0個或者多個字符踏烙;而_
代表一個單個字符。
如果要是查找有%的記錄历等,使用關(guān)鍵字
escape
舉例:
select * from t_char where a like '%\%%' escape '\';
- 邏輯操作符
邏輯操作符 | 意義 |
---|---|
AND | 所有條件都滿足讨惩,返回TRUE |
OR | 只要有一個條件滿足,返回TRUE |
NOT | 如果條件是FALSE,返回TRUE |
- 排序:“
order by
”
-
asc
升序 -
desc
降序
三寒屯、單行函數(shù)
1.大小寫轉(zhuǎn)換函數(shù)
函數(shù) | 結(jié)果 |
---|---|
LOWER('SQL Course') | sql course |
UPPER('SQL Course') | SQL COURSE |
INITCAP('SQL course') | Sql Course |
注意:Oracle數(shù)據(jù)庫中的數(shù)據(jù)是大小寫敏感的
2.字符串操作函數(shù)
函數(shù) | 結(jié)果 |
---|---|
CONCAT('Hello', 'World') | HelloWorld |
SUBSTR('HelloWorld',1,5) | Hello |
LENGTH('HelloWorld') | 10 |
INSTR('HelloWorld', 'W') | 6 |
LPAD(salary,10,'*') | *****24000 |
RPAD(salary, 10, '*') | 24000***** |
TRIM('H' FROM 'HelloWorld') | elloWorld |
TRIM(' HelloWorld') | HelloWorld |
TRIM('Hello World') | Hello World |
3.數(shù)字操作函數(shù)
函數(shù) | 結(jié)果 |
---|---|
ROUND(45.926, 2) | 45.93 |
TRUNC(45.926, 2) | 45.92 |
MOD(1600, 300) | 100 |
4.日期操作函數(shù)
函數(shù) | 結(jié)果 |
---|---|
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') | 19.6774194 |
ADD_MONTHS ('11-JAN-94',6) | 11-Jul-94 |
NEXT_DAY ('01-SEP-95','FRIDAY') | 8-Sep-95 |
NEXT_DAY ('01-SEP-95',1) | 3-Sep-95 |
NEXT_DAY ('1995-09-01',1) | ORA-01861:literal does not match format string |
NEXT_DAY (to_date('1995-09-01','YYYY-MM-DD'),1) | 3-Sep-95 |
LAST_DAY('01-FEB-95') | 28-Feb-95 |
ROUND('25-JUL-95','MONTH') | 1-Aug-95 |
ROUND('25-JUL-95' ,'YEAR') | 1-Jan-96 |
TRUNC('25-JUL-95' ,'MONTH') | 1-Jul-95 |
TRUNC('25-JUL-95','YEAR') | 1-Jan-95 |
- 日期運算操作
SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS, sysdate+1 as
tomorrow , hire_date + 8/24
FROM employees
WHERE department_id = 90;
5. Oracle數(shù)據(jù)類型的隱私轉(zhuǎn)換規(guī)則
從 | 到 |
---|---|
VARCHAR2 or CHAR | NUMBER |
VARCHAR2 or CHAR | DATE |
NUMBER | VARCHAR2 |
DATE | VARCHAR2 |
注意:對于表達(dá)式比較操作僅可以:
從 | 到 |
---|---|
VARCHAR2 or CHAR | NUMBER |
VARCHAR2 or CHAR | DATE |
SELECT last_name, TO_CHAR(hire_date, 'fmDD "of" Month YYYY') AS
HIREDATE
FROM employees;
6. 日期到字符串的轉(zhuǎn)換:TO_CHAR(date, 'format_model');
日期格式化元素 | 意義 |
---|---|
YYYY | 4位數(shù)字表示的年份 |
YEAR | 英文描述的年份 |
MM | 2位數(shù)字表示的月份 |
MONTH | 英文描述的月份 |
MON | 三個字母的英文描述月份簡稱 |
DD | 2位數(shù)字表示的日期 |
DAY | 英文描述的星期幾 |
DY | 三個字母的英文描述的星期幾簡稱 |
HH24:MI:SS AM | 時分秒的格式化 |
DDspth | 英文描述的月中第幾天 |
fm | 格式化關(guān)鍵字荐捻,可選 |
7. 數(shù)字到字符串的轉(zhuǎn)換TO_CHAR(number, 'format_model');
數(shù)字格式化元素 | 意義 |
---|---|
9 | 表示一個數(shù)字 |
0 | 強制顯示0 |
$ | 放一個美元占位符 |
L | 使用浮點本地幣種符號 |
. | 顯示一個小數(shù)點占位符 |
, | 顯示一個千分位占位符 |
SELECT TO_CHAR(salary, 'L99,999.00') SALARY FROM employees
WHERE last_name = 'Ernst';
8. 字符串到數(shù)字和日期的轉(zhuǎn)換
TO_NUMBER(char[, 'format_model']);
TO_DATE(char[, 'format_model']);
9. 其它單行函數(shù)
函數(shù) | 用途 |
---|---|
NVL (expr1, expr2) | 如果expr1為空,這返回expr2 |
NVL2 (expr1, expr2, expr3) | 如果expr1為空,這返回expr3(第2個結(jié)果)否則返回expr2 |
NULLIF (expr1, expr2) | 如果expr1和expr2相等靴患,則返回空 |
COALESCE (expr1, expr2, ..., exprn) | 如果expr1不為空仍侥,則返回expr1,結(jié)束;否則計算expr2,直到找到一個不為NULL的值或者如果全部為NULL鸳君,也只能返回NULL |
SELECT last_name, salary, NVL(commission_pct, 0),
(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
FROM employees;
10. 條件表達(dá)式
CASE語句:
SELECT last_name, job_id, salary,
CASE job_id
WHEN 'IT_PROG' THEN 1.10*salary
WHEN 'ST_CLERK' THEN 1.15*salary
WHEN 'SA_REP' THEN 1.20*salary
ELSE salary
END "REVISED_SALARY"
FROM employees;
DECODE語句:
SELECT last_name, job_id, salary,
DECODE(job_id, 'IT_PROG', 1.10*salary,
'ST_CLERK', 1.15*salary,
'SA_REP', 1.20*salary,
salary) REVISED_SALARY
FROM employees;
四农渊、多表關(guān)聯(lián)查詢
不同的數(shù)據(jù)庫廠商對鏈接類型有不同的定義,但國際上有個凌駕于各廠商的工業(yè)標(biāo)準(zhǔn)定義(SQL 1999), 我們先來看Oracle定義的鏈接類型:
1或颊、等于鏈接
2砸紊、不等鏈接
3、外連接(可細(xì)分為左外連接囱挑、右外連接)
4醉顽、自鏈接
1.等于連接
語法:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
舉例:
SELECT employees.employee_id, employees.last_name,
employees.department_id,
departments.department_id,departments.location_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;
2. 不等于連接
“不等鏈接” 語法: 使用不等鏈接符,包括> , < , !=, between
語法:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 > table2.column2;
舉例:
SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary
BETWEEN j.lowest_sal AND j.highest_sal;
3.外連接
外連接包括左外連接和右外連接
舉例:
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
記憶方式:
哪邊沒加好平挑,就是那種外連接游添。比如:加號在右面,就叫左外連接通熄,此時右面對應(yīng)的空數(shù)據(jù)也會查詢出來
4.自連接
“自鏈接” :其實是一種概念唆涝,某個table和自己本身鏈接 ,比如:table1給另一個“自己”起別名為table2
舉例:
SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;
五唇辨、 分組計算函數(shù)和“GROUP BY”字句
- 常用的分組計算函數(shù)包括:
作用 | 關(guān)鍵字 |
---|---|
求和 | (SUM) |
求平均值 | (AVG) |
計數(shù) | (COUNT) |
求標(biāo)準(zhǔn)差 | (STDDEV) |
求方差 | (VARIANCE) |
求最大值 | (MAX) |
求最小值 | (MIN) |
-
count()
的用法
函數(shù)用法 | 意義 |
---|---|
COUNT(*) | 返回滿足選擇條件的所有行的行數(shù)廊酣,包括值為空的行和重復(fù)的行 |
COUNT(expr) | 返回滿足選擇條件的且表達(dá)式不為空行數(shù) |
COUNT(DISTINCT expr) | 返回滿足選擇條件的且表達(dá)式不為空,且不重復(fù)的行數(shù) |
注意:
SELECT 查詢語句中同時選擇分組計算函數(shù)表達(dá)式和其他獨立字段時 赏枚,其他字段必須出現(xiàn)在Group By子句中亡驰,否則不合法。
不能在Where 條件中使用分組計算函數(shù)表達(dá)式饿幅,當(dāng)出現(xiàn)這樣的需求的時候凡辱,使用Having 子句。
分組計算函數(shù)可以嵌套使用
六栗恩、子查詢
語法:
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
注意點:
- 單行比較必須對應(yīng)單行子查詢(返回單一結(jié)果值的查詢)煞茫; 比如= , >
- 多行比較必須對應(yīng)多行子查詢(返回一個數(shù)據(jù)集合的查詢)摄凡;比如 IN , > ANY, > ALL 等
七、DML語句
-
insert
語句
形式一:
不允許為空的列蚓曼,必須寫出來亲澡。
INSERT INTO table [(column [, column...])]
VALUES (value [, value...]);
形式二:僅寫出列名,這種形式必須顯式的給出所有列的數(shù)據(jù)纫版。
INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);
形式三:從另一個表中copy
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';
形式四:使用子查詢作為插入目標(biāo)
INSERT INTO
(SELECT employee_id, last_name,
email, hire_date, job_id, salary, department_id
FROM employees
WHERE department_id = 50)
VALUES (99999, 'Taylor', 'DTAYLOR', TO_DATE('07-JUN-99', 'DD-MON-RR'),
'ST_CLERK', 5000, 50);
-
update
語句
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];
注意:存在約束條件的時候床绪,可能會更新失敗
-
delete
語句
DELETE [FROM] table
[WHERE condition];
刪除所有:delete
刪除語句沒有where
條件時,意為刪除所有數(shù)據(jù),但是表依然存在癞己,刪除表實體使用drop
膀斋。
注意:當(dāng)存在約束時,有可能會刪除失敗痹雅。
-
meger
比較整合語句
舉例:
MERGE INTO copy_emp c
USING employees e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
...
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);
七仰担、事務(wù)控制
隱式的事務(wù)提交或者回滾:
Commit
, rollback
是顯式的提交和回滾語句,還有一些隱式的提交和回滾是大家需要知道并引起注意的:
當(dāng)如下事件發(fā)生是绩社,會隱式的執(zhí)行Commit動作:
1摔蓝、數(shù)據(jù)定義語句被執(zhí)行的時候,比如新建一張表:Create Table …
2愉耙、數(shù)據(jù)控制語句被執(zhí)行的時候贮尉,比如賦權(quán) GRANT …( 或者 DENY)
3、正常退出 iSQL*Plus 或者PLSQL DEVELOPER, 而沒有顯式的執(zhí)行 COMMIT 或者 ROLLBACK 語句 朴沿。
當(dāng)如下事件發(fā)生時猜谚,會隱式執(zhí)行Rollback 動作:
九、數(shù)據(jù)庫對象-表
表的命名要求和表中列的命名要求:
1赌渣、必須以字母開頭
2魏铅、長度不能超過30個字符
3、只能包含 A–Z, a–z, 0–9, _, $, and #
4锡垄、不能與數(shù)據(jù)庫中的已有對象重名
5沦零、不能使用Oracle 數(shù)據(jù)庫的保留字
語法:
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr][, ...]);
中間部分省略
十四、GROUP BY 增強
-
GROUP BY
中使用Rollup
產(chǎn)生常規(guī)分組匯總行以及分組小計
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id);
這樣會產(chǎn)生三維的統(tǒng)計數(shù)據(jù):department_id, job_id
為一個維度货岭,department_id
為一個維度路操,job_id
為一個維度。
-
GROUP BY
中使用cube
產(chǎn)生Rollup
結(jié)果集+多維度交叉表數(shù)據(jù)來源
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY CUBE (department_id, job_id) ;
這樣就會有四個維度千贯,相當(dāng)于再反向的rollup一次
-
GROUPING函數(shù)
關(guān)鍵字: grouping(column) rename
舉例:
SELECT department_id DEPTID, job_id JOB,
SUM(salary),
GROUPING(department_id) GRP_DEPT,--用了哪個維度屯仗,哪個維度就顯示為0,否則為1
GROUPING(job_id) GRP_JOB
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);
-
GROUPING STES
來代替多次的union
舉例:
SELECT department_id, job_id,
manager_id,avg(salary)
FROM employees
GROUP BY GROUPING SETS
((department_id,job_id), (job_id,manager_id));
此時搔谴,就會按照
(department_id,job_id)
和(job_id,manager_id)
兩個組合來進行分組匯總魁袜,最后再union
。
十五敦第、子查詢進階
- 非相關(guān)子查詢峰弹,即把子查詢的結(jié)果當(dāng)做一張表來使用
舉例:
SELECT a.last_name, a.salary,
a.department_id, b.salavg
FROM employees a, (SELECT department_id,
AVG(salary) salavg
FROM employees
GROUP BY department_id) b
WHERE a.department_id = b.department_id
AND a.salary > b.salavg;
- 相關(guān)子查詢,即子查詢中參考了外部主查詢的中的表
舉例:
SELECT last_name, salary, department_id
FROM employees outer
WHERE salary > (SELECT AVG(salary)
FROM employees
WHERE department_id =
outer.department_id) ;
使用
Exists
芜果、not exists
操作使用
in
鞠呈、not in
操作
注意:Not In
里面只要有一個NULL
,就不成立了右钾,這是很容易出錯的地方蚁吝; 正確的方法請在后面的子查詢中加上where department_id is not null;