一、簡單查詢
SQL(Structured Query Language) 結構化查詢語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系數據庫系統。ANSI(美國國家標准學會)聲稱,SQL是關系數據庫管理系統的標准語言。
Oracle數據庫之所以發展的很好,主要也是因為Oracle是全世界最早采用SQL語句的數據庫產品。
SQL功能強大,概括起來,它可以分成以下幾組:
- DML(Data Manipulation Language) 數據操作語言,用於檢索或者修改數據
- DDL(Data Definition Language) 數據定義語言,用於定義數據的結構,創建、修改或者刪除數據庫對象
- DCL(Data Control Language) 數據控制語言,用於定義數據庫的權限
簡單查詢指的是查詢出一張表中的所有的數據,簡單查詢的語法如下:
SELECT [DISTINCT] * | 字段 [別名] [,字段 [別名]] FROM 表名稱 [別名];
范例:查詢dept表的全部記錄
SELECT * FROM dept;
范例:查詢出每個雇員的編號、姓名、基本工資
SELECT empno, ename, sal FROM emp;
范例:查詢出每個雇員的職位
SELECT job FROM emp;
這個時候發現查詢出來的job內容中出現了重復的數據,而之所以數據會有重復,主要的原因是現在沒有消除掉重復記錄,可以使用DISTINCT消除掉所有的重復內容:
SELECT DISTINCT job FROM emp;
但是對於重復數據,指的是一行中的每個列的記錄都重復,才叫重復數據。
范例:查詢出每個雇員的姓名、職位
SELECT DISTINCT ename, job FROM emp;
在進行簡單查詢的操作之中,也可以使用各個數學的四則運算符。
范例:要求顯示每一個雇員的姓名、職位、基本年薪
SELECT ename, job, sal*12 FROM emp;
但是這個時候顯示列上出現了一個“SAL*12”,這個肯定是顯示的查詢列,但是這個列名稱不方便瀏覽,所以此時可以起一個別名。
SELECT ename, job, sal*12 income FROM emp;
但是對於別名,建議不要使用中文,只要是程序的開發,都要回避中文。
范例:由於公司的福利很高,每個月都有200元的飯食補助以及100元車費補貼,這個時候的年薪
SELECT ename, job, (sal+300)*12 income FROM emp;
范例:公司每年的年底都會多發一個月的基本工資
SELECT ename, job, (sal+300)*12+sal income FROM emp;
在簡單查詢中也可以使用“||”連接查詢的字段。
范例:觀察“||”的使用
SELECT empno || ',' || ename FROM emp;
由於“,”屬於原樣輸出的字符串,所以必須使用“ ' ”括起來,即:在SQL語句之中,“ ' ”表示的是字符串。
范例:要求現在的數據庫按照如下的格式顯示:
“雇員編號是:7369的雇員姓名是:SMITH,基本工資是:800,職位是:CLERK!”
現在相當於查找:empno、ename、sal、job字段,並且使用“||”進行連接。
SELECT '雇員編號是:' || empno || '的雇員姓名是:' || ename || ',基本工資是:' || sal || ',職位是:' || job || '! ' 雇員信息 FROM emp;
一定要記住,別名上的內容不要使用“ ' ”括起來,而只有在SELECT子句之中出現的內容使用“ ' ”。
二、限定查詢
在之前的簡單查詢中,是將所有的記錄進行顯示,但是現在可以對顯示的記錄進行過濾的操作,而這就屬於限定查詢的工作了,限定查詢就是在之前語法的基礎上增加了一個WHERE子句,用於指定限定條件,此時語法如下:
SELECT [DISTINCT] * | 字段 [別名] [,字段 [別名]] FROM 表名稱 [別名] [WHERE 條件(S)];
在WHERE子句之后可以增加多個條件,最常見的條件就是基本的關系運算:>、>=、<、<=、!=(<>)、BETWEEN、AND、LIKE、IN、IS NULL、AND、OR、NOT;
1、關系運算
范例:要求查詢出基本工資高於1500的所有雇員信息
SELECT * FROM emp WHERE sal>1500;
范例:查詢出所有職位是辦事員的雇員信息
SELECT * FROM emp WHERE job='clerk';
這個時候沒有返回相應的查詢結果,主要原因是在Oracle數據庫中,所有的數據都是區分大小寫的,所以代碼修改如下:
SELECT * FROM emp WHERE job='CLERK';
以上只是操作了一個條件,現在也可以操作多個條件,而這多個條件之間可以使用AND或OR進行連接操作。
范例:查詢工資在1500~3000之間的全部雇員信息
SELECT * FROM emp WHERE sal>=1500 AND sal<=3000;
范例:查詢出職位是辦事員,或者是銷售人員的全部信息
SELECT * FROM emp WHERE job='CLERK' OR job='SALESMAN';
范例:查詢出職位是辦事員,或者是銷售人員的全部信息,並且要求這些雇員的工資大於1200
SELECT * FROM emp WHERE (job='CLERK' OR job='SALESMAN') AND sal>1200;
范例:查詢所有不是辦事員的雇員信息
SELECT * FROM emp WHERE job<>'CLERK'; SELECT * FROM emp WHERE job!='CLERK'; SELECT * FROM emp WHERE NOT job='CLERK';
2、范圍判斷:BETWEEN…AND…
“BETWEEN 最小值 AND 最大值”,表示的是一個范圍的判斷過程。
范例:要求查詢出基本工資在1500~3000的雇員信息
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;
范例:現在也可以對BETWEEN…AND…操作求反
SELECT * FROM emp WHERE NOT sal BETWEEN 1500 AND 3000;
“BETWEEN…AND…”操作符不光只是針對於數字有用,對於日期也同樣有用。
范例:要求查詢出在1981年雇佣的全部雇員信息
時間范圍:1981-01-01~1981-12-31,使用hiredate字段表示雇佣日期;
hiredate字段上的內容可以使用字符串表示:’01-1月-1981’~’31-12月-81’
SELECT * FROM emp WHERE hiredate BETWEEN '01-1月-1981' AND '31-12月-81';
3、判斷是否為空:IS (NOT) NULL
使用此語法可以判斷某一個字段上的內容是否是“null”,但是null和數字0以及空字符串是兩個概念。
范例:查詢出所有領取獎金的雇員信息
SELECT * FROM emp WHERE comm IS NOT NULL; SELECT * FROM emp WHERE NOT comm IS NULL;
范例:查詢出所有不領取獎金的雇員
SELECT * FROM emp WHERE comm IS NULL;
4、指定范圍的判斷:IN操作符
IN操作符表示的是指定一個查詢的范圍,例如,現在有如下一個查詢要求:
范例:查詢出雇員編號是7369、7566、7799的雇員信息
如果按照最早的做法,使用OR操作完成;
SELECT * FROM emp WHERE empno=7369 OR empno=7566 OR empno=7799;
如果現在使用了新的操作符IN的話,則代碼簡單了;
SELECT * FROM emp WHERE empno IN (7369,7566,7799);
而如果現在使用的是NOT IN呢?則表示不在指定的范圍之中。
SELECT * FROM emp WHERE empno NOT IN (7369,7566,7799);
注意點:關於NOT IN的問題
如果現在使用了IN操作符,查詢的范圍之中存在了null,不影響查詢;
SELECT * FROM emp WHERE empno IN(7369,7566,null);
如果現在使用的是NOT IN操作符,如果查詢范圍之中有了null則表示的就是查詢全部數據。
SELECT * FROM emp WHERE empno NOT IN(7369,7566,null);
對於這個限制,現在先作為特點記住,以后會講解為什么NOT IN之中不能出現null。
5、模糊查詢:LIKE子句
LIKE子句的功能是提供了模糊查找的操作,例如:某些程序上出現的搜索操作,都屬於LIKE子句的實現,但是必須提醒的,搜索引擎上的查詢可不是LIKE。
但是要想使用LIKE子句則必須認識兩個匹配符號:
匹配單個字符:_; -> 1個
匹配任意多個字符:%; -> 0個、1個、多個
范例:要求查詢雇員姓名中以字母A開頭的全部雇員信息
SELECT * FROM emp WHERE ename LIKE 'A%';
范例:要求查詢出雇員姓名中第二個字母是A的全部雇員信息
SELECT * FROM emp WHERE ename LIKE '_A%';
范例:要求查詢出雇員姓名中帶有字母A的雇員
SELECT * FROM emp WHERE ename LIKE '%A%';
現在也可以使用NOT操作,對操作進行求反的功能:
SELECT * FROM emp WHERE ename NOT LIKE '%A%';
但是對於LIKE子句,不一定只能在字符串數據上表示,可以在任意的數據上表示:
SELECT * FROM emp WHERE ename LIKE '%1%' OR hiredate LIKE '%1%' OR sal LIKE '%1%';
說明:關於LIKE子句的使用
在開發之中,數據庫的模糊查詢肯定使用LIKE子句,但是在使用LIKE子句的時候有一個最大的注意點:如果在模糊查詢上不設置任何的查詢關鍵字的話('%%')則表示查詢全部記錄:
SELECT * FROM emp WHERE ename LIKE '%%' OR hiredate LIKE '%%' OR sal LIKE '%%';
這一個特點可以幫助用戶節約很多的代碼,所以一定要記住。
三、數據的排序
當數據返回查詢結果之后,所有的數據默認情況下是按照雇員編號排序的,當然,現在也可以使用”ORDER BY”子句指定所需要的排序的操作列,而這個時候的SQL語法如下:
SELECT [DISTINCT] * | 字段 [別名] [,字段 [別名]] FROM 表名稱 [別名] [WHERE 條件(S)] [ORDER BY 字段 [ASC|DESC] [,字段 [ASC|DESC],…]];
“ORDER BY”子句是寫在所有的SQL語句最后的內容,而且對於排序有以下幾點說明:
排序的時候可以指定多個排序的字段;
排序的方式有兩種:
- 升序(ASC):默認,不寫也是升序;
- 降序(DESC):用戶需要指定,由大到小排序;
范例:查詢所有的雇員的信息,要求按照工資排序
SELECT * FROM emp ORDER BY sal; SELECT * FROM emp ORDER BY sal ASC;
范例:進行降序排列
SELECT * FROM emp ORDER BY sal DESC;
范例:要求查詢出所有的雇員信息,按照工資由高到低排序,如果工資相同,則按照雇佣日期由早到晚排序
此時肯定需要兩個字段排序:工資(DESC),雇佣日期(ASC);
SELECT * FROM emp ORDER BY sal DESC, hiredate ASC;
SQL> SELECT * FROM emp ORDER BY sal DESC, hiredate ASC;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
7902 FORD ANALYST 7566 03-12月-81 3000 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7369 SMITH CLERK 7902 17-12月-80 800 20
7788 SCOTT CLERK 7566 19-4月 -87 800 20
已選擇14行。
對於排序操作,一般只在需要的地方上使用,而且一定要記住的是,ORDER BY 子句是寫在所有的SQL語句的最后的部分。