distinct 去除重复数据

  1. -- 统计students表中的学生姓名,姓名不能有重复名字
  2. -- 去重 distinct
  3. SELECT DISTINCT(username) from students;
  4. -- 去重 age
  5. select distinct(age) from students;

需要注意的是: 去重的时候 select 后面只能跟1个字段。
下面的代码不支持

  1. select distinct(username),DISTINCT(age) from students;

image.png

distinct 去重也支持where条件查询

  1. -- 语文成绩去重后显示出来
  2. select DISTINCT(score) from students
  3. WHERE course="语文";

order by

进行排序

  1. -- 查询所有的学生信息, 按照年龄从小到大进行排序
  2. select * from students
  3. ORDER BY age

desc 表示倒序排序

  1. select * from students
  2. ORDER BY age DESC

image.png

  1. -- 男生同学 语文成绩 从大到小进行排序。 需要使用where 条件, 注意where条件
  2. -- 放在 order by 之前。
  3. SELECT * from students
  4. WHERE sex="男" and course="语文" -- 先把符合条件的数据过滤出来
  5. ORDER BY score desc; -- 再进行排序

按照多个字段进行排序

  1. -- 排序的时候可以按照多个字段排序
  2. -- 1. 先按年龄,如果年龄相同,再按成绩排序,成绩相同,按id
  3. SELECT * from students
  4. order by age desc, score desc,id desc

limit 限制

默认前3个

  1. -- 过滤排序之后的时候,显示前三个
  2. select * from students
  3. ORDER BY score desc
  4. LIMIT 3;

limit 1,3

  1. select * from students
  2. LIMIT 2,3 -- 2.2+1=3 第三行开始。 3表示显示3行数据

image.png

  1. -- 体育成绩大-小排序。 显示排在前三位的同学信息;
  2. SELECT * from students
  3. WHERE course = "体育"
  4. ORDER BY score DESC
  5. LIMIT 3;
  6. -- 年龄大-小排序。 显示排在第3-5的同学信息;
  7. select * from students
  8. ORDER BY age desc
  9. LIMIT 2,3 -- 2.2+1=3 第三行开始。 3表示显示3行数据

练习

  1. 1. 语文最高分是多少?
  2. 2. 体育最低分是多少?
  3. 3. 数学成绩第二高是多少?
  1. select score from students
  2. where course = "语文"
  3. ORDER BY score DESC
  4. LIMIT 1;
  5. select score from students
  6. where course = "体育" AND score is not Null -- 过滤掉Null
  7. ORDER BY score
  8. LIMIT 1;
  9. SELECT DISTINCT(score) from students
  10. WHERE course="数学"
  11. ORDER BY score desc
  12. limit 1,1

思考

  1. 查找语文分数最高的人?
  1. -- 找到最高的语文分数
  2. select score from students
  3. where course = "语文"
  4. ORDER BY score DESC
  5. LIMIT 1;
  6. -- 我已经知道最高分为100 查询分数为100的人员
  7. select * from students
  8. WHERE course="语文" and score=100
  9. -- 将两条sql 语句结合在一起
  10. select * from students
  11. WHERE course="语文"
  12. and score=( -- 先运行 () 中的语句
  13. select score from students
  14. where course = "语文"
  15. ORDER BY score DESC
  16. LIMIT 1
  17. );
  1. 数学成绩第二高的人员
  1. select * from students
  2. WHERE course="数学"
  3. and score=( -- 先运行 () 中的语句
  4. select DISTINCT(score) from students
  5. where course = "数学"
  6. ORDER BY score DESC
  7. LIMIT 1,1
  8. );

聚合函数

max() 最大值

  1. -- 语文最大分数
  2. select max(score) from students where course = "语文";
  1. -- 男生中第二最大年龄
  2. -- 年龄在小于 最大年龄中的最大年龄
  3. select max(age) from students
  4. where sex="男" and age < (select max(age) from students WHERE sex="男");
  5. select max(age) from students
  6. where sex="男" and age < 30;

min() 最小值

  1. -- 年龄最小的女生的年龄
  2. select min(age) from students where sex="女";
  3. -- 年龄第二小的女生年龄
  4. select min(age) from students WHERE sex = "女" and
  5. age > (select min(age) from students where sex="女");
  6. -- 年龄最小的女生姓名
  7. select DISTINCT(username) from students WHERE
  8. sex="女"
  9. and
  10. age is not null
  11. and
  12. age = (
  13. select min(age) from students where sex="女"
  14. );

  1. -- 血量hp_max最高的人员:姓名,血量
  2. -- 1. 最大的血量
  3. select max(hp_max) from heros;
  4. -- 2. 根据最大血量找人
  5. select name,hp_max from heros WHERE hp_max = 9328;
  6. -- 3. 两个sql语句结合一起
  7. select name,hp_max from heros
  8. where hp_max = (select max(hp_max) from heros);

count() 计数

  1. -- 统计名字4个字的英雄个数
  2. select COUNT(*) from heros WHERE name LIKE "____";
  3. -- 统计hp_max血量 大于6000 的英雄个数
  4. select COUNT(*) from heros WHERE hp_max > 6000;
  5. -- 统计students表中不重名的名字个数
  6. SELECT count(DISTINCT(username)) from students;

sum() 总和

  1. -- hp_max 血量总和
  2. SELECT sum(hp_max) from heros;
  3. -- 学生表中 语文成绩总和
  4. SELECT sum(score) from students
  5. WHERE course="语文";

avg() 平均值

  1. -- 所有英雄的血量平均值
  2. select avg(hp_max) from heros;
  1. -- 所有英雄的血量平均值
  2. select avg(hp_max) from heros;
  3. -- 血量大于平均值的英雄信息
  4. select * from heros
  5. WHERE hp_max > (select avg(hp_max) from heros);
  6. -- 血量大于平均值的英雄信息 并且按照血量的大-小 排序
  7. select * from heros
  8. WHERE hp_max > (select avg(hp_max) from heros)
  9. ORDER BY hp_max DESC;

group by 分组

  1. SELECT DISTINCT(role_main) FROM heros;
  2. SELECT role_main FROM heros
  3. GROUP BY role_main; -- GROUP BY 后面跟上对应的字段,可以将该字段中的有重复数据自动去重。
  1. -- 计算 students表中每个科目的分数总和
  2. -- 1. 要按照 course 进行分组
  3. -- 2. 分数总和 sum(score)
  4. select course,sum(score) from students
  5. WHERE course is not null -- 先去掉空数据
  6. GROUP BY course; -- 再进行分组
  1. -- 按照攻击类型进行分组,分别计算 总和,平均值,数量
  2. select attack_range, sum(hp_max), avg(hp_max),COUNT(name) from heros
  3. GROUP BY attack_range;

having 条件过滤

在group by 分组之后,如果需要进行相关数据的条件过滤,使用 having 条件过滤;
having后跟的条件 主要是 聚合函数中统计数据,
比如 sum,min,max

  1. -- 英雄表中 按照 role_main 进行分组,统计出 hp_max 总和, 要求 hp_max的总和大于 30000的相关信息
  2. SELECT role_main,sum(hp_max) from heros
  3. GROUP BY role_main -- 如果是涉及到统计数据的过滤,使用 group by ... HAVING 进行过滤
  4. HAVING sum(hp_max) > 30000;

执行顺序

  1. select * from table
  2. where 条件
  3. group by ... 分组
  4. having... 针对分组的统计数据过滤
  5. order by. 排序
  6. limit .. 限制

练习

  1. -- students 表中 课程进行分组,算出每门学课的成绩总和 以及 平均值
  2. -- course 分组, sum(score), avg(score)
  3. select course,sum(score),avg(score) from students
  4. WHERE score is not null
  5. group by course
  6. -- students 表中 针对每个学生进行分组,计算该学生的 成绩总和,平均值
  7. select username,sum(score),avg(score) from students
  8. WHERE score is not null
  9. group by username

作业

checkin 表
image.png

  1. 2021-7月份考勤的总数
  2. 2021-7月份每个人的考勤次数 (分组)
  3. 总共考勤中每个人的考勤次数 并按照考勤次数的多少 从大到小排序
  4. 2021-7月份考勤的人员最多的人的姓名
  1. -- 2021-7月份考勤的总数
  2. SELECT * FROM checkin;
  3. select count(*) from checkin WHERE checkin_time LIKE "2021-07%"
  4. -- 2021-7月份每个人的考勤次数 (分组)
  5. select name, COUNT(name) from checkin
  6. WHERE checkin_time LIKE "2021-07%"
  7. GROUP BY name
  8. -- 总共考勤中每个人的考勤次数 并按照考勤次数的多少 从大到小排序
  9. select name, COUNT(*) from checkin
  10. GROUP BY name
  11. ORDER BY count(name) DESC
  12. -- 2021-7月份考勤的人员最多的人的姓名
  13. select name, count(*) from checkin
  14. WHERE checkin_time LIKE "2021-07%"
  15. GROUP BY name
  16. HAVING count(*) = (
  17. select COUNT(checkin_time) from checkin
  18. WHERE checkin_time LIKE "2021-07%"
  19. GROUP BY name
  20. ORDER BY count(checkin_time) desc
  21. LIMIT 1
  22. )

students 表
image.png
— 1、查询出所有学生的姓名

— 2、查询出所有学生的姓名和性别

— 3、查询出学生表全部信息

— 4、查询出成绩大于80分的学生编号,成绩

— 5、查询出成绩等于80分的学生编号,成绩

— 6、查询出成绩不超过80分的学生编号,成绩

— 7、查询出成绩不低于80分的学生编号,成绩

— 8、查询出成绩低于80分的学生编号,成绩

— 9、查询出成绩在60到80分之间的学生编号,成绩

— 10、查询出姓王的学生

— 11、查询出姓名中包含兰字的学生

— 12、查询出姓名中第二个字为风字的学生

— 13、查询出不姓王的女学生

— 14、查询出成绩不在60到80分之间的学生

— 15、查询出成绩为80分或者60分的学生编号并对学生编号去重

— 16、查询出成绩不为60分和80分的学生,并对学生编号去重

— 17、查询出学生编号01的学生,成绩高于80分的课程编号

— 18、查询出所有学生的成绩并按照成绩从高到低的顺序排序

— 20、查询出所有学生的成绩,取成绩最高的三条记录

— 21、查询出所有学生的成绩,取3到5条记录

— 22、统计出所有学生的总成绩

— 23、统计出所有学生的平均成绩

— 24、统计出所有学生的最高成绩

— 25、统计出所有学生的最低成绩

— 26、统计出成绩表中共有多少条记录

— 27、统计每个学生的总成绩

— 28、统计每个学生的平均成绩

— 29、统计每个学生的最高成绩

— 30、统计每个学生的最低成绩

— 31、统计每门课及格的学生数

  1. SELECT course ,count(score) from students
  2. WHERE score >=60
  3. GROUP BY course

— 32、统计每门课都及格的学生姓名

  1. SELECT username from students
  2. WHERE course="体育" AND score >= 60 and username in (
  3. SELECT username from students
  4. WHERE course="语文" AND score >= 60 and username in (
  5. SELECT username from students
  6. WHERE course="数学" AND score >= 60)
  7. )

  1. 男生的人数

    1. SELECT COUNT(DISTINCT(username)) from students
    2. WHERE sex = "男"
  2. 一条sql语句统计出男生,女生的人数

    1. SELECT sex, COUNT(DISTINCT(username)) FROM
    2. students
    3. WHERE sex is not null
    4. GROUP BY sex
  3. 语文成绩按从大到小进行排序

    1. SELECT * from students
    2. WHERE course="语文"
    3. ORDER BY score DESC
  4. 体育成绩最大值

    1. select max(score) FROM students
    2. WHERE course="体育"
  5. 平均成绩大于60分的学生姓名 ```sql

select username as “姓名”, sum(score)/3 as “平均成绩” from students GROUP BY username

— 2. 平均成绩大于60

select username as 姓名, sum(score)/3 as 平均成绩 from students GROUP BY username HAVING 平均成绩 > 60

  1. 6. 统计学生的平均年龄
  2. ```sql
  3. select avg(age) from (SELECT DISTINCT(username),age from students
  4. WHERE age is not null) as tmpdata;
  1. 大于平均年龄的学生姓名

    1. SELECT DISTINCT(username), age from students
    2. WHERE age > (
    3. select avg(age) from (SELECT DISTINCT(username),age from students
    4. WHERE age is not null) as tmpdata
    5. )
  2. 总成绩最高的学生 ```sql — 总成绩最高的学生 SELECT * from students; — 1. 总成绩 sum(score) SELECT username,sum(score) from students GROUP BY username;

— 2, 最高的总成绩

— a. 使用order by

SELECT sum(score) from students GROUP BY username ORDER BY sum(score) DESC LIMIT 1;

— b 使用max

SELECT sum(score) from students GROUP BY username — 使用子查询

select max(总分) as 最高分 from (SELECT sum(score) as 总分 from students GROUP BY username) as tmp — 将查询结果作为临时表 as后跟临时表的表名

— 3。 根据最高总成绩招人

select username FROM students — 对应的人 GROUP BY username HAVING sum(score) = — 总分=最高分 ( SELECT sum(score) from students GROUP BY username ORDER BY sum(score) DESC LIMIT 1 ) — 最高分

— select username FROM students GROUP BY username HAVING sum(score) = ( select max(总分) as 最高分 from (SELECT sum(score) as 总分 from students GROUP BY username) as tmp )

  1. 9. 语文和数学都高于70分的学生
  2. ```sql
  3. -- 如果都大于70 那么这个名字应该出现2次 COUNT(expr)
  4. SELECT username from students
  5. WHERE course in ("语文","数学") and score > 70
  6. GROUP BY username
  7. HAVING count(username) = 2
  8. -- 先查询语文大于70的人
  9. select username from students
  10. WHERE course="语文" AND score > 70
  11. select username from students
  12. WHERE course="数学" AND score > 70 and username in ( select username from students WHERE course="语文" AND score > 70)