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、括號,改變執行順序