SQL经典练习(11~14)

  1. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
      分析:两门及以上课程,那就是成绩表中课程数目大于等于2,不及格成绩,那就是考试成绩小于60。学生的学号,姓名信息来自students表,平均成绩是对考试成绩进行AVG函数。
SELECT s.`S#`,s.sname,AVG(score) AS "平均成绩"
FROM students s,SC
WHERE  s.`S#` = SC.`S#` AND score < 60 
GROUP BY s.`S#` ,s.sname
HAVING COUNT(score) >= 2;

查询结果

12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
  分析:两个表联结查询,score < 60, 筛选条件课程为01,最后降序排列。

SELECT s.*
FROM students AS s,SC
WHERE s.`S#` = SC.`S#` AND score < 60 AND `C#` = '01'
ORDER BY score DESC;
查询结果
  1. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
      分析:如果题目只要求“显示所有学生的平均成绩(默认升序排列)”则使用
SELECT `S#`,AVG(score)
FROM SC
GROUP BY `S#`
ORDER BY AVG(score);
查询结果

  但是题目还要求显示所有课程和成绩,因此要在上面查询结果中在增加3列,分别表示课程01,02,03以及对应的成绩,如果没有成绩,成绩显示为0或者NULL等。这个让我想到了一维表转成二维表,就是原表的列是“课程”,它下面有各门课程,比如语文,数学,英语等,这种表属于典型的一维表,很多时候我们都需要这种形式的表进行表格创建,数据分析等。而如果把“课程”字段下的各门课程单独拿出来,作为新的列(字段)就变成了二维表。本题就要求进行这样的查询。“行转列”自然想到了条件判断CASE...WHEN...END,配合GROUP BY语句,对分组以后的记录,进行“遍历”筛选,符合某条件的就返回对应的值,不符合的也设定一个值,比如本题是0或者NULL。

SELECT `S#`,MAX(CASE `C#` WHEN '01' THEN score ELSE NULL END) AS course_01,
MAX(CASE `C#` WHEN '02' THEN score ELSE NULL END) AS course_02,
MAX(CASE `C#` WHEN '03' THEN score ELSE NULL END) AS course_03,
AVG(score) AS "平均成绩"
FROM SC
GROUP BY `S#`
ORDER BY AVG(score) DESC;

查询结果

  这段代码花费了我比较长的时间,主要是卡在了聚集函数与CASE...WHEN...END以及GROUP BY子句的联合使用。最终也是想明白了。主要是以下几点:
(1)GROUP BY 子句后面需要分组的列名,必须是SELECT 后面的除了聚集函数以外的所有列名。如果SELECT后面包含多个列名(没有使用聚集函数SUM,AVG,MAX,MIN等),而GROUP BY后面的列名只是它们其中的一部分,系统将报错。
(2)GROUP BY 分组,其实有点像DISTINCT,它把表的内容按照某个字段分组,该字段中,相同的数据合成为“一个”数据。之后使用聚集函数就针对每个分组进行了,不会越过某个分组跑到另外的分组。
(3)如果使用了GROUP BY子句分组,那么SELECT 后面,需要新增的列,必须使用聚集函数,因为这样才能保证输出结果为一个。GROUP BY 分组后,查询总是只返回一个数据,聚集函数的作用就是将多个数据通过函数的方法变成一个
(4)一定要明白SQL语句的执行顺序。
  这段代码中的MAX,其实可以更换成SUM,NULL可以更换成数字0,因为SUM函数是忽略NULL值的;三个成绩,其中两个为空(或者为0),另外一个进行SUM计算,还是本身。而它们的目的就是将多个数据通过计算变成一个数据,这样就可以返回。

  1. 查询各科成绩最高分、最低分和平均分,以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率(及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)。 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
      分析:看到条件判断筛选的题目首先就要想到CASE...WHEN...END。“查询各科成绩”这句话提示要按照课程分组。这个题目多了一组数据,及格率等,知道及格率=及格人数/总人数,其他类似即可,这里就存在一个对60分以上的成绩进行计数计算的过程。
SELECT c.`C#` AS "课程编号",c.`Cname` AS "课程名称",COUNT(*) AS "选修人数",
MAX(score) AS "最高分",MIN(score) AS "最低分",AVG(score) AS "平均分",
SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END)/COUNT(*) AS "及格率",
SUM(CASE WHEN score > 70 AND score < 80 THEN 1 ELSE 0 END)/COUNT(*) AS "中等率",
SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END)/COUNT(*) AS "优良率",
SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END)/COUNT(*) AS "优秀率"
FROM courses AS c, SC
WHERE c.`C#` = SC.`C#`
GROUP BY c.`C#`,c.Cname
ORDER BY COUNT(*) DESC,c.`C#` ASC;
查询结果

  这段代码,主要关注SUM与CASE的搭配使用。在GROUP BY 按照课程号和课程名称分组以后,CASE语句在每个分组内进行记录遍历,如果满足条件,值设为1,在对照第二条记录时,如果还是满足条件的,那么实现累加,即在原来1的基础上再加1,变成2,如果不满足,就是1+0=1,因为实现了对满足条件的记录计数的功能。这个类似EXCEL的COUNTIF函数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,231评论 0 7
  • 网上流传较广的50道SQL训练,奋斗了不知道多久终于写完了。前18道题的难度依次递增,从19题开始的后半部分算是循...
    Kaidi_G阅读 474,747评论 312 452
  • 说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句。 问题及描述: --1.学生表 Stud...
    lijun_m阅读 1,304评论 0 1
  • 50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cna...
    最美的太阳WW阅读 3,188评论 0 23
  • 我在看 幻想与幻象的游戏 从每一个脑袋上空升起 我,难道就我特殊奇异? 哦,朋友,你错了 我与你无异 那里头正时刻...
    真魚阅读 229评论 0 0