1. 程式人生 > >Oracle常用sql語句(三)之子查詢

Oracle常用sql語句(三)之子查詢

子查詢

子查詢要解決的問題,不能一步求解

分為:
- 單行子查詢
- 多行子查詢

語法:

    SELECT select_list
    FROM table
    WHERE expr operator (SELECT select_list
                         FROM   table);
  • 子查詢(內查詢)在住查詢之前一次執行完成
  • 子查詢的記過被主查詢使用(外查詢)

注意:
1.括號
2.合理的書寫風格
3.可以在住查詢的 WHERE SELECT HAVING FROM 後面使用子查詢
4.不可以在GROUP BY 後面使用
5.強調FROM後面的子查詢
6.主查詢和子查詢可以不是同一張表;只用子查詢返回的結果,主查詢可以使用即可
7.一般不在子查詢中排序;但在top-n分析問題中
8.一般先執行子查詢,在執行主查詢;但相關子查詢例外
9.單行子查詢只能使用單行操作符;多行子查詢只能使用多行子查詢
10.子查詢中的null:單行的子查詢,多行子查詢

解釋:
–5、強調from後面的子查詢
查詢員工資訊:員工號 姓名 月薪

SELECT
    * 
FROM
    ( SELECT empno, ename, sal FROM emp );

查詢員工資訊:員工號 姓名 月薪 年薪

SELECT
    * 
FROM
    (
SELECT
    empno,
    ename,
    sal,
    sal * 12 annsal 
FROM
    emp)

–6、主查詢和子查詢可以不是同一張表;只有子查詢返回的結果 主查詢可以使用 即可
查詢部門名稱是SALES的員工

SELECT
    * 
FROM
emp WHERE deptno = ( SELECT deptno FROM dept WHERE dname = 'SALES' );

–7.一般不在子查詢中排序;但在top-n分析問題中

– 找到員工表中工資最高的三名員工

SELECT
    empno,
    ename,
    sal 
FROM
    ( SELECT * FROM emp ORDER BY sal DESC ) 
WHERE
    ROWNUM < 4

8.一般先執行子查詢,在執行主查詢;但相關子查詢例外

相關子查詢:
– 找到員工表中薪水大於本部門平均薪水的員工

-- 一般方法
SELECT
    e.ename,
    e.sal,
    e.deptno,
    d.avgsal 
FROM
    emp e,
    ( SELECT deptno, AVG( sal ) avgsal FROM emp GROUP BY deptno ) d 
WHERE
    e.deptno = d.deptno 
    AND e.sal > d.avgsal

-- 相關子查詢
SELECT
    empno,
    ename,
    sal,
    ( SELECT avg( sal ) FROM emp WHERE deptno = e.deptno ) avgsal 
FROM
    emp e 
WHERE
    sal > (SELECT avg( sal ) 
           FROM  emp 
           WHERE deptno = e.deptno)

10.子查詢中的null
in關鍵字中可以有null
not in 中有null就會查不到資料原因如下

  • not in 等同於 <>ALL

集合運算

這裡寫圖片描述

INTERSECT(交集),返回兩個查詢共有的記錄。

UNION ALL(並集),返回各個查詢的所有記錄,包括重複記錄。

UNION(並集),返回各個查詢的所有記錄,不包括重複記錄。

MINUS(補集),返回第一個查詢檢索出的記錄減去第二個查詢檢索出的記錄之後剩餘的記錄。

注意的問題:
1、參與運算的各個集合必須列數相同 且型別一致(列數不夠可以用,to_number(null)、to_char(null)等去填充
2、採用第一個集合作為最後的表頭
3、order by永遠在最後
4、括號,改變執行順序