SQL练习题
2014-03-06 13:58
489 查看
原题:点击打开链接
题目是人家的, 答案是自己做的。
题目是人家的, 答案是自己做的。
SET NOCOUNT ON CREATE TABLE STUDENT ( SNO VARCHAR(3) NOT NULL, SNAME VARCHAR(4) NOT NULL, SSEX VARCHAR(2) NOT NULL, SBIRTHDAY DATETIME, CLASS VARCHAR(5) ) go CREATE TABLE COURSE ( CNO VARCHAR(5) NOT NULL, CNAME VARCHAR(10) NOT NULL, TNO VARCHAR(10) NOT NULL ) go CREATE TABLE SCORE ( SNO VARCHAR(3) NOT NULL, CNO VARCHAR(5) NOT NULL, DEGREE NUMERIC(10, 1) NOT NULL ) go CREATE TABLE TEACHER ( TNO VARCHAR(3) NOT NULL, TNAME VARCHAR(4) NOT NULL, TSEX VARCHAR(2) NOT NULL, TBIRTHDAY DATETIME NOT NULL, PROF VARCHAR(6), DEPART VARCHAR(10) NOT NULL ) GO INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' ,'男' ,1977-09-01,95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,1975-10-02,95031); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' ,'女' ,1976-01-23,95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' ,'男' ,1976-02-20,95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,1975-02-10,95031); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' ,'男' ,1974-06-03,95031); GO INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825) INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('6-166' ,'数据电路' ,856); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,100); GO INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-105',92); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-105',88); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-105',76); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'3-105',64); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'3-105',91); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'3-105',78); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'6-166',85); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'6-106',79); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81); GO INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (804,'李诚','男','1958-12-02','副教授','计算机系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (856,'张旭','男','1969-03-12','讲师','电子工程系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (825,'王萍','女','1972-05-05','助教','计算机系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (831,'刘冰','女','1977-08-14','助教','电子工程系'); SET NOCOUNT OFF --题目: --1、 查询Student表中的所有记录的Sname、Ssex和Class列。 SELECT s.SNAME,s.SSEX,s.CLASS FROM STUDENT s --2、 查询教师所有的单位即不重复的Depart列。 SELECT t.DEPART FROM TEACHER t GROUP BY t.DEPART --3、 查询Student表的所有记录。 SELECT * FROM STUDENT s --4、 查询Score表中成绩在60到80之间的所有记录。 SELECT * FROM SCORE s WHERE s.DEGREE BETWEEN 60 AND 80 --5、 查询Score表中成绩为85,86或88的记录。 SELECT * FROM SCORE s WHERE s.DEGREE IN (85,86,88) --6、 查询Student表中“95031”班或性别为“女”的同学记录。 SELECT * FROM STUDENT s WHERE s.CLASS='95031' OR s.SSEX='女' --7、 以Class降序查询Student表的所有记录。 SELECT * FROM STUDENT s ORDER BY s.CLASS DESC --8、 以Cno升序、Degree降序查询Score表的所有记录。 SELECT * FROM SCORE s ORDER BY s.cno ASC,s.DEGREE DESC --9、 查询“95031”班的学生人数。 SELECT COUNT(1) FROM STUDENT s WHERE s.CLASS='95031' --10、查询Score表中的最高分的学生学号和课程号。 --解法1 SELECT * FROM SCORE s2 WHERE EXISTS( SELECT s.cno,MAX(s.DEGREE) AS 分数 FROM SCORE s WHERE s2.CNO = s.CNO GROUP BY s.CNO H***ING s2.DEGREE = MAX(s.DEGREE) ) ORDER BY s2.CNO --解法2 ;WITH t AS ( SELECT s.*,RANK() OVER( PARTITION BY s.CNO ORDER BY s.DEGREE DESC) AS [Rank] FROM SCORE s ) SELECT t.sno,t.cno,t.DEGREE FROM t WHERE t.rank =1 ORDER BY t.CNO --解法3 SELECT s.* FROM SCORE s INNER JOIN (SELECT s.*,RANK() OVER( PARTITION BY s.CNO ORDER BY s.DEGREE DESC) AS [Rank] FROM SCORE s) t ON s.SNO=t.SNO AND s.CNO=t.CNO AND t.[Rank]=1 ORDER BY s.CNO --11、查询‘3-105’号课程的平均分。 SELECT s.cno,***G(s.DEGREE) FROM SCORE s WHERE s.CNO='3-105' GROUP BY s.cno --12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。 SELECT s.cno,***G(s.DEGREE),COUNT(1) AS 选修人数 FROM SCORE s WHERE cno LIKE '3%' GROUP BY s.CNO H***ING COUNT(s.CNO)>=5 --13、查询最低分大于70,最高分小于90的Sno列。 SELECT s.SNO FROM SCORE s WHERE s.DEGREE>70 AND s.DEGREE<90 GROUP BY s.SNO --14、查询所有学生的Sname、Cno和Degree列。 SELECT s.SNAME,s2.cno,s2.DEGREE FROM STUDENT s INNER JOIN SCORE s2 ON s.SNO=s2.SNO ORDER BY s.SNAME,s2.CNO --15、查询所有学生的Sno、Cname和Degree列。 SELECT s2.SNO,c.CNAME,s2.DEGREE FROM SCORE s2 INNER JOIN COURSE c ON s2.CNO=c.CNO ORDER BY s2.sno,s2.CNO --16、查询所有学生的Sname、Cname和Degree列。 SELECT s.SNAME,c.CNAME,s2.DEGREE FROM STUDENT s INNER JOIN SCORE s2 ON s.SNO=s2.SNO INNER JOIN COURSE c ON s2.CNO=c.CNO ORDER BY s.SNAME,s2.CNO --17、查询“95033”班所选课程的平均分。 SELECT s.cno,***G(s.DEGREE) FROM SCORE s INNER JOIN STUDENT stu ON s.SNO=stu.SNO WHERE stu.CLASS='95033' GROUP BY s.CNO --18、假设使用如下命令建立了一个grade表: /* create table grade(low INT,upp INT,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') */ --现查询所有同学的Sno、Cno和rank列。 SELECT sc.sno,sc.cno,g.rank FROM score sc INNER JOIN grade g ON sc.DEGREE BETWEEN g.low AND g.upp ORDER BY sc.SNO SELECT A.SNO,A.CNO,B.RANK FROM SCORE A,GRADE B WHERE A.DEGREE BETWEEN B.LOW AND B.UPP ORDER BY RANK; --19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 SELECT * FROM SCORE s WHERE s.cno='3-105' AND EXISTS (SELECT 1 FROM SCORE s2 WHERE s2.CNO='3-105' AND s2.sno='109' AND s.DEGREE>s2.DEGREE) --20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。 --解法1: SELECT * FROM SCORE s1 WHERE EXISTS ( SELECT 1 FROM SCORE s2 WHERE s1.sno=s2.SNO GROUP BY s2.sno H***ING COUNT(1)>1 ) AND EXISTS( SELECT s3.cno,MAX(s3.DEGREE) FROM SCORE s3 WHERE s1.cno=s3.CNO GROUP BY s3.CNO H***ING s1.DEGREE< MAX(s3.DEGREE) ) ORDER BY s1.CNO --解法2: select * from score b where EXISTS( SELECT 1 FROM SCORE c WHERE b.sno=c.SNO GROUP BY c.sno H***ING COUNT(1)>1 ) AND degree < ( select max(degree) from score a where a.cno=b.cno ) --21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 SELECT * FROM SCORE s1 WHERE s1.CNO='3-105' AND EXISTS( SELECT 1 FROM SCORE s2 WHERE s2.CNO='3-105' AND s2.SNO='109' AND s1.DEGREE>s2.DEGREE ) --22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 SELECT * FROM STUDENT s1 WHERE EXISTS( SELECT * FROM STUDENT s2 WHERE s2.SNO='108' AND DATEDIFF(YEAR,s2.SBIRTHDAY,s1.SBIRTHDAY)=0 ) --23、查询“张旭“教师任课的学生成绩。 SELECT * FROM SCORE s WHERE EXISTS( SELECT c.CNO FROM COURSE c INNER JOIN TEACHER t ON c.TNO = t.TNO AND t.TNAME='张旭' AND c.CNO=s.CNO ) --24、查询选修某课程的同学人数多于5人的教师姓名。 SELECT t.TNAME FROM TEACHER t INNER JOIN COURSE c ON t.TNO=c.TNO WHERE EXISTS( SELECT s.CNO FROM SCORE s WHERE c.CNO=s.CNO GROUP BY s.CNO H***ING COUNT(1)>5 ) --25、查询95033班和95031班全体学生的记录。 SELECT * FROM STUDENT s WHERE s.CLASS IN ('95033','95031') --26、查询存在有85分以上成绩的课程Cno. SELECT s.CNO,MAX(s.DEGREE) FROM SCORE s GROUP BY cno H***ING MAX(s.DEGREE)>85 --27、查询出“计算机系“教师所教课程的成绩表。 SELECT * FROM SCORE s WHERE EXISTS ( SELECT 1 FROM TEACHER t INNER JOIN COURSE c ON t.TNO=c.TNO AND t.DEPART='计算机系' and s.cno=c.cno ) --28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 SELECT * FROM TEACHER t WHERE EXISTS( SELECT PROF FROM teacher t1 WHERE DEPART='计算机系' and exists( SELECT * FROM TEACHER t2 WHERE t2.DEPART='电子工程系' and t1.PROF=t2.prof ) AND t.PROF!=t1.PROF ) --29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 SELECT s.CNO,s2.SNO,s.DEGREE FROM SCORE s INNER JOIN STUDENT s2 ON s.SNO=s2.SNO WHERE s.CNO='3-105' AND s.DEGREE>( SELECT MAX(s3.DEGREE) FROM SCORE s3 WHERE s3.CNO='3-245' GROUP BY s3.CNO ) ORDER BY s.DEGREE DESC --30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. SELECT s.CNO,s2.SNO,s.DEGREE FROM SCORE s INNER JOIN STUDENT s2 ON s.SNO=s2.SNO WHERE s.CNO='3-105' AND EXISTS( SELECT 1 FROM SCORE s3 WHERE s3.CNO='3-245' AND s3.SNO=s.SNO AND s.DEGREE>s3.DEGREE ) --31、查询所有教师和同学的name、sex和birthday. SELECT t.TNAME AS [Name],t.TSEX AS [Sex],t.TBIRTHDAY AS [Birthday],'教师' AS [Type] FROM TEACHER t UNION ALL SELECT s.SNAME AS [Name],s.SSEX AS [Sex],s.SBIRTHDAY AS [Birthday],'同学' AS [Type] FROM STUDENT s --32、查询所有“女”教师和“女”同学的name、sex和birthday. SELECT t.TNAME AS [Name],t.TSEX AS [Sex],t.TBIRTHDAY AS [Birthday],'女教师' AS [Type] FROM TEACHER t where t.TSEX='女' UNION ALL SELECT s.SNAME AS [Name],s.SSEX AS [Sex],s.SBIRTHDAY AS [Birthday],'女同学' AS [Type] FROM STUDENT s where s.SSEX='女' --33、查询成绩比该课程平均成绩低的同学的成绩表。 SELECT * FROM SCORE s WHERE EXISTS ( SELECT * FROM SCORE s2 WHERE s.CNO=s2.CNO GROUP BY s2.CNO H***ING s.DEGREE<***G(s2.DEGREE) ) --34、查询所有任课教师的Tname和Depart. SELECT t.TName,t.DEPART FROM TEACHER t --35 查询所有未讲课的教师的Tname和Depart. SELECT * FROM TEACHER t WHERE t.tno NOT IN ( SELECT c.TNO FROM SCORE s INNER JOIN COURSE c ON s.cno=c.CNO ) --36、查询至少有2名男生的班号。 SELECT class FROM STUDENT s WHERE s.SSEX='男' group by s.class having COUNT(1)>=2 --37、查询Student表中不姓“王”的同学记录。 SELECT * FROM STUDENT s WHERE s.SNAME NOT LIKE '王%' --38、查询Student表中每个学生的姓名和年龄。 SELECT s.SNAME,DATEDIFF(YEAR,s.SBIRTHDAY,GETDATE()) AS 年龄 FROM STUDENT s --39、查询Student表中最大和最小的Sbirthday日期值。 SELECT MAX(s.SBIRTHDAY) AS 最大,MIN(s.SBIRTHDAY) AS 最小 FROM STUDENT s --40、以班号和年龄从大到小的顺序查询Student表中的全部记录。 SELECT * FROM STUDENT s ORDER BY s.CLASS DESC, s.SBIRTHDAY ASC --41、查询“男”教师及其所上的课程。 SELECT c.*,t.TNAME FROM COURSE c INNER JOIN TEACHER t ON t.TSEX='男' and c.TNO=t.TNO --42、查询最高分同学的Sno、Cno和Degree列。 SELECT s1.SNO,s1.CNO,s1.DEGREE FROM SCORE s1 WHERE EXISTS( SELECT 1 FROM SCORE s2 WHERE s1.CNO=s2.CNO GROUP BY s2.CNO H***ING MAX(s2.DEGREE)=s1.DEGREE ) --43、查询和“李军”同性别的所有同学的Sname. SELECT * FROM STUDENT s2 WHERE s2.SSEX IN ( SELECT s.SSEX FROM STUDENT s WHERE s.SNAME='李军' ) --44、查询和“李军”同性别并同班的同学Sname. SELECT * FROM STUDENT s2 WHERE EXISTS ( SELECT 1 FROM STUDENT s WHERE s.SNAME='李军' AND s.class=s2.class and s.SSEX=s2.SSex ) --45、查询所有选修“计算机导论”课程的“男”同学的成绩表 SELECT s.* FROM SCORE s INNER JOIN COURSE c ON s.CNO=c.cno AND c.CNAME='计算机导论' WHERE s.sno IN ( SELECT s2.SNO FROM STUDENT s2 WHERE s2.SSEX='男' )