Subquery 子查询可以嵌套在select,where,from语句中
Subquery 子查询解决query依赖问题
-子查询能嵌套在Select,insert,update,or delete 语句中或者其他的子查询语句里面,也就是所谓的嵌套。子查询支持32层嵌套。
-子查询也可以使用>< OR =在 IN ANY ALL字查询语句里面
总体来说,以下情况都可以使用子查询:
用where的语句,来说一下outer query 和 inner query:
两个表格,一个关于销售的订单,一个关于销售的顾客信息。
代码如下,黄色区域是子查询,使用子查询要把子查询代码用括号括起来。
单独输入子查询,得到的结果如下,只会显示顾客的ID信息:
SQL在执行语句的时候,先是将子查询的信息提取出来,然后在执行外部查询得到最后结果。
推荐下面这个网站,讲到了如何嵌套三个语句在一起。
https://www.sqlservertutorial.net/sql-server-basics/sql-server-subquery/www.sqlservertutorial.netThe Ultimate Guide To SQL Server Subquery
https://www.sqlservertutorial.net/sql-server-basics/sql-server-subquery/www.sqlservertutorial.net来个图解,w3resources.com 看看执行语句的顺序吧,感觉十分清楚~
IN的基本语句结构:
SELECT column-names
FROM table-name1
WHERE value IN (SELECT column-name
FROM table-name2
WHERE condition)
ANY 的基本语句结构:
SELECT column-names
FROM table-name
WHERE column-name operator ANY
(SELECT column-name
FROM table-name
WHERE condition)
ANY 语句的例子:
SELECT ProductName
FROM Product
WHERE Id = ANY
(SELECT ProductId
FROM OrderItem
WHERE Quantity = 1)
ALL 的语句结构:
SELECT column-names
FROM table-name
WHERE column-name operator ALL
(SELECT column-name
FROM table-name
WHERE condition)
ALL的语句例子:
SELECT DISTINCT FirstName + ' ' + LastName as CustomerName 选择姓名为新的一列
FROM Customer, [Order]
WHERE Customer.Id = [Order].CustomerId 匹配两个表中的ID相同
AND TotalAmount > ALL 列出订单金额大于平均数的顾客姓名
(SELECT AVG(TotalAmount)
FROM [Order]
GROUP BY CustomerId
结果:
(插一嘴,关于虚拟列与实际列的区别
Virtual : 值不是实际存储的,每次读取动作时候会被计算
Stored : 值是实际存储的,值是在插入或者更新的时候被更新的)