??? 子查詢是指在其它的SQL語句中的SELECT語句,也叫嵌套查詢。但是,當在DDL語句中引用子查詢時,可以帶有ORDER BY子句;在WHERE子句,SET字句中不能帶有ORDER BY子句。subQuery具有以下的一些作用:
??? →? 同坐在INSERT或CREATE TABLE語句中使用subQuery,可以將原表數據插入到目標表中。
??? →? 通過在CAREATE VIEW或CREATE MATERIALIZED VIEW中使用subQuery,可以定義視圖或者實例化視圖所對應的SELECT語句。
??? →?? 通過在UPDATE語句中使用subQuery可以修改一列或者多列數據。
????→?? 在WHERE,HAVING,START WITH子句中可以使用subQuery,可以提供條件值。
一般來說根據返回的結果不同,subQuery被分為單行subQuery,多行subQuery和多列subQuery。
單行subQuery: 只返回一行數據的subQuery。例如:
?SELECT name,salary,deptno, FROM employee WHERE deptno =(SELECT deptno FROM employee WHERE name ='antsoul');
多行subQuery:返回多行數據的subQuery。當在WHERE子句中使用的時候,必須使用多行比較符。(IN,ALL,ANY) ?例如:
使用IN:
SELECT name,job,salary,deptno FROM employee WHERE job IN (SELECT distinct job FROM employee WHERE deptno = 10);
使用ALL:
SELECT name,salary,deptno FROM employee WHERE salary > ALL(SELECT salary? FROM employee WHERE deptno = 30);
使用ANY:
SELECT name,salary,deptno FORM employee WHERE salary >ANY(SELECT salary FOMR employee WHERE deptno =30);
多列subQuery:當多列subQuery在WHERE子句中使用時候,必須運用多行比較符(IN,ALL,ANY)。例如:
顯示與antsoul部門和崗位完全相同的職員。
SELECT name,job,salary,deptno FROM employee WHERE (deptno,job) = (SELECT deptno,job FORM employee WHERE name ='antsoul');
相關subQuery: 需要引用主查詢表列的子查詢語句,相關子查詢是通過關鍵字EXISTS來實現的。例如:
顯示工作在“ShangHai ” 的所有職員。
SELECT name,job FORM employee WHERE EXISTS(SELECT 1 FROM dept WHERE deptno = emp.deptno AND dept.loc = 'ShangHai');