把一个查询的结果在另一个查询中使用就叫做子查询
特点
-
需要创建临时表,查询完毕后再删除这些临时表,而且做得笛卡尔积,所以查询慢
-
灵活
-
where子查询的相等判断只能有一条记录,否则会报:Subquery returns more than 1 row
-
where后的子查询只能有一个字段,否则报错:Operand should contain 1 column(s),
-
ntext、text 和 image 数据类型不能用在子查询的选择列表中
一、WHERE子查询
子查询+WHERE条件时:子查询只能返回一条数据(返回多条数据时无法判断会出错)
-- 括号里是子查询
select * from sys_user WHERE username = (SELECT username from sys_user where age = 23)
-- 子查询:括号里内容:求平均年龄,外面的查询:查询年龄大于平均年龄的结果
SELECT * FROM sys_user WHERE age < (select AVG(age) from sys_user)
二、FROM子查询
子查询+FROM条件时:子查询可以返回多条数据,但是子查询必须要添加别名才可以
SELECT * from (SELECT * FROM sys_user WHERE age = 22) as a
SELECT * from (SELECT * FROM sys_user WHERE age = 22) a
三、HAVING子查询:HAVING子句是对分组统计函数进行过滤的子句(需要和group结合使用)
SELECT * FROM sys_user GROUP BY age HAVING username = (SELECT username FROM sys_user WHERE id = 9)
四、WHERE + EXISTS子查询
EXISTS判断子查询是否成立(如果子查询成立返回true,不成立返回false),子查询返回true则执行外面的查询
SELECT * FROM sys_user WHERE EXISTS (SELECT * FROM sys_user WHERE id=9)
五、WHERE + NOT EXISTS子查询
和WHERE + EXISTS子查询相反(子查询成立则不执行外面的查询,子查询不成立则执行外面的查询)
SELECT * FROM sys_user WHERE NOT EXISTS (SELECT * FROM sys_user WHERE id=9)
六、子查询结果说明
-
标量子查询(结果集只有一行一列)
-
列子查询(结果集只有一列多行)
-
行子查询(结果集有一行多列)
-
表子查询(结果集一般为多行多列)
七、子查询和关联查询的区别
-
表关联的效率要高于子查询,因为子查询走的是笛卡尔积,子查询需要创建临时表,查询完毕后再删除这些临时表
-
表关联可能有多条记录,子查询只有一条记录
-
子查询很灵活
-
子查询可以嵌套在主查询中所有位置,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。