添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
把一个查询的结果在另一个查询中使用就叫做子查询
特点
  • 需要创建临时表,查询完毕后再删除这些临时表,而且做得笛卡尔积,所以查询慢
  • 灵活
  • 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。