mysql学习笔记4(SELECT的子查询),HAVING,GROUP BY

mysql学习笔记4

本文主要学习了SELECT 中的子查询具体分类和实际案例以及GROUP BY和HAVING关键字的使用规则与场景

子查询

子查询:当需要查询的数据引用到的条件等是一个查询语句的结果,那么此时可以使用子查询
例如:

类似于,不局限于WHERE中
SELECT 字段 FROM 表
WHERE 条件(此条件内的数据为表内的某个数据)
                       (SELECT 字段 FROM 表名
                       ...
                       ...
                       )

外查询:外层的查询语句
内查询:内层的查询语句
内外层是相对内外层
内层在外层之前使用,外层使用内层的查询结果

单行子查询vs多行子查询

当查询结果为一行数据时为单行子查询,返回值为多行数据称为多行子查询

多行子查询

多行子查询也称为集合比较子查询(内查询中返回多行数据)
使用多行比较子查询

INANYALLSOME
列表中的任意一个与子查询返回某个值带的比较与子查询返回的所有值比较与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

剑谱最终页,无爱自然神

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值