SQL的子查询
一、什么是子查询?
子查询就是将一个查询的语句嵌套在另一个查询语句的条件中。即外层是的查询语句把嵌套在里面 的查询语句当作条件,嵌套在里面的查询语句查询出来的是结果。
例:以下语句显示如何在 SELECT 语句的[WHERE]子句中使用子查询来查找位于纽约( New York )的客户的销售订单
SELECT order_id, order_date, customer_id
FROM sales.orders
WHERE customer_id IN (
SELECT customer_id
FROM sales.customers
WHERE city = 'New York'
)
ORDER BY order_date DESC;
注意:WHERE条件查询的后面的 IN 的意思是只要满足在括号里面任何一个结果即可。若是IN是等号(=)的时候子查询返回的结果必须是唯一的,否则会报错的。
二、子查询嵌套子查询
子查询可以嵌套再另一个子查询中。SQL Server最多支持 32 个嵌套级别
例:
1.第一步,SQL Server执行以下子查询以获取品牌名称为 ‘上海永久’ 和 ‘凤凰’ 的品牌标识号列表:
SELECT brand_id
FROM production.brands
WHERE brand_name = '上海永久' OR brand_name = '凤凰'
2.第二步,SQL Server计算属于这些品牌的所有产品的平均价格
SELECT AVG (list_price)
FROM production.products
WHERE brand_id IN (1,2)
3.第三步,SQL Server查找价格高于 ‘上海永久’ 和 ‘凤凰’ 品牌的所有产品的平均定价的产品。
SELECT product_name, list_price
FROM production.products
WHERE list_price > (
SELECT AVG (list_price)
FROM production.products
WHERE brand_id IN (
SELECT brand_id
FROM production.brands
WHERE brand_name = '上海永久' OR brand_name = '凤凰'
)
)
ORDER BY list_price
三、SQL Server相关子查询
相关子查询是使用外部查询的值的[子查询]。换句话说,它取决于外部查询的值。由于这种依赖 性,相关子查询不能作为简单子查询独立执行。此外,对外部查询评估的每一行重复执行一次相 关子查询。相关子查询也称为重复子查询。
例:
SELECT product_name, list_price, category_id
FROM production.products p1
WHERE list_price IN (
SELECT MAX (p2.list_price)
FROM production.products p2
WHERE p2.category_id = p1.category_id
GROUP BY p2.category_id
)
ORDER BY category_id, product_name
四、SQL Server Exists运算符
EXISTS 运算符是一个逻辑运算符,用于检查子查询是否返回任何行。 如果子查询返回一行或多行, 则 EXISTS 运算符返回 TRUE 。
SQL Server EXISTS 运算符的语法:EXISTS ( subquery)
在此语法中,子查询仅是 SELECT 语句。子查询返回行后, EXISTS 运算符返回 TRUE 并立即停止处理。请注意,即使子查询返回 NULL 值, EXISTS 运算符也会计算为 TRUE
例:例返回 customers 表中的所有行
SELECT customer_id, first_name, last_name
FROM sales.customers
WHERE EXISTS (SELECT NULL)
ORDER BY first_name, last_name
在此示例中,子查询返回包含 NULL 的结果集,这也导致 EXISTS 运算符计算为 TRUE 。
五、SQL Server Any运算符
ANY 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值集进行比较。
ANY 运算符的语法: scalar_expression comparison_operator ANY (subquery)
在上面语法中,scalar_expression - 是任何有效的表达式。 comparison_operator - 是任何比较运算符,包括等于( = ),不等于( <> ),大于( > ),大于或等于 ( >= ),小于( < ),小于或等于( <= )。 subquery 是一个[SELECT]语句,它返回单个列的结果集,其数据与标量表达式的数据类型相同。
例:
SELECT product_name, list_price
FROM production.products
WHERE product_id = ANY (
SELECT product_id
FROM sales.order_items
WHERE quantity >= 2
)
ORDER BY product_name
六、SQL Server All运算符
SQL Server ALL 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值列表进行比较。
ALL 运算符语法:scalar_expression comparison_operator ALL ( subquery)
在上面语法中,scalar_expression 是任何有效的表达式。 comparison_operator 是任何有效的比较运算符,包括等于( = ),不等于( <> ),大于( > ),大于或等于( >= ),小于( < ),小于或等于( <= )。
括号内的子查询( subquery )是一个[SELECT]语句,它返回单个列的结果。 此外,返回列的数据类型必须与标量表达式的数据类型相同。
例:
SELECT product_name, list_price
FROM production.products
WHERE list_price > ALL (
SELECT AVG (list_price) avg_list_price
FROM production.products
GROUP BY brand_id
)
ORDER BY list_price