根据CSDN名叫【梦起丶】发的关于SQL练习题,用MySQL做了一遍,题目挺好的,能重新熟悉大部分SQL语法使用,感谢!!!
部分题目存在歧义表述不清楚(对28、29、30题做了语义补充),有一两个题目解法有误(好像是20和21题,做了修改),把我自己跟着做了一遍的发上来,部分题目有自己写的解法,大同小异,欢迎大家的检查!!!
以下是表的创建语句(使用的是MySQL数据库和数据库管理工具Navicat)
CREATE TABLE Student
(
stu_id VARCHAR(3) NOT NULL,
stu_name VARCHAR(4) NOT NULL,
stu_sex VARCHAR(2) NOT NULL,
stu_birthday DATETIME NOT NULL,
stu_class VARCHAR(5)
);
CREATE TABLE Course
(
cou_id VARCHAR(5) NOT NULL,
cou_name VARCHAR(10) NOT NULL,
tea_id VARCHAR(10) NOT NULL
);
CREATE TABLE Score
(
stu_id VARCHAR(3) NOT NULL,
cou_id VARCHAR(5) NOT NULL,
sco_degree NUMERIC(10, 1) NOT NULL
);
CREATE TABLE Teacher
(
tea_id VARCHAR(3) NOT NULL,
tea_name VARCHAR(4) NOT NULL,
tea_sex VARCHAR(2) NOT NULL,
tea_birthday DATETIME NOT NULL,
tea_prof VARCHAR(6),
tea_depart VARCHAR(10) NOT NULL
);
INSERT INTO Student (stu_id, stu_name, stu_sex, stu_birthday, stu_class)
VALUES (108, '曾华', '男', '1977-09-01', 95033);
INSERT INTO Student (stu_id, stu_name, stu_sex, stu_birthday, stu_class)
VALUES (105, '匡明', '男', '1975-10-02', 95031);
INSERT INTO Student (stu_id, stu_name, stu_sex, stu_birthday, stu_class)
VALUES (107, '王丽', '女', '1976-01-23', 95033);
INSERT INTO Student (stu_id, stu_name, stu_sex, stu_birthday, stu_class)
VALUES (101, '李军', '男', '1976-02-20', 95033);
INSERT INTO Student (stu_id, stu_name, stu_sex, stu_birthday, stu_class)
VALUES (109, '王芳', '女', '1975-02-10', 95031);
INSERT INTO Student (stu_id, stu_name, stu_sex, stu_birthday, stu_class)
VALUES (103, '陆君', '男', '1974-06-03', 95031);
INSERT INTO Course (cou_id, cou_name, tea_id)
VALUES ('3-105', '计算机导论', 825);
INSERT INTO Course (cou_id, cou_name, tea_id)
VALUES ('3-245', '操作系统', 804);
INSERT INTO Course (cou_id, cou_name, tea_id)
VALUES ('6-166', '数据电路', 856);
INSERT INTO Course (cou_id, cou_name, tea_id)
VALUES ('9-888', '高等数学', 100);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (103, '3-245', 86);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (105, '3-245', 75);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (109, '3-245', 68);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (103, '3-105', 92);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (105, '3-105', 88);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (109, '3-105', 76);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (101, '3-105', 64);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (107, '3-105', 91);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (108, '3-105', 78);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (101, '6-166', 85);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (107, '6-166', 79);
INSERT INTO Score (stu_id, cou_id, sco_degree)
VALUES (108, '6-166', 81);
INSERT INTO Teacher (tea_id, tea_name, tea_sex, tea_birthday, tea_prof, tea_depart)
VALUES (804, '李诚', '男', '1958-12-02', '副教授', '计算机系');
INSERT INTO Teacher (tea_id, tea_name, tea_sex, tea_birthday, tea_prof, tea_depart)
VALUES (856, '张旭', '男', '1969-03-12', '讲师', '电子工程系');
INSERT INTO Teacher (tea_id, tea_name, tea_sex, tea_birthday, tea_prof, tea_depart)
VALUES (825, '王萍', '女', '1972-05-05', '助教', '计算机系');
INSERT INTO Teacher (tea_id, tea_name, tea_sex, tea_birthday, tea_prof, tea_depart)
VALUES (831, '刘冰', '女', '1977-08-14', '助教', '电子工程系');
45个题目和答案,部分存在多种解法
-- 1、 查询student表中的所有记录的stu_name、stu_sex和stu_class列。
SELECT
student.stu_name,
student.stu_sex,
student.stu_class
FROM
student;
-- 2、 查询教师所有的单位即不重复的tea_depart列。
SELECT DISTINCT tea_depart
FROM teacher;
-- 3、 查询student表的所有记录。
SELECT *
FROM student;
-- 4、 查询score表中成绩在60到80之间的所有记录。
SELECT *
FROM score
WHERE sco_degree BETWEEN 60 AND 80;
-- 5、 查询score表中成绩为85,86或88的记录。
SELECT *
FROM score
WHERE sco_degree IN(85,86,88);
SELECT *
FROM score
WHERE sco_degree=85 or sco_degree=86 or sco_degree=88;
-- 6、 查询student表中“95031”班或性别为“女”的同学记录。
SELECT *
FROM student
WHERE stu_class='95031' OR stu_sex='女';
-- 7、 以stu_class降序查询student表的所有记录。
SELECT *
FROM student
ORDER BY stu_class DESC;
-- 8、 以stu_id升序、sco_degree降序查询score表的所有记录。
SELECT *
FROM student
ORDER BY stu_id ASC,stu_class DESC;
-- 9、 查询“95031”班的学生人数。
SELECT COUNT(*) as class_95031_num
FROM student
WHERE stu_class='95031';
-- 10、查询score表中的最高分的学生学号和课程号。
SELECT stu_id,cou_id
FROM score
ORDER BY sco_degree DESC
LIMIT 1;
SELECT stu_id,cou_id
FROM score
WHERE sco_degree =(SELECT MAX(sco_degree) FROM score);
-- 11、查询‘3-105’号课程的平均分。
SELECT AVG(sco_degree) AS avg_degree
FROM score
WHERE cou_id='3-105';
-- 12、查询score表中至少有5名学生选修的并以3开头的课程的平均分数。
SELECT AVG(sco_degree) AS avg_3_degree,cou_id
FROM score
GROUP BY cou_id
HAVING count(*)>=5 AND cou_id LIKE '3%';
SELECT AVG(sco_degree) AS degree_avg, cou_id
FROM score
WHERE cou_id LIKE '3%'
GROUP BY cou_id
HAVING COUNT(*) >= 5;
-- 13、查询最低分大于70,最高分小于90的stu_id列。
SELECT stu_id
FROM score
GROUP BY stu_id
HAVING min(sco_degree)>70 and max(sco_degree)<90;
-- 13、查询最低分大于70,最高分小于90的stu_id列。
SELECT stu_id
FROM score
GROUP BY stu_id
HAVING MIN(sco_degree)>70 AND MAX(sco_degree)<90;
-- 14、查询所有学生的stu_name、cou_id和sco_egree列。
SELECT a.stu_name,b.cou_id,b.sco_degree
FROM student AS a LEFT JOIN score AS b
ON a.stu_id=b.stu_id;
-- 15、查询所有学生的stu_id、cou_name和sco_degree列。
SELECT b.stu_id,c.cou_name,b.sco_degree
FROM score AS b LEFT JOIN course AS c
ON b.cou_id=c.cou_id;
-- 16、查询所有学生的stu_name、cou_name和sco_degree列。
SELECT student.stu_name,course.cou_name,score.sco_degree
FROM student,course,score
WHERE student.stu_id=score.stu_id and course.cou_id=score.cou_id;
SELECT student.stu_name,course.cou_name,score.sco_degree
FROM student INNER join score INNER join course ON student.stu_id=score.stu_id AND score.cou_id=course.cou_id;
-- 17、查询“95033”班所选课程的平均分。
select student.stu_class,AVG( score.sco_degree)
FROM student LEFT JOIN score
ON student.stu_id=score.stu_id
WHERE student.stu_class='95033';
-- 18、假设使用如下命令建立了一个grade表, 现查询所有同学的stu_name、cou_name和gra_rank列。
/*-- 去除注释进行创建
CREATE TABLE grade
(
gra_low NUMERIC(3, 0),
gra_upp NUMERIC(3),
gra_rank CHAR(1)
);
INSERT INTO grade VALUES(90, 100, 'A');
INSERT INTO grade VALUES(80, 89, 'B');
INSERT INTO grade VALUES(70, 79, 'C');
INSERT INTO grade VALUES(60, 69, 'D');
INSERT INTO grade VALUES(0, 59, 'E');
COMMIT;
*/
SELECT student.stu_name,course.cou_name,grade.gra_rank
FROM student,course,score,grade
WHERE student.stu_id=score.stu_id AND score.cou_id=course.cou_id
AND (score.sco_degree BETWEEN grade.gra_low AND grade.gra_upp);
-- 19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录
SELECT *
from score
WHERE cou_id='3-105' AND sco_degree>(SELECT sco_degree FROM score WHERE stu_id='109' AND cou_id='3-105');
SELECT s1.*
FROM score AS s1 INNER JOIN score as s2 ON s1.cou_id=s2.cou_id
WHERE s1.cou_id='3-105' AND s1.sco_degree>s2.sco_degree AND s2.cou_id='3-105' AND s2.stu_id='109';
-- 20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。
SELECT *
FROM score
WHERE score.sco_degree < (SELECT MAX(score.sco_degree) FROM score)
AND stu_id in
(SELECT stu_id FROM score GROUP BY stu_id HAVING COUNT(*) > 1);
-- 21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
SELECT *
FROM score
WHERE sco_degree>(SELECT sco_degree FROM score WHERE stu_id='109' AND cou_id='3-105');
SELECT s1.*
FROM score as s1 ,score as s2
WHERE s1.sco_degree>s2.sco_degree AND s2.stu_id='109' AND s2.cou_id='3-105';
-- 22、查询和学号为‘108’的同学同年出生的所有学生的stu_id、stu_name和stu_birthday列。
SELECT stu_id,stu_name,stu_birthday
FROM student
WHERE year(stu_birthday)=YEAR((SELECT stu_birthday FROM student WHERE stu_id='108'));
SELECT *
FROM student as s1 INNER JOIN student as s2 ON s1.stu_id=s2.stu_id
-- 23、查询“张旭“教师任课的学生成绩。
SELECT sco_degree
FROM score
WHERE cou_id=(SELECT cou_id FROM course WHERE tea_id=(SELECT tea_id FROM teacher WHERE tea_name='张旭'))
SELECT score.stu_id,score.sco_degree
FROM teacher,score,course
WHERE score.cou_id=course.cou_id AND course.tea_id=teacher.tea_id AND teacher.tea_name='张旭';
-- 24、查询选修某课程的同学人数多于5人的教师姓名。
SELECT DISTINCT teacher.tea_name
FROM score,course,teacher
WHERE course.cou_id=
(SELECT cou_id FROM score GROUP BY cou_id HAVING COUNT(cou_id)>5)
AND teacher.tea_id=course.tea_id;
SELECT teacher.tea_name
FROM teacher, course, score
WHERE teacher.tea_id = course.tea_id
AND course.cou_id = score.cou_id
GROUP BY teacher.tea_name
HAVING COUNT(*) > 5;
-- 25、查询95033班和95031班全体学生的记录。
SELECT *
from student
WHERE stu_class='95033' OR stu_class='95031';
SELECT *
from student
WHERE stu_class in('95033','95031');
-- 26、查询存在有85分以上成绩的课程cou_id。
SELECT cou_id
FROM score
GROUP BY cou_id
HAVING MAX(sco_degree)>85;
-- 27、查询出“计算机系“教师所教课程的成绩表。
SELECT score.sco_degree,score.stu_id
FROM teacher,score,course
WHERE score.cou_id=course.cou_id AND course.tea_id=teacher.tea_id AND teacher.tea_depart='计算机系';
-- 28、查询“计算机系”与“电子工程系“所有tea_prof不同的教师的tea_name和tea_prof。
SELECT tea_name, tea_prof
FROM teacher
WHERE tea_depart = '计算机系'
AND tea_prof NOT IN (SELECT tea_prof
FROM teacher
WHERE tea_depart = '电子工程系');
-- 29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的某位同学的成绩的cou_id、stu_id和sco_degree,并按sco_degree从高到低次序排序。
SELECT cou_id,stu_id,sco_degree
FROM score
WHERE cou_id='3-105' AND sco_degree>ANY(SELECT sco_degree FROM score WHERE cou_id='3-245')
ORDER BY sco_degree DESC;
-- 30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的所有同学的成绩的cou_id、stu_id和sco_degree。
SELECT cou_id,stu_id,sco_degree
FROM score
WHERE cou_id='3-105' AND sco_degree>ALL(SELECT sco_degree FROM score WHERE cou_id='3-245')
ORDER BY sco_degree DESC;
-- 31、查询所有教师和同学的name、sex和birthday。
SELECT tea_name AS name, tea_sex AS sex, tea_birthday AS birthday
FROM teacher
UNION
SELECT stu_name, stu_sex, stu_birthday
FROM student;
-- 32、查询所有“女”教师和“女”同学的name、sex和birthday。
SELECT tea_name AS name, tea_sex AS sex, tea_birthday AS birthday
FROM teacher
WHERE tea_sex='女'
UNION
SELECT stu_name, stu_sex, stu_birthday
FROM student
WHERE stu_sex='女';
-- 33**、查询成绩比该课程平均成绩低的同学的成绩表。
SELECT cou_id,stu_id,sco_degree
FROM score as s1
WHERE sco_degree<
(SELECT AVG( sco_degree) FROM score as s2 WHERE s1.cou_id=s2.cou_id);
-- 34、查询所有任课教师的tea_name和tea_depart
SELECT tea_name,tea_depart
FROM teacher,course
WHERE teacher.tea_id in (course.tea_id);
SELECT tea_name, tea_depart
FROM teacher
WHERE teacher.tea_id IN (SELECT course.tea_id FROM course);
-- 35、查询所有未讲课的教师的tea_name和tad_depart
SELECT tea_name, tea_depart
FROM teacher
WHERE teacher.tea_id NOT IN (SELECT course.tea_id FROM course);
-- 36、查询至少有2名男生的班号。
SELECT stu_class
FROM student
GROUP BY stu_class
HAVING COUNT(stu_sex='男')>2;
SELECT stu_class
FROM student
WHERE stu_sex = '男'
GROUP BY stu_class
HAVING COUNT(*) >= 2;
-- 37、查询Student表中不姓“王”的同学记录。
SELECT *
FROM student
WHERE stu_name NOT LIKE '王%';
-- 38、查询Student表中每个学生的姓名和年龄。
SELECT student.stu_name,YEAR(NOW())-year(stu_birthday) AS stu_age
from student
-- 39、查询Student表中最大和最小的stu_birthday日期值
SELECT max(stu_birthday) as maxdata, MIN(stu_birthday) AS mindata
FROM student
-- 40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
SELECT *,YEAR(NOW())-YEAR(stu_birthday)AS age
FROM student
ORDER BY stu_class ASC, age ASC;
-- 41、查询“男”教师及其所上的课程。
SELECT course.*
FROM teacher,course
WHERE teacher.tea_id=course.tea_id AND teacher.tea_sex='男';
SELECT course.*
FROM course INNER JOIN
teacher ON teacher.tea_id = course.tea_id
WHERE teacher.tea_sex = '男';
-- 42、查询最高分同学的stu_id、cou_id和sco_degree列
SELECT s1.*
FROM score AS s1
WHERE s1.sco_degree = (SELECT MAX(s2.sco_degree) FROM score AS s2);
-- 43、查询和“李军”同性别的所有同学的stu_name.
SELECT s1.stu_name
FROM student as s1
WHERE s1.stu_sex=(SELECT s2.stu_sex FROM student as s2 WHERE s2.stu_name='李军');
-- 44、查询和“李军”同性别并同班的同学stu_name.
SELECT s1.stu_name
FROM student AS s1,student AS s2
WHERE s1.stu_sex=s2.stu_sex AND s1.stu_class=s2.stu_class AND s2.stu_name='李军';
SELECT s1.stu_name
FROM student AS s1
WHERE s1.stu_sex=(SELECT s2.stu_sex FROM student AS s2 WHERE s2.stu_name='李军')
AND s1.stu_class=(SELECT s3.stu_class FROM student AS s3 WHERE s3.stu_name='李军');
-- 45、查询所有选修“计算机导论”课程的“男”同学的成绩表
SELECT score.stu_id,student.stu_sex,course.cou_name,score.sco_degree
FROM student,score,course
WHERE student.stu_sex='男'
AND student.stu_id=score.stu_id
AND score.cou_id=course.cou_id
AND course.cou_name='计算机导论';