MySql中流程控制函数/统计函数/分组查询用法解析
作者:木卯生十木 发布时间:2024-01-26 09:33:38
标签:MySql,流程控制函数,统计函数,分组查询
路漫漫其修远兮,吾将上下而求索,又到了周末,我继续带各位看官学习回顾Mysql知识。
上次说到了流程控制函数,那就从流程控制函数来继续学习吧!
#五.流程控制函数
#1.if函数:if else的效果
IF(条件表达式,成立返回1,不成立返回2)
#与Java三元运算相同
SELECT IF(10>5,'大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金呵呵','有奖金嘻嘻') AS 备注
FROM employees;
#2.CASE函数的使用一: swirch case的效果【等值判断】
回顾:switch(变量或表达式){
case 常量1:语句1;break;
...
default:语句n;break;
}
mysql中
case 要判断的字段或表达式或变量
when 常量1 then 要显示的值1或者语句1;[语句要加分号,值不用加]
when 常量2 then 要显示的值2或者语句2;
...
slse要显示的值n或者语句n;[默认值]
end[结尾]
case在SELECT后面相当于表达式用,后面不能放语句,只能是值.
在后续的学习中,存储过程与函数内就可以单独,用不搭配SLECT,就用语句.
先是表达式的操作
案例:查询员工的工资,要求
部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,显示的工资为原工资
SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
#2.CASE函数的使用二:类是于多重IF【区间判断】
回顾Java中:if(条件1){
语句1;
}else if(条件2){
语句2;
}...
else{
语句n;
}
mysql中:
case
when 条件1 then 要显示的值1或者语句[语句后面要加分号;]
when 条件2 then 要显示的值2或者语句[语句后面要加分号;]
...
else 要显示的值n或语句n
end
案例:查询员工的工资的情况
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则,显示D级别
==============流程函数到此结束,要想熟练运用还需要勤加练习。===============
提供几道习题供读者试试手!
#计算有几种工资。
SELECT COUNT(DISTINCT salary),
COUNT(salary)
FROM employees;
#5.count 函数的详细介绍
SELECT COUNT(salary) FROM employees;
#COUNT(统计所有列)
SELECT COUNT(*) FROM employees;
#把表的行生成一个列每一列都是1。统计1的总数。count里面可以用任意常量值。
SELECT COUNT(1) FROM employees;
#考虑到效率问题:
#5.5之前都是MYISAM 下COUNT(*)最高,计数器直接返回
#5.5之后默认都是INNODB下COUNT()与COUNT(1)都差不多,
比COUNT(字段)效率高,如果是字段要判断字段是否为NULL。
#6.和分组函数一同查询的字段有限制
SELECT AVG(salary),employee_id FROM employees;
#1.查询公司员工工资的最大值,最小值,平均值,总和。
SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM employees;
SELECT MAX(salary) AS 最大值,MIN(salary) AS 最小值,
ROUND(AVG(salary)) AS 最小值,SUM(salary) AS总和
FROM employees;
#2.查询员工表中最大入职时间和最小入职时间的相差天数。
#DATEDIFF计算天数。DATEIFF(参数1-参数2)
SELECT DATEDIFF(NOW(),('1995-1-1'));
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) AS DIFFRENCE
FROM employees;
#3.查询部门编号为90的员工个数。
SELECT COUNT(*) AS个数
FROM employees
WHERE department_id=90;
#进阶5.分组查询GROUP BY子句语法。
可以使用GROUP BY子句将表中的数据分成若干组。
语法:
SELECT 分组函数,列(要求出现在GROUP BY的后面)
FROM 表
【WHERE筛选条件】
GROP BY 分组的列表
【ORDER BY 子句】
注意:
查询列表必须特殊,要求是分组函数和GROUP BY后出现的字段
特点:
1.分组查询中的筛选条件分为两类
2.GROUP BY 子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求)
也支持表达式或函数分组(用的较少)
3.也可以添加排序(排序放在整个分组查询的最后)
#引入:查询每个部门的平均工资,保留两位小数。
SELECT ROUND(AVG(salary),2) AS 平均工资
FROM employees;
#简单的分组查询,添加分组前的筛选WHERE
#案例1:查询每个工种的最高工资。
SELECT MAX(salary) AS 最高工资,job_id AS 工种编号
FROM employees
GROUP BY job_id;
#案例2:查询每个位置上的部门个数。
SELECT COUNT(*) AS 总数,location_id
FROM departments
GROUP BY location_id;
#添加筛选条件
#查询邮箱中包含a字符的,平均工资保留两位小数,每个部门的平均工资
SELECT email,ROUND(AVG(salary),2),department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;
#案例2:查询每个领导手下员工有奖金的的最高工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
添加复杂的筛选,添加分组后的筛选HAVING
#案例1:查询哪个部门的员工个数>2
#①查询每个部门的员工个数
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
#②根据①的结果,查询哪个部门的员工个数>2
SELECT COUNT(*) AS 总数,department_id AS 部门编号
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
#案例2.查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资。
#①查询每个工种有奖金的员工的最高工资。
#原始表能筛选的就放在FROM 后面用WHERE。
SELECT job_id AS 员工编号,MAX(salary) AS 最高工资
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id;
#②根据①结果继续筛选,最高工资>12000。
SELECT job_id AS 员工编号,MAX(salary) AS 最高工资
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
#案例3.查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资。
#①查询领导编号>102的每个领导手下的最低工资
SELECT MIN(salary) AS 最低工资,manager_id AS 领导编号
FROM employees
WHERE manager_id > 102
GROUP BY manager_id;
#②最低工资大于5000的。
SELECT MIN(salary) AS 最低工资,manager_id AS 领导编号
FROM employees
WHERE manager_id > 102
GROUP BY manager_id
HAVING 最低工资 > 5000;
#案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
#MYSQL内GROUP BY与HAVING后面支持别名,WHERE不支持别名。但ORACLE数据库的GROUP BY与HAVING是不支持别名的。
SELECT LENGTH(CONCAT(last_name,first_name)) AS 姓名长度,
COUNT(*) AS 个数
FROM employees
GROUP BY 姓名长度
HAVING 姓名长度 > 5;
#按多个字段分组
#案例:查询每个部门工种的员工的平均工资(保留两位小数)。
SELECT ROUND(AVG(salary),2) AS 平均工资,department_id AS 部门,job_id AS 工种
FROM employees
GROUP BY 部门,工种;
#添加排序
#案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示。
SELECT ROUND(AVG(salary),2) AS 平均工资,department_id AS 部门,job_id AS 工种
FROM employees
GROUP BY 工种,部门
ORDER BY 平均工资 DESC;
#案例:查询部门不能为空的,每个部门每个工种的员工的平均工资,并且按平均工资的高低显示。
SELECT ROUND(AVG(salary),2) AS 平均工资,department_id AS 部门,job_id AS 工种
FROM employees
WHERE department_id IS NOT NULL
GROUP BY 工种,部门
ORDER BY 平均工资 DESC;
#案例:查询部门不能为空的,每个部门每个工种的员工的平均工资高于10000的,并且按平均工资的高低显示。
SELECT ROUND(AVG(salary),2) AS 平均工资,department_id AS 部门,job_id AS 工种
FROM employees
WHERE department_id IS NOT NULL
GROUP BY 工种,部门
HAVING 平均工资 > 10000
ORDER BY 平均工资 DESC;
加强练习:
#1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序。
SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM employees
GROUP BY job_id
ORDER BY job_id ASC;
#2.查询员工最高工资和最低工资的差距(DIFFERENCE)。
SELECT MAX(salary) - MIN(salary) AS DIFFERENCE
FROM employees;
=======================================================
SELECT MAX(salary) AS 最高,MIN(salary) AS 最低,MAX(salary)-MIN(salary) AS DIFFERENCE
FROM employees;
#3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不能计算在内。
SELECT MIN(salary),CONCAT(last_name,first_name),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>6000;
到此结束,MySql的统计,分组查询到此结束。如果没有感觉的看官可以自己手动练习一下。
夏天的太阳总是那么亮的刺眼,但多沐浴一下阳光也补钙,想不到吧!o(^▽^)o
来源:https://www.cnblogs.com/jxearlier/p/13336822.html
0
投稿
猜你喜欢
- 求f(x) = sin(x)/x 的不定积分和负无穷到正无穷的定积分sin(x)/x 的不定积分是信号函数sig ,负无穷到正无穷的定积分为
- 本文实例讲述了Python基于聚类算法实现密度聚类(DBSCAN)计算。分享给大家供大家参考,具体如下:算法思想基于密度的聚类算法从样本密度
- 之前爬美团外卖后台的时候出现的问题,各种方式拖动验证码都无法成功,包括直接控制拉动,模拟人工轨迹的随机拖动都失败了,最后发现只要用chrom
- 上节我们提到解决赋值中等号两边参数不一致的方法可以通过切片,但在Python3中我们可以利用特定的语法更加方便的处理这种情况,如下示例。当带
- 1. PHP入侵检测系统PHP IDS(即PHP-入侵检测系统)是一套易于使用、结构良好、速度出色且专门面向PHP类Web应用程序的先进安全
- mysqladmin 工具的使用格式:mysqladmin [option] command [command option] comman
- 百度指数抓取,再用图像识别得到指数前言:土福曾说,百度指数很难抓,在淘宝上面是20块1个关键字:哥那么叼的人怎么会被他吓到,于是乎花了零零碎
- 问题介绍棋盘覆盖问题,是一种编程问题。如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋
- 1.创建xml字段在表xmlTest内创建一个字段,命名_x,设置数据类型为xml。2.写入xmlinsert into xmlTest (
- 近期,一直在研究MySQL数据库,经常修改配置文件,导致MySQL数据库无法使用,不得不反复重装MySQL数据库。以下是在Windows7
- 1、Tkinter是什么Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块(“Tk 接口&
- 前言在做数据报表时,需要对某一时间段分组,以1小时为时间间隔统计各项数据,如9点-10点,10点-11点…,但是现在有种情况,时间有可能不是
- 使用python完成超级基础的学生管理系统,供大家参考,具体内容如下说明:1、本学生管理系统非常非常简易,只有增,显,查,删,改功能,对于P
- 简介 tensorflow 配套的可视化工具, 将你的计算图画出来.当训练一个巨大的网络的时候, 计算图既复杂又令人困惑. TensorBo
- sys模块sys.argv: 实现从程序外部向程序传递参数。位置参数argv[0]代表py文件本身,运行方法 python xx.py 参数
- NumPy 支持的几类矩阵乘法也很重要。元素级乘法你已看过了一些元素级乘法。你可以使用 multiply 函数或 * 运算符来实现。回顾一下
- Overview这篇博客内容将包括对XML文件的解析、追加新元素后写入到XML,以及更新原XML文件中某结点的值。使用的是python的xm
- 有的时候,我们为了保持网页的美观,需要将较长的文字在一定长度时截断。比如我们希望在列表中显示文章标题的前15个字,那么一个这样的标题:“rs
- 一、文件操作1、文件的概念1.文件就是计算机暴露给用户操作硬盘的快捷方式2.计算机的文件,就是用来储存某种信息的数据3.在计算机中,文件是以
- 编码问题因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了。问题要从文字的编码讲起。原本的英文编码只有0~255