1. 程式人生 > >Orale基本查詢、高階查詢個別例子

Orale基本查詢、高階查詢個別例子

emp表格

DEPT表格

----------------------------------------------------
--DISTINCT  用於去除結果集
--中指定欄位的重複值
--DISTINCT  只能在select關鍵字之後
--DISTINCT 可以對多列去重,去重原則
--是這些列的組合沒有重複值
--檢視公司有多少職位
SELECT   DISTINCT  JOB,NAME FROM EMP;
--ORDER BY  字句  
--排序結果集,可以按照指定的欄位進行
--升序或降序
--ASC:升序,可以不寫。預設就是升序
--DESC :降序
--需要注意:ORDER BY 只能定義在select
--語句的最後一個字句上
--檢視公司員工的工資排名
SELECT NAME,    SALARY FROM EMP ORDER BY SALARY DESC
--ORDER BY 可以對多列進行排序
--排序規則,先按照第一個的排序
--方式進行排序結果集,當第一個欄位
--具有重讀值是再按照第二個的值,
--的排序方式進行排序結果集,以此類推
--若排序的欄位中含有null值
--NULL 值被視為最大值
SELECT  NAME,COMM  FROM EMP   ORDER BY COMM  DESC;
--聚合函式,又稱為多行函式
--聚合函式使用來統計結果集
--"MAX   "MIN"
--統計最大值,最小值
--檢視公司的最高與最低的工資
SELECT MAX(SALARY) "最高工資",MIN(SALARY) "最低的工資"FROM  EMP;
--統計平均值與總和
--檢視公司平均工資以及工資總和
SELECT AVG(SALARY)  "平均工資" ,SUM(SALARY)"工資總和" FROM EMP;
---------------------------------------------------
--檢視部門有多少員工?
SELECT COUNT(1) "員工個數",DEPTNO"部門"FROM EMP GROUP BY DEPTNO;
----------------------------------------------------
--檢視每個部門的平均工資
SELECT AVG(SALARY) "平均工資" ,DEPTNO "部門號"FROM EMP GROUP BY DEPTNO;
-------------------------------------------------
--檢視每個部門的平均工資,前提是平均工資超過2000
SELECT DEPTNO "部門號" ,AVG(SALARY)"平均工資"FROM EMP GROUP BY DEPTNO 
HAVING AVG(SALARY)>2000;
----------------------------------------------------
--WHERE 中不允許使用聚合函式作為過濾條件
--原因在於過濾時機不同
--WHERE 的過濾時機是在第一個從表中
--檢索資料時新增過濾條件,用來確定
--哪些資料可以別查詢出來,已確定結果集
--HAVING 子句:having 必須在group  by 子句
--之後,可以使用聚合函式作為過濾條件
--使之可以對分組進行過濾,將滿足條件的保留,不滿足的去掉
--關聯查詢
--查詢的結果集中的欄位來自多張表
--聯合多張表查詢資料就是關聯查詢
--在關聯查詢中需要在過濾條件中新增
--兩張表中記錄之間的對應關係,這樣的條件稱為連線天劍
--N張表聯合查詢至少有N-1個連線條件
--不新增連線條件會產生笛卡爾積,除特殊情況下
--該結果集通常是無意義的
--並且由於資料量大,對系統資源消耗有巨大影響
--檢視每個員工的名字以及所在部門的名稱
SELECT NAME ,DNAME FROM EMP,DEPT  WHERE EMP.DEPTNO=DEPT.ID;
--在關聯查詢中的過濾條件應當與連線條件同時成立
--檢視‘財務部’部門員工資訊?
SELECT *FROM DEPT WHERE DNAME='財務';
SELECT NAME,DNAME ,SALARY FROM EMP,DEPT WHERE EMP.DEPTNO =DEPT.ID
AND DEPT.DNAME='財務部';
------------------------------------------------------------------
--當查詢過程中出現欄位在兩張表中都有的情況,必須指明該欄位屬於哪張表
SELECT E.NAME,D.DNAME FROM EMP E,DEPT D WHERE   E.DEPTNO=D.ID
-----檢視平均工資高於2000的部門所在地
SELECT AVG(SALARY),D.DNAME  ,D.DLOCAL  FROM EMP E,DEPT D   WHERE E.DEPTNO=D.ID  
GROUP BY  D.DNAME,D.DLOCAL   HAVING AVG(SALARY)>2000;


--內連線
--關聯查詢的另一種寫法
--檢視銷售部的員工資訊
SELECT E.NAME,D.DNAME,D.ID FROM EMP E,DEPT D WHERE E.DEPTNO=D.ID
AND D.DNAME='銷售部'
----------------------------------------------------------------------------
SELECT E.NAME,D.DNAME ,D.ID FROM EMP E  INNER JOIN  DEPT D  ON E.DEPTNO=D.ID
WHERE D.DNAME='銷售部'
----------------------------------------------------------------------------
--外連線
--外連線在進行關聯查詢時可以將不滿足
--連線條件的記錄也查詢出來
--外連線分為:1、左外連線  2、右外連線 3、全外連線
--左外連線:以join 左側表作為驅動表,該表中所有的記錄全部會列出來,
--那麼當哪條記錄不滿足連線條件時,該記錄中來自右側表中的欄位的值為null
--左外連線
SELECT E.NAME ,D.DNAME FROM EMP E   LEFT OUTER JOIN DEPT D ON E.DEPTNO=D.ID;
--自連線
--自連線指的是自己表中的記錄對應自己表中
--多條記錄,建立的關聯查詢就是自連線
--自連線設計用於解決資料相同,但是存在上下級關係的樹狀結構使用
--檢視每個員工以及其上司的名字?

SELECT E.NAME,M.NAME FROM EMP E,EMP M   WHERE E.ID=M.ID
--檢視每個領導手下有多少人?
SELECT COUNT(1) FROM EMP E,EMP M WHERE E.MGR=M.ID  GROUP BY  M.NAME
--檢視lisi的上司在哪個城市工作?
SELECT D.DLOCAL   FROM EMP E,EMP M  ,DEPT D WHERE E.ID=M.ID
AND M.DEPTNO=D.ID
 AND E.NAME='lisi'
--自然連線
--a NATURAL join  b