Unit03: SQL(基礎查詢) 、 SQL(關聯查詢)
列別名 當SELECT子句中查詢的列是一個函數 或者表達式時,那么查詢出來的結果集 中對應的該字段的名字就是這個函數或者 表達式的名字。為此可以為這一列添加 別名,這樣結果集中該字段就使用別名 作為該列的名字。 若希望別名區分大小寫或者含有空格,那么 該別名可以使用雙引號括起來。 SELECT ename,sal*12 "s al" FROM emp AND,OR AND優先級高於OR,可以通過括號 提高優先級。 SELECT ename,job,sal FROM emp WHERE sal>1000 AND job='SALESMAN' OR job='CLERK' LIKE可以模糊匹配字符串 支持兩個通配符: %:任意個字符(0-多個) _:單一的一個字符 查看名字第二個字母是A的員工: SELECT ename,sal,deptno FROM emp WHERE ename LIKE '_A%' IN(list)與NOT IN(list) 判斷在列表中或者不在列表中。 常用在判斷子查詢的結果。 BETWEEN...AND... 判斷在一個區間范圍內 查看工資在1500到3000之間的員工信息 SELECT ename,sal,deptno FROM emp WHERE sal BETWEEN 1500 AND 3000 ANY,ALL 配合>,>=,<,<=判斷使用, 判斷一個列表中的內容是否滿足要求 >ANY(list):大於列表之一即可(大於最小) >ALL(list):大於列表所有(大於最大) ANY,ALL通常用在子查詢結果的判斷上。 DISTINCT關鍵字 對結果集指定字段值重復的記錄行 去除。 SELECT DISTINCT job FROM emp 對多列去重是指:這這些列的值的組合沒有重復 SELECT DISTINCT job,deptno FROM emp ORDER BY子句,用於結果集排序 ORDER BY只能寫在DQL的最后一個子句中 ORDER BY可以對結果集按照給定字段的值 進行升序(ASC)或降序(DESC)進行排序 查看公司的工資排名? SELECT ename,sal FROM emp ORDER BY sal DESC 多字段排序是有優先級的,首先按照 第一個字段的排序規則對結果集排序, 當第一個字段有重復值時再按照第二個 字段的值排序,以此類推。 SELECT ename,deptno,sal FROM emp ORDER BY deptno,sal DESC 排序的字段若含有NULL值,NULL被 認作最大值。 SELECT ename,comm FROM emp ORDER BY comm 聚合函數 聚合函數也稱為:多行函數,分組函數 聚合函數是用來統計結果集中的數據的 四個對值進行統計的函數:MAX,MIN,AVG,SUM 一個對記錄數統計的函數:COUNT 統計公司工資的最大值與最小值 SELECT MAX(sal),MIN(sal) FROM emp 公司的工資總和和平均值? SELECT SUM(sal),AVG(sal) FROM emp 查看公司總共多少人? SELECT COUNT(ename) FROM emp 聚合函數忽略NULL值。 SELECT SUM(comm),AVG(NVL(comm,0)) FROM emp SELECT NVL(comm,0) FROM emp 統計一張表記錄總數常用: SELECT COUNT(*) FROM emp SELECT AVG(sal) FROM emp WHERE deptno=20 分組 GROUP BY子句 GROUP BY子句可以將結果集按照指定 字段進行分組,分組原則為該字段值一 樣的記錄看作一組,配合聚合函數可以 進行細致的統計。 查看每個部門的平均工資? SELECT AVG(sal),deptno FROM emp GROUP BY deptno 查看每個職位的平均工資與工資總和? SELECT AVG(sal),SUM(sal),job FROM emp GROUP BY job GROUP BY可以按照多字段分組,分組 原則為這幾個字段值的組合相同的記錄 看作一組 查看同部門同職位的員工各多少人? SELECT COUNT(*),deptno,job FROM emp GROUP BY deptno,job 查看部門的平均工資,前提是該部門 平均工資要高於2000 SELECT AVG(sal),deptno FROM emp WHERE AVG(sal)>2000 GROUP BY deptno WHERE中不能使用聚合函數作為過濾 條件,原因在於過濾時機不對。WHERE 是在第一次查詢表中數據進行過濾的, 逐行過濾,將滿足條件的記錄查詢出來。 聚合函數是建立在結果集基礎上進行統計 的。這已經是在WHERE之后進行了。 HAVING子句 HAVING子句必須跟在GROUP BY子句之后, 用來對GROUP BY分組后對每一個分組進行 過濾。 HAVING可以使用聚合函數並根據結果來取舍 分組。 查看部門的平均工資,前提是該部門 平均工資要高於2000 SELECT AVG(sal),deptno FROM emp GROUP BY deptno HAVING AVG(sal)>2000 查看平均工資高於2000的部門的 最高工資與最低工資分別是多少? SELECT MAX(sal),MIN(sal),deptno FROM emp GROUP BY deptno HAVING AVG(sal)>2000 查看平均工資高於2000的職位各多少人? SELECT COUNT(*),job FROM emp GROUP BY job HAVING AVG(sal)>2000 關聯查詢 關聯查詢的結果集中字段來自多張表 聯合查詢的結果。 關聯查詢的關鍵在於連接條件,即: 表之間數據的對應關系。 查看每個員工以及其所在部門的名稱? SELECT e.ename,e.deptno,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno 關聯查詢中連接條件要與過濾條件同時 成立! 查看在NEW YORK工作的員工? SELECT e.ename,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND d.loc='NEW YORK' 關聯查詢中不添加鏈接條件或鏈接條件 無效則會出現笛卡兒積,這通常是一個 無意義的結果集。 笛卡兒積的記錄數是由參與查詢的表的記 錄數乘積得到。 SELECT d.deptno,d.dname FROM dept d 不滿足連接條件的記錄是不會被查詢 出來的。 SELECT e.ename,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno 查看KING在哪個城市工作? SELECT e.ename,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND e.ename='KING' 關聯查詢中N張表關聯查詢,至少要有 N-1個連接條件。 內連接 內連接也是用來完成關聯查詢的。 SELECT e.ename,d.loc FROM emp e JOIN dept d ON e.deptno=d.deptno WHERE e.ename='KING' 外連接 外連接在進行關聯查詢時除了可以將 滿足連接條件的記錄查詢出來之外,也 可以將不滿足連接條件的記錄列出來。 外連接分為:左外連接,右外連接,全外連接 左外連接:以JOIN左側表作為驅動表(所有記錄 都會列出來),那么當驅動表中不滿足 連接條件的記錄來自右側表中的字段值 為NULL。 SELECT e.ename,d.dname FROM emp e LEFT|RIGHT|FULL OUTER JOIN dept d ON e.deptno=d.deptno SELECT e.ename,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno(+) 自連接 當前表的一條記錄可以對應當前表自己的 多條記錄這樣的設定就是自連接。 自連接保存屬性相同的數據但是之間有存在 上下級關系的樹狀結構數據使用。 SELECT empno,ename,mgr FROM emp 查看每個員工的名字以及其上司的名字? SELECT e.ename,m.ename FROM emp e,emp m WHERE e.mgr=m.empno 查看SMITH的上司在哪個城市工作?