1. 程式人生 > >SQL 基礎--> 子查詢

SQL 基礎--> 子查詢

--=========================

--SQL 基礎--> 子查詢

--=========================

/*

一、子查詢

子查詢就是位於SELECTUPDATE、或DELETE語句中內部的查詢

二、子查詢的分類

單行子查詢

返回零行或一行

多行子查詢

返回一行或多行

多列子查詢

返回多列

相關子查詢

引用外部SQL語句中的一列或多列

巢狀子查詢

位於其它子查詢中的查詢

三、子查詢語法 */

SELECT select_list

FROM table

WHERE expr operator

(SELECT

select_list

FROM table);

/*

子查詢(內部查詢)在執行主查詢之前執行一次

然後主查詢(外部查詢)會使用該子查詢的結果

四、子查詢的規則

將子查詢括在括號中

將子查詢放置在比較條件的右側

只有在執行排序Top-N分析時,子查詢中才需要使用ORDER BY 子句

單行運算子用於單行子查詢,多行運算子用於多行子查詢

五、單行子查詢

僅返回一行

使用單行的表較運算子:= ,>, >= ,< , <= ,<>

WHERE 子句中使用子查詢*/

SQL> select ename,job from

emp

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

---------- --