子查询
子查询
子查询,就是在一个查询中嵌套了其他若干查询,即在一个
子查询本质上是嵌套进其他
子查询本质上是嵌套进其他
SELECT 子句( 必须) FROm 子句( 必选) WHERE 子句( 可选) GROUp BY( 可选) HAVING( 可选)
子查询也可以嵌套在其他子查询中,子查询也叫内部查询
子查询作为数据源使用
当子查询在外部查询的
SELECT
p.product_id,
p.name,
p.product_number,
m.name AS product_model_name
FROm
production.product AS p
INNER JOIN
(SELECT name, product_model_id FROm production.product_model) AS m
ON p.product_model_id = m.product_model_id
上述子查询语句将

作为数据源使用也是子查询最简单的应用。当然,当子查询作为数据源使用时,也分为相关子查询和无关子查询。
当子查询在外部查询的
子查询作为查询条件使用
作为选择条件的子查询也是子查询相对最复杂的应用。作为选择条件的子查询是那些只返回一列
SELECT [first_name]
,[middle_name]
,[last_name]
FROm [adventure_works].[person].[contact]
WHERE contact_id IN
(SELECT employee_id
FROm [adventure_works].[human_resources].[employee]
WHERE sick_leave_hours>68)
结果如下:

上面的查询中,在
SELECT [first_name]
,[middle_name]
,[last_name]
FROm [adventure_works].[person].[contact]
WHERE contact_id IN (25,33)
只有在上面这种情况下,使用
SELECT [first_name]
,[middle_name]
,[last_name]
FROm [adventure_works].[person].[contact]
WHERE contact_id =ANY
(SELECT employee_id
FROm [adventure_works].[human_resources].[employee]
WHERE sick_leave_hours>68)
作为选择条件的子查询也是子查询相对最复杂的应用。作为选择条件的子查询是那些只返回一列
SELECT
*
FROm
product
WHERE
price > (
SELECT
price
FROm
product
WHERE
name = "产品一"
)
子查询作为计算列使用
当子查询作为计算列使用时,只返回单个值
SELECT [Name],
(SELECT COUNT(*) FROm adventure_works.Sales.SalesOrderDetail S
WHERE S.product_id=p.product_id) AS SalesAmount
FROm [adventure_works].[production].[product] p
当子查询作为计算列使用时,只返回单个值
--- 查询每个类别中价格大于某个值的产品数目
SELECT
p1.category,
(
SELECT
count(*)
FROm
product p2
WHERE
p2.category = p1.category
AND p2.price > 30
) AS 'Expensive'
FROm
product p1
GROUp BY
p1.category;
--- 自连接查询不同等级的数目
SELECT a.distributor_id,
(SELECT COUNT(*) FROm my_table WHERE level='personal' and distributor_id = a.distributor_id) as personal_count,
(SELECT COUNT(*) FROm my_table WHERE level='exec' and distributor_id = a.distributor_id) as exec_count,
(SELECT COUNT(*) FROm my_table WHERE distributor_id = a.distributor_id) as total_count
FROm my_table a ;