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;
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后面条件不能使用聚合函数。
4、聚合函数、分组、having的是否可以独立存在
注意:如果只分组,但是没有用聚合函数,则会返回每个分组中的随机一条记录,通常是第一条。
八、sql语句的执行逻辑步骤
- SQL 查询的执行顺序是
FROM
→WHERE
→GROUP BY
→ 聚合函数计算 →HAVING
→SELECT
。 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为总页数