SQL-分组查询

news2024/12/24 9:05:03

目录

DQL-分组查询

分组查询注意事项:

DQL- 排序查询


🎉欢迎您来到我的MySQL基础复习专栏

☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
✨博客主页:小小恶斯法克的博客
🎈该系列文章专栏:重拾MySQL
📜其他专栏:待开发js逆向,全栈,爬虫.....等专栏
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 感谢大家的关注! ❤️
————————————————

DQL-分组查询

语法

注意:括号中的语句是可选的!

SELECT 字段列表  FROM	表名 [ WHERE	条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];

在做题之前,大家可以发现这条语句中,有两个地方是指定条件的,一个是where之后的条件,一个是having之后的条件,那么肯定有疑问,where和having之间到底有什么区别?

where与having区别

1.执行时机不同:where是分组之前进行过滤,不满足where条件,则不参与分组;而having是分组之后对结果进行过滤。

2.判断条件不同:where不能对聚合函数进行判断,而having中可以。

 案例:

1.根据性别分组 , 统计男性员工 和 女性员工的数量

首先,我们先写下基础查询的语法

select * from emp group by gender ;

1.因为我们根据性别分组,所以后面跟的分组的字段名是gender

2.分组我们知道,我们通常配合着聚合函数来操作,因为having中是可以使用聚合函数进行判断的

3.本题需要统计男性员工和女性员工的数量,此时要统计数量,那么我们要用的聚合函数是count还是sum?这里要统计的是数量,所以我们选用count,因此我们需要讲聚合函数加入进去,这里回顾一下聚合函数的语法

select 聚合函数(字段列表) from 表名 ;

4.于是在这里需要写入count(*),对分组的男性员工与女性员工进行统计

select count(*) from emp group by gender ;

此时结果如下:

f8106d2a66d54d92a1bf42a7ee892545.png

此时不是很明了,因为我们并不知道到底男性是7还是女性是7?因此我们可以在查询的时候把gender也查询出来,查询多个字段的语法我们回顾一下:

select 字段1,字段2,字段3 ..... from  表名 ;

于是我们在count(*)之前再加入gender字段,需要将gender查询出来,代码如下:

select gender, count(*) from emp group by gender ;

执行结果如下:

eea6710e229f4c2abd77258bcbffc5d2.png

注意!如果gender写在count(*)的后面则查询的结果gender字段就在count(*)后面,执行如下图:

e15a90af31e641809e5b4ffffaeb5b98.png

2.根据性别分组 , 统计男性员工 和 女性员工的平均年龄

参照上一案例的思路的话,直接将统计数量的count函数改为平均值avg函数再在括号里将age字段给入即可

select gender, avg(age) from emp group by gender ;

执行结果如下:

 1a1f11e721c94fb59b89cfc7a8163f07.png

3.查询年龄小于35的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址

我们是思路是可以一步一步来完善这些条件,那么第一步先查询出年龄小于35岁的员工

select * from emp where age<35 ;

然后根据工作地址进行分组,那么就是加入group by

select * from emp where age<35 group by workaddress ;

再然后获取员工数量大于等于3的工作地址,要求取员工的数量,所以*此时应该变为一个count(*),注意,肯定有人会疑惑怎么能用count(*)?大家要明白分组时会执行聚合,也就是说age<35的员工分成不同工作地址后执行了聚合,不同的工作地址看成不同的一整个表,所以用*是没有问题的,总结来说就是select gender, count(*) from emp group by gender ;  select gender首先他会筛选性别这个字段 ,然后通过 group by 进行分组,这个时候他会自动去统计字段里面的类别,分为男和女2个组,然后,再通过,count(*)去统计每个组的人数。此时就能够根据工作地址workaddress分组,然后获取每一个工作地址的员工年龄小于35的员工数量

select count(*) from emp where age<35 group by workaddress ;

执行结果如下:

94ac14d5de2444849578b8a3ce1f3f7a.png

当然此时我们很难看出是哪个工作地址的员工的数量所以我们再补全一下代码,将workaddress也进行一个查询,当然workaddress要放置于count(*)前面,注意workaddress和count(*)之间的逗号不能省略

select workaddress , count(*) from emp where age<35 group by workaddress ;

执行结果如下:

046c0741d3794c44bd581ded2b926bb3.png

此时可以看出年龄小于35的员工,在上海的有1人,在北京的有6人,而其他工作地址的数据为什么没有被查询出来,因为它们不满足一个条件就是,它们的年龄没有小于35,所以没有被查询出来

接下来就要考虑查询员工数量大于等于3的工作地址,意思就是要在分组的基础上再进行过滤,我们知道where是分组之前进行过滤,而having是分组之后对结果进行过滤,所以我们肯定要用到having,而且where是不能判断聚合函数的,所以你不能写where count(*) >= 3,我们只能让where去判断age<35,让having去判断count(*) >= 3

select workaddress, count(*)  from emp where age < 35 group by workaddress having count(*) >= 3 ;

执行结果如下:

e663d639af1e404ea32d1cef01e3f335.png

当然,这里给大家介绍一下我们也可以这样写,给它起一个别名,address_count,起了别名之后,后面这一块就不用count(*)了,用别名来进行分组之后的过滤是一样的

select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;

4.统计各个工作地址上班的男性及女性员工的数量

可以按照前面的方式一步步来完善操作,就不赘述这么多了

1.统计各个地址,男性及女性员工的数量,那么肯定是要根据两个方面进行分组的,一个是地址,一个是性别。当然我们需要特别注意的是多个分组字段之间也是要用逗号分隔的,千万不能漏掉

select * from emp group by gender , workaddress ;

2.统计员工数量肯定是需要用到count(*)

select count(*) from emp group by gender , workaddress ;

执行如下:

9c6478417808407796f64148cbbe7f41.png

3.做到第2部其实条件已经基本完善了,但是不太直观,如果想要查询的数据更好看的话就再添加一下查询字段和别名

select workaddress, gender, count(*) '数量' from emp group by gender , workaddress ;

执行如下:

5fda943b87ad44309593fab46959338a.png

分组查询注意事项:

执行顺序: where > 聚合函数 > having 。(where在分组之前进行过滤,而分组的时候会执行聚合函数,而having是在分组聚合之后过滤的)

支持多字段分组, 具体语法为 : group by columnA,columnB    (注意两个字段中间的逗号不能漏掉)

分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

这句话如何理解?如图

d1f9d84ab03b468da9bac7166ad138a0.png

大家看,此时我是男9女7,如果我前面加一个name能不能执行?可以,但是执行出来的name值没有任何意义,女性显示一个沈立聪什么含义呢?女性只有沈立聪嘛,女性有很多,它只是展示出来第一个女性的姓名,所以没有任何意义

2258aeb67e0f4c7792a668d599c038f1.png


DQL- 排序查询

排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序。

179b15b850be4a3ca225e5b304713e97.png

语法

SELECT 字段列表  FROM  表名 ORDER BY 字段1  排序方式1 , 字段2  排序方式2 ;

大家由此代码可以看出,实际上排序操作是支持多字段排序的,而排序时,第一个就是指定字段名,第二个指定排序方式

排序方式

1.ASC : 升序(默认值)

2.DESC: 降 序

注意事项:

1.如果是升序, 可以不指定排序方式ASC ;

2.如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;

 案例:

1.根据年龄对公司的员工进行升序排序

select * from emp order by age asc;

select * from emp order by age;

执行如图 :

b8a9520337e749f8aaf6472b910e8d31.png  

 如果要进行降序排序则对asc进行一个替换,替换为desc即可

bba3b12f2a204a9fac3763d75ef50526.png

写法上的一些思考

 1.基础语法先写出来

select * from emp ;

2.再写排序关键字order by

select * from emp order by age asc;

2.根据入职时间对员工进行降序排序

select * from emp order by entrydate desc;

 执行结果如图:

c92d31abccff41a7bf5589252d951939.png

此时可观察到降序 

3.根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序

select * from emp order by age asc , entrydate desc ;

注意,这里多字段排序的意思是,如果前一个字段信息相同了,排序不了之后,才会根据第二个字段进行排序,不是说字段1可以进行升序,字段2可以进行降序

多字段排序,多字段之间使用逗号分隔

 ab8a5d2f1fd3476e8cbe092569e04d58.png


🎉感谢你这么好看还来关注和点赞我,谢谢你的支持!❤️

☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
✨能跟大家交流学习MySQL真的很开心,我会持续不断的更新优质文章
🎈文章我尽量写的很细,对小白友好,难度会持续增加
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 严谨,仔细,认真,专研,然后持续代码输出 yeh
————————————————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RT-Thread入门笔记4-跑马灯线程实例

RT-Thread操作系统是基于线程调度的多任务系统。 线程状态切换 调度过程是一种完全抢占式的基于优先级的调度算法。 支持8/32/256优先级&#xff0c;其中0表示最高&#xff0c;7/31/255表示最低。最低优先级7/31/255优先级用于空闲线程。 支持以相同优先级运行的线程。 共享时…

【AI视野·今日NLP 自然语言处理论文速览 第七十二期】Mon, 8 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 8 Jan 2024 Totally 17 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers DeepSeek LLM: Scaling Open-Source Language Models with Longtermism Authors DeepSeek AI Xiao Bi, Deli Ch…

jupyter notebook 配置conda 虚拟环境python

conda创建python环境 conda create -n openvoice python3.9 激活环境 source activate openvoice 在虚拟环境中安装ipykernel pip install ipykernel 添加虚拟环境进到 jupyter notebook python -m ipykernel install --user --name openvoice --display-name openvoice …

修改idea或者pycharm或者android studio的快捷键,快速跳转到行尾

ctrl enter这个快捷键是idea默认配置的&#xff0c;就是将光标所在的行切一刀&#xff0c;并且换到下一行。但是在我的开发习惯里面不怎么使用ctrl enter这个快捷键&#xff0c; 反而开发java或者flutter软件需要快速跳转到行尾添加分号 ; &#xff0c;但是使用end键脱离了我…

C++进阶(三)多态

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、多态的概念1、概念 二、多态的定义及实现1、多态的构成条件2、虚函数3、虚函数的重写4、C…

groovy XmlParser 递归遍历 xml 文件,修改并保存

使用 groovy.util.XmlParser 解析 xml 文件&#xff0c;对文件进行修改&#xff08;新增标签&#xff09;&#xff0c;然后保存。 是不是 XmlParser 没有提供方法遍历每个节点&#xff0c;难道要自己写&#xff1f; 什么是递归&#xff1f; 不用说&#xff0c;想必都懂得~ …

ERROR in Plugin “react“ was conflicted .... 天坑留念-turborepo、eslint plugin

前两天项目代码拉下来&#xff0c;装完依赖启动的时候直接报错&#xff1a; [eslint] Plugin "react" was conflicted between ".eslintrc.js eslint-config-custom eslint-config-alloy/react" and "BaseConfig D:\pan\erp\test\business-servic…

Java21 如何使用switch case

1. Java8 和 Java21 Java8 引入字符串和枚举 Java21 可以返回值, yield关键字, switch 表达式, 模式匹配, null值处理 2. 代码案例 1. Java8 public static void java8() {String day "tuesday";switch (day) {case "monday":System.out.println("w…

vue3+vite+ts+pinia新建项目(略详细版)

1、新建项目 npm create vite@latest 2、安装依赖 yarn add vue-router yarn add -D @types/node vite-plugin-pages sass sass-loader 3、配置别名 //vite.config.ts import { defineConfig } from vite import path from node:path export default defineConfig({ plu…

基于ssm快餐店点餐结算系统的设计与实现+vue论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装快餐店点餐结算系统软件来发挥其高效地信息处理的作用&…

Python-基础语法

标识符 第一个字符必须是字母表中字母或下划线 _ 。标识符的其他的部分由字母、数字和下划线组成。标识符对大小写敏感。在 Python 3 中&#xff0c;可以用中文作为变量名&#xff0c;非 ASCII 标识符也是允许的了。 python保留字 保留字即关键字&#xff0c;我们不能把它们用…

php大型酒店管理系统源码(多酒店版)带安装手册

php大型酒店管理系统源码(多酒店版&#xff09;带安装手册 系统的运行环境要求PHP7.2以上 功能介绍&#xff1a; 房间动态、房间管理、优惠活动、预定信息、商品管理、营业查询、交班管理 会员营销、查看房价、数据统计、客房服务、物品租借、夜审设置、系统设置 酒店设置、计费…

代码随想录day25 回溯算法加强练习

216.组合总和III 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数&#xff0c;并且每种组合中不存在重复的数字。 说明&#xff1a; 所有数字都是正整数。解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 示例 2: 输入…

金融中介管理系统,助您高效管理金融中介业务!

金融中介管理系统是一种用于有效管理金融中介业务的软件系统。它提供了一系列工具和功能&#xff0c;帮助金融中介机构简化和优化其日常运营和管理流程。 金融中介管理系统通常具有以下特点和功能&#xff1a; 1. 客户管理 系统可以帮助机构记录和管理客户信息、需求和交互历…

PDF修改技巧之:如何简单方便的编辑PDF文件?

在当今精通技术的世界中&#xff0c;PDF 的使用已变得普遍&#xff0c;尤其是在商业和教育方面。如果您在审阅 PDF 文件时遇到语法或其他错误怎么办&#xff1f; 尽管 PDF 文件不像 Word 或在线文档那样容易编辑&#xff0c;但借助高级工具&#xff0c;您一定可以进行编辑。 …

CodeWave智能开发平台--03--目标:应用创建--09供应商详情页面下

摘要 本文是网易数帆CodeWave智能开发平台系列的第13篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成09供应商详情页面下主营产品展示及权限管理 CodeWave智能开发平台的13次接触 CodeWave参考资源…

使用ffmpeg实现音频静音修剪

1 silenceremove介绍 本文主要介绍在 FFmpeg 命令中使用 silenceremove filter 进行音频静音的修剪。 1.1 start_x参数 参数名说明取值范围默认值start_periods设置是否应在音频开头修剪音频。0 表示不应从一开始就修剪静音。当指定一个非 0 值时&#xff0c;它会修剪音频直…

搜索与图论第二期 BFS

前言 BFS跟DFS同样重要&#xff0c;也一定要熟练的掌握&#xff01;&#xff01;&#xff01; 一、BFS的基本内容 BFS是从根节点开始&#xff0c;沿着树(图)的宽度遍历树(图)的节点。 如果所有节点均被访问&#xff0c;则算法中止。 BFS同样属于盲目搜索。 一般用队列数据结…

2. Presto应用

该笔记来源于网络&#xff0c;仅用于搜索学习&#xff0c;不保证所有内容正确。文章目录 1、Presto安装使用2、事件分析3、漏斗分析4、漏斗分析UDAF开发开发UDF插件开发UDAF插件 5、漏斗测试 1、Presto安装使用 参考官方文档&#xff1a;https://prestodb.io/docs/current/ P…

Hugging Face Datasets文本质量分析,识别低质量内容、垃圾数据、偏见内容、识别毒性内容、检测重复文档、识别测试集污染数据、识别过短的内容

Hugging Face Datasets文本质量分析,识别低质量内容、垃圾数据、偏见内容、识别毒性内容、检测重复文档、识别测试集污染数据、识别过短的内容。 在机器学习和自然语言处理的世界中,数据的质量至关重要。Hugging Face提供了大量的文本数据集,但是如何评估这些数据集的质量呢…