MYSQL(DQL数据查询语言下)

前言

今天为大家分享的是DQL数据查询语言的后续部分知识点,
上一篇博客已经分享了DQL数据查询语言的概念、特点、
基本的SELECT语句、过滤和排序数据以及分组查询!

DQL前文:DQL数据查询语言前文部分

分组查询

(一)、过滤分组Having 子句

1、语法: select 查询列表 from 表 【where 筛选条件】 group by 分组的字段 【order by 排序的字段】;

2、特点:

1、和分组函数一同查询的字段必须是group by后出现的字段

2、筛选分为两类:分组前筛选和分组后筛选

分组前筛选 分组后筛选
针对的是原始表 针对的是group by后的结果集
where关键字 having关键字

3、分组前筛选:

案例1:查询邮箱中包含a字符的 每个部门的最高工资

SELECT MAX(salary),department_id
FROM t_mysql_employees
WHERE email LIKE '%a%'
GROUP BY department_id;

结果:
在这里插入图片描述
案例2:延伸案例1,得出以下结论!

SELECT MAX(salary),manager_id,department_id
FROM t_mysql_employees
WHERE email  LIKE  '%a%'
GROUP BY department_id;

结论:虽然可以查询出结果,但是结果不一定正确,因为一个部门里面不可能只有一个员工,所以说最好按照查询出来的列名进行分组!

在这里插入图片描述

分组后筛选:

案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

SELECT job_id,MAX(salary)
FROM t_mysql_employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;

结果:
在这里插入图片描述
(二)、where条件筛选和having条件筛选的区别以及应用场景:

例1:查询员工数大于5的部门

SELECT COUNT(*),department_id

FROM t_mysql_employees

WHERE   salary>12000

GROUP BY department_id;

例2:查询员工数大于5的部门

SELECT COUNT(*),department_id

FROM t_mysql_employees

GROUP BY department_id

HAVING salary>12000;

结果如下:
在这里插入图片描述
结论:虽然两种方式的最终运行结果是一样的,但是其实内在的使用逻辑不一样,where关键字是先进行条件的判断,再筛选;反之,having关键字是先进行筛选,再进行判断的,只是由于表的设计,所以运行结果一样,并不是说两者之间没有区别,所以容易混淆!

注意:having后带的条件必须是整个sql语句中select查询出来的列!

案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

首先分析题中的条件:

1、每个工种 意思是按照工种分组 group by job_id

2、有奖金 意思是奖金率不为空 使用where条件

3、最高工资>12000 意思是分组后筛选 使用having关键字

<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值