SQL-分组查询

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

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

目录

DQL-分组查询

分组查询注意事项:

DQL- 排序查询


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


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

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

相关文章

turnjs实现翻书效果

需求&#xff1a;要做一个效果&#xff0c;类似于阅读器上的翻书效果。 咱们要实现这个需求就需要使用turnjs这个插件&#xff0c;他的官网是turnjs官网。 进入官网后可以点击 这个按钮去下载官网的demo。 这个插件依赖于jQuery&#xff0c;所以你的先安装jQuery. npm insta…

面试官:实际工作中哪里用到了自定义注解?

自定义注解可以标记在方法上或类上&#xff0c;用于在编译期或运行期进行特定的业务功能处理。在 Java 中&#xff0c;自定义注解使用 interface 关键字来定义&#xff0c;它可以实现如&#xff1a;日志记录、性能监控、权限校验等功能。 在 Spring Boot 中实现一个自定义注解&…

Unity URP下阴影锯齿

1.概述 在Unity开发的URP项目中出现阴影有明显锯齿。如下图所示&#xff1a; 并且在主光源的Shadow Type已经是Soft Shadows模式了。 2.URP Asset 阴影出现锯齿说明阴影质量不高&#xff0c;所以要先找到URP Asset文件进行阴影质量参数的设置。 1.打开PlayerSetting找到Graph…

代码签名证书怎么选择?软件开发者必看

随着互联网的高速发展&#xff0c;各种购物、资讯、社交类软件高速增长。而对于软件开发者来说&#xff0c;选择合适的代码签名证书来为软件进行数字签名、确保软件程序代码的完整性和软件的可信任性是很有必要的。但市场上有多种品牌、多种类型的代码签名证书可以选择&#xf…

03.阿里Java开发手册——OOP规约

【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法&#xff0c;无谓增加编译器解析成本&#xff0c;直接用类名来访问即可。 【强制】所有的覆写方法&#xff0c;必须加Override 注解。 说明&#xff1a;getObject()与 get0bject()的问题。一个是字母的 O&#x…

git pull 时 配置适合自己的合并策略 git config pull.rebase

当 git pull 时有可能遇到以下的提示 hint: git config pull.rebase false # merge (the default strategy) hint: git config pull.rebase true # rebase hint: git config pull.ff only # fast-forward only这三个配置项影响git pull的默认行为。以下是对它们…

tab分页高亮切换及tab交互

当用户点击页面中的 Tab 后&#xff0c;切换展示相应的商品列表&#xff0c;功能相对简单&#xff0c;快速实现即可。 // 存储高亮的下标 <script setup lang"ts"> // 高亮的下标 const activeIndex ref(0) </script><template><!-- 推荐选项…

vue前端开发自学,插槽练习,同时渲染父子组件的数据信息

vue前端开发自学,插槽练习,同时渲染父子组件的数据信息&#xff01; 如果想在slot插槽出口里面&#xff0c;同时渲染出来&#xff0c;来自父组件的数据&#xff0c;和子组件自身的数据呢。又有点绕口了。vue官方给的解决办法是。需要借助于&#xff0c;父组件的自定义属性。 …

第二百五十九回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了通道有不同的…

Unity 面试篇|(一)C#基础篇 【全面总结 | 持续更新】

目录 1. 面向对象的三大特点2. 简述值类型和引用类型3.重载和重写的区别4.C#中所有引用类型的基类是什么5.请简述ArrayList和 List的主要区别6.GC 相关知识点7.结构体和类8.C#中四种访问修饰符是哪些&#xff1f;各有什么区别&#xff1f;9.修饰符 简述private&#xff0c;publ…

本地部署Canal笔记-实现MySQL与ElasticSearch7数据同步

背景 本地搭建canal实现mysql数据到es的简单的数据同步&#xff0c;仅供学习参考 建议首先熟悉一下canal同步方式&#xff1a;https://github.com/alibaba/canal/wiki 前提条件 本地搭建MySQL数据库本地搭建ElasticSearch本地搭建canal-server本地搭建canal-adapter 操作步骤…

24-1-9 bilibilic++音视频

下午两点面试&#xff0c;面试官迟到了一会&#xff0c;面试官人很好&#xff0c;整体面试经历很不错&#xff0c;但是我人太紧张了&#xff0c;基础知识掌握的深度不够&#xff0c;没有深挖&#xff0c; 是做音视频的底层相关的&#xff0c; 实习要求只要每天打卡够九个小时就…

【高可用】SQL Server 2019 无域+WSFC搭建Always On环境图文步骤

SQL Server 2019 无域搭建Always On环境 简介环境介绍服务器配置安装故障转移修改主机名并加入域修改hosts文件关闭防火墙修改DNS新建故障转移集群(任一台服务器)验证故障转移是否成功(任意一台电脑关机)设置共享文件数据库安装数据库配置数据库开启Always On在数据库里面安…

禁用code server docker容器中的工作区信任提示

VSCode 添加受限模式&#xff0c;主要是防止自动运行代码的&#xff0c;比如在vscode配置的task和launch参数是可以运行自定义代码的。如果用VScode打开未知的工程文件就有可能直接运行恶意代码。 但是当我们的实验基础模板文件可控的情况下&#xff0c;要想禁用code server do…

vue前端开发自学,组件的嵌套关系demo

vue前端开发自学,组件的嵌套关系demo!今天开始分享的&#xff0c;前端开发经常用到的&#xff0c;组件的嵌套关系案例代码。下面先给大家看看&#xff0c;代码执行效果。 如图&#xff0c;这个是代码执行后&#xff0c;的效果布局&#xff01; 下面给大家贴出来源码。方便大家…

认识字面量

字面量&#xff1a;数据在程序中的书写格式 整数小数写法无变化 字符&#xff1a;在程序中必须使用单引号&#xff0c;有且只能有一个字符 字符串&#xff1a;程序中必须使用双引号&#xff0c;内容可有可无 布尔值&#xff1a;true、false 空值&#xff1a;null 示例和结…

使用spark将MongoDB数据导入hive

使用spark将MongoDB数据导入hive 一、pyspark 1.1 pymongospark 代码 import json,sys import datetime, time import pymongo import urllib.parse from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType127.0.0.1 27…

功效产品如何做好营销?媒介盒子解答

功能性产品目前的营销痛点就在于宣传夸张导致用户信任度降低&#xff0c;尤其是健康类产品&#xff0c;作为消费者&#xff0c;对此类产品大多持观望态度&#xff0c;但媒介盒子作为提供品牌宣传服务的团队&#xff0c;想和大家聊聊&#xff1a;功能性产品除了在功能上进行宣传…

【Java】解决Servlet编程中出现的中文乱码问题

1、引言 前面两篇文章我们讲述了编写Servlet程序的基本步骤和修改一个Servlet程序 【Java】编写一个简单的Servlet程序​​​​​​ 【Java】SmartTomcat的配置及使用 上面两篇文章的示例代码都是使用的全英文&#xff0c;当我们编写中文&#xff0c;发现似乎出了一点点问题…

【100个 Unity实用技能】☀️ | UGUI中 判断屏幕中某个坐标点的位置是否在指定UI区域内

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…