1. 单行子查询最多只能返回一行;子查询不能包含ORDER BY子句,任何排序都必须在外部查询中完成。
2. 多行子查询
要处理返回多行记录的子查询,外部查询可以使用IN、ANY或ALL操作符。
1) 在多行子查询中使用IN操作符
含义:IN可以用来检查在一个值列表中是否包含指定的值。
例: SELECT product_id,name FROM products
WHERE product_id IN
(SELECT product_id FROM products
WHERE name LIKE '%e%');
2) 在多行子查询中使用ANY操作符
含义: ANY可以用来将一个值与一个列表中的任何值进行比较,在查询中ANY操作符之前必须使用一个=、<>、、<=或>=操作符。
例: SELECT employee_id,last_name FROM employees
WHERE salary < ANY
(SELECT low_salary FROM salary_grades);
3) 在多行子查询中使用ALL操作符
含义:ALL操作符可以用来将一个值与一个列表中的所有值进行比较。在查询中ALL操作符之前必须使用一个=、<>、、<=或>=操作符。
例: SELECT employee_id,last_name FROM employees
WHERE salary > ALL
(SELECT high_salary FROM salary_grades);
3. 关联子查询
1) 注:当问题的答案需要依赖于外部查询中包含的每一行的值时,通常就需要使用关联子查询。关联子查询对于外部查询中的每一行都会运行一次,这与非关联子查询是不同的(非关联子查询只在运行外部查询之前运行一次);关联子查询可以解决空值问题。
例: 检索那些价格高于同类产品平均价格的产品。
SELECT product_id,product_type_id,name,price
FROM products outer
WHERE price >
(SELECT AVG(price)
FROM products inner
WHERE inner.product_type_id = outer.product_type_id);
FROM products outer
WHERE price >
(SELECT AVG(price)
FROM products inner
WHERE inner.product_type_id = outer.product_type_id);
2) 在关联子查询中使用EXISTS和NOT EXISTS
1. 使用EXISTS
注:EXISTS并不关心自查新返回多少行,而只关心子查询是否返回任何行。
例: 检索那些负责管理其他员工的员工记录:
SELECT employee_id,last_name
FROM employees outer
WHERE EXISTS
(SELECT 1
FROM employees inner
WHERE inner.manager_id = outer.employee_id);
FROM employees outer
WHERE EXISTS
(SELECT 1
FROM employees inner
WHERE inner.manager_id = outer.employee_id);
2. 使用NOT EXISTS
例: 检索从未卖出的产品:
SELECT product_id,name
FROM products outer
WHERE NOT EXISTS
(SELECT 1
FROM purchases inner
WHERE inner.product_id = outer.product_id);
FROM products outer
WHERE NOT EXISTS
(SELECT 1
FROM purchases inner
WHERE inner.product_id = outer.product_id);
3) EXISTS和NOT EXISTS与IN和NOT IN的比较
1. EXISTS只是检查行的存在性,而IN则要检查实际值的存在性。通常来讲,EXISTS的性能都比IN高,应尽可能地使用EXISTS,而不是IN。
2. 当一个值列表包含一个空值时,NOT EXISTS返回true,而NOT IN则返回false。即关联子查询可以解决空值问题。
4. 嵌套子查询
在子查询内部可以嵌套其它子查询,在编程时应尽量少用嵌套子查询的技术,因为使用表连接时,查询的性能可能会更高。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17014649/viewspace-605078/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17014649/viewspace-605078/