角度1:从内查询返回的结果的条目数
1,单行子查询 vs 多行子查询
单行子查询是指内查询返回单行单列结果(一个标量值),然后外查询可以使用单行比较运算符(如 =、>、<、>=、<=、<>)与这个值进行比较
sqlSELECT last_name,job_id,salary FROM employees WHERE job_id = ( SELECT job_id FROM employees WHERE employee_id = 141 ) AND salary > ( SELECT salary FROM employees WHERE employee_id = 143 );多行子查询是指内查询返回多行单列的结果集,外查询使用多行比较运算符 (如
IN、ANY、ALL)或EXISTS运算符与这个结果集进行比较筛选
sql#题目:返回其它job_id中比job_id为'IT_PROG'部门任一工资低的员工的员工号、 #姓名、job_id 以及salary SELECT employee_id,last_name,job_id,salary FROM employees WHERE job_id <> 'IT_PROG' AND salary < ANY ( SELECT salary FROM employees WHERE job_id = 'IT_PROG' ); #题目:返回其它job_id中比job_id为'IT_PROG'部门所有工资低的员工的员工号、 #姓名、job_id 以及salary SELECT employee_id,last_name,job_id,salary FROM employees WHERE job_id <> 'IT_PROG' AND salary < ALL ( SELECT salary FROM employees WHERE job_id = 'IT_PROG' );
角度2:内查询是否被执行多次
2,相关子查询 vs 不相关子查询
相关子查询:内层查询依赖外层查询 不相关子查询:内层查询不依赖外层查询
比如:相关子查询的需求:查询工资大于本部门平均工资的员工信息。 不相关子查询的需求:查询工资大于本公司平均工资的员工信息。
sql#回顾:查询员工中工资大于公司平均工资的员工的last_name,salary和其department_id #6.1 SELECT last_name,salary,department_id FROM employees WHERE salary > ( SELECT AVG(salary) FROM employees ); #题目:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id #方式1:使用相关子查询 SELECT last_name,salary,department_id FROM employees e1 WHERE salary > ( SELECT AVG(salary) FROM employees e2 WHERE department_id = e1.`department_id` ); #方式2:在FROM中声明子查询 SELECT e.last_name,e.salary,e.department_id FROM employees e,( SELECT department_id,AVG(salary) avg_sal FROM employees GROUP BY department_id) t_dept_avg_sal WHERE e.department_id = t_dept_avg_sal.department_id AND e.salary > t_dept_avg_sal.avg_sal #题目:查询员工的id,salary,按照department_name 排序 SELECT employee_id,salary FROM employees e ORDER BY ( SELECT department_name FROM departments d WHERE e.`department_id` = d.`department_id` ) ASC;3,子查询可以放的位置
a,子查询放在 FROM 中
sql#方式2:在FROM中声明子查询 SELECT e.last_name,e.salary,e.department_id FROM employees e,( SELECT department_id,AVG(salary) avg_sal FROM employees GROUP BY department_id) t_dept_avg_sal WHERE e.department_id = t_dept_avg_sal.department_id AND e.salary > t_dept_avg_sal.avg_salb,子查询放在 ORDDER BY 中
sql#题目:查询员工的id,salary,按照department_name 排序 SELECT employee_id,salary FROM employees e ORDER BY ( SELECT department_name FROM departments d WHERE e.`department_id` = d.`department_id` ) ASC; SELECT : 用于聚合函数 FROM : 用于查表操作 WHERE : 用于过滤操作,如进行条件分组 ORDER BY : 用于按照表进行排序操作 HAVING : 用于聚合函数,进行分组操作# 按照返回的部门名称进行排序
#结论:在SELECT中,除了GROUP BY 和 LIMIT之外,其他位置都可以声明子查询!
/*
SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT)JOIN ....ON 多表的连接条件
(LEFT / RIGHT)JOIN ... ON ....
WHERE 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....
*/