您的位置:首页 > 数据库

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='男'
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: