数据

-- 学生
create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('08' , '王菊' , '1990-01-20' , '女');-- 课程
create table Course(cid varchar(10),cname varchar(10),tid varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');-- 老师
create table Teacher(tid varchar(10),tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');-- 分数
create table SC(sid varchar(10),cid varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);

学生

老师

课程

分数

01

查询"01"课程比"02"课程成绩高的学生的信息及课程分数

先查询01课程

再查询02

交集

SELECT *
FROM (SELECT * FROM SC WHERE cid='01') aJOIN(SELECT * FROM SC WHERE cid='02') b on a.sid = b.sid

增加限制条件,01分数 > 02分数

关联查询课程信息

SELECT *
FROM (SELECT * FROM SC WHERE cid='01') aJOIN(SELECT * FROM SC WHERE cid='02') b on a.sid = b.sid and a.score > b.scoreJOINCourse c on a.cid = c.cidJOINCourse d on b.cid = d.cid

关联查询学生信息

SELECT *
FROM (SELECT * FROM SC WHERE cid='01') aJOIN(SELECT * FROM SC WHERE cid='02') b on a.sid = b.sid and a.score > b.scoreJOINCourse c on a.cid = c.cidJOINCourse d on b.cid = d.cidJOINStudent e on a.sid = e.sid

汇总

-- 01
SELECTe.sid,e.sname,e.sage,e.ssex,a.cid AS cid01,c.cname AS cname01,a.score AS cscore01,b.cid AS cid02,d.cname AS cname02,b.score AS cscore02
FROM( SELECT * FROM SC WHERE cid = '01' ) aJOIN ( SELECT * FROM SC WHERE cid = '02' ) b ON a.sid = b.sid AND a.score > b.scoreJOIN Course c ON a.cid = c.cidJOIN Course d ON b.cid = d.cidJOIN Student e ON a.sid = e.sid

02

查询学生选课存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null)

SELECT*
FROM( SELECT * FROM SC WHERE cid = '01' ) aLEFT JOIN ( SELECT * FROM SC WHERE cid = '02' ) b ON a.sid = b.sid

03

查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

先查询平均分

SELECT *,AVG(score) avg
FROM sc
GROUP BY sc.sid
HAVING avg >= 60

再多表关联查询

SELECTa.sid, b.sname, a.avg
FROM( SELECT *, AVG( score ) avg FROM sc GROUP BY sc.sid HAVING avg >= 60 ) aJOIN Student b ON a.sid = b.sid

04

查询在 SC 表存在成绩的学生信息

SELECT b.*, a.score FROM sc a, Student b WHERE a.sid = b.sid
GROUP BY a.sid-- or
SELECT b.*, a.score FROM sc a
JOIN Student b on a.sid = b.sid
GROUP BY a.sid

05

查询所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和

SELECT a.sid,b.sname,COUNT(DISTINCT a.cid) count,SUM(a.score) scores
FROM sc a
JOIN Student b on a.sid = b.sid
GROUP BY a.sid

06

查询「李」姓老师的数量

SELECT (COUNT(DISTINCT tid)) count FROM Teacher WHERE tname like '李%'

07

查询学过「张三」老师授课的同学的信息

SELECTa.sid,d.sname,d.sage,d.ssex,c.tid,c.tname
FROMsc aJOIN Course b ON a.cid = b.cidJOIN Teacher c ON b.tid = c.tid AND c.tname = '张三'JOIN Student d ON d.sid = a.sid

08

查询没有学全所有课程的同学的信息

学生表关联成绩表,进行匹配查询

SELECT*
FROMStudent aLEFT JOIN sc b on a.sid = b.sid

根据sid进行分组,查询cid的个数

SELECT*,COUNT(DISTINCT b.cid) count
FROMStudent aLEFT JOIN sc b on a.sid = b.sid GROUP BY b.sid

根据课程总数进行过滤

SELECTa.*,COUNT(DISTINCT b.cid) count
FROMStudent aLEFT JOIN sc b on a.sid = b.sid GROUP BY b.sidHAVING count < (SELECT COUNT(*) FROM Course)


09

查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

关联查询学生表和成绩表

SELECTa.*,b.*
FROMStudent aJOIN sc b ON a.sid = b.sid

筛选匹配学号为" 01 "的同学所学课程

SELECTa.*,b.*
FROMStudent aJOIN sc b ON a.sid = b.sid
WHEREb.cid in (SELECT cid FROM sc WHERE sid='01')

按sid分组并排除01

SELECTa.*,b.*
FROMStudent aJOIN sc b ON a.sid = b.sid
WHEREb.cid in (SELECT cid FROM sc WHERE sid='01')
GROUP BY a.sid
HAVING a.sid != '01'

10

查询和" 01 "号的同学所学课程,完全相同的其他同学的信息

多表查询,排除01

SELECTa.*,b.*
FROMStudent aJOIN sc b ON a.sid = b.sid and a.sid != '01'

拼接课程ID,方便后面比较

SELECTa.*,GROUP_CONCAT(b.cid SEPARATOR '-') courses
FROMStudent aJOIN sc b ON a.sid = b.sid and a.sid != '01'GROUP BY b.sid

和01同学比较

SELECTa.*,GROUP_CONCAT(b.cid SEPARATOR '-') courses
FROMStudent aJOIN sc b ON a.sid = b.sid and a.sid != '01'GROUP BY b.sidHAVING courses=(SELECT GROUP_CONCAT(cid SEPARATOR '-') courses FROM sc WHERE sid='01' GROUP BY sid)

11

查询没学过"张三"老师讲授的任一门课程的学生姓名

先关联查询成绩表的课程信息和老师信息

SELECT*
FROMsc bJOIN Course c ON b.cid = c.cidJOIN Teacher d ON c.tid = d.tid

过滤出张三老师

SELECT*
FROMsc bJOIN Course c ON b.cid = c.cidJOIN Teacher d ON c.tid = d.tid
WHEREtname = '张三'

从学生表中筛选出不在当前所含sid的其他同学信息

SELECT*
FROMStudent
WHEREsid NOT IN (SELECTb.sid FROMsc bJOIN Course c ON b.cid = c.cidJOIN Teacher d ON c.tid = d.tid WHEREtname = '张三' )

12

查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

查询不及格

SELECT * FROM sc
WHERE score < 60

分组统计次数并筛选数量、计算平均成绩

SELECT sid, AVG(score) avg
FROM sc
WHERE score < 60
GROUP BY sid
HAVING COUNT( cid ) >= 2

关联查询学生信息

SELECTb.*,a.avg
FROM( SELECT sid, AVG( score ) avg FROM sc WHERE score < 60 GROUP BY sid HAVING COUNT( cid ) >= 2 ) aJOIN Student b ON a.sid = b.sid

13

查询" 01 "课程分数小于 60,按分数降序排列的学生信息

SELECTb.*,a.score
FROM( SELECT sid, score FROM sc WHERE score < 60 AND cid = '01' ORDER BY score DESC ) aJOIN Student b ON a.sid = b.sid

14

按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECTa.*,b.avg
FROMSC aJOIN ( SELECT sid, avg( score ) avg FROM sc GROUP BY sid ) b ON a.sid = b.sid
ORDER BY avg DESC

15

查询各科成绩最高分、最低分和平均分

字段:课程 id,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

及格为>=60,中等为:[70,80),优良为:[80-90),优秀为:>=90

SELECTcid,MAX( score ) maxScore,MIN( score ) minScore,AVG( score ) avgScore,COUNT( sid ) count,SUM( CASE WHEN score >= 60 THEN 1 ELSE 0 END ) / COUNT( sid ) '及格率',SUM( CASE WHEN score > 70 AND score < 80 THEN 1 ELSE 0 END ) / COUNT( sid ) '中等率',SUM( CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END ) / COUNT( sid ) '优良率',SUM( CASE WHEN score >= 90 THEN 1 ELSE 0 END ) / COUNT( sid ) '优秀率'
FROMsc
GROUP BYcid
ORDER BYcid ASC

16

按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺

SELECT*,rank() over ( PARTITION BY cid ORDER BY score DESC ) AS ranked
FROMsc;

MySQL可以实现Oracle中的排名公式,一共有三种

  1. rank() over(order by col_name desc)
  2. dense_rank() over()
  3. row_number() over()

第一个是如果出现了相同排名都为同一排名,下个排名跳过,例如1,1,3,4
第二个是如果出现了相同排名都为同一排名,下个排名不跳过,例如1,1,2,3
第三个是直接对行进行排名不分是否有相同值
此题目要按照各科成绩进行排序 over()中要填partition by col_name order by col_name
第一个columname 为分组的内容,第二个是按什么值排的内容。

17

查询学生的总成绩,并进行排名,总分重复时保留名次空缺

SELECTa.*,RANK() over(ORDER BY sum DESC) ranked
FROM(SELECT sid, sum(score) sum FROM sc GROUP BY sid) a

18

查询学生的总成绩,并进行排名,总分重复时不保留名次空缺

SELECTa.*,DENSE_RANK() over(ORDER BY sum DESC) ranked
FROM(SELECT sid, sum(score) sum FROM sc GROUP BY sid) a

19

统计各科成绩各分数段人数:课程编号,[100-85),[85-70),[70-60),[60-0] 及所占百分比

SELECTcid,SUM( CASE WHEN score <= 60 THEN 1 ELSE 0 END ) / count( sid ) p1,SUM( CASE WHEN score > 60 AND score <= 70 THEN 1 ELSE 0 END ) / count( sid ) p2,SUM( CASE WHEN score > 70 AND score <= 85 THEN 1 ELSE 0 END ) / count( sid ) p3,SUM( CASE WHEN score > 85 THEN 1 ELSE 0 END ) / count( sid ) p4
FROMSC
GROUP BYcid

20

查询各科成绩前三名的记录

SELECT*
FROM( SELECT sid, cid, score, rank() over ( PARTITION BY cid ORDER BY score DESC ) ranked FROM sc ) a
WHEREa.ranked <= 3

21

查询每门课程被选修的学生数

SELECT cid,COUNT(sid)
FROMsc
GROUP BY cid

22

查询出只选修两门课程的学生学号和姓名

SELECTa.sid,a.count,b.sname,b.sage,b.ssex
FROM( SELECT sid, COUNT( cid ) count FROM sc GROUP BY sid HAVING count = 2 ) aJOIN Student b ON a.sid = b.sid

SQL的执行顺序应该为 FORM-JOIN ON-WHERE-GROUP BY-HAVING-SELECT-DISTINCT-UNION-ORDER

23

查询男生、女生人数

SELECT ssex,COUNT(*) count
FROMStudent
GROUP BY ssex

24

查询名字中含有「风」字的学生信息

SELECT*
FROMStudent
WHERE sname like '%风%'

25

查询同名同姓学生名单,并统计同名人数

SELECT*,COUNT(*) count
FROMStudent aJOIN Student b on a.sname=b.sname and a.ssex=b.ssex
GROUP BY a.sid
HAVING count >= 2

26

查询 1990 年出生的学生名单

SELECT*
FROMStudent
WHERE YEAR(sage) = 1990

27

查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

SELECTcid,AVG( score ) avg
FROMsc
GROUP BYcid
ORDER BY avg DESC, cid asc

28

查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

SELECTa.*,b.sname
FROM( SELECT a.sid, avg( a.score ) avg FROM SC a GROUP BY sid HAVING avg >= 85 ) aJOIN Student b on a.sid = b.sid

29

查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

SELECTc.sid,c.sname,a.score,b.cname
FROMsc aJOIN Course b on a.cid = b.cid and b.cname='数学'JOIN Student c on a.sid = c.sid
WHERE score < 60

30

查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)

SELECTc.sname,b.cname,a.score
FROMSC aJOIN Course b ON a.cid = b.cidJOIN Student c ON a.sid = c.sid

31

查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数

SELECTc.sname,b.cname,a.score
FROM(SELECT * FROM sc WHERE score > 70) a JOIN Course b on a.cid = b.cidJOIN Student c on a.sid = c.sid

32

查询不及格的课程

SELECTa.sid,b.cid,b.cname,a.score
FROM(SELECT * FROM sc WHERE score < 60) aJOIN Course b on a.cid = b.cid

33

查询课程编号为 01 且课程成绩在 60 分以上的学生的学号和姓名

SELECTa.sid,b.sname,a.score,a.cid,c.cname
FROM(SELECT * from sc WHERE cid='01' and score > 60) aJOIN Student b on a.sid = b.sidJOIN Course c on a.cid = c.cid

34

求每门课程的学生人数

SELECTa.cid,b.cname,a.count
FROM( SELECT cid, COUNT( DISTINCT sid ) count FROM sc GROUP BY cid ) aJOIN Course b ON a.cid = b.cid

35

成绩没有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

SELECTd.sid,d.sname,b.cid,b.cname,MAX(score) maxScore,c.tid,c.tname
FROM(SELECT * from SC) a JOIN Course b on a.cid = b.cidJOIN Teacher c on b.tid = c.tid and c.tname='张三'JOIN Student d on a.sid = d.sid

36

成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

先改点数据,最高分变两个

rank() 函数排序

SELECTd.sid,d.sname,b.cid,b.cname,c.tid,c.tname,RANK() over ( ORDER BY a.score DESC ) ranked
FROM( SELECT * FROM sc ) aJOIN Course b ON a.cid = b.cidJOIN Teacher c ON b.tid = c.tid AND c.tname = '张三'JOIN Student d ON a.sid = d.sid

然后筛选 ranked=1

SELECT*
FROM(SELECTd.sid,d.sname,b.cid,b.cname,c.tid,c.tname,RANK() over ( ORDER BY a.score DESC ) ranked FROM( SELECT * FROM sc ) aJOIN Course b ON a.cid = b.cidJOIN Teacher c ON b.tid = c.tid AND c.tname = '张三'JOIN Student d ON a.sid = d.sid ) tmp
WHEREranked = 1

37

查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

SELECT DISTINCT a.sid,a.cid,a.score
FROMsc aJOIN sc b ON a.score = b.score AND a.cid != b.cid

38

查询每门功成绩最好的前两名

前两名是排名的前2个,即第一个排名1 和第二个排名2,如果有两个并列第一,一个第二,那么前两名应该是3个人,用dense_rank,排名不跳过;如果说是最好的前两个人,就用rank,排名跳过

SELECT*
FROM( SELECT *, DENSE_RANK() over ( PARTITION BY cid ORDER BY score DESC ) ranked FROM sc ) a
WHEREranked <=2

39

统计每门课程的学生选修人数(超过 5 人的课程才统计)

SELECTa.*,b.cname
FROM( SELECT cid, count(*) count FROM sc GROUP BY cid ) aJOIN Course b ON a.cid = b.cid

40

检索至少选修两门课程的学生学号

SELECTb.sname,a.*
FROM(SELECT sid, count(*) count FROM sc GROUP BY sid HAVING count >= 2) a JOIN Student b on a.sid = b.sid

41

查询选修了全部课程的学生信息

SELECTa.*,b.sname,b.sage,b.ssex
FROM(SELECT sid, COUNT(cid) count FROM sc GROUP BY sid HAVING count = (SELECT count(*) from Course)) aJOIN Student b on a.sid = b.sid

42

查询各学生的年龄,只按年份来算

SELECTsname,YEAR(NOW()) - YEAR(sage) age
FROMStudent

43

按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一

SELECTsname,sage,(DATE_FORMAT( now(), '%m-%d' ) - DATE_FORMAT( sage, '%m-%d' )) sub,CASE WHEN (DATE_FORMAT( now(), '%m-%d' ) - DATE_FORMAT( sage, '%m-%d' )) < 0 THEN YEAR (NOW()) - YEAR ( sage ) - 1 ELSE YEAR (NOW()) - YEAR ( sage ) END AS age
FROMstudent

MYSQL50道基础练习题相关推荐

  1. Python3道基础练习题

    练习: 输入一个整数n, 判断这个整数是否是素数(prime) (素数是指只能被1 和自身整除的数) 如: # 2 3 5 7 11... 方法: 用排除法.一但n能被2~n-1的数整除就不是素 数, ...

  2. python给定字符串显示奇数_字符串基础练习题80+道(原文及代码见文尾链接)

    Python 字符串基础练习题80+道 1.编写一个Python程序来计算字符串的长度. 2.编写一个Python程序来计算字符串中的字符数(字符频率). Sample String:google.c ...

  3. Python100道经典练习题(一)

    Python100道经典练习题(一) 当前计算机语言最火的python占据我们生活的各个方面,人工智能.云计算.5G发展.汽车工业.互联网加行业等.话不多说,所谓磨刀不误砍柴工,掌握一门编程语言的最佳 ...

  4. java习题7参考练习及答案_Java基础练习题及详细答案

    本文参考 嗨客网 Java 实战 前言 本篇文章给大家安利一些关于 Java 基础的练习题,每道题都附有答案链接,答案解题的每个步骤到运行结果都十分详细,十分适合小白拿来练习,也十分适合准备面试的各位 ...

  5. Python基础练习题:杂乱无章的页面列表【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶

    Python基础练习题:杂乱无章的页面列表[难度:1级]: 你得到了一本古老的书,不幸的是有几页错误的位置,幸运的是你的计算机有一个从"1"到"n"的顺序的每个 ...

  6. 这些Python基础练习题你会几个?

    在人工智能大火的当今,Python 作为人工智能时代的首选语言已经越来越收到追捧:但是许多非科班.零基础的小伙伴常常苦于没有合适的入门 Python 的教程而感到苦恼:本人是一名资深Python开发, ...

  7. python集合例题_python基础练习题、集合的讲解、一些公关方法

    1.求100(含100)以内所有偶数的和 range(start,end,step)这个序列生成器,和那个切片的语法一样,含头不含尾,step是步长,这里就不需要在对j进行判断了,对于这些简单求奇数和 ...

  8. Linux基础练习题(二)

    Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...

  9. 计算机基本的应用是,计算机统考应用基础练习题

    计算机统考应用基础练习题 计算机统考就要来临,有哪些好的练习试题.下面是小编为您整理的关于计算机统考应用基础练习题的相关资料,欢迎阅读! 计算机安全的基本知识和概念 1.下面最难防范的网络攻击是___ ...

最新文章

  1. MYSQL触发器记录用户操作的命令
  2. 正则爬取京东商品信息并打包成.exe可执行程序。
  3. banner手动切换效果
  4. 鼠标马赛克图像部分区域
  5. 【Scratch】青少年蓝桥杯_每日一题_8.03_飞猫
  6. java_opts gc回收器_JVM之垃圾回收机制(GC)
  7. java创建阻塞_如何从HttpsURLConnection创建Java非阻塞InputStream?
  8. JZOJ 3871. 【NOIP2014八校联考第4场第1试10.19】无聊的游戏(game)
  9. llinux的shell脚本编程详解
  10. Unity中使用RequireComponent,没有添加上组件
  11. ajax上传变量,通过ajax传递post变量
  12. 获取指定远程网页内容
  13. 物联网(IoT)会是广告欺诈的一道后门
  14. ubuntu linux设置网关,ubuntu修改静态IP网关
  15. 获得当前时间,刻度为一千分一秒
  16. 惠普服务器c盘格式化提示win7系统盘,c盘格式化,小编告诉你怎么格式化c盘
  17. JS实现网页二维码扫描功能
  18. Gradle下载安装教程
  19. Java调用第三方接口(http总结)
  20. 如何用 Unity 编写像炸弹人一样的游戏

热门文章

  1. Socket简单学习之UDP通信
  2. 抓包工具(Android)
  3. Canape与Canoe一起使用时如何配置通道
  4. 个人用户如何在知网系统提交知网查重
  5. 天池新人赛幸福感数据分析+预测
  6. 整除光棍(附简要证明)
  7. 童诗白模电--基本运算电路
  8. 远程桌面连接出现由于网络错误,连接被中断,请重新连接到远程计算机错误的解决方法
  9. matlab dda算法,dda直线算法生成.pdf
  10. perl 脚本跑回归测试【IC】