一,数据表说明
1. 学生表student(sid,sname,age,sex)参数说明:
sid:学生编号#,sname:学生姓名,age:学生年龄,sex:学生性别
2. 课程表course(cid,cname,tid)参数说明:
cid:课程编号#,cname:课程名字,tid:教师师编号#
3. 教师表teacher(tid,tname)参数说明:
tid:教师编号#,tname:教师姓名
4. 成绩表grade(sid,cid,score)参数说明:
sid:学生编号#,cid:课程编号#,score:课程成绩
5. 总览:
/*student(学号#,姓名,性别,年龄)
course(课程号#,课程名,教师号#)
teacher(教师号#,教师名)
score(学号#,课程号#,成绩) */
二,mysql建库,建表语句
- 1,建库school
CREATE DATABASE school CHARSET utf8;
- 2,#学生表
CREATE TABLE student
(
sid CHAR(20) NOT NULL,
sname VARCHAR(20) NOT NULL DEFAULT '',
age INT NOT NULL CHECK(age>12 AND age<120) ,
sex CHAR(2) NOT NULL DEFAULT '女' CHECK( sex IN (‘男’,’女’)),
PRIMARY KEY(sid)
)CHARACTER SET utf8;
- 3,#课程表
CREATE TABLE course
(
cid VARCHAR(20) NOT NULL,
cname VARCHAR(20) NOT NULL,
tid VARCHAR(20) NOT NULL,
PRIMARY KEY(cid, tid)
)CHARACTER SET utf8;
- 4,#教师表
CREATE TABLE teacher(
tid VARCHAR(20) NOT NULL,
tname VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(tid)
)CHARACTER SET utf8;
-5,#成绩表
CREATE TABLE score
(
sid CHAR(20) NOT NULL ,
cid CHAR(20) NOT NULL,
score INT NOT NULL,
PRIMARY KEY (sid, cid)
)CHARACTER SET utf8;
三,插入表数据
- 1,#插入学生表测试数据
INSERT INTO student VALUES('001' , '亚瑟' , '24' , '男');
INSERT INTO student VALUES('002' , '后弈' , '22' , '男');
INSERT INTO student VALUES('003' , '张飞' , '17' , '男');
INSERT INTO student VALUES('004' , '李白' , '23' , '男');
INSERT INTO student VALUES('005' , '梦奇' , '18' , '女');
INSERT INTO student VALUES('006' , '虞姬' , '19' , '女');
INSERT INTO student VALUES('007' , '露娜' , '22' , '女');
INSERT INTO student VALUES('008' , '貂蝉' , '16' , '女');
INSERT INTO student VALUES('009' , '韩信' , '26' , '男');
INSERT INTO student VALUES('010' , '张良' , '31' , '男');
INSERT INTO student VALUES('011' , '妲己' , '18' , '女');
INSERT INTO student VALUES('012' , '小乔' , '22' , '女');
INSERT INTO student VALUES('013' , '关羽' , '21' , '男');
INSERT INTO student VALUES('014' , '小乔' , '19' , '女');
INSERT INTO student VALUES('015' , '王昭君' , '23' , '女');
INSERT INTO student VALUES('016' , '甄姬' , '15' , '女');
- 2,#课程表测试数据
INSERT INTO course VALUES('01' , '语文' , '0001');
INSERT INTO course VALUES('02' , '数学' , '0002');
INSERT INTO course VALUES('03' , '英语' , '0003');
INSERT INTO course VALUES('04' , '物理' , '0004');
- 3,#教师表测试数据
INSERT INTO teacher VALUES('0001' , '老夫子');
INSERT INTO teacher VALUES('0002' , '墨子');
INSERT INTO teacher VALUES('0003' , '诸葛亮');
INSERT INTO teacher VALUES('0004' , '庄周');
INSERT INTO teacher VALUES('0005' , '姜子牙');
- 4,#成绩表测试数据
INSERT INTO score VALUES('001' , '01' , 80);
INSERT INTO score VALUES('001' , '02' , 90);
INSERT INTO score VALUES('001' , '03' , 99);
INSERT INTO score VALUES('001' , '04' , 92);
INSERT INTO score VALUES('002' , '01' , 70);
INSERT INTO score VALUES('002' , '02' , 59);
INSERT INTO score VALUES('002' , '03' , 80);
INSERT INTO score VALUES('002' , '04' , 95);
INSERT INTO score VALUES('003' , '01' , 59);
INSERT INTO score VALUES('003' , '02' , 57);
INSERT INTO score VALUES('003' , '03' , 81);
INSERT INTO score VALUES('003' , '04' , 79);
INSERT INTO score VALUES('004' , '01' , 50);
INSERT INTO score VALUES('004' , '02' , 30);
INSERT INTO score VALUES('004' , '03' , 45);
INSERT INTO score VALUES('004' , '04' , 62);
INSERT INTO score VALUES('005' , '01' , 76);
INSERT INTO score VALUES('005' , '02' , 87);
INSERT INTO score VALUES('005' , '03' , 69);
INSERT INTO score VALUES('005' , '04' , 59);
INSERT INTO score VALUES('006' , '01' , 31);
INSERT INTO score VALUES('006' , '02' , 24);
INSERT INTO score VALUES('006' , '03' , 69);
INSERT INTO score VALUES('006' , '04' , 49);
INSERT INTO score VALUES('007' , '01' , 59);
INSERT INTO score VALUES('007' , '02' , 69);
INSERT INTO score VALUES('007' , '03' , 79);
INSERT INTO score VALUES('007' , '04' , 85);
INSERT INTO score VALUES('008' , '01' , 52);
INSERT INTO score VALUES('008' , '02' , 61);
INSERT INTO score VALUES('008' , '03' , 39);
INSERT INTO score VALUES('008' , '04' , 69);
INSERT INTO score VALUES('009' , '01' , 92);
INSERT INTO score VALUES('009' , '02' , 66);
INSERT INTO score VALUES('009' , '03' , 60);
INSERT INTO score VALUES('009' , '04' , 89);
INSERT INTO score VALUES('010' , '01' , 92);
INSERT INTO score VALUES('010' , '02' , 96);
INSERT INTO score VALUES('010' , '03' , 99);
INSERT INTO score VALUES('010' , '04' , 89);
INSERT INTO score VALUES('011' , '01' , 62);
INSERT INTO score VALUES('011' , '02' , 26);
INSERT INTO score VALUES('011' , '03' , 49);
INSERT INTO score VALUES('011' , '04' , 89);
INSERT INTO score VALUES('012' , '01' , 32);
INSERT INTO score VALUES('012' , '02' , 46);
INSERT INTO score VALUES('012' , '03' , 39);
INSERT INTO score VALUES('012' , '04' , 69);
INSERT INTO score VALUES('013' , '01' , 92);
INSERT INTO score VALUES('013' , '02' , 96);
INSERT INTO score VALUES('013' , '03' , 59);
INSERT INTO score VALUES('014' , '02' , 69);
INSERT INTO score VALUES('014' , '04' , 99);
INSERT INTO score VALUES('015' , '02' , 89);
问题汇总(50+)
- #查询“001”课程比“002”课程成绩高的所有学生的学号
method1
SELECT a.sid,a.score,b.score FROM score a, score b
WHERE a.cid='01' AND b.cid = '02' AND a.sid = b.sid AND a.score>b.score;
method2
SELECT DISTINCT s01.sid, s01.score, s02.score FROM
(SELECT sid,score FROM score WHERE cid = '01') AS s01
INNER JOIN (SELECT sid,score FROM score WHERE cid = '02') AS s02
ON s01.sid = s02.sid AND s01.score > s02.score ;
method3
SELECT DISTINCT sc.sid, s01.score, s02.score FROM score sc
INNER JOIN (SELECT sid,score FROM score WHERE cid = '01') AS s01 ON sc.sid = s01.sid
INNER JOIN (SELECT sid,score FROM score WHERE cid = '02') AS s02 ON sc.sid = s02.sid
WHERE s01.score > s02.score ;
- #查询平均成绩大于60分的同学的学号和平均成绩
SELECT sid, AVG(score) ascore FROM score GROUP BY sid HAVING AVG(score)>60;
- 注:存在缺考时(null)时,不合理
SELECT st.sid, AVG(IFNULL(score,0)) AS avgs
FROM(SELECT s.sid, c.cid FROM student s, course c) st
LEFT JOIN score sc ON st.sid=sc.sid AND st.cid=sc.cid
GROUP BY st.sid
HAVING avgs>60;
- 注:缺考计0分,计入平均成绩
- #查询所有同学的学号、姓名、选课数、总成绩
SELECT st.sid, st.sname,COUNT(sc.cid) COUNT, IFNULL(SUM(score), 0) SUM FROM student st
LEFT JOIN score sc ON st.sid=sc.sid
GROUP BY st.sid;
- 查询姓“庄”的老师的个数;
SELECT COUNT(*) FROM teacher WHERE tname LIKE "庄%";
- 查询没学过“庄周”老师课的同学的学号、姓名;
SELECT s.sid,s.sname FROM student s
WHERE sid NOT IN
( SELECT sc.sid FROM score sc, course c, teacher t WHERE sc.cid=c.cid AND c.tid=t.tid AND t.tname="庄周" );
- 查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
SELECT DISTINCT s.sid, s.sname FROM student s, score sc
WHERE s.sid=sc.sid AND sc.cid=01
AND EXISTS
(SELECT DISTINCT s.sid, s.sname FROM student s, score sc WHERE s.sid=sc.sid AND sc.cid=02);
- 查询学过“庄周”老师所教的所有课的同学的学号、姓名;
SELECT s.sid, s.sname FROM student s
WHERE s.sid IN
(SELECT sc.sid FROM score sc,course c, teacher t WHERE sc.cid=c.cid AND c.tid=t.tid AND t.tname='庄周')
8.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
SELECT s.sid, s.sname FROM student s
WHERE s.sid IN
(SELECT s1.sid FROM score s1, score s2 WHERE s1.cid='01' AND s2.cid='02' AND s1.sid=s2.sid AND s1.score>s2.score);
SELECT s.sid, s.sname,sc1.score score1, sc2.score score2 FROM student s
INNER JOIN ( SELECT sid, score FROM score sc WHERE sc.cid='01') sc1
INNER JOIN ( SELECT sid, score FROM score sc WHERE sc.cid='02') sc2
ON s.sid=sc1.sid AND s.sid=sc2.sid AND sc1.score>sc2.score
GROUP BY s.sid;
- 查询所有课程成绩小于60分的同学的学号、姓名;
SELECT s.sid, s.sname, sc.score FROM score sc, student s
WHERE sc.sid=s.sid AND sc.score<60;
- 查询没有学全所有课的同学的学号、姓名;
SELECT b.sid, b.sname FROM
(SELECT a.sid, a.sname,a.cname, IFNULL(sc.score,1) qscore, a.cid FROM
(SELECT s.sid, s.sname, c.cid, c.cname FROM student s, course c ) a
LEFT JOIN score sc ON a.sid=sc.sid AND a.cid=sc.cid
WHERE sc.score IS NULL) b
GROUP BY b.sid;
- 查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
SELECT s.sid, s.sname FROM student s, score sc
WHERE s.sid = sc.sid AND sc.cid IN (SELECT cid FROM score WHERE sid="001")
GROUP BY s.sid;
SELECT s.sid, s.sname FROM student s WHERE s.sid IN(
SELECT sid FROM score sc
WHERE sc.cid IN
(SELECT cid FROM score sc WHERE sid="001")
);
- 查询与学号为“002”同学所有课程相同的其他同学学号和姓名;
SELECT s.sid, s.sname FROM
(SELECT sid, GROUP_CONCAT(cid ORDER BY cid SEPARATOR ',') AS cid_str FROM score WHERE sid="002") a,
(SELECT sid, GROUP_CONCAT(cid ORDER BY cid SEPARATOR ',') AS cid_str FROM score GROUP BY sid) b
LEFT JOIN student s ON b.sid=s.sid
WHERE a.cid_str=b.cid_str AND b.sid<>"002";
- 把“SC”表中“庄周”老师教的课的成绩都更改为此课程的平均成绩;
UPDATE score SET score=SELECT( avgs(sc2.score)
FROM score sc2
WHERE sc2.cid=score.cid )
FROM course c, teacher t
WHERE c.cid=score.cid AND c.tid=t.tid AND t.tname="庄周";
- 查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
SELECT s.sid, s.sname, b.cid_str FROM
(SELECT sid, GROUP_CONCAT(cid ORDER BY cid SEPARATOR ',') AS cid_str FROM score WHERE sid='002') AS a,
(SELECT sid, GROUP_CONCAT(cid ORDER BY cid SEPARATOR ',') AS cid_str FROM score GROUP BY sid) AS b
LEFT JOIN student s ON s.sid=b.sid
WHERE b.cid_str=a.cid_str AND s.sid <> '002';
- 删除学习“庄周”老师课的SC表记录;
DELETE FROM score WHERE cid IN(
SELECT c.cid FROM course c
LEFT JOIN teacher t ON c.tid=t.tid
WHERE t.tname="庄周"
);
- 向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“03”课程的同学学号、02号课的平均成绩;
INSERT INTO score
SELECT s.sid,"05",
(SELECT AVG(score) FROM score WHERE cid="02" )
FROM student s
WHERE s.sid NOT IN (SELECT sid FROM score sc WHERE sc.cid="03");
- 按平均成绩从高到低显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,
#按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分。
SELECT t.sid AS 学生ID,
IFNULL((SELECT score FROM score sc WHERE sc.sid=t.sid AND sc.cid="01"),0) AS 语文,
IFNULL((SELECT score FROM score sc WHERE sc.sid=t.sid AND sc.cid="02"),0) AS 数学,
IFNULL((SELECT score FROM score sc WHERE sc.sid=t.sid AND sc.cid="03"),0) AS 英语,
COUNT(cid) AS 有效课程数, AVG(score) 有效平均分
FROM score t
GROUP BY t.sid
ORDER BY AVG(score) DESC;
- 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT cid AS "课程ID", MAX(score) AS "最高分", MIN(score) AS "最低分"
FROM score GROUP BY cid;
SELECT a.cid AS "课程ID",maxs AS "最高分",mins AS "最低分" FROM
(SELECT cid, MAX(sc.score) AS maxs FROM score sc GROUP BY sc.cid ) a
JOIN (SELECT cid, MIN(so.score) AS mins FROM score so GROUP BY so.cid) b ON a.cid=b.cid
ORDER BY a.cid;
- 按各科平均成绩从低到高和及格率的百分数从高到低顺序 ;
SELECT sc.cid ,c.cname,AVG(score),
100*SUM(CASE
WHEN COALESCE(score, 0)>=60
THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数
FROM score sc
LEFT JOIN course c ON sc.cid=c.cid
GROUP BY sc.cid
ORDER BY 100*SUM(CASE
WHEN COALESCE(score, 0)>=60
THEN 1 ELSE 0 END)/COUNT(*)
;
- 查询如下课程平均成绩和及格率的百分数(用"1行"显示): 语文(01),数学(02),英语 (03),物理(04)
SELECT
SUM(CASE WHEN cid="01" THEN score ELSE 0 END )/SUM(CASE cid WHEN "01" THEN 1 ELSE 0 END) AS 语文平均成绩,
SUM(CASE WHEN cid="01" AND IFNULL(score, 0)>=60 THEN 1 ELSE 0 END)/SUM(CASE cid WHEN "01" THEN 1 ELSE 0 END) AS 语文及格率,
SUM(CASE WHEN cid="02" THEN score ELSE 0 END )/SUM(CASE cid WHEN "02" THEN 1 ELSE 0 END) AS 数学平均成绩,
SUM(CASE WHEN cid="02" AND IFNULL(score, 0)>=60 THEN 1 ELSE 0 END)/SUM(CASE cid WHEN "02" THEN 1 ELSE 0 END) AS 数学及格率,
SUM(CASE WHEN cid="03" THEN score ELSE 0 END )/SUM(CASE cid WHEN "03" THEN 1 ELSE 0 END) AS 英语平均成绩,
SUM(CASE WHEN cid="03" AND IFNULL(score, 0)>=60 THEN 1 ELSE 0 END)/SUM(CASE cid WHEN "03" THEN 1 ELSE 0 END) AS 英语及格率,
SUM(CASE WHEN cid="04" THEN score ELSE 0 END )/SUM(CASE cid WHEN "04" THEN 1 ELSE 0 END) AS 物理平均成绩,
SUM(CASE WHEN cid="04" AND IFNULL(score, 0)>=60 THEN 1 ELSE 0 END)/SUM(CASE cid WHEN "04" THEN 1 ELSE 0 END) AS 物理及格率
FROM score sc;
- 查询不同老师所教不同课程平均分从高到低显示 ;
SELECT t.tid, IFNULL(c.cid, 0) cid, tname, IFNULL(TRUNCATE(co.avgs,2), 0) avgscore FROM teacher t
LEFT JOIN course c ON t.tid=c.tid
LEFT JOIN (SELECT cid, AVG(score) avgs FROM score sc GROUP BY cid) co ON c.cid=co.cid
ORDER BY co.avgs DESC;
- 查询如下课程成绩第 3 名到第 6 名的学生成绩单:语文(01),数学(02),英语 (03),物理(04) ,总成绩
表格格式:[学生学号],[学生姓名],[语文],[数学],[英语],[物理],[总成绩]
SELECT t.sid 学生学号, s.sname 学生姓名,
IFNULL((SELECT score FROM score sc WHERE sc.sid=t.sid AND sc.cid="01"),0) AS 语文,
IFNULL((SELECT score FROM score sc WHERE sc.sid=t.sid AND sc.cid="02"),0) AS 数学,
IFNULL((SELECT score FROM score sc WHERE sc.sid=t.sid AND sc.cid="03"),0) AS 英语,
IFNULL((SELECT score FROM score sc WHERE sc.sid=t.sid AND sc.cid="04"),0) AS 物理,
SUM(score) 总分
FROM score t
LEFT JOIN student s ON t.sid=s.sid
GROUP BY t.sid
ORDER BY SUM(score) DESC
LIMIT 2, 4;
- 统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
SELECT sc.cid AS 课程ID, c.cname AS 课程名称,
SUM( CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS "[100 -85]",
SUM( CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS "[85 -70]",
SUM( CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS "[70 -60]",
SUM( CASE WHEN score <60 THEN 1 ELSE 0 END) AS "[60 -0]"
FROM score sc, course c
WHERE sc.cid=c.cid
GROUP BY sc.cid;
- 查询学生平均成绩及其名次
SELECT 1+(
SELECT COUNT(DISTINCT avgs)
FROM (SELECT sid, AVG(score) AS avgs FROM score GROUP BY sid) t1
WHERE avgs > t2.avgs
) AS orders, sid ,avgs
FROM (SELECT sid, AVG(score) avgs FROM score GROUP BY sid ) AS t2
ORDER BY avgs DESC;
- 注:不计算缺考少考,不合理
SELECT 1+(
SELECT COUNT(DISTINCT avgs) FROM (
SELECT a.sid, TRUNCATE(AVG(IFNULL(sc.score,0)), 2) avgs
FROM (SELECT s.sid, c.cid FROM student s ,course c) a
LEFT JOIN score sc ON a.sid=sc.sid AND a.cid=sc.cid
GROUP BY a.sid
) AS t1
WHERE avgs>t2.avgs
)AS 名次,sid AS 学号, sname 姓名, avgs AS 平均成绩
FROM (
SELECT a.sid,a.sname, TRUNCATE(AVG(IFNULL(sc.score,0)), 2) avgs
FROM (SELECT s.sid,s.sname, c.cid FROM student s ,course c) a
LEFT JOIN score sc ON a.sid=sc.sid AND a.cid=sc.cid
GROUP BY a.sid
) AS t2
ORDER BY avgs DESC;
- 注:缺考计0分,计入平均成绩
- 查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT sc1.cid, sc1.sid, sc1.score FROM score sc1 WHERE EXISTS
(SELECT COUNT(1) FROM score sc2
WHERE sc1.cid=sc2.cid AND sc1.score<=sc2.score
HAVING COUNT(1)<4
)ORDER BY sc1.cid, sc1.score DESC;
SELECT sc1.cid, sc1.sid, score FROM score sc1
WHERE (SELECT COUNT(cid) FROM score
WHERE sc1.cid=cid AND sc1.score<score
)<3
ORDER BY sc1.cid, score DESC;
(SELECT cid, sid, score FROM score WHERE cid="01" ORDER BY score DESC LIMIT 3)
UNION
(SELECT cid, sid, score FROM score WHERE cid="02" ORDER BY score DESC LIMIT 3)
UNION
(SELECT cid, sid, score FROM score WHERE cid="03" ORDER BY score DESC LIMIT 3)
UNION
(SELECT cid, sid, score FROM score WHERE cid="04" ORDER BY score DESC LIMIT 3);
SELECT sc1.cid, sc1.sid, sc1.score
FROM score sc1
LEFT JOIN score sc2
ON sc1.cid=sc2.cid AND sc1.score<sc2.score
GROUP BY sc1.cid, sc1.sid
HAVING COUNT(*)<3
ORDER BY cid , score DESC;
- 查询每门课程被选修的学生数
SELECT c.cid, c.cname,COUNT(*) FROM course c
LEFT JOIN score sc ON c.cid=sc.cid
GROUP BY c.cid;
- 查询出只选修了一门课程的全部学生的学号和姓名
SELECT s.sid, s.sname, COUNT(*) FROM score sc
LEFT JOIN student s ON s.sid=sc.sid
GROUP BY s.sid
HAVING COUNT(*)=1;
- 查询男生、女生人数、总人数
SELECT COUNT(CASE WHEN s.sex="男" THEN sex END) AS 男生人数,
COUNT(CASE WHEN s.sex="女" THEN sex END) AS 女生人数,
COUNT(CASE WHEN s.sex IN ("男","女") THEN sex END) AS 总人数
FROM student s ;
- 查询姓“张”的学生名单
SELECT sid, sname FROM student WHERE sname LIKE "张%";
- 查询同名同性学生名单,并统计同名人数
SELECT s.sname,COUNT(*) FROM student s GROUP BY sname HAVING COUNT(*)>1;
- 查询1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
- 注:表中可建出生日期字段,
SELECT * FROM student s WHERE YEAR(s.brithday)=1981;
- 查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
SELECT cid, AVG(score) avgs FROM score sc GROUP BY cid ORDER BY avgs , cid DESC ;
- 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
- 注:缺考科目计0分,
SELECT s.sid, s.sname, SUM(IFNULL(score,0))/(SELECT COUNT(*) FROM course ) avgs FROM student s
LEFT JOIN score sc ON s.sid=sc.sid
GROUP BY s.sid
HAVING avgs>85;
- 注:缺考科目计0分,
SELECT s1.sid, s1.sname, AVG(IFNULL(score,0)) avgs FROM
(SELECT s.sid, s.sname, c.cid FROM student s, course c) s1
LEFT JOIN score sc ON s1.sid=sc.sid AND s1.cid=sc.cid
GROUP BY s1.sid
HAVING avgs>85;
SELECT s.sid, s.sname, AVG(IFNULL(score,0)) avgs FROM student s
LEFT JOIN score sc ON s.sid=sc.sid
GROUP BY s.sid
HAVING avgs>85;
- 注:缺考科目未考虑,
- 查询课程名称为“数学”,且分数低于60的学生姓名和分数
SELECT s.sid, s.sname,sc.score FROM score sc
LEFT JOIN course c ON sc.cid=c.cid
LEFT JOIN student s ON sc.sid=s.sid
WHERE c.cname="数学"
HAVING sc.score<60;
- 查询所有学生的选课情况;
SELECT s.sid, s.sname, sc.cid, c.cname FROM student s
LEFT JOIN score sc ON s.sid=sc.sid
LEFT JOIN course c ON sc.cid=c.cid;
- 查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
SELECT sname,cname,score FROM score sc
LEFT JOIN course c ON sc.cid=c.cid
LEFT JOIN student s ON sc.sid=s.sid
WHERE sc.score>70
GROUP BY sc.sid;
- 查询不及格的课程,并按课程号从大到小排列
SELECT * FROM score sc
WHERE score<60
ORDER BY cid DESC;
- 查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
SELECT s.sid, s.sname, score FROM student s
LEFT JOIN score sc ON s.sid=sc.sid
WHERE cid="03" AND score>80 ;
- 求选了课程的学生人数
SELECT cid, COUNT(*) FROM score GROUP BY cid;
- 查询选修“庄周”老师所授课程的学生中,成绩最高的学生姓名及其成绩
SELECT s.sid, sname, score,tname FROM student s
LEFT JOIN score sc ON s.sid=sc.sid
LEFT JOIN course c ON sc.cid=c.cid
LEFT JOIN teacher t ON c.tid=t.tid
WHERE t.tname="庄周"
ORDER BY score DESC
LIMIT 1;
- 查询各个课程及相应的选修人数
SELECT sc.cid, cname, COUNT(*) FROM score sc
LEFT JOIN course c ON sc.cid=c.cid
GROUP BY sc.cid;
SELECT cid, COUNT(*) FROM score GROUP BY cid;
- 查询不同课程成绩相同的学生的学号、课程号、学生成绩
SELECT * FROM score sc1, score sc2
WHERE sc1.score=sc2.score AND sc1.cid<>sc2.cid;
- 查询每门课程成绩最好的前两名
SELECT s1.cid, s1.sid, score FROM score s1
WHERE (SELECT COUNT(1) FROM score s2
WHERE s1.cid=s2.cid AND s1.score<s2.score
)<2
ORDER BY s1.cid, score DESC;
SELECT sc1.cid, sc1.sid, sc1.score
FROM score sc1
LEFT JOIN score sc2
ON sc1.cid=sc2.cid AND sc1.score<sc2.score
GROUP BY sc1.cid, sc1.sid
HAVING COUNT(*)<2
ORDER BY cid , score DESC;
- 统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT cid AS 课程号, COUNT(*) AS 选修人数 FROM score sc GROUP BY cid HAVING COUNT(*)>10 ORDER BY COUNT(*) DESC, cid ASC;
- 检索至少选修两门课程的学生学号
SELECT sid, COUNT(1) FROM score sc GROUP BY sid HAVING COUNT(1)>=2;
SELECT s.sid, s.sname, COUNT(1) FROM student s
LEFT JOIN score sc ON s.sid=sc.sid
GROUP BY s.sid
HAVING COUNT(1)>=2
;
- 查询全部学生都选修的课程的课程号和课程名
SELECT sc.sid, c.cid, c.cname,COUNT(*) FROM course c
LEFT JOIN score sc ON c.cid=sc.cid
GROUP BY c.cid
HAVING COUNT(*)=(SELECT COUNT(sid) FROM student) ;
- 查询没学过“庄周”老师讲授的任一门课程的学生姓名
SELECT s.sid,s.sname FROM student s
WHERE s.sid NOT IN (SELECT sid FROM score sc
WHERE cid IN (SELECT cid FROM course c INNER JOIN teacher t ON c.tid=t.tid AND t.tname="庄周"));
SELECT s.sid, sname FROM student s
WHERE NOT EXISTS (SELECT sid FROM score sc
WHERE s.sid=sc.sid AND cid IN (SELECT cid FROM course c INNER JOIN teacher t ON c.tid=t.tid AND t.tname="叶平"));
SELECT s.sid, s.sname FROM student s
LEFT JOIN (
SELECT sid,cid FROM score sc
WHERE cid=(SELECT cid FROM course c INNER JOIN teacher t ON c.tid=t.tid AND t.tname="叶平")
) AS s2 ON s.sid=s2.sid
WHERE s2.cid IS NULL;
- 查询两门及以上不及格课程的同学的学号及其平均成绩
SELECT s1.sid, AVG(IFNULL(score,0)) AS avgs, SUM(IFNULL(score,0)<60) AS fail FROM(
SELECT s.sid, c.cid FROM student s, course c
) s1
LEFT JOIN score sc ON s1.sid=sc.sid AND s1.cid=sc.cid
GROUP BY s1.sid
HAVING fail>=2;
- 检索“04”课程分数小于60,按分数降序排列的同学学号
SELECT sid,score FROM score sc WHERE score<60 AND cid="04" ORDER BY score DESC;
- 删除“002”同学的“01”课程的成绩
DELETE FROM score WHERE sid="002" AND cid="01";
- 查询没有选修02号课程的学生的学号,姓名
SELECT sid, sname FROM student s
WHERE NOT EXISTS (SELECT cid FROM score sc WHERE s.sid=sc.sid AND cid="02");
- 查询选修了所有课程的同学学号
SELECT sid FROM
(SELECT sid, GROUP_CONCAT(sc.cid ORDER BY sc.cid SEPARATOR ',') AS cid_str1 FROM score sc GROUP BY sid) AS a,
(SELECT GROUP_CONCAT(c.cid ORDER BY c.cid SEPARATOR ',') AS cid_str2 FROM course c) AS b
WHERE a.cid_str1=b.cid_str2
;
- 按各科成绩进行排序,并显示排名, score 重复时保留名次空缺。
SELECT sc1.cid, sc1.sid, sc1.score, COUNT(sc2.score)+1 AS srank
FROM score sc1
LEFT JOIN score sc2 ON sc1.cid=sc2.cid AND sc1.score<sc2.score
GROUP BY sc1.cid, sc1.sid, sc1.score
ORDER BY sc1.cid, srank ASC;
- 按各科成绩进行排序,并显示排名, Score 重复时合并名次
SELECT sc.sid, sc.cid, sc.score, tp.ranks FROM score sc
LEFT JOIN
(SELECT sid, cid,
(SELECT COUNT(DISTINCT sc2.score)+1 FROM score sc2
WHERE sc1.cid=sc2.cid AND sc2.score>sc1.score) ranks
FROM score sc1) tp
ON sc.sid=tp.sid AND sc.cid=tp.cid
ORDER BY sc.cid, ranks;
- 查询各科成绩最高分,最低分,平均分
#以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率。
#及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90。
#要求输出课程编号和选修人数,查询结果按人数降序排列,若人数相同,按课程编号升序排列。
SELECT sc.cid , cname, MAX(score), MIN(score), AVG(score),
CONCAT(ROUND((SUM(score>=60)/COUNT(*))*100,2),"%") AS pass_rate,
CONCAT(ROUND((SUM(score>=70 && score<80)/COUNT(*))*100,2), "%") AS mid_rate,
CONCAT(ROUND((SUM(score>=80 && score<90)/COUNT(*))*100,2), "%") AS good_rate,
CONCAT(ROUND((SUM(score>=90 && score<100)/COUNT(*))*100,2), "%") AS excellent_rate
FROM score sc
LEFT JOIN course c ON sc.cid=c.cid
GROUP BY sc.cid
ORDER BY sid DESC, cid ASC;
- 查询出挂科2门及2门以上的学员的平均成绩,学生学号,
- 注:缺考科目未考虑,
SELECT sid, AVG(score), SUM(score<60) AS gks FROM score GROUP BY sid HAVING gks>=2;
- 注:缺考科目作为零分,再计算平均成绩,
SELECT st.sid, AVG(IFNULL(sc.score, 0)) avgscore , SUM(IFNULL(sc.score, 0)<60) fail FROM
(SELECT s.sid, c.cid, c.cname FROM student s, course c) st
LEFT JOIN score sc ON st.sid=sc.sid AND st.cid=sc.cid
GROUP BY st.sid
HAVING fail>=2;
- 案例将持续加增,朋友们有经典sql案例,可回复,并加增。。
本文提供了一份包含50+道MySQL面试题的汇总,涉及学生、课程、教师和成绩表的数据查询,包括课程对比、平均成绩、选课情况、成绩排名等各种复杂SQL操作的实例解析。
&spm=1001.2101.3001.5002&articleId=98544643&d=1&t=3&u=a11165bca0834a5d87bccea96845ddab)
1万+

被折叠的 条评论
为什么被折叠?



