mysql学习笔记4
本文主要学习了SELECT 中的子查询具体分类和实际案例以及GROUP BY和HAVING关键字的使用规则与场景
子查询
子查询:当需要查询的数据引用到的条件等是一个查询语句的结果,那么此时可以使用子查询
例如:
类似于,不局限于WHERE中
SELECT 字段 FROM 表
WHERE 条件(此条件内的数据为表内的某个数据)
(SELECT 字段 FROM 表名
...
...
)
外查询:外层的查询语句
内查询:内层的查询语句
内外层是相对内外层
内层在外层之前使用,外层使用内层的查询结果
单行子查询vs多行子查询
当查询结果为一行数据时为单行子查询,返回值为多行数据称为多行子查询
多行子查询
多行子查询也称为集合比较子查询(内查询中返回多行数据)
使用多行比较子查询
IN | ANY | ALL | SOME |
---|---|---|---|
列表中的任意一个 | 与子查询返回某个值带的比较 | 与子查询返回的所有值比较 | 与ANY相同 |
问题:查询某部门员工比“job_id=IT”部门中任一员工的工资低的所有员工的姓名,id,工资,job_id
代码示例
SELECT name,id,salary,job_id
FROM employees
WHERE job_id <> 'IT'
AND salary <ANY(
SELECT salary
FROM employees
WHERE job_id=‘IT’
);
问题:查询某部门员工比“job_id=IT”部门中所有员工的工资低的所有员工的姓名,id,工资,job_id
代码示例
SELECT name,id,salary,job_id
FROM employees
WHERE job_id <> 'IT'
AND salary < ALL (
SELECT salary
FROM employees
WHERE job_id=‘IT’
);
问题3:查询平均工资最低的部门
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)<= ALL
(SELECT AVG(salary) a
FROM employee
GROUP BY department_id );
相关子查询vs非相关子查询
相关子查询:具有相关性(如果子查询的执行过程使用到了外部的表,并执行关联条件,每查询一次都需要重新计算,这样的子查询称为关联子查询)
例如:查询某员工是否大于其所在部门的平均工资(有相关性)
SELECT name,salary,department_id
FROM employees e1
WHERE salary>(
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id='e1.department_id'
)
方式2:
SELECT e.name,e.salary,e.department_id
FROM employees e ,(SELECT department_id,AVG(salary) a
FROM employees
GROUP BY department_id) 别名
WHERE department_id=别名.department_id
AND e.salary>别名.a;
非相关子查询:子查询的结果与外层查询无关联性
例如:查询某员工工资是否大于公司工资平均值
在SELECT中除GROUP BY 于LIMIT 中的可以声明子查询
GROUP BY
将查询除的数据进行分组
代码示例
SELECT 字段
FROM 表名
GROUP BY 字段2(查询除的数据按照字段分组)
HAVING
数据过滤
当过滤条件中出现聚合函数需要用HAVING进行过滤
SELECT AVG(字段)
FROM 表名
HAVING AVG(字段)>0(此处为含有聚合函数的条件举例)
GROUP BY 字段2
剑谱最终页,无爱自然神