以下文章来源于何先振,责编小何

子查询指一个查询语句嵌套在另一个查询语句内部的查询,Mysql4.1开始引入。
如果我们要查谁的工资比Abel高?
方式一:先查出Able的工资,再拿他的工资筛选比他高的,需要写两条SQL完成。


方式二:自连接,多表连查一条SQL查出来。

方式三:子查询
括号里面的SQL是子查询也叫内查询。外面的SQL叫外查询或主查询。

注意:
子查询要写在括号内。
将子查询放在比较条件的右侧。
单行操作符对应单行子查询,多行操作符对应多行子查询。
例如:=号就是单行操作符号,对应着一条单行子查询。
角度1:从内查询返回的结果的条目数
单行子查询:子查询查出一条记录。
多行子查询:子查询查出多条记录。
角度2:内查询是否被执行多次
相关子查询:主查询和子查询有关系,被执行多次。
比如:相关子查询的需求:查询工资大于本部门平均工资的员工信息。子查询需要根据主查询的部门查询对应部门的平均工资,有多个部门子查询需要执行多次。
不相关子查询:主查询和子查询无关系,只执行一次。
比如:查询工资大于本公司平均工资的员工信息。子查询只需要查本公司平均工资的员工信息,公司只有一个只执行一次。
单行操作符:= 、!= 、>、>=、<、<=
子查询的编写技巧或者步骤:从里往外写 或者从外往里写
单行子查询的举例:
举例一:查询工资大于149号员工工资的员工的信息

举例二:查询job_id与141号员工相同,salary比143员工多的员工姓名,job_id和工资
先查141员工的job_id

然后再查,143员工的工资

然后在查询同时等于141员工的job_id和工资大于143员工的员工

举例三:查询公司工资最少的员工的last_name,job_id和salary
求最少的工资

求最少工资的员工的last_name,job_id,salary

举例四:查询与141号员工的manager_id和department_id相同的其他员工的employee_id,manager_id,department_id
从外往里写,先查询员工的employee_id,manager_id,department_id

再查141号员工manager_id

再查141号员工department_id

其他员工,不等于141,得到最终语句

联合查,两列合并查

子查询写在having中举例:
查询最低工资大于50号部门的最低工资的部门id和其他最低工资
先查询部门id和其他最低工资

最低工资大于50号部门的的最低工资

子查询写在查询语句中举例:
显示员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800的department_id相同,则location为"Canada",其余则为"USA"
先查询显示员工的employee_id,last_name和location。

然后查location_id为1800的department_id

然后写在case when中,查询出结果

子查询的空值的举例:
没有这个人

因为内查询没有,所以外层也查不到。不返回任何行

非法使用子查询的举例:
内查询,查出有多行

=属于单行操作符,用单行操作符,跟多行子查询就会报错,返回多条结果






