#进阶八:子查询/*含义: 出现在其他语句中的select语句,成为子查询或内查询 外部的查询语句,成为主查询或外查询分类: 按子查询出现的位置: select后面: 支持标量子查询 from后面: 支持表子查询 where或having后面:(***) 支持标量子查询(*) 列子查询(*) 行子查询 exists后面(相关子查询): 表子查询 按结果集的行列数不同: 标量子查询(结果集只有一行一列) 列子查询(结果集只有一列多行) 行子查询(结果有一行多列) 表子查询(结果集一般为多行多列)*/#一:where或having后面 #1.标量子查询 #2.列子查询 #3.行子查询/* 特点: 1.子查询放在小括号内 2.子查询一般放在条件的右侧 3.标量子查询,一般搭配着单行操作符使用 > < >= <= = <> 列子查询,一般搭配着多行操作符使用 in/not in:等于(不等于)列表中的任意一个 any\some:和子查询返回的某一个值比较 all:和子查询返回的所有值比较 4.子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果*/#案例一:查询谁的工资比Abel高SELECT *FROM employeesWHERE salary>( SELECT salary FROM employees WHERE last_name='Abel');#案例二:查询最低工资大于50号部门最低工资的部门ID和其最低工资SELECT MIN(salary),department_idFROM employeesGROUP BY department_idHAVING MIN(salary)>( SELECT MIN(salary) FROM employees WHERE department_id=50);#二:列子查询#案例一:返回location_id是1400或1700的部门中的所有员工姓名SELECT last_nameFROM employeesWHERE department_id IN( SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400,1700));#三:行子查询(结果集是一行多列或多行多列)#案例一:查询员工编号最小并且工资最高的员工信息SELECT *FROM employeesWHERE (employee_id,salary)=( SELECT MIN(employee_id),MAX(salary) FROM employees);#二:select后面#案例一:查询每个部门的员工数SELECT d.*,( SELECT COUNT(*) FROM employees e WHERE e.department_id=d.`department_id`) 个数FROM departments d;#三:from后面/*将子查询结果充当一张表,要求必须起别名*/#案例一:查询每个部门的平均工资的工资等级SELECT ag_dep.*,g.`grade_level`FROM( SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id) ag_depINNER JOIN job_grades gON ag_dep.ag BETWEEN lowest_sal AND highest_sal;#四:exists后面(相关子查询)/*先执行外查询,后执行内查询语法:exists(完整的查询语句)结果:1或0*/#案例一:查询有员工的部门名SELECT department_nameFROM departments dWHERE EXISTS( SELECT * FROM employees e WHERE d.`department_id`=e.`department_id`);