20200819-sql语句基础练习题

一、建表:

CREATE DATABASE MyHomework;
CREATE TABLE tb_class(
cid INT(4) PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(10)
)
INSERT INTO tb_class VALUES(1,‘kb01’),(2,‘kb01’),(3,‘kb01’),(4,‘kb01’);

DROP TABLE tb_student;
CREATE TABLE tb_student(
sid INT(4) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10),
gender VARCHAR(2),
class_id INT(4),
age INT(100)

)

INSERT INTO tb_student(sname,gender,class_id,age) VALUES
(‘C罗’,‘男’,1,18),
(‘梅西’,‘男’,1,19),
(‘碧昂斯’,‘女’,2,20),
(‘ysm’,‘女’,1,18),
(‘hly’,‘女’,2,18),
(‘rqm’,‘女’,2,20),
(‘lx’,‘男’,3,21),
(‘pq’,‘男’,3,19),
(‘wr’,‘男’,3,17);

DROP TABLE tb_teacher;
CREATE TABLE tb_teacher(
tid INT(4) PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(10),
gender VARCHAR(2)
);
INSERT INTO tb_teacher(tname,gender) VALUES(‘波多’,‘女’),(‘苍空’,‘男’),(‘饭岛’,‘男’);

CREATE TABLE tb_course(
tid INT(4) PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(10),
teacher_id INT(4)
);
INSERT INTO tb_course(cname,teacher_id)
VALUES(‘java’,1),(‘java web’,1),(‘mysql’,2);

CREATE TABLE tb_score(
sid INT(4) PRIMARY KEY AUTO_INCREMENT,
stu_id INT(4),
corse_id INT(4),
scores INT(100)
);
INSERT INTO tb_score(stu_id,corse_id,scores)
VALUES(1,1,60),(1,2,85),(1,2,100);

二、插入数据:

#1、每个班补齐到3个学生
INSERT INTO tb_student(sname,gender,class_id) VALUES
(‘ysm’,‘女’,1),
(‘hly’,‘nv’,2),
(‘rqm’,‘女’,2),
(‘lx’,‘男’,3),
(‘pq’,‘男’,3),
(‘wr’,‘男’,3);

INSERT INTO tb_course(cname,teacher_id)
VALUES(‘python’,2),(‘hive’,3),(‘linux’,3);

TRUNCATE TABLE tb_score;

INSERT INTO tb_score(stu_id,corse_id,scores)
VALUES(1,1,60),(1,2,85),(1,3,100),(1,4,60),(1,5,85),(1,6,100),
(2,1,100),(2,2,85),(2,3,98),(2,4,60),(2,5,85),(2,6,100),
(3,1,60),(3,2,78),(3,3,98),(3,4,60),(3,5,85),(3,6,100),
(4,1,99),(4,2,98),(4,3,87),(4,4,60),(4,5,85),(4,6,100),
(5,1,60),(5,2,67),(5,3,98),(5,4,60),(5,5,85),(5,6,100),
(6,1,90),(6,2,87),(6,3,98),(6,4,60),(6,5,85),(6,6,100),
(7,1,99),(7,2,98),(7,3,78),(7,4,60),(7,5,85),(7,6,100),
(8,1,60),(8,2,90),(8,3,78),(8,4,60),(8,5,85),(8,6,100),
(9,1,88),(9,2,98),(9,3,79),(9,4,60),(9,5,85),(9,6,100);

三、习题:

#第1题:
SELECT tb1.stu_id
FROM tb_score tb1
JOIN tb_score tb2
ON tb1.scores>tb2.scores AND tb1.corse_id=1 AND tb2.corse_id=2
AND tb1.stu_id=tb2.stu_id

#2、查询平均成绩大于60分的同学的学号和平均成绩;
SELECT * FROM
(SELECT st.sid 学号 ,st.sname 姓名, AVG(so.scores) 平均分
FROM tb_student st
JOIN tb_score so ON st.sid=so.stu_id
GROUP BY stu_id
) a
HAVING a.平均分>80
ORDER BY 平均分 DESC

#3、查询所有同学的学号、姓名、选课数、总成绩;
SELECT sc.stu_id 学号, s.sname 姓名,
COUNT(stu_id) 选课数, SUM(sc.scores) 总成绩
FROM tb_score sc
JOIN tb_student s ON sc.stu_id = s.sid
GROUP BY stu_id

#4、查询姓“李”的老师的个数;
SELECT COUNT(tname) 个数
FROM tb_teacher
WHERE tname LIKE ‘李%’

#第5题(1):
SELECT c.cname
FROM tb_course c,tb_teacher t
WHERE t.tid IN(SELECT tid FROM tb_teacher WHERE tname = ‘苍空’)
AND t.tid=c.teacher_id

#第5题(2):
SELECT s.sname FROM tb_student s
WHERE sid IN(
SELECT s1.stu_id
FROM tb_score s1
WHERE s1.course_id=2
)

#第5题(3):
SELECT s.sname FROM tb_student s
WHERE s.sname NOT IN(
SELECT s0.sname FROM tb_student s0
WHERE sid IN(
SELECT s1.stu_id
FROM tb_score s1
WHERE s1.course_id=2
)
)

#第6题(1):
SELECT cname
FROM tb_course
WHERE tid = 1 OR tid=2

#8.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
SELECT s.sname , s.sid
FROM tb_student s
WHERE sid IN(
SELECT sc1.stu_id
FROM tb_score sc1,tb_score sc2
WHERE sc1.stu_id=sc2.stu_id AND sc1.course_id=1 AND sc2.corse_id=2
AND sc1.scores<sc2.scores)

#9.查询有课程成绩小于60分的同学的学号、姓名;
SELECT DISTINCT s.sname , s.sid
FROM tb_student s
WHERE sid IN(
SELECT sc1.stu_id
FROM tb_score sc1
WHERE sc1.stu_id AND sc1.scores< 80)

#10、查询没有学全所有课的同学的学号、姓名;
SELECT st.sid 学号, st.sname 姓名
FROM tb_score sc
JOIN tb_student st
ON sc.stu_id = st.sid
GROUP BY stu_id
HAVING COUNT(course_id)<6

方法二:
SELECT COUNT(DISTINCT course_id),stu_id
FROM tb_score
GROUP BY stu_id
HAVING COUNT(DISTINCT course_id)<
(SELECT COUNT(1) FROM tb_course);

#11、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
#(1)查询学生所选课程是否在学生id为1的学生的课程里面
SELECT s2.stu_id
FROM tb_score s1
JOIN tb_score s2
ON s1.course_id = s2.course_id
WHERE s1.stu_id = 1 AND s2.stu_id != 1
GROUP BY stu_id
#having s1.course_id = s2.coutse_id

方法二:
SELECT DISTINCT stu_id,sname
FROM tb_score s
JOIN tb_student st
ON s.stu_id = st.sid
WHERE s.course_id IN
(SELECT DISTINCT course_id
FROM tb_score
WHERE stu_id=1 )
AND stu_id != 1;

#(2)和学生表关联取出相关的ID和姓名
SELECT s.sid 学号, s.sname 姓名
FROM tb_student s
WHERE s.sid IN (
SELECT s2.stu_id
FROM tb_score s1
JOIN tb_score s2
ON s1.course_id = s2.course_id
WHERE s1.stu_id = 1 AND s2.stu_id != 1
GROUP BY stu_id)

#13、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
#002学生选择了1,2两门课程,1,3;1;2;2,4;
#(1)和1号同学选择的个数相同的学生id
SELECT stu_id
FROM tb_score
GROUP BY stu_id
HAVING stu_id != 1 AND COUNT(stu_id) = (
SELECT COUNT(stu_id) FROM tb_score WHERE stu_id = 1)

#(2)再筛选和1号同学选择课程名相同的学生id

SELECT DISTINCT a.stu_id,COUNT(a.course_id) ‘相同课程个数’ FROM tb_score a
LEFT JOIN
(SELECT course_id FROM tb_score WHERE stu_id=2) b
ON a.course_id=b.course_id
GROUP BY stu_id
HAVING 相同课程个数=
(SELECT COUNT(course_id) FROM tb_score WHERE stu_id=1) AND stu_id<>1

#16、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,
#按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
#第一种实现方式
SELECT * FROM
(SELECT sc.stu_id 学号, s.sname 姓名, COUNT(course_id) 课程数, AVG(scores) 平均分
FROM tb_score sc
JOIN tb_student s ON s.sid = sc.stu_id

JOIN tb_course c ON c.cid = sc.course_id
WHERE cname = ‘java’
GROUP BY sc.stu_id
) a
ORDER BY a.平均分 DESC

#第二种实现方式
SELECT s.stu_id,s.scores python,mysql,java,
CASE WHEN s.scores IS NULL THEN 0 ELSE 1 END+
CASE WHEN mysql IS NULL THEN 0 ELSE 1 END+
CASE WHEN java IS NULL THEN 0 ELSE 1 END sub_cnt
FROM tb_score s
LEFT JOIN tb_course c ON cid = course_id
LEFT JOIN
(SELECT s.stu_id,s.scoures mysql
FROM tb_score s
JOIN tb_course c ON s.stu_id = b.stu_id
LEFT JOIN (SELECT s.stu_id, s.scores java
FROM tb_score s JOIN tb_course
ON s.stu_id = d.stu_id WHERE
c.cname = ‘python’) a

#18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
#思路:通过课程id来进行分组,这个时候会显示四行,然后用聚合函数max,min来找出最大值和最小值。
SELECT course_id 课程编号 , MAX(scores) 最高分, MIN(scores) 最低分
FROM tb_score
GROUP BY course_id

#19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
#新知识点:case when then相当于if判断

SELECT AVG(scores),course_id,
CONCAT(100*SUM(CASE WHEN scores>60 THEN 1 ELSE 0 END)/COUNT(scores),’%’) passed
FROM tb_score
GROUP BY course_id
ORDER BY AVG(scores)
SUM(CASE WHEN scores>60 THEN 1 ELSE 0 END)/COUNT(scores) DESC;

#20、课程平均分从高到低显示(显示任课老师);
SELECT s.course_id 课程编号 , t.tname 老师, AVG(s.scores) 平均分
FROM tb_score s
JOIN tb_course c ON c.cid = s.course_id
JOIN tb_teacher t ON t.tid = c.teacher_id
GROUP BY course_id
ORDER BY 平均分 DESC

#21
SELECT DISTINCT score1,score2,score3,score4,score5,score6 FROM
(SELECT scores ‘score1’ FROM tb_score WHERE course_id=1 ORDER BY scores DESC LIMIT 3) a,
(SELECT scores ‘score2’ FROM tb_score WHERE course_id=1 ORDER BY scores DESC LIMIT 3) b,
(SELECT scores ‘score3’ FROM tb_score WHERE course_id=1 ORDER BY scores DESC LIMIT 3) c,
(SELECT scores ‘score4’ FROM tb_score WHERE course_id=1 ORDER BY scores DESC LIMIT 3) d,
(SELECT scores ‘score5’ FROM tb_score WHERE course_id=1 ORDER BY scores DESC LIMIT 3) e,
(SELECT scores ‘score6’ FROM tb_score WHERE course_id=1 ORDER BY scores DESC LIMIT 3) f;

SELECT scores ‘score1’ @m:=@m+1 FROM tb_score JOIN(SELECT @m:=0) a WHERE course_id=1
ORDER BY score LIMIT 3;

#21
SELECT a.course_id ,a.scores, b.scores
FROM tb_score a
JOIN tb_score b ON a.course_id = b.course_id AND
a.scores<=b.scores
GROUP BY b.course_id,b.scores
HAVING COUNT(DISTINCT a.scores)<=3
ORDER BY a.course_id ,COUNT(DISTINCT b.scores);

#22、查询每门课程被选修的学生数;
SELECT course_id 课程编号,COUNT(course_id) 选课人数
FROM tb_score
GROUP BY course_id

#23、查询出只选修了一门课程的全部学生的学号和姓名;
SELECT st.sid 学号, st.sname 姓名
FROM tb_score sc
JOIN tb_student st
ON sc.stu_id = st.sid
GROUP BY stu_id
HAVING COUNT(course_id)=2

#24、查询男生、女生的人数;
SELECT gender 性别,COUNT(gender) 人数
FROM tb_student
GROUP BY gender

#26、查询同名同姓学生名单,并统计同名人数;
SELECT s.sname 姓名, COUNT(sname) 人数
FROM tb_student s
GROUP BY sname
HAVING 人数 != 1

#27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
SELECT course_id 课程号, AVG(scores) 平均成绩
FROM tb_score
GROUP BY course_id
ORDER BY 平均成绩 ASC# , course_id desc

#28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
SELECT st.sid 学号, st.sname 姓名 , AVG(scores) 平均分
FROM tb_score
JOIN tb_student st
ON stu_id = st.sid
GROUP BY stu_id
HAVING 平均分>85

#30、求选了课程的学生人数
SELECT COUNT(sid) 选课人数
FROM tb_student
WHERE sid IN(
SELECT stu_id
FROM tb_score
GROUP BY stu_id
HAVING COUNT(course_id)>0
)

方法二:
SELECT a.sid,sname FROM tb_student a
WHERE a.sid IN(SELECT DISTINCT stu_id FROM tb_score
GROUP BY course_id)

#31
SELECT MAX(scores),sname,tname
FROM tb_teacher
JOIN tb_course ON teacher_id=tid
JOIN tb_score s ON cid=course_id
JOIN tb_student st ON s.stu_id= st.sid
WHERE tname=‘李梅’
GROUP BY tid;

#31、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
SELECT s.sid 学号,s.sname 姓名, MAX(sc.scores) 成绩
FROM tb_score sc
JOIN tb_student s ON s.sid = sc.stu_id
WHERE course_id IN(SELECT cid FROM tb_course WHERE teacher_id IN( SELECT tid FROM tb_teacher WHERE tname=‘李梅’))
GROUP BY stu_id
ORDER BY scores DESC
LIMIT 1;

33、查询各个课程及相应的选修人数;
第一种
SELECT c.cname 课程名 , c.cid 课程编号, COUNT(course_id) 选课人数
FROM tb_score sc
JOIN tb_course c ON sc.course_id = c.cid
GROUP BY course_id

34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
SELECT s1.stu_id 学号, s1.course_id 课程号, s1.scores 成绩
FROM tb_score s1
JOIN tb_score s2
ON s1.stu_id = s2.stu_id AND s1.course_id != s2.course_id AND s1.scores = s2.scores

35、查询每门课程成绩最好的前两名;
#首先,select count(1)表示查询出表中符合条件的行数;
#sc2.scores>=sc1.scores AND sc1.course_id=sc2.course_id表示查询条件;
#总体的意思就是从表sc2中查询出满足
#sc2.scores>=sc1.scores AND sc1.course_id=sc2.course_id条件的行数;
#结合完整的sql语句来看,这个查询出的行数要<=2,所以"行数<=2"是作为前一个查询语句的查询条件的。
#所以,要选择2名,先将表降序按课程分组,其实两张表的数据是一样的,所以在不加<=2的条件的情况下
#应该所有行都满足条件,所以<=2实际是选择了前两行。

SELECT sc1.*
FROM tb_score sc1
WHERE (SELECT COUNT(scores) FROM tb_score sc2 WHERE
sc2.scores>=sc1.scores AND sc1.course_id=sc2.course_id)<=2
ORDER BY sc1.course_id ;

老师:
SELECT a.course_id, a.scores
FROM tb_score a
JOIN tb_score b
ON a.course_id=b.course_id AND a.scores<=b.scores
GROUP BY b.course_id,a.scores
HAVING COUNT(DISTINCT b.scores)<=2
ORDER BY a.course_id,COUNT(DISTINCT b.scores);

36、检索至少选修两门课程的学生学号;
SELECT DISTINCT stu_id 学号, COUNT(stu_id) 选课数
FROM tb_score
GROUP BY stu_id
HAVING 选课数>1

37、查询全部学生都选修的课程的课程号和课程名;
SELECT stu_id 学号, course_id 课程号, cname 课程名
FROM tb_score
JOIN tb_course ON course_id = cid

38、查询没学过“叶平”老师讲授的任一门课程的学生姓名;
第一种

SELECT sname 姓名, sid 学号 FROM tb_student WHERE sname NOT IN (
SELECT DISTINCT sname
FROM tb_student st
JOIN tb_score s ON st.sid = s.stu_id
WHERE course_id IN (SELECT cid FROM tb_course WHERE teacher_id IN(
SELECT tid FROM tb_teacher WHERE tname = ‘罗老师’)
)
)

第二种

38、查询两门以上不及格课程的同学的学号及其平均成绩;

SELECT s1.stu_id ,AVG(scores)
FROM tb_score s1
#join (select avg(scores) from tb_score s2 where scores<=70 group by stu_id) a
WHERE scores <=70
GROUP BY stu_id
HAVING COUNT(stu_id)>=2

39、检索“004”课程分数小于60,按分数降序排列的同学学号;
SELECT stu_id ,scores FROM tb_score
WHERE course_id=4 AND scores<80
ORDER BY scores DESC

40、删除“002”同学的“001”课程的成绩;
DELETE FROM tb_score
WHERE stu_id = 3 AND course_id = 3

41、查询成绩表中成绩为85,86或88的学生姓名
SELECT sid ,sname FROM tb_student
WHERE sid IN (
SELECT stu_id FROM tb_score WHERE scores = 85 OR scores = 86 OR scores = 88)

42、查询“kb03”班的学生人数
SELECT COUNT(class_id) 人数 FROM tb_student
WHERE class_id IN(SELECT cid FROM tb_class WHERE cname = ‘kb03’)

43、查询“张旭“教师任课的学生平均成绩
SELECT course_id, AVG(scores)
FROM tb_score WHERE course_id IN (SELECT cid FROM tb_course WHERE teacher_id IN
(SELECT tid FROM tb_teacher WHERE tname = ‘王老师’))
GROUP BY course_id

44.查询和学号为108的同学年龄相同的所有学生的姓名
SELECT s.sname ,s.sid
FROM tb_student s
JOIN tb_student s1
ON s.age=s1.age AND s1.sid = 4;

45、查询成绩比该课程平均成绩低的同学的成绩表
SELECT stu_id, a.course_id,scores
FROM tb_score a
JOIN (
SELECT course_id,AVG(scores) 平均分 FROM tb_score GROUP BY course_id ) b
ON a.course_id = b.course_id
WHERE a.scores < b.平均分
#group by a.course_id

46、查询至少有3名女生的班号
SELECT cid FROM tb_class
WHERE cid IN(SELECT class_id FROM tb_student WHERE gender = ‘女’
GROUP BY class_id
HAVING COUNT(class_id)>=2)

47.查询“男”教师及其所上的课程成绩表
SELECT cname
FROM tb_course
WHERE teacher_id IN(SELECT tid FROM tb_teacher WHERE gender = ‘男’)

48、查询分别展示男,女学员的平均成绩
SELECT gender,AVG(scores)
FROM tb_score a
JOIN tb_student b
ON a.stu_id = b.sid
GROUP BY gender

49、查询选修某课程的同学人数多于5人的教师姓名
SELECT tname FROM tb_teacher
WHERE tid IN (SELECT teacher_id FROM tb_course WHERE cid IN
(SELECT course_id FROM tb_score GROUP BY course_id
HAVING COUNT(course_id)>=5
))

50、查询课程表中至少有5名学生选修的并以java开头的课程的平均分数
SELECT AVG(scores)
FROM tb_score
JOIN tb_course
WHERE course_id IN (SELECT cid FROM tb_course WHERE cname LIKE ‘java%’)
GROUP BY course_id
HAVING COUNT(course_id)>3

猜你喜欢

转载自blog.csdn.net/qq_42005540/article/details/108108118