子查询是指在其它的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');