SQL 基礎--> 子查詢
--=========================
--SQL 基礎--> 子查詢
--=========================
/*
一、子查詢
子查詢就是位於SELECT、UPDATE、或DELETE語句中內部的查詢
二、子查詢的分類
單行子查詢
返回零行或一行
多行子查詢
返回一行或多行
多列子查詢
返回多列
相關子查詢
引用外部SQL語句中的一列或多列
巢狀子查詢
位於其它子查詢中的查詢
三、子查詢語法 */
SELECT select_list
FROM table
WHERE expr operator
(SELECT
FROM table);
/*
子查詢(內部查詢)在執行主查詢之前執行一次
然後主查詢(外部查詢)會使用該子查詢的結果
四、子查詢的規則
將子查詢括在括號中
將子查詢放置在比較條件的右側
只有在執行排序Top-N分析時,子查詢中才需要使用ORDER BY 子句
單行運算子用於單行子查詢,多行運算子用於多行子查詢
五、單行子查詢
僅返回一行
使用單行的表較運算子:= ,>, >= ,< , <= ,<>
在WHERE 子句中使用子查詢*/
SQL> select ename,job from
2where empno = (
3select empno from emp
4where mgr = 7902 );
ENAMEJOB
---------- ---------
SMITHCLERK
--使用分組函式的子查詢
SQL> select ename,job,sal
2from emp
3where sal >
4(select avg(sal) from emp);
ENAMEJOBSAL
---------- --------- ----------
JONESMANAGER2975
BLAKEMANAGER2850
CLARKMANAGER2450
SCOTTANALYST3000
KINGPRESIDENT5000
FORDANALYST3000
--在HAVING子句中使用子查詢
SQL> select deptno,min(sal)
2from emp
3group by deptno
4 having min(sal) >
5(select min(sal)
6from emp
7where deptno = 20);
DEPTNOMIN(SAL)
---------- ----------
30950
101300
--在FROM 子句中使用子查詢
SQL> select empno,ename
2from
3(select empno,ename
4from emp
5where deptno = 20);
EMPNO ENAME
---------- ----------
7369 SMITH
7566 JONES
7788 SCOTT
7876 ADAMS
7902 FORD
--單行子查詢中的常見錯誤
--子查詢的結果返回多於一行
SQL> select empno,ename
2from emp
3where sal =
4(select sal
5from emp
6where deptno = 20);
(select sal
*
ERROR at line 4:
ORA-01427: single-row subquery returns more than one row
--子查詢中不能包含ORDER BY子句
SQL> select empno,ename
2from emp
3where sal >
4(select avg(sal)
5from emp
6order by empno);
order by empno)
*
ERROR at line 6:
ORA-00907: missing right parenthesis
--子查詢內部沒有返回行,如下語句可以正確執行,但沒有資料返回
SQL> select ename,job
2from emp
3where empno =
4(select empno
5from emp
6where mgr = 8000);
no rows selected
/*
六、多行子查詢
返回多個行
使用多行比較運算子IN ,ANY ,ALL
在多行子查詢中使用IN 操作符*/
SQL> select empno,ename,job
2from emp
3where sal in
4(select max(sal)
5from emp
6group by deptno);
EMPNO ENAMEJOB
---------- ---------- ---------
7698 BLAKEMANAGER
7902 FORDANALYST
7788 SCOTTANALYST
7839 KINGPRESIDENT
--在多行子查詢中使用ANY 操作符
SQL> select empno,ename,job
2from emp
3where sal < any
4(select avg(sal)
5from emp
6group by deptno);
EMPNO ENAMEJOB
---------- ---------- ---------
7369 SMITHCLERK
7900 JAMESCLERK
7876 ADAMSCLERK
7521 WARDSALESMAN
7654 MARTINSALESMAN
7934 MILLERCLERK
7844 TURNERSALESMAN
7499 ALLENSALESMAN
7782 CLARKMANAGER
7698 BLAKEMANAGER
--在多行子查詢中使用ALL 操作符
SQL> select empno,ename,job
2from emp
3where sal > all
4(select avg(sal)
5from emp
6*group by deptno)
EMPNO ENAMEJOB
---------- ---------- ---------
7566 JONESMANAGER
7788 SCOTTANALYST
7839 KINGPRESIDENT
7902 FORDANALYST
/*
七、相關子查詢
子查詢中使用了主查詢中的某些欄位,主查詢每掃描一行都要執行一次子查詢 */
--查詢工資高於同一部門的員工的部門號,姓名,工資
SQL> select deptno,ename,sal
2from emp outer
3where sal >
4(select avg(sal)
5from emp inner
6where inner.deptno = outer.deptno);
DEPTNO ENAMESAL
---------- --