当前位置: 首页 > article >正文

MySQL数据库02|去重、条件查询、排序、聚合函数、分组、分页显示

目录

三、别名和重复记录

1、as:字段的别名

2、as:表的别名

3、distinct:消除重复记录

四、条件查询

1、where子句

2、where后支持的运算符

1️⃣比较运算符

2️⃣逻辑运算符:and、or、not

3️⃣模糊查询:like

4️⃣范围查询:in 和between…and…

5️⃣空判断

3、where也可以用在update和delere语句中 

五、排序:order by 

六、聚合函数

1、COUNT():计算行的数量

2、SUM():计算数列值总和

3、AVG():计算数列值平均值

4、MAX():返回列中最大值

5、MIN():返回列中最小值

七、数据分组

1、分组:group by

2、分组后的数据筛选:having

 3、where和having的区别

4、聚合函数、分组、having的是否可以独立存在 

八、sql语句的执行逻辑步骤

 九、数据分页显示

1、获取部分行:limit

2、分页


三、别名和重复记录

1、as:字段的别名

  • 通过as 给字段起别名,别名可以是中文。
  • as可以省略
select card as 身份证, name as 姓名, sex as 性别 from student; -- 查出来的表第一行就显示的别名

select card 身份证, name 姓名, sex 性别 from student; --效果和上面一样

2、as:表的别名

  • 在from后的表名,可以使用as为表起别名
  • as可以省略
select name, age from student as stu;

3、distinct:消除重复记录

distinct用于从查询结果中去除重复的行,仅返回唯一值。只能固定放在select之后,只过滤select查询的结果,对原始数据没有改动。

当 distinct 作用于多列时,会将这些列的组合视为一个整体,只有完全相同的行才会被去重。

select distinct sex,class from students; --过滤掉sex和class都重复的记录

四、条件查询

1、where子句

select 字段1,字段2,…… from 表名 where 条件; 
  • selct 后面的*或者字段名,决定了返回什么样的字段(列);
  • select中where子句,决定了返回什么样的记录(行);

2、where后支持的运算符

1️⃣比较运算符

2️⃣逻辑运算符:and、or、not
  • and(与):至少两个条件,and的多个条件必须同时满足;
  • or(或):至少两个条件,或的多个条件只要一个满足即可;
  • not(非):只有一个条件,即“求反”。如果条件为满足,则not后为不满足,如果条件为不满足,not后变为满足。
-- 查询age小于30且性别为女的同学记录
select * from students where age < 30 and sex = '女';

-- 查询性别为女或者班级为1班的同学记录
select * from students where  sex = '女' or class = '1班';

-- 查询老家非天津的学生记录
select * from students where  not hometown = '1班';
3️⃣模糊查询:like

like:一般就只用于匹配字符串

  • %表示任意多个任意字符
  • _表示一个任意字符
-- 查询name中以‘孙’开头的学生记录
select * from students where name like'孙%';

-- 查询name中含‘白’的学生记录
select * from students where name like'%白%';
4️⃣范围查询:in 和between…and…
  • in表示一个非连续的范围
-- 查询家乡是北京或上海或广东的学生记录
select * from students where hometown in('北京','上海','南京');
  • between…and…表示在一个连续的范围内(包含边界值),参数可以是数字和英文字母
-- 查询年龄在25到30的学生记录
select * from students where age between 25 and 30;
5️⃣空判断

null不是0,也不是‘’(是长度为0的字符串),null在sql中代表空,什么也没有

null不能用比较运算符判断

is null 是否为空

is not null 是否不为空

不能用字段名 = null 或字段名 != null

-- 查询card为null 的学生记录
select * from students where card is null;

-- 查询card非null 的学生记录
select * from students where card is not null;

3、where也可以用在update和delere语句中 

五、排序:order by 

对数据的结果进行排序

-- 语法
select * from 表名
order by 字段1 [asc/desc] , 字段2 [asc/desc],…

将行数据按照字段1进行排序,如果某行字段的值相同,则按照字段2排序,以此类推。

默认按照字段值从小到大排序。

  • asc(默认):从小到大,即升序,可以省略
  • desc:从大到小,降序,不可以省略
select * from students order by age;

-- 查询所有学生记录,按照age从大到小排序
-- 如果年龄相同,则按照学号从小到大排序
select * from students order by age desc , studentNo;

当一条select语句有where又有order by,一定要把where写在order by之前(没有为什么,就是语法规定,不这样写会报错)。

select * from 表名 where 条件 order by 字段1,字段2;

六、聚合函数

聚合函数(Aggregate Functions)是一类用于对一组值进行计算的函数,通常与 SELECT 和 GROUP BY 子句结合使用,用于对结果进行汇总或统计。

一般都是计算数字类型的字段

1、COUNT():计算行的数量

计算的就是select语句返回的记录总数。

括号里可以是*,其他聚合函数都不可以使用*。

SELECT COUNT(*) AS total_employees
FROM employees;                        -- 结果:返回员工总人数。


select count(distinct sex) from students;

2、SUM():计算数列值总和

计算指定字段的总和

SELECT SUM(salary) AS total_salary
FROM employees      
WHERE sex = '女';                  -- 结果:返回性别为女的记录的薪资总和。

3、AVG():计算数列值平均值

计算指定字段的平均值 

注意:avg忽略null值,即不作为分母计算平均值,null值不参与平均值计算

SELECT AVG(salary) AS avg_salary
FROM employees
WHERE sex = '女';                       -- 结果:返回性别为女的记录的薪资平均值。

4、MAX():返回列中最大值

计算的就是select语句经过where后返回的记录中,某个字段的最大值。

括号里不能是*

SELECT MAX(salary) AS max_salary
FROM employees;                        -- 结果:返回薪资最大值。

5、MIN():返回列中最小值

和max用法基本一致

 

注意:

  • 聚合函数会忽略 NULL 值(COUNT(*) 除外)。如AVG(salary) 不会计算包含 NULL 的薪资。
  • 聚合函数不能用在where条件中使用 ,但having中可以使用聚合函数
  • 在没有使用group by时,不能将聚合函数与普通列直接结合,否则会报错。

 

七、数据分组

1、分组:group by

按照字段分组,表示此字段相同的数据被放到一个组里;

分组的目的是配合聚合函数,实现逻辑是先分组,让聚合函数对每一组的数据分别进行统计

如果只分组,但是没有用聚合函数,则会返回每个分组中的随机一条记录,通常是第一条 

--语法
select 字段1,字段2,聚合函数… from 表名 groupy by 字段1,字段2…   --先分组再聚合
select 字段1,字段2,聚合函数… from 表名 where 条件 groupy by 字段1,字段2…   -- 先条件筛选,再分组,再聚合


select sex,count(*) from students group by sex;  -- 查询各种性别的人数
select class,count(*),avg(age),sum(age),max(age) from students group by class;
关键字的排序,看本文最后的sql语句的执行逻辑逻辑步骤章节

2、分组后的数据筛选:having

对分组后的数据进行筛选,并且它是对每一组数据分别应用筛选条件的

通常,having不能独立存在,要用在group by之后 

-- 语法
select 字段1,字段2,聚合函数… from 表名
group by 字段1,字段2,字段3…
having 字段1,…聚合…
-- 用where查询男生总数
select count(*) from students where sex = '男';

-- 用having查询男生总数
select count(*) from students group by sex  having sex = '男';
  • 第一句是先筛选出男的记录,然后聚合算总数
  • 第二句是先分组,再分组聚合,最后再在分组聚合的结果中只保留符合条件的。

 3、where和having的区别

  • where是对from后面指定的表进行数据筛选,数据对原始数据的筛选;
  • having是对group by的结果进行筛选;
  • having后面的条件可以使用聚合函数,where后面条件不能使用聚合函数。
这个需求只能用分组后having实现,无法用where实现
因为原表是学生表,需要按照班级分组才能知道1班的学生总数

4、聚合函数、分组、having的是否可以独立存在 

注意:如果只分组,但是没有用聚合函数,则会返回每个分组中的随机一条记录,通常是第一条

 

八、sql语句的执行逻辑步骤

  • SQL 查询的执行顺序是 FROMWHEREGROUP BY → 聚合函数计算 → HAVINGSELECT
  • WHERE:在分组之前筛选原始数据。
  • GROUP BY:分组后,配合聚合函数生成每组的聚合数据。
  • HAVING:在分组和聚合之后,筛选分组数据。

 九、数据分页显示

1、获取部分行:limit

当数据量过大时,在一页中查看数据非常麻烦,使用limit。

当有where或者group by 或者order by,limit总是出现在select语句的最后。

-- 语法 
select * from 表名 limit start,count
  •  从start开始,获取count条数据
  • start索引从0开始,如省略start默认从0开始
select * from students limit 3; --显示前三行学生记录
select * from students limit 3,3; --查询从第4条开始的三条记录

 

2、分页

 当一个表的记录特别多时,需要用到分页显示;

已知:每页显示m条数据,求查询第n页的数据

-- 语法
select * from students limit (n-1)*m,m;

-- 每页显示4条记录,查询第3页数据,m=4,n=3
select * from students limit 8,4;



-- 查询select表,每页显示5条记录,求总页数
-- 1、查询一共多少记录a
select count(*) from student;
-- 2、使用总记录数a除以每页显示条数5,得到b
-- 3、如果b是整数,即b为总页数
-- 4、如果b不是整数,则b+1为总页数

 

 


http://www.kler.cn/a/442393.html

相关文章:

  • B站评论系统的多级存储架构
  • 浅谈云计算20 | OpenStack管理模块(下)
  • 细说STM32F407单片机窗口看门狗WWDG的原理及使用方法
  • 使用jupyter notebook没有正常打开浏览器的几种情况解决
  • 玩转随机数:用 JavaScript 掌控不可预测的魔力!
  • WORD转PDF脚本文件
  • 小程序中使用 Vue2 + Vuex 实现数据存储与获取
  • 长短期记忆神经网络(LSTM)介绍
  • rpc设计的再次思考20251215(以xdb为核心构建游戏框架)
  • 如何有效的开展接口自动化测试?
  • 使用Python实现两组数据纵向排序
  • 建立在商用GPT上的简单高效单细胞表示模型
  • C# 识别二维码
  • 【TF-IDF】Hugging Face Model Recommendation System
  • 基础入门-APP应用微信小程序原生态开发H5+Vue技术WEB封装打包反编译抓包点
  • Spring整合Redis基本操作步骤
  • C# 字符串拼接的 7 种方式及性能对比
  • 爬虫抓取的数据如何有效存储和管理?
  • 【YashanDB知识库】YCP单机部署离线升级-rpc升级方式详细步骤
  • Python `str.strip()` 的高级用法详解
  • 为何VisualRules更适合技术人员使用
  • 迅为瑞芯微RK3562开发板/核心板内置独立NPU, 算力达 1TOPS,可用于轻量级人工智能应用
  • [shader]【图形渲染】【unity】【游戏开发】 Shader数学基础2-认识点和矢量
  • Linux下MySql:表的操作
  • C++ OCR证件照文字识别
  • 详解C++中“virtual”的概念及其含义