MYSQL50道基础练习题

数据

-- 学生
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);

学生

MYSQL50道基础练习题_第1张图片

老师

MYSQL50道基础练习题_第2张图片

课程

MYSQL50道基础练习题_第3张图片

分数
MYSQL50道基础练习题_第4张图片

01

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

先查询01课程

MYSQL50道基础练习题_第5张图片

再查询02

MYSQL50道基础练习题_第6张图片

交集

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

MYSQL50道基础练习题_第7张图片

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

MYSQL50道基础练习题_第8张图片

关联查询课程信息

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

MYSQL50道基础练习题_第9张图片

关联查询学生信息

SELECT 
	* 
FROM 
  (SELECT * FROM SC WHERE cid='01') a
	JOIN
	(SELECT * FROM SC WHERE cid='02') b on a.sid = b.sid and a.score > b.score
	JOIN
	Course c on a.cid = c.cid
	JOIN
	Course d on b.cid = d.cid
	JOIN
	Student e on a.sid = e.sid

MYSQL50道基础练习题_第10张图片

汇总

-- 01
SELECT
	e.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' ) a
	JOIN ( SELECT * FROM SC WHERE cid = '02' ) b ON a.sid = b.sid AND a.score > b.score
	JOIN Course c ON a.cid = c.cid
	JOIN Course d ON b.cid = d.cid
	JOIN Student e ON a.sid = e.sid

MYSQL50道基础练习题_第11张图片

02

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

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

MYSQL50道基础练习题_第12张图片

03

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

先查询平均分

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

MYSQL50道基础练习题_第13张图片

再多表关联查询

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

MYSQL50道基础练习题_第14张图片

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

MYSQL50道基础练习题_第15张图片

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

MYSQL50道基础练习题_第16张图片

06

查询「李」姓老师的数量

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

MYSQL50道基础练习题_第17张图片

07

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

SELECT
	a.sid,
	d.sname,
	d.sage,
	d.ssex,
	c.tid,
	c.tname 
FROM
	sc a
	JOIN Course b ON a.cid = b.cid
	JOIN Teacher c ON b.tid = c.tid AND c.tname = '张三'
	JOIN Student d ON d.sid = a.sid

MYSQL50道基础练习题_第18张图片

08

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

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

SELECT
	*
FROM
	Student a
	LEFT JOIN sc b on a.sid = b.sid

MYSQL50道基础练习题_第19张图片

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

SELECT
	*,
	COUNT(DISTINCT b.cid) count
FROM
	Student a
	LEFT JOIN sc b on a.sid = b.sid GROUP BY b.sid

MYSQL50道基础练习题_第20张图片

根据课程总数进行过滤

SELECT
	a.*,
	COUNT(DISTINCT b.cid) count
FROM
	Student a
	LEFT JOIN sc b on a.sid = b.sid GROUP BY b.sid
	HAVING count < (SELECT COUNT(*) FROM Course)

MYSQL50道基础练习题_第21张图片
MYSQL50道基础练习题_第22张图片

09

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

关联查询学生表和成绩表

SELECT
	a.*,
	b.*
FROM
	Student a
	JOIN sc b ON a.sid = b.sid 

MYSQL50道基础练习题_第23张图片

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

SELECT
	a.*,
	b.*
FROM
	Student a
	JOIN sc b ON a.sid = b.sid 
WHERE
	b.cid in (SELECT cid FROM sc WHERE sid='01')

MYSQL50道基础练习题_第24张图片

按sid分组并排除01

SELECT
	a.*,
	b.*
FROM
	Student a
	JOIN sc b ON a.sid = b.sid 
WHERE
	b.cid in (SELECT cid FROM sc WHERE sid='01')
GROUP BY a.sid
HAVING a.sid != '01'

MYSQL50道基础练习题_第25张图片

10

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

多表查询,排除01

SELECT
	a.*,
	b.*
FROM
	Student a
	JOIN sc b ON a.sid = b.sid and a.sid != '01'

MYSQL50道基础练习题_第26张图片

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

SELECT
	a.*,
	GROUP_CONCAT(b.cid SEPARATOR '-') courses
FROM
	Student a
	JOIN sc b ON a.sid = b.sid and a.sid != '01'
	GROUP BY b.sid

MYSQL50道基础练习题_第27张图片

和01同学比较

SELECT
	a.*,
	GROUP_CONCAT(b.cid SEPARATOR '-') courses
FROM
	Student a
	JOIN sc b ON a.sid = b.sid and a.sid != '01'
	GROUP BY b.sid
	HAVING courses=(SELECT GROUP_CONCAT(cid SEPARATOR '-') courses FROM sc WHERE sid='01' GROUP BY sid)

MYSQL50道基础练习题_第28张图片

11

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

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

SELECT
	* 
FROM
	sc b
	JOIN Course c ON b.cid = c.cid
	JOIN Teacher d ON c.tid = d.tid 

MYSQL50道基础练习题_第29张图片

过滤出张三老师

SELECT
	* 
FROM
	sc b
	JOIN Course c ON b.cid = c.cid
	JOIN Teacher d ON c.tid = d.tid 
WHERE
	tname = '张三'

MYSQL50道基础练习题_第30张图片

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

SELECT
	* 
FROM
	Student 
WHERE
	sid NOT IN (
	SELECT
		b.sid 
	FROM
		sc b
		JOIN Course c ON b.cid = c.cid
		JOIN Teacher d ON c.tid = d.tid 
	WHERE
		tname = '张三' 
	)

MYSQL50道基础练习题_第31张图片

12

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

查询不及格

SELECT * FROM sc 
WHERE score < 60

MYSQL50道基础练习题_第32张图片

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

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

MYSQL50道基础练习题_第33张图片

关联查询学生信息

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

MYSQL50道基础练习题_第34张图片

13

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

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

MYSQL50道基础练习题_第35张图片

14

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

SELECT
	a.*,
	b.avg 
FROM
	SC a
	JOIN ( SELECT sid, avg( score ) avg FROM sc GROUP BY sid ) b ON a.sid = b.sid 
ORDER BY avg DESC

MYSQL50道基础练习题_第36张图片

15

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

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

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

SELECT
	cid,
	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 ) '优秀率' 
FROM
	sc 
GROUP BY
	cid 
ORDER BY
	cid ASC

MYSQL50道基础练习题_第37张图片

16

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

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

MYSQL50道基础练习题_第38张图片

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

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

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

MYSQL50道基础练习题_第39张图片

18

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

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

MYSQL50道基础练习题_第40张图片

19

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

SELECT
	cid,
	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 
FROM
	SC 
GROUP BY
	cid

MYSQL50道基础练习题_第41张图片

你可能感兴趣的:(数据库,mysql,数据库)