SELECT select_list
FROM table
WHERE expro perator (SELECT select_list
FROM table);
你可以将子查询放在许多的 SQL 子句中,包括:
:: WHERE 子句
:: HAVING 子句
:: FROM 子句
比较条件分为两个种类:单行运算符 (>, =, >=, <, <>, <=) 从内 SELECT 语句只返回一行的查询
多行运算符 (IN, ANY, ALL)。从内 SELECT 语句返回多行的查询
子查询可以被放在 CREATE VIEW 语句中、CREATE TABLE 语句、UPDATE 语句、INSERT 语句的 INTO 子句和 UPDATE 语句的 SET 子句中。
首先执行子查询 (内查询) 显示子查询返回的值,然后用内查询返回的结果执行外查询,最后,执行整个查询 (包括子查询),显示相同的结果。
外和内查询可以从不同的表中取得数据。
・子查询错误
单行运算符用于多行子查询
eg:
select employee_id,last_name
from employees
where salary= //把=改成IN
(select min(salary)
from employees
group by department_id);
・子查询问题,语句正确
eg:
select last_name,job_id
from employees
where job_id=
(select job_id
from employees
where last_name='Haas');
no rows selected //子查询无返回值
如果job存在null值,也没有返回行,因为比较两个空值还是空,因此where子句的条件不为true.
■多行子查询
操作 含义
IN 等于列表中的任何成员
ANY 比较子查询返回的每个值
ALL 比较子查询返回的全部值
ANY 意思是大于最小值。 =ANY 等同于 IN。 当使用 SOME 或者 ANY 时,通常用 DISTINCT 关键字防止返回被多次选择的行。
NOT 运算符可以与 IN、ANY 和 ALL 运算符一起使用。
eg:
select emp.last_name
from employees emp
where emp.employee_id not in
(select mgr.manager_id
from employees mgr);
no rows selected
只要空值可能是子查询结果集的一部分,就不能用 NOT IN 运算符。NOT IN 运算符相当于 <> ALL。
注意到空值作为一个子查询结果集的一部分,如果你使用 IN 操作符的话,不是一个问题。IN 操作符相当于 =ANY。
eg:为了显示有下属的雇员 (即经理) 使用下面的SQL 语句:
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id IN
(SELECT mgr.manager_id
FROM employees mgr);
作为选择,WHERE 子句也可以被指定在子查询中,以显示所有没有下属的雇员:
SELECT last_name FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL);