-- 学生
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"课程比"02"课程成绩高的学生的信息及课程分数
先查询01课程
再查询02
交集
SELECT
*
FROM
(SELECT * FROM SC WHERE cid='01') a
JOIN
(SELECT * FROM SC WHERE cid='02') b on a.sid = b.sid
增加限制条件,01分数 > 02分数
关联查询课程信息
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
关联查询学生信息
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
汇总
-- 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
查询学生选课存在" 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
查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
先查询平均分
SELECT
*,
AVG(score) avg
FROM sc
GROUP BY sc.sid
HAVING avg >= 60
再多表关联查询
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
查询在 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
查询所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和
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
查询「李」姓老师的数量
SELECT (COUNT(DISTINCT tid)) count FROM Teacher WHERE tname like '李%'
查询学过「张三」老师授课的同学的信息
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
查询没有学全所有课程的同学的信息
学生表关联成绩表,进行匹配查询
SELECT
*
FROM
Student a
LEFT JOIN sc b on a.sid = b.sid
根据sid进行分组,查询cid的个数
SELECT
*,
COUNT(DISTINCT b.cid) count
FROM
Student a
LEFT JOIN sc b on a.sid = b.sid GROUP BY b.sid
根据课程总数进行过滤
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)
查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
关联查询学生表和成绩表
SELECT
a.*,
b.*
FROM
Student a
JOIN sc b ON a.sid = b.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')
按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'
查询和" 01 "号的同学所学课程,完全相同的其他同学的信息
多表查询,排除01
SELECT
a.*,
b.*
FROM
Student a
JOIN sc b ON a.sid = b.sid and a.sid != '01'
拼接课程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
和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)
查询没学过"张三"老师讲授的任一门课程的学生姓名
先关联查询成绩表的课程信息和老师信息
SELECT
*
FROM
sc b
JOIN Course c ON b.cid = c.cid
JOIN Teacher d ON c.tid = d.tid
过滤出张三老师
SELECT
*
FROM
sc b
JOIN Course c ON b.cid = c.cid
JOIN Teacher d ON c.tid = d.tid
WHERE
tname = '张三'
从学生表中筛选出不在当前所含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 = '张三'
)
查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
查询不及格
SELECT * FROM sc
WHERE score < 60
分组统计次数并筛选数量、计算平均成绩
SELECT
sid, AVG(score) avg
FROM sc
WHERE score < 60
GROUP BY sid
HAVING COUNT( cid ) >= 2
关联查询学生信息
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
查询" 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
按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
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
查询各科成绩最高分、最低分和平均分
字段:课程 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
按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
SELECT
*,
rank() over ( PARTITION BY cid ORDER BY score DESC ) AS ranked
FROM
sc;
MySQL可以实现Oracle中的排名公式,一共有三种
- rank() over(order by col_name desc)
- dense_rank() over()
- row_number() over()
第一个是如果出现了相同排名都为同一排名,下个排名跳过,例如1,1,3,4
第二个是如果出现了相同排名都为同一排名,下个排名不跳过,例如1,1,2,3
第三个是直接对行进行排名不分是否有相同值
此题目要按照各科成绩进行排序 over()中要填partition by col_name order by col_name
第一个columname 为分组的内容,第二个是按什么值排的内容。
查询学生的总成绩,并进行排名,总分重复时保留名次空缺
SELECT
a.*,
RANK() over(ORDER BY sum DESC) ranked
FROM
(SELECT sid, sum(score) sum FROM sc GROUP BY sid) a
查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
SELECT
a.*,
DENSE_RANK() over(ORDER BY sum DESC) ranked
FROM
(SELECT sid, sum(score) sum FROM sc GROUP BY sid) a
统计各科成绩各分数段人数:课程编号,[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