嵌套在其他查询中的查询叫子查询
-
使用到 WHERE 子句中时,子查询必须用括号括起来。
-
子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
-
子查询返回多于一行时,只能与多值运算符一起使用,如 IN 运算符。
-
子查询与可以 SELECT , UPDATE , INSERT , DELETE 一直使用。
作为条件
子查询做为条件时,从内往外执行。
SELECT name FROM artists WHERE ArtistId IN (
SELECT DISTINCT ArtistId FROM albums GROUP BY ArtistId HAVING count(*)>4 -- 查找记录数大于 4 的 ArtistId
)
- 子查询只返回了一列。
INSERT INTO albums_bak
select * from albums
;
- 子查询没有使用到 WHERE 条件中,所以不需要使用 ()。
- 该功能相当于把 albums 中的数据完全复制到 albums_bak 表中。
- 可以在复制的时候指定两个表的列的对应关系。
INSERT INTO albums_bak(AlbumId,Title,ArtistId)
select ArtistId,Title,AlbumId from albums
;
- 按上述语句,albums 表中的 ArtistId 值会存储到 albums_bak 的 AlbumId 字段中。
作为返回列
子查询也可做为返回列。作为返回列,子查询从外往内执行。
作为返回列时,需要使用 () 括赶来。
SELECT ArtistId, name,(SELECT COUNT(*) FROM albums WHERE albums.[ArtistId] = artists.[ArtistId]) AS num FROM artists;
首先会从 artists 表中检索出每一行,将每行的 ArtistId 传入内层 SELECT语句中,再执行内层的 SELECT,并将结果做为外层的一列结果值返回。
网友评论