原文轉自 一沙彌的世界 的部落格
一、SQL 結構化查詢語言
包括DDL(資料定義語言)、DCL(資料控制語言)、
DQL(資料查詢語言)、DML(資料操縱語言)
二、SQL的特點
SQL 語句不區分大小寫
SQL 語句能輸入一行或多行
關鍵字不能整行縮寫或分離
子句通常被放置在分開的行上
縮進可提高可讀性
在SQL 開發工具,SQL 語句能選擇分号結束(;)
.當你運作多個SQL 語句的時候,需要分号
在SQL*Plus中, 你要用一個分号結束每個SQL 語句.(;)
三、SQL*PLUS特征:
字元日期左對齊
數字右對對齊
列名預設大寫
SQL PLUS 自己的指令不需以分号“;”結束
四、SQL查詢時,數字和日期類型的資料可用算術運算符
+ 加
- 減
* 乘
/ 除
( ) 用于改變運算符的優先級
五、空值
空值一般用NULL表示
一般表示未知的、不确定的值,也不是空格
一般運算符與其進行運算時,都會為空
空不與任何值相等
表示某個列為空用:IS NULL 不能使用COMM=NULL這種形式
某個列不為空:IS NOT NULL 不能使用COMM != NULL 這種形式
空值在作升序排列時,空值會放到最後。
相反作降序排列時,空值會放在最前。
空值作邏輯運算時:
AND運算:
F AND F =F F AND T =F F AND NULL =F
T AND F =F T AND T =T T AND NULL IS NULL
NULL AND F =F NULL AND T IS NULL NULL AND NULL IS NULL
就是說AND的優先級是:F ->NULL ->T
OR運算:
T OR T =T T OR F =T T OR NULL =T
F OR T =T F OR F =F F OR NULL IS NULL
NULL OR T =T NULL OR F IS NULL NULL OR NULL IS NULL
OR運算優先級:T ->NULL ->F
NOT運算:
NOT T =F
NOT F =T
NOT NULL IS NULL
與空值相關的函數:
NVL 函數
格式:NVL(表達式1,表達式2)
作用:測試表達式的值,如果表達式1為空,則傳回表達式2的值;不為空,傳回表達式1的值。
NVL2 函數
格式:NVL2(表達式1,表達式2,表達式3)
作用:測試表達式的值,表達式1不為空,傳回表達式2的值,如果為空,則傳回表達式3的值。
NULLIF 相等為空
格式:NULLIF (表達式1,表達式2)
作用:比較表達式1和表達式2的值,如果兩個相等則傳回為空,否則傳回表達式1的值。
COALESCE 找非空
格式:COALESCE (表達式1,表達式2,表達式3,...,表達式n)
作用:傳回第一個不為空的值,如果所有的都為空,則傳回NULL。
六、SELECT語句的用法
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table;
七、示範 */
--選擇所有字段
SQL> SET LINESIZE 200
SQL> SELECT * FROM SCOTT.EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
--選擇部分字段
SQL> SELECT EMPNO,ENAME,SAL FROM SCOTT.EMP;
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
--算術加減運算
SQL> SELECT EMPNO,ENAME,SAL + 300 FROM SCOTT.EMP;
EMPNO ENAME SAL+300
7369 SMITH 1100
7499 ALLEN 1900
7521 WARD 1550
--優先級
SQL> SELECT EMPNO,ENAME,12 * (SAL + 300) FROM SCOTT.EMP;
EMPNO ENAME 12*(SAL+300)
---------- ---------- ------------
7369 SMITH 13200
7499 ALLEN 22800
7521 WARD 18600
SQL> SELECT EMPNO,ENAME,12 * SAL + 300 FROM SCOTT.EMP;
EMPNO ENAME 12*SAL+300
7369 SMITH 9900
7499 ALLEN 19500
7521 WARD 15300
--NULL,記錄中COMM存在為NULL的情況
SQL> SELECT EMPNO,ENAME,SAL,COMM FROM SCOTT.EMP;
EMPNO ENAME SAL COMM
---------- ---------- ---------- ----------
7499 ALLEN 1600 300
7521 WARD 1250 500
7566 JONES 2975
--與NULL運算,結果為NULL
SQL> SELECT EMPNO,ENAME,SAL,COMM + 300 FROM SCOTT.EMP;
EMPNO ENAME SAL COMM+300
7499 ALLEN 1600 600
7521 WARD 1250 800
--将COMM不為NULL的記錄的COMM乘以
SQL> SELECT EMPNO,ENAME,SAL,COMM * 12 FROM SCOTT.EMP WHERE COMM IS NOT NULL
——注意 where子句 這裡的is null 或者 is not null 的寫法。
EMPNO ENAME SAL COMM*12
7499 ALLEN 1600 3600
7521 WARD 1250 6000
7654 MARTIN 1250 16800
7844 TURNER 1500 0
--字段别名,字段後用AS 别名,AS可以省略
SQL> SELECT EMPNO,ENAME AS EmpName,SAL Salary FROM SCOTT.EMP;
EMPNO EMPNAME SALARY
--DISTINCT,過濾重複行
SQL> SELECT DISTINCT EMPNO,ENAME FROM SCOTT.EMP;
--連接配接操作符,通過二個垂直的條描述(||),注意,日期和文字數值一定嵌入在單引号裡面
SQL> SELECT EMPNO,ENAME || ' IS A ' ||JOB AS POSITION FROM SCOTT.EMP;——連接配接操作符
EMPNO POSITION
---------- -------------------------
7369 SMITH IS A CLERK
7499 ALLEN IS A SALESMAN
7521 WARD IS A SALESMAN
--DESC table_name,顯示表結構資訊
SQL> DESC SCOTT.EMP
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
--NVL的用法
SQL> SELECT EMPNO,ENAME,NVL(TO_CHAR(COMM),'Not
Applicable') FROM SCOTT.EMP; ——如果第一個參數不空,則傳回第一個參數,如果為空,傳回第二個參數。
EMPNO ENAME NVL(TO_CHAR(COMM),'NOTAPPLICABLE')
---------- ---------- ----------------------------------------
7369 SMITH Not Applicable
7499 ALLEN 300
7521 WARD 500
7566 JONES Not Applicable
--NVL2的用法
SQL> SELECT empno,ename,sal,NVL2(TO_CHAR(comm),12 * (sal + comm),sal) AS Income FROM scott.emp;——
第一個參數有(即不空),返2,第一個參數無(即空)返3.簡記為:有2空3. 用來算一年收入不錯,有年終獎的加上,沒年中獎的直接得出。。
EMPNO ENAME SAL INCOME
7369 SMITH 800 800
7499 ALLEN 1600 22800
7521 WARD 1250 21000
7566 JONES 2975 2975
--NULLIF的用法
--等價于CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
SQL> SELECT e.last_name, NULLIF(e.job_id, j.job_id) "Old
Job ID" ——第一個參數等于第二個參數,傳回空,否則傳回第一個參數。用來比較新舊不錯,若新的等于舊的,則不傳回,若不等,則傳回新的。
2 FROM hr.employees e, hr.job_history j
3 WHERE e.employee_id = j.employee_id
4 ORDER BY last_name, "Old Job ID";
LAST_NAME Old Job ID
------------------------- ----------
De Haan AD_VP
Hartstein MK_MAN
Kaufling ST_MAN
Kochhar AD_VP
Raphaely PU_MAN
Taylor SA_REP
Taylor
Whalen AD_ASST
Whalen
--下面是使用CASE WHEN的等價用法
SQL> SELECT e.last_name, CASE WHEN e.job_id = j.job_id THEN NULL ELSE e.job_id END AS "Old
Job ID"
2 FROM hr.employees e, hr.job_history j
3 WHERE e.employee_id = j.employee_id
4 ORDER BY last_name, "Old Job ID";
--COALESCE的用法
--當COALESCE(exp1,exp2)包含兩個表達式時,等價于CASE WHEN exp1 IS NOT NULL THEN exp1 ELSE exp2 END
--COALESCE (expr1, expr2, ..., exprn), for n>=3
--當n >= 3時,等價于
--CASE WHEN expr1 IS NOT NULL THEN expr1
-- ELSE COALESCE (expr2, ..., exprn) END
SQL> SELECT product_id, list_price, min_price,
2 COALESCE(0.9*list_price, min_price, 5) "Sale"
3 FROM oe.product_information
4 WHERE supplier_id = 102050
5 ORDER BY product_id, list_price, min_price, "Sale"
PRODUCT_ID LIST_PRICE MIN_PRICE Sale
1769 48 43.2
1770 73 73
2378 305 247 274.5
2382 850 731 765
3355 5