经典sql练习题sql server版,末尾处有mysql版的链接

来源:互联网 发布:aop切面编程 性能 编辑:程序博客网 时间:2024/06/05 09:35
之前有大神整理了mysql版的,点击http://www.2cto.com/database/201402/282086.html
小弟跟着学习了一下,大为受益,所以把自己在sqlserver上做的发出来供新手参考,也希望能有大神指导一二。
转载请声明源出处http://www.2cto.com/database/201402/282086.html ,(大神源贴地址)
CREATE TABLE STUDENT(SNO VARCHAR(3) NOT NULL, SNAME NVARCHAR(4) NOT NULL,SSEX NVARCHAR(2) NOT NULL, SBIRTHDAY DATETIME,CLASS VARCHAR(5));CREATE TABLE COURSE(CNO NVARCHAR(5) NOT NULL, CNAME NVARCHAR(10) NOT NULL, TNO NVARCHAR(10) NOT NULL);CREATE TABLE SCORE (SNO VARCHAR(3) NOT NULL, CNO NVARCHAR(5) NOT NULL, DEGREE NUMERIC(10, 1) NOT NULL);CREATE TABLE TEACHER (TNO NVARCHAR(10) NOT NULL, TNAME NVARCHAR(4) NOT NULL, TSEX NVARCHAR(2) NOT NULL, TBIRTHDAY DATETIME NOT NULL, PROF NVARCHAR(6), DEPART NVARCHAR(10) NOT NULL);
alter table student add constraint pk_stu primary key (sno);alter table course add constraint pk_co primary key (cno);
alter table score add constraint pk_sno_cno primary key (sno,cno);
alter table teacher add constraint pk_tea primary key(tno);
ALTER TABLE score ADD FOREIGN KEY (sno)REFERENCES student(sno);
ALTER TABLE score ADD FOREIGN KEY (cno)REFERENCES course(cno);
alter table course add foreign key(tno)references teacher(tno);
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);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (104 ,'李元芳' ,'男' ,'1974-02-24',95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (106 ,'刘亦菲' ,'女' ,'1988-02-90',95033);
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','助教','电子工程系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (100,'涂相求','男','1976-03-14','教授','计算机系');

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);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (106,'3-245',69);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (104,'3-245',89);
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-166',79);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81); 
create table grade(
low NUMERIC(3,0),
upp NUMERIC(3),
rank char );
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');
/*select * from student;select * from course;select * from score;select * from teacher;*/ 
SET STATISTICS IO ON; --查看IO
SET STATISTICS TIME ON; --查看时间
use test;--test数据库名

select sname ,ssex ,class from student; 

-- 1、 查询Student表中的所有记录的Sname、Ssex和Class列
select distinct depart from teacher;
-- 2、 查询教师所有的单位即不重复的Depart列。


select * from student;
--3、 查询Student表的所有记录。


select * from score where DEGREE between 60 and 80;
--4、 查询Score表中成绩在60到80之间的所有记录。


select sno ,cno ,degree from score where degree in (85,86,88);
select sno ,cno,degree from score where degree = 85 or degree = 86 or degree = 68;
--5、 查询Score表中成绩为85,86或88的记录。


select * from student where class = 95031 or ssex = '女';
--6、 查询Student表中“95031”班或性别为“女”的同学记录。


select * from student order by class desc;
--7、 以Class降序查询Student表的所有记录。


select * from score order by cno ,degree desc; 
--order by 默认升序,desc降序
--8、 以Cno升序、Degree降序查询Score表的所有记录。


select count(sno) as '95031班人数' from student where class = 95031;
--9、 查询“95031”班的学生人数。


select  top(1) sno,cno,degree from score order by degree desc; 
select sno,cno from score where degree = (select max(degree) from SCORE);
--10、查询Score表中的最高分的学生学号和课程号。


select avg(degree) from score where cno = '3-105'; 
--11、查询‘3-105’号课程的平均分。


select avg(degree) from score where (select count(sno) from score)> 5 and  cno like '3%';
--12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。




SELECT SNO FROM SCORE GROUP BY SNO HAVING MIN(DEGREE)>70 AND MAX(DEGREE)<90;
--13、查询最低分大于70,最高分小于90的Sno列。


select sname ,cno,degree from score,student where score.sno = student.SNO;
SELECT A.SNAME,B.CNO,B.DEGREE FROM STUDENT AS A JOIN SCORE AS B ON A.SNO=B.SNO;
--14、查询所有学生的Sname、Cno和Degree列。


select a.sno,a.degree,b.cname from course as b join score as a on a.CNO = b.CNO ;
--15、查询所有学生的Sno、Cname和Degree列。


select a.sname,b.cname,b.degree from student as a join (
select a.sno,a.degree,b.cname from course as b join score as a on a.CNO = b.CNO) as b on a.SNO = b.SNO;
select a.sname,b.cname,c.degree from STUDENT as a,COURSE as b, SCORE as c where a.SNO=c.SNO and b.CNO = c.CNO;
--16、查询所有学生的Sname、Cname和Degree列。


select avg(degree) FROM SCORE,STUDENT WHERE CLASS = 95033 AND SCORE.SNO = STUDENT.SNO;
SELECT AVG(A.DEGREE) FROM SCORE A JOIN STUDENT B ON A.SNO = B.SNO WHERE B.CLASS= '95033';
--17、查询“95033”班所选课程的平均分。






select sno,cno,degree from score where cno = '3-105' and DEGREE > (
select degree from score where sno = 109 and cno = '3-105'



SELECT A.* FROM SCORE A JOIN SCORE as B on A.CNO='3-105' AND A.DEGREE>B.DEGREE AND 
B.SNO='109' AND B.CNO='3-105';


SELECT A.* FROM SCORE A WHERE A.CNO='3-105' AND A.DEGREE>ALL(SELECT DEGREE FROM 
SCORE B WHERE B.SNO='109' AND B.CNO='3-105');--性能很差
--19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。


 
select S.* from score as s  join 
(select cno,max(degree)as degree from score as b right join 
(select sno from SCORE group by sno having count(sno) >1) 
as c on c.SNO = b.SNO group by CNO ) 
as ct 
on  ct.CNO =s.CNO and s.DEGREE < ct.degree;  
--20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。


SELECT A.* FROM SCORE AS A JOIN SCORE AS B ON B.SNO = 109 AND B.CNO = '3-105' AND A.DEGREE > B.DEGREE AND A.CNO = '3-105'; 
--21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。


SELECT B.* FROM STUDENT AS B JOIN STUDENT AS A ON A.SNO = 108 AND YEAR(A.SBIRTHDAY) = YEAR(B.SBIRTHDAY);
--22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。


SELECT DEGREE FROM SCORE,TEACHER,COURSE WHERE TEACHER.TNAME = '张旭' AND TEACHER.TNO = COURSE.TNO AND COURSE.CNO = SCORE.CNO;
SELECT DEGREE FROM SCORE RIGHT JOIN (
SELECT CNO FROM COURSE B RIGHT JOIN (
SELECT TNO FROM TEACHER WHERE TNAME ='张旭') 
AS C ON C.TNO = B.TNO )
AS A ON A.CNO = SCORE.CNO;
SELECT A.SNO,A.DEGREE FROM SCORE A JOIN (TEACHER B ,COURSE C )
ON A.CNO=C.CNO AND B.TNO=C.TNO
WHERE B.TNAME='张旭';
select cno,sno,degree from score where cno=(select x.cno from course x,teacher y 
where x.tno=y.tno and y.tname='张旭')
--23、查询“张旭“教师任课的学生成绩。




select tname from teacher where tno in(select x.tno from course x,score y where x.cno=y.cno group by x.tno having count(x.tno)>=5);
--最慢
SELECT TNAME FROM TEACHER RIGHT JOIN (
SELECT TNO FROM COURSE RIGHT JOIN (
SELECT CNO FROM SCORE GROUP BY CNO HAVING COUNT(SNO)>= 5 )
AS A ON A.CNO = COURSE.CNO)
AS B ON B.TNO = TEACHER.TNO;
SELECT TNAME FROM TEACHER,COURSE WHERE TEACHER.TNO = COURSE.TNO AND COURSE.CNO in (
SELECT CNO FROM SCORE GROUP BY CNO HAVING COUNT(SNO)>=5);  
--24、查询选修某课程的同学人数多于5人的教师姓名。


select * from STUDENT WHERE STUDENT.CLASS IN (95033,95031);
SELECT * FROM STUDENT WHERE STUDENT.CLASS = 95033 OR STUDENT.CLASS=95031;
--25、查询95033班和95031班全体学生的记录。


select cno from score GROUP BY CNO HAVING MAX(DEGREE)>85;
--26、查询存在有85分以上成绩的课程Cno.


SELECT * FROM TEACHER AS T,COURSE AS C,SCORE AS S WHERE T.DEPART = '计算机系' AND C.CNO = S.CNO AND T.TNO = C.TNO;
SELECT * FROM SCORE RIGHT JOIN (
SELECT CNO,B.TNO FROM COURSE B RIGHT JOIN (
SELECT TNO FROM TEACHER WHERE DEPART ='计算机系') 
AS C ON C.TNO = B.TNO )
AS A ON A.CNO = SCORE.CNO;
--27、查询出“计算机系“教师所教课程的成绩表。


SELECT PROF,TNAME FROM TEACHER WHERE DEPART='计算机系' ;
SELECT PROF,TNAME FROM TEACHER WHERE DEPART='电子工程系';


select tname,prof from teacher where prof not in (
select  A.PROF FROM TEACHER AS A JOIN TEACHER AS B ON A.DEPART != B.DEPART AND A.DEPART ='计算机系' AND B.DEPART = '电子工程系'AND A.PROF = B.PROF
)
select tname,prof from teacher where prof not in (
select  A.PROF FROM TEACHER AS A , TEACHER AS B where A.DEPART != B.DEPART AND A.DEPART ='计算机系' AND B.DEPART = '电子工程系'AND A.PROF = B.PROF
)
--28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。


SELECT A.* FROM SCORE AS A JOIN (
SELECT * FROM SCORE WHERE CNO = '3-245') AS B 
ON A.CNO = '3-105' AND A.DEGREE > B.DEGREE AND A.SNO = B.SNO ORDER BY A.DEGREE DESC;
--29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。


SELECT A.* FROM SCORE AS A JOIN (
SELECT DEGREE,SNO FROM SCORE WHERE CNO = '3-245') AS B 
ON A.CNO = '3-105' AND A.DEGREE > B.DEGREE AND A.SNO = B.SNO;
--30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.


SELECT TNAME AS NAME,TSEX AS SEX,TBIRTHDAY AS BIRTHDAY FROM TEACHER
UNION (SELECT SNAME ,SSEX,SBIRTHDAY FROM STUDENT); 
--31、查询所有教师和同学的name、sex和birthday.


SELECT TNAME AS NAME,TSEX AS SEX,TBIRTHDAY AS BIRTHDAY FROM TEACHER WHERE TSEX = '女'
UNION (SELECT SNAME ,SSEX,SBIRTHDAY FROM STUDENT WHERE SSEX = '女'); 
--32、查询所有“女”教师和“女”同学的name、sex和birthday.


SELECT * FROM SCORE AS A  JOIN 
(SELECT CNO,AVG(DEGREE) AS DEGREE FROM SCORE GROUP BY CNO) AS B 
ON A.CNO =B.CNO AND A.DEGREE < B.DEGREE;
SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO)
--33、查询成绩比该课程平均成绩低的同学的成绩表。




SELECT A.TNAME,A.DEPART FROM TEACHER A JOIN COURSE B ON A.TNO=B.TNO;
select tname,depart from teacher a where exists
(select * from course b where a.tno=b.tno);
SELECT TNAME,DEPART FROM TEACHER WHERE TNO IN (SELECT TNO FROM COURSE);


--34、查询所有任课教师的Tname和Depart.




SELECT TNAME,DEPART FROM TEACHER WHERE TEACHER.TNO NOT IN (
SELECT TNO FROM COURSE AS C INNER JOIN (
SELECT DISTINCT CNO FROM SCORE) AS B ON B.CNO = C.CNO)
select tname,depart from teacher a where not exists
(select * from course b where a.tno=b.tno);--快
SELECT TNAME,DEPART FROM TEACHER WHERE TNO NOT IN (SELECT TNO FROM COURSE); 
--35 查询所有未讲课的教师的Tname和Depart. 
--方法一和方法三是同一种方法,之所以结果不一样是因为我socre表没有记录即意味这门课未开,即使course表有记录。


SELECT CLASS FROM STUDENT where SSEX = '男' GROUP BY CLASS HAVING COUNT(SNO)> 2) 
--36、查询至少有2名男生的班号。


SELECT * FROM STUDENT WHERE SNAME NOT LIKE '王%'; 
--37、查询Student表中不姓“王”的同学记录。


SELECT SNAME ,FLOOR(datediff(DY,SBIRTHDAY,getdate())/365.25) as age FROM STUDENT;
select * from student;
--38、查询Student表中每个学生的姓名和年龄。
select MAX(sbirthday) AS '最大日期值' ,MIN(SBIRTHDAY) AS '最小日期值' FROM STUDENT;
--39、查询Student表中最大和最小的Sbirthday日期值。


SELECT *FROM STUDENT ORDER BY CLASS DESC,FLOOR(DATEDIFF(DY,SBIRTHDAY,GETDATE())/365.25) DESC;
SELECT *FROM STUDENT ORDER BY CLASS DESC,SBIRTHDAY ASC;
--40、以班号和年龄从大到小的顺序查询Student表中的全部记录。


SELECT cname ,cno,teacher.tno,TEACHER.TNAME from course,TEACHER where course.tno = TEACHER.tno and TEACHER.tsex = '男'; 
--41、查询“男”教师及其所上的课程。


select * from SCORE where degree = (select max(DEGREE) from SCORE);
select * from score right join (select max(degree) as degree from score) as b on b.degree = score.DEGREE;  
--42、查询最高分同学的Sno、Cno和Degree列。


select a.SNAME from student as a,student as b where a.SSEX = b.SSEX and b.SNAME = '李军'; 
--43、查询和“李军”同性别的所有同学的Sname.
select a.SNAME from student as a,student as b where a.SSEX = b.SSEX and b.SNAME = '李军' and a.CLASS = b.CLASS;
--44、查询和“李军”同性别并同班的同学Sname.
select distinct a.* from score as a ,course as c , student as s where s.SSEX = '男' and c.CNAME = '计算机导论' and a.CNO = c.CNO; 
--45、查询所有选修“计算机导论”课程的“男”同学的成绩表
                                             
0 0
原创粉丝点击