一、常用汇总函数的练习

score表

问题:

  • 查询课程编号为“0002”的总成绩
  • 查询选了课程的学生人数
  • 查询学号为“0001”的学生的最高分、最低分和平均分

解答SQL语句如下:

-- 查询课程编号为“0002”的总成绩
SELECT 学号,SUM(成绩)FROM score WHERE `课程号`='0002';-- 查询选了课程的学生人数
SELECT COUNT(DISTINCT 学号)FROM score WHERE `课程号` IS NOT NULL;-- 查询学号为“0001”的学生的最高分
SELECT 学号,MAX(成绩),MIN(成绩),AVG(成绩)FROM score WHERE `学号`='0001';

二、分组练习

student表
score表

问题:

  • 查询各科成绩的最高分和最低分
  • 查询每门课程被选修的学生数
  • 查询男生、女生的人数

解答SQL语句如下:

-- 查询各科成绩的最高分和最低分
SELECT 课程号,MAX(成绩),MIN(成绩)FROM score GROUP BY `课程号`;-- 查询每门课程被选修的学生数
SELECT 课程号,COUNT(DISTINCT 学号)FROM score GROUP BY `课程号`;-- 查询男生、女生的人数
SELECT 性别,COUNT(DISTINCT 性别)FROM student GROUP BY `性别`;

三、给分组结果指定条件的练习

student表
score表

问题:

  • 查询平均成绩大于60分学生的学号和平均成绩
  • 查询至少选修两门课程的学生学号
  • 查询姓名相同的学生名单并统计同名人数

解答:

SQL语句如下:

-- 查询平均成绩大于60分学生的学号和平均成绩
SELECT 学号,AVG(成绩) AS 平均成绩FROM score GROUP BY `学号`HAVING AVG(`成绩`)>60;-- 查询至少选修两门课程的学生学号
SELECT 学号,COUNT(课程号) AS 选修课程数FROM score GROUP BY `学号`HAVING COUNT(`课程号`)>=2;-- 查询姓名相同的学生名单并统计同名人数
SELECT 姓名,COUNT(姓名) AS 同名人数 FROM student GROUP BY `姓名` HAVING COUNT(`姓名`)>=2;

四、用SQL解决业务问题的解题思路

score表

问题:

查询出平均成绩在80分及以上的课程,并写出分析思路。

解答:

  1. 第一步,翻译问题,理解问题

求出每一门课程的平均成绩,然后选出平均成绩在80分及以上的课程

2. 第二步,明确分析思路

分析思路

3. 第三步,写SQL语句

-- 查询出平均成绩在80分及以上的课程,并写出分析思路
SELECT 课程号,AVG(成绩) AS 平均成绩  -- 第四步:查询结果显示课程号,平均成绩FROM score   -- 第一步:从score表中查找数据GROUP BY `课程号`  -- 第二步:按课程号分组HAVING AVG(`成绩`)>=80; -- 第三步:给分组结果指定条件为平均成绩>=80

五、排序练习

score表

问题:

写出下列问题对应的SQL语句,并画出运行顺序

  1. 查询不及格的课程,并按课程号从大到小排列
  2. 查询每门课程的平均成绩,结果按平均成绩升序排序;平均成绩相同时,按课程号降序排序
  3. 查询课程编号为“0003”且成绩>=80的学生学号,结果按按分数降序排列
  4. 统计每门课程的学生选修人数(超过2人的课程才统计),要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序
  5. 查询至少两门课程成绩优秀的同学学号及其成绩优秀的课程的平均成绩

解答:

题1~4答案:

-- 查询不及格的课程,并按课程号从大到小排列
SELECT 课程号,成绩   -- 第三步,查询出成绩<60分的课程号和成绩FROM score -- 第一步,从score表中查询数据WHERE `成绩`<60    -- 第二步,查询条件是成绩<60分
ORDER BY `课程号` DESC;  -- 第四步,对查询结果按课程号降序排序/*查询每门课程的平均成绩,结果按平均成绩升序排序;
平均成绩相同时,按课程号降序排序*/
SELECT 课程号,AVG(成绩) AS 平均成绩  -- 第三步,对分组后的课程计算每门课程的平均成绩,并把列名“AVG(成绩)”命名为“平均成绩”FROM score    -- 第一步,从score表中查询数据GROUP BY `课程号`  -- 第二步,按课程号分组
ORDER BY 平均成绩 ASC ,`课程号` DESC ;   -- 第四步,按照课程的平均成绩升序排序,当平均成绩相同时按照课程号降序排序-- 查询课程编号为“0003”且成绩>90的学生学号,结果按按分数降序排列
SELECT 学号,成绩    -- 第三步,查询结果显示学号和成绩FROM score     -- 第一步,从score表中查询数据WHERE `课程号`='0003' AND `成绩`>=80    -- 第二步,查询条件是课程号为0003并且成绩>=80
ORDER BY `成绩` desc ;  -- 对查询结果按照成绩进行倒序排序/*统计每门课程的学生选修人数(超过2人的课程才统计),
要求输出课程号和选修人数,查询结果按人数降序排序;若人数相同,按课程号升序排序*/
SELECT 课程号,COUNT(学号) AS 选修人数    -- 第四步,查询结果显示课程号和“COUNT(学号)”,并把“COUNT(学号)”命名为“选修人数”FROM score     -- 第一步,从score表中查询数据GROUP BY `课程号`  -- 第二步,按照课程号分组HAVING COUNT(`学号`)>2  -- 给分组指定条件,选修该课程超过2人
ORDER BY 选修人数 DESC ,`课程号` ASC ;   -- 对查询结果按照选修人数进行倒序排序,如果选修人数相同,则按照课程号进行升序排序

题5较为复杂,下面详细解答:

(1)翻译题目,理解题目

先将题目逐个拆解:

查询“至少两门”“课程成绩优秀”的【同学学号】及其“成绩优秀的课程”的【平均成绩】

也就是:

  1. 需要查询的字段是【学号】和【平均成绩】
  2. 【学号】的限制条件是“课程成绩优秀”,“课程成绩优秀”的限制条件是“至少两门”,“平均成绩”的限制条件是“成绩优秀的课程”

(2)确定分析思路

  1. 第一步:得到每个学生的平均成绩,查询结果显示学号和平均成绩

select -- 查询结果:学号,avg(成绩) as 平均成绩

from -- 从哪张表查找数据:score

where -- 限制条件:没有

group by -- 分组:按学号分组

having --给分组指定条件:没有

order by -- 排序:没有

limit -- 指定行数:没有

查询语句如下:

SELECT 学号,AVG(成绩) AS 平均成绩FROM score GROUP BY `学号`;

2. 第二步:加上限制条件

① 给“学号”加上“课程成绩优秀”——查询限制条件where

② 给“平均成绩”加上“成绩优秀的课程”——查询限制条件where

③ 给“课程成绩优秀”加上“至少2门”——在查询限制条件where的基础上给分组指定条件having

select -- 查询结果:学号,avg(成绩) as 平均成绩

from -- 从哪张表查找数据:score

where -- 限制条件:成绩>=90

group by -- 分组:按学号分组

having --给分组指定条件:count(课程号)>=2

order by -- 排序:没有

limit -- 指定行数:没有

查询语句如下:

SELECT 学号,AVG(成绩) AS 平均成绩FROM score WHERE `成绩`>=90GROUP BY `学号`HAVING COUNT(`课程号`)>=2;

sql倒序排列取第一条_从零学会SQL·三——汇总分析相关推荐

  1. sql 删除重复记录保留一条_从零学会SQL·二——简单查询

    一.使用select查询语句完成以下练习 student表 查询姓名和性别 查询所有字段 给查询的字段名替换别名,姓名替换为s_name,性别替换为"人类性别" 查询姓名时删除重复 ...

  2. oracle 分组排序后取第一条_关于oracle中位图索引的探讨:概念、原理、优缺点...

    概述 oracle索引主要分为以下几种: 1. b-tree索引 Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名.CREATE INDEX语句时, ...

  3. mysql 查询重复记录 取第一条_取出重复记录的第一条

    这几天在查询购买记录,其中一个需求就是查出来客户首次购买的产品时间和产品名称.说白了,就是在一段时间内,去取出来用户的第一次购买记录,再清楚一些就是在一堆重复的记录中取出第一条购买记录. 这个问题捉只 ...

  4. sql 分组求和_从零学会SQL:汇总分析 D3

    2020年3月24日 星期二 大纲: 汇总分析: 分组: 对分组结果指定条件: 用sql解决业务问题: 对查询结果排序: 如何看懂报错信息. 1 汇总分析 汇总函数 count:求某列的行数: 计算教 ...

  5. group by 取第一条_一家叫“可牛”的公司成立了!论如何取一个有网感的公司名字?...

    天眼查App显示,近日,可牛了乳制品有限公司成立,注册资本为6885.94万美元,法定代表人为VENKATA VAMSI MOHAN THATI,经营范围包含生产.销售和营销低温奶产品等.天眼查App ...

  6. sql取最大值的那一行_从零学会SQL:SQL高级功能

    一.什么是窗口函数 1.什么是窗口函数? 窗口函数,也叫OLAP函数(Online Analytical Processing,联机分析处理),可以对数据库数据进行实时分析处理. 窗口函数的基本语法如 ...

  7. SQL 取空格右边的字符_从零学会SQL,第2关

    [一.基本的查询语句] SQL书写规则:以英文 ; 结尾 不区分关键字的大小写 符号皆为英文 列名不加单引号,不加空格 select <列名1>,<列名2> from < ...

  8. sql查询 关联帖子_从零学会sql,复杂查询

    一.视图,表中存放的是实际数据,视图中存放的是SQL查询语句,使用视图时,会运行视图里的sql查询语句创建出一张临时表,格式是create view 视图名称(<视图列表1>,<视图 ...

  9. Oracle中实现分组后按时间排序取第一条

    一.实现效果 ①原表效果:存在重复的编号(PARTNER_ID)内容,访问时间(VISIT_DATE)不同 ②分组排序后取第一条的效果:[实现对编号去重,且取访问时间最新的一条数据] 二.sql语句 ...

最新文章

  1. 社区活跃吗_武汉大江园社区活跃着一支90后志愿者突击队
  2. TablePlus 3中文版
  3. Redis命令参考简体中文版
  4. 夜上海音乐播放器 v 1.0
  5. 使用js、jquery完成省市二级联动
  6. 高中辅导班为何改名成培训机构了?
  7. 图论(三)--各种基础图算法总结
  8. 在iOS开发中,我们会遇到十六进制和字符串之间相互转换,话不多说,直接上代码:...
  9. tp3.2 URL生成
  10. 百度飞桨PaddlePaddle 顶会论文复现课程 阅读心得 BigGAN
  11. 【数据库认证】OCM准备及考试经验总结
  12. 面试系列-3 限流场景实践
  13. gt,gte,lt,lte含义
  14. vi 查看最顶部_vi命令示例大全
  15. 4. DBSCAN方法及其应用
  16. 致远项目管理SPM系统进度控制之进度对比分析
  17. hexo博客kaze主题自定义社交链接
  18. 百分点科技助力中国环境监测总站用数据底座赋能智慧监测
  19. Gunicorn 部署flask-socketio项目,项目访问慢的问题
  20. OpenEmbedded Yocto BitBake Poky以及之间关系

热门文章

  1. ASP.NET Core Razor 页面使用教程
  2. .NET Core跨平台的奥秘[上篇]:历史的枷锁
  3. 在ASP.NET Core Web API上使用Swagger提供API文档
  4. 微软觊觎LinkedIn算法
  5. PHP上传图片到数据库,并进行显示
  6. Android实战:手把手实现“捧腹网”APP(一)-----捧腹网网页分析、数据获取
  7. Android Studio之导入别人的module后config.gradle配置文件没有生效
  8. C和指针之字符串strtok函数
  9. linux网络编程之用一张图片说明套接口常用函数
  10. HTML基础之bit哥的反客为主之道(9)