子查询

一般而言在一个查询中,可以嵌套另一个查询,即在一个SELECT查询内在嵌入另一个SELECT查询 ,外层的SELECT语句较外部查询,内层的SELECT语句叫子查询,子查询可以嵌套多层,但每层需要用“()”括起来,子查询可以用在SELECT语句中,还可以用在INSERT,UPDATE,DELETE语句中 .子查询是一个完整的的SELECT语句,是其他SOL语句的一部分,大部分子查询是在SELECT语句的WHERE字句中实现的,也可以放在FROM字句中当虚拟表。

示例数据表如图:

departments表:

子查询中怎么去重统计 mysql 子查询select_数据

employees表:

子查询中怎么去重统计 mysql 子查询select_数据_02

1.单行子查询

指子查询单列单行数据,即只返回一个值,也可以成为单值子查询。可以使用运算符=,>,<,<=,>=,<>,经常用在SELECT,UPDATE,DELETE语句的WHERE字句中充当条件。

eg:查询在销售部工作的员工信息。

子查询中怎么去重统计 mysql 子查询select_多列_03

子查询中怎么去重统计 mysql 子查询select_子查询_04

eg2:查询工资低于平均工资的雇员信息。

子查询中怎么去重统计 mysql 子查询select_子查询_05

   

子查询中怎么去重统计 mysql 子查询select_多列_06

 

 2.多行子查询

指子查询返回单列多行查询,即一组数据。当子查询是单列多行子查询时,必须使用多行比较运算符,包括IN,NOT IN ,ANY,ALL,SOME.IN 和NOT IN 可以独立使用,但ANY,和ALL必须与单行运算符组合起来使用:

<ANY:表示小于任何一个,即小于最大值即可。

=ANY:表示等于任何一个,与IN相似。

>ANY:表示大于任何一个,即大于最小值即可。

<ALL:表示小于所有值,即小于最小值。

>ALL:表示大于所有值,即大于最大值。

3.多列子查询

多列子查询获得的是多列任意行数据,当多列子查询返回当行数据时相当于单行子查询使用单行运算符(>,<,=等),返回多行数据时,在WHERE子句必须使用多行比较符(IN,NOT IN,ALL,ANY等)

eg:利用emp表查询编号为7369的雇员的部门和工作岗位完全相同的所有雇员。(成对比较)

子查询中怎么去重统计 mysql 子查询select_数据_07

使用子查询比较多列时,既可以使用成对比较也可以使用非成对比较 。成对比较要求多个列的数据必须同时匹配,非成对比较则不要求多个列的数据同时匹配,此时是单独写得查询条件,各个条件之间是必须独立的。

eg:利用emp表查询编号为7369的雇员的部门和工作岗位完全相同的所有雇员。(非成对比较)

子查询中怎么去重统计 mysql 子查询select_子查询中怎么去重统计 mysql_08

4.相关子查询

内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。

执行过程:

  • 从外部查询中取出一个元组,将元组相关列的值传给内层查询。
  • 执行内层查询,得到子查询操作的值
  • 外查询根据子查询返回的结果或结果集得到满足的条件的行。
  • 然后外层查询取下一个元组重复上述步骤,直到外层的元组全部处理完毕。

eg1:查询所有部门人数

语句1:连接查询

子查询中怎么去重统计 mysql 子查询select_数据_09

子查询中怎么去重统计 mysql 子查询select_子查询中怎么去重统计 mysql_10

eg2:相关子查询

子查询中怎么去重统计 mysql 子查询select_数据_11

 

子查询中怎么去重统计 mysql 子查询select_子查询_12

eg2:查询各部门的部门号,部门名和平均工资。

语句1:连接查询

子查询中怎么去重统计 mysql 子查询select_子查询_13

子查询中怎么去重统计 mysql 子查询select_子查询_14

语句2:相关查询

子查询中怎么去重统计 mysql 子查询select_子查询中怎么去重统计 mysql_15

:

子查询中怎么去重统计 mysql 子查询select_多列_16

 

 eg3:查询在北京工作的员工信息

语句1:连接查询

子查询中怎么去重统计 mysql 子查询select_多列_17

子查询中怎么去重统计 mysql 子查询select_子查询_18

 

语句2:IN

子查询中怎么去重统计 mysql 子查询select_子查询_19

子查询中怎么去重统计 mysql 子查询select_多列_20

eg4:带EXISTS的相关子查询

是通过EXISTS运算符实现的查询,EXISTS用于测试子查询的结果是否为空,如果子查询的结果不为空,则EXISTS发挥TRUE,否则返回false,与EXSITS相对应的有EXISTS.

 

子查询中怎么去重统计 mysql 子查询select_数据_21

 

子查询中怎么去重统计 mysql 子查询select_数据_22