SQL練習題匯總(Sqlserver和Mysql版本)


所需表及數據執行腳本:

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
CREATE TABLE [GRADE](
    [low] [numeric](3, 0) NULL,
    [up] [numeric](3, 0) NULL,
    [rank] [char](1) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
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','助教','電子工程系');
GO
INSERT INTO [GRADE]([low],[up],[rank]) VALUES(90,100,'A');
INSERT INTO [GRADE]([low],[up],[rank]) VALUES(80,89,'B');
INSERT INTO [GRADE]([low],[up],[rank]) VALUES(70,79,'C');
INSERT INTO [GRADE]([low],[up],[rank]) VALUES(60,69,'D');
INSERT INTO [GRADE]([low],[up],[rank]) VALUES(0,59,'E');
View Code

 

題目:
1、查詢Student表中的所有記錄的Sname、Ssex和Class列。
2、查詢教師所有的單位即不重復的Depart列。
3、查詢Student表的所有記錄。
4、查詢Score表中成績在60到80之間的所有記錄。
5、查詢Score表中成績為85,86或88的記錄。
6、查詢Student表中“95031”班或性別為“女”的同學記錄。
7、以Class降序查詢Student表的所有記錄。
8、以Cno升序、Degree降序查詢Score表的所有記錄。
9、查詢“95031”班的學生人數。
10、查詢Score表中的最高分的學生學號和課程號。
11、查詢‘3-105’號課程的平均分。
12、查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。
13、查詢所有課程最低分大於70,最高分小於90的Sno列。
14、查詢所有學生的Sname、Cno和Degree列。
15、查詢所有學生的Sno、Cname和Degree列。
16、查詢所有學生的Sname、Cname和Degree列。
17、查詢“95033”班所選課程的平均分。
18、查詢所有同學的Sno、Cno和rank列。(涉及grade表)
19、查詢選修“3-105”課程的成績高於“109”號同學成績的所有同學的記錄。
20、查詢score中選學一門以上課程的同學中分數為非最高分成績的記錄。
21、查詢成績高於學號為“109”、課程號為“3-105”的成績的所有記錄。
22、查詢和學號為108的同學同年出生的所有學生的Sno、Sname和Sbirthday列。
23、查詢“張旭“教師任課的學生成績。
24、查詢選修某課程的同學人數多於5人的教師姓名。
25、查詢95033班和95031班全體學生的記錄。
26、查詢存在有85分以上成績的課程Cno.
27、查詢出“計算機系“教師所教課程的成績表。
28、查詢“計算機系”與“電子工程系“不同職稱的教師的Tname和Prof。
29、查詢選修編號為“3-105“課程且成績至少高於選修編號為“3-245”的同學的Cno、Sno和Degree,並按Degree從高到低次序排序。
30、查詢選修編號為“3-105”且成績高於選修編號為“3-245”課程的同學的Cno、Sno和Degree.
31、查詢所有教師和同學的name、sex和birthday.
32、查詢所有“女”教師和“女”同學的name、sex和birthday.
33、查詢成績比該課程平均成績低的同學的成績表。
34、查詢所有目前有帶課程的教師的Tname和Depart.
35  查詢所有未講課的教師的Tname和Depart.
36、查詢至少有2名男生的班號。
37、查詢Student表中不姓“王”的同學記錄。
38、查詢Student表中每個學生的姓名和年齡。
39、a.查詢Student表中最大和最小生日的姓名和生日日期。 b.查詢Student表中最大和最小的Sbirthday日期部分。
40、以班號和年齡從大到小的順序查詢Student表中的全部記錄。
41、查詢“男”教師及其所上的課程。
42、查詢最高分同學的Sno、Cno和Degree列。
43、查詢和“李軍”同性別的所有同學的Sname.
44、查詢和“李軍”同性別並同班的同學Sname.
45、查詢所有選修“計算機導論”課程的“男”同學的成績表

 

SqlServer寫法答案:

--1、 查詢Student表中的所有記錄的Sname、Ssex和Class列。
select sname,ssex,class from student

--2、 查詢教師所有的單位即不重復的Depart列。
select distinct depart from teacher

--3、 查詢Student表的所有記錄。
select * from student

--4、 查詢Score表中成績在60到80之間的所有記錄。
select * from score where degree between 60 and 80

--5、 查詢Score表中成績為85,86或88的記錄。

寫法一:
select * from score where degree in (85,86,88);
寫法二:
select * from score where degree = 85 or degree = 86 or degree = 88 --6、 查詢Student表中“95031”班或性別為“女”的同學記錄。 select * from student where class=95031 or ssex='' --7、 以Class降序查詢Student表的所有記錄。 select * from student order by class desc --8、 以Cno升序、Degree降序查詢Score表的所有記錄。 select * from score order by sno asc,degree desc --9、 查詢“95031”班的學生人數。 select count(*) from student where class = 95031 --10、查詢Score表中的最高分的學生學號和課程號。
寫法一:
select * from score where degree = (select max(degree) from score)

寫法二:
select top 1 sno,cno from score
order by degree desc;
--11、查詢‘3-105’號課程的平均分。 select avg(degree) from score where cno='3-105' --12、查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。 select cno,AvgScore from
(select cno,count(cno) as count,avg(degree) as AvgScore from score
group by cno) as A
where a.count>=5 and a.cno like '3%';

--13、查詢所有課程最低分大於70,最高分小於90的Sno列。 SELECT SNO FROM SCORE GROUP BY SNO HAVING MIN(DEGREE)>70 AND MAX(DEGREE)<90; --14、查詢所有學生的Sname、Cno和Degree列。
寫法一:
select a.sname,b.cno,b.degree from student as a inner join score as b on a.sno = b.sno;
寫法二:
select sname,cno,degree from student as a,score as b where a.sno = b.sno;
--15、查詢所有學生的Sno、Cname和Degree列。 select a.sno,b.cname,a.degree from score as a inner join course as b on a.cno = b.cno --16、查詢所有學生的Sname、Cname和Degree列。 select c.sname,b.cname,a.degree from score a inner join course b on a.cno = b.cno inner join student c on c.sno = a.sno --17、查詢“95033”班所有課程的平均分。 SELECT AVG(A.DEGREE) FROM SCORE A JOIN STUDENT B ON A.SNO = B.SNO WHERE B.CLASS='95033'; --各科的平均分: select cno,avg(degree) from score where sno in(select sno from student where class=95033) group by cno --18、查詢所有同學的Sno、Cno和rank列 SELECT A.SNO,A.CNO,B.RANK FROM SCORE A,GRADE B WHERE A.DEGREE BETWEEN B.LOW AND B.UP --備注: select * from score,grade --產生笛卡爾積 記錄數=表1記錄數*表2記錄數 --19、查詢選修“3-105”課程的成績高於“109”號同學成績的所有同學的記錄。 select * from score where cno='3-105' and degree>(select degree from score where sno=109 and cno='3-105') --20、查詢score中選學一門以上課程的同學中分數為非最高分成績的記錄。 select * from score where sno in ( select sno from ( select sno,count(cno) as cnt from score group by sno ) t where t.cnt>1 and sno not in(select top 1 sno from score order by degree desc ) ) --21、查詢成績高於學號為“109”、課程號為“3-105”的成績的所有記錄。 select * from score where degree > (select degree from score where sno=109 and cno='3-105') --22、查詢和學號為108的同學同年出生的所有學生的Sno、Sname和Sbirthday列。 SELECT SNO,SNAME,SBIRTHDAY FROM STUDENT WHERE YEAR(SBIRTHDAY)=(SELECT YEAR(SBIRTHDAY) FROM STUDENT WHERE SNO='108'); --23、查詢“張旭“教師任課的學生成績。 select * from score where cno in ( select b.cno from teacher a inner join course b on a.tno = b.tno and a.tname='張旭' ) --類似寫法 select sno,cno,degree from score where cno=(select x.cno from course x,teacher y where x.tno=y.tno and y.tname='張旭'); --24、查詢選修某課程的同學人數多於5人的教師姓名。 select tname from teacher where tno in ( select tno from course where cno in (select cno from score group by cno having count(cno)>5) ) --類似寫法: 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); --25、查詢95033班和95031班全體學生的記錄。 select * from student where class in(95033,95031); --26、查詢存在有85分以上成績的課程Cno. SELECT CNO FROM SCORE GROUP BY CNO HAVING MAX(DEGREE)>85; --其他方法: 1. select cno from score where degree>85 group by cno; 2.select distinct cno from score where degree in (select degree from score where degree>85); --27、查詢出“計算機系“教師所教課程的成績表。 select * from score where cno in( select a.cno from course a inner join teacher b on a.tno = b.tno and b.depart='計算機系' ); --28、查詢“計算機系”與“電子工程系“不同職稱的教師的Tname和Prof。 select tname,prof from teacher where depart='計算機系' and prof not in( select distinct prof from teacher where depart ='電子工程系' ); --29、查詢選修編號為“3-105“課程且成績至少高於選修編號為“3-245”的同學的Cno、Sno和Degree,並按Degree從高到低次序排序。 SELECT * FROM SCORE WHERE CNO='3-105' AND DEGREE>ANY(SELECT DEGREE FROM SCORE WHERE CNO='3-245') ORDER BY DEGREE DESC; --30、查詢選修編號為“3-105”且成績高於選修編號為“3-245”課程的同學的Cno、Sno和Degree. SELECT * FROM SCORE WHERE DEGREE>ALL(SELECT DEGREE FROM SCORE WHERE CNO='3-245') ORDER BY DEGREE DESC; --31、查詢所有教師和同學的name、sex和birthday. (select sname as name,ssex as sex,sbirthday as birthday from student) union all --union去除重記錄 union all不去除 (select tname as name,tsex as sex,tbirthday as birthday from teacher) --32、查詢所有“女”教師和“女”同學的name、sex和birthday. (select sname as name,ssex as sex,sbirthday as birthday from student where ssex='') union all (select tname as name,tsex as sex,tbirthday as birthday from teacher where tsex=''); --33、查詢成績比該課程平均成績低的同學的成績表。(不太理解) SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO); --34、查詢所有任課教師的Tname和Depart. select a.tname,a.depart from teacher a inner 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); 實際分析,第一種揭發貌似更好,至少掃描次數最少。 --35、查詢所有未講課的教師的Tname和Depart. select tname,depart from teacher where tno not in( select tno from course ); --其他解法: select tname,depart from teacher a where not exists (select * from course b where a.tno=b.tno); --36、查詢至少有2名男生的班號。 select class from student where ssex='' group by class having count(ssex)>1; --37、查詢Student表中不姓“王”的同學記錄。 select * from student where sname not like'王%' --38、查詢Student表中每個學生的姓名和年齡。 select sname,(year(getdate())-year(sbirthday)) as age from student; --類似寫法: select sname,datediff(year,sbirthday,getdate()) as age from student; --38、查詢Student表中每個學生的姓名和年齡。 select sname,(year(getdate())-year(sbirthday)) as age from student; --類似寫法: select sname,datediff(year,sbirthday,getdate()) as age from student; --39、a.查詢Student表中最大和最小生日的姓名和生日日期 select sname,sbirthday as THEMAX from student where sbirthday =(select min(SBIRTHDAY) from student) union select sname,sbirthday as THEMIN from student where sbirthday =(select max(SBIRTHDAY) from student); --b.查詢Student表中最大和最小的Sbirthday日期部分。 select convert(varchar(10),min(sbirthday),120) as [min],convert(varchar(10),max(sbirthday),120) as [max] from student; --40、以班號和年齡從大到小的順序查詢Student表中的全部記錄。 SELECT *,datediff(year,sbirthday,getdate()) AS AGE FROM STUDENT ORDER BY CLASS DESC,AGE DESC; --41、查詢“男”教師及其所上的課程。 select a.tname,b.cname from teacher as a inner join course as b on a.tno=b.tno where a.tsex=''; --42、查詢最高分同學的Sno、Cno和Degree列。 select * from score where degree = ( select max(degree) from score ); --43、查詢和“李軍”同性別的所有同學的Sname. select sname from student where ssex=( select ssex from student where sname='李軍' ); --44、查詢和“李軍”同性別並同班的同學Sname. SELECT SNAME FROM STUDENT A WHERE SSEX=(SELECT SSEX FROM STUDENT B WHERE B.SNAME='李軍' ) AND CLASS=(SELECT CLASS FROM STUDENT C WHERE c.SNAME='李軍'); --排除“李軍”本人: select sname from student where ssex=( select ssex from student where sname='李軍' ) and class = ( select class from student where sname='李軍' ) and sname!='李軍'; --45、查詢所有選修“計算機導論”課程的“男”同學的成績表 select * from score where sno in(select sno from student where ssex='') and cno=(select cno from course where cname='計算機導論');

 

MySql寫法答案:

1、查詢Student表中的所有記錄的Sname、Ssex和Class列。
SELECT SNAME,SSEX,CLASS FROM STUDENT;

2、查詢教師所有的單位即不重復的Depart列。
SELECT DISTINCT DEPART FROM TEACHER;

3、查詢Student表的所有記錄。
SELECT * FROM STUDENT;

4、查詢Score表中成績在60到80之間的所有記錄。
SELECT * FROM SCORE WHERE DEGREE BETWEEN 60 AND 80;

5、查詢Score表中成績為85,86或88的記錄。
SELECT * FROM SCORE WHERE DEGREE IN (85,86,88);

6、查詢Student表中“95031”班或性別為“女”的同學記錄。
SELECT * FROM STUDENT WHERE CLASS='95031' OR SSEX='';

7、以Class降序查詢Student表的所有記錄。
SELECT * FROM STUDENT ORDER BY CLASS DESC;

8、以Cno升序、Degree降序查詢Score表的所有記錄。
SELECT * FROM SCORE ORDER BY CNO ASC,DEGREE DESC;

9、查詢“95031”班的學生人數。
SELECT  COUNT(*) FROM STUDENT WHERE CLASS='95031';

10、查詢Score表中的最高分的學生學號和課程號。
SELECT SNO,CNO FROM SCORE WHERE DEGREE=(SELECT MAX(DEGREE) FROM SCORE);
SELECT SNO,CNO FROM SCORE ORDER BY DEGREE DESC LIMIT 1;

11、查詢‘3-105’號課程的平均分。
SELECT AVG(DEGREE) FROM SCORE WHERE CNO='3-105';

12、查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。
select avg(degree),cno from score
where cno like '3%'
group by cno
having count(sno)>= 5;

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

14、查詢所有學生的Sname、Cno和Degree列。
SELECT A.SNAME,B.CNO,B.DEGREE FROM STUDENT AS A JOIN SCORE AS B ON A.SNO=B.SNO;

15、查詢所有學生的Sno、Cname和Degree列。
SELECT A.CNAME, B.SNO,B.DEGREE FROM COURSE AS A JOIN SCORE AS B ON A.CNO=B.CNO ;

16、查詢所有學生的Sname、Cname和Degree列。
SELECT A.SNAME,B.CNAME,C.DEGREE FROM STUDENT A JOIN (COURSE B,SCORE C)
ON A.SNO=C.SNO AND B.CNO =C.CNO;

17、查詢“95033”班所選課程的平均分。
SELECT AVG(A.DEGREE) FROM SCORE A JOIN STUDENT B ON A.SNO = B.SNO WHERE B.CLASS='95033';

18、查詢所有同學的Sno、Cno和rank列。(grade表)
SELECT A.SNO,A.CNO,B.RANK FROM SCORE A,GRADE B 
WHERE A.DEGREE BETWEEN B.LOW AND B.UP
ORDER BY RANK;

19、查詢選修“3-105”課程的成績高於“109”號同學成績的所有同學的記錄。
SELECT A.* FROM SCORE A JOIN SCORE B 
WHERE 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');

20、查詢score中選學一門以上課程的同學中分數為非最高分成績的記錄。
SELECT * FROM score s 
WHERE DEGREE<(SELECT MAX(DEGREE) FROM SCORE) 
GROUP BY SNO 
HAVING COUNT(SNO)>1 ORDER BY DEGREE ;

21、查詢成績高於學號為“109”、課程號為“3-105”的成績的所有記錄。
見19的第二種解法

22、查詢和學號為108的同學同年出生的所有學生的Sno、Sname和Sbirthday列。
SELECT SNO,SNAME,SBIRTHDAY FROM STUDENT 
WHERE YEAR(SBIRTHDAY)=(SELECT YEAR(SBIRTHDAY) FROM STUDENT WHERE SNO='108');

ORACLE寫法:
select x.cno,x.Sno,x.degree from score x,score y 
where x.degree>y.degree 
and y.sno='109'and y.cno='3-105';

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

23、查詢“張旭“教師任課的學生成績。
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='張旭');
根據實際EXPLAIN此SELECT語句,第一個的掃描次數要小於第二個

24、查詢選修某課程的同學人數多於5人的教師姓名。
SELECT A.TNAME FROM TEACHER A JOIN (COURSE B, SCORE C) ON (A.TNO=B.TNO AND B.CNO=C.CNO)
GROUP BY C.CNO HAVING COUNT(C.CNO)>5;
另一種解法:
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
);
實際測試1明顯優於2

25、查詢95033班和95031班全體學生的記錄。
select * from student where class in(95033,95031);

26、查詢存在有85分以上成績的課程Cno.
SELECT CNO FROM SCORE GROUP BY CNO HAVING MAX(DEGREE)>85;
另一種解法:
select distinct cno from score 
where degree in (select degree from score where degree>85);

27、查詢出“計算機系“教師所教課程的成績表。
SELECT A.* FROM SCORE A JOIN (TEACHER B,COURSE C) ON A.CNO=C.CNO AND B.TNO=C.TNO
WHERE B.DEPART='計算機系';
另一種解法:
SELECT * from score 
where cno in (
select a.cno from course a join teacher b on a.tno=b.tno and b.depart='計算機系'
);
此時2略好於1,在多連接的境況下性能會迅速下降

28、查詢“計算機系”與“電子工程系“不同職稱的教師的Tname和Prof。
select tname,prof from teacher 
where depart='計算機系' 
and prof not in (select prof from teacher where depart='電子工程系');

29、查詢選修編號為“3-105“課程且成績至少高於選修編號為“3-245”的同學的Cno、Sno和Degree,並按Degree從高到低次序排序。
SELECT * FROM SCORE 
WHERE CNO='3-105' 
AND DEGREE>ANY(SELECT DEGREE FROM SCORE WHERE CNO='3-245') 
ORDER BY DEGREE DESC;

30、查詢選修編號為“3-105”且成績高於選修編號為“3-245”課程的同學的Cno、Sno和Degree.
SELECT * FROM SCORE 
WHERE DEGREE>ALL(SELECT DEGREE FROM SCORE WHERE CNO='3-245') 
ORDER BY DEGREE DESC;

31、查詢所有教師和同學的name、sex和birthday.
SELECT SNAME AS NAME, SSEX AS SEX, SBIRTHDAY AS BIRTHDAY FROM STUDENT
UNION
SELECT TNAME AS NAME, TSEX AS SEX, TBIRTHDAY AS BIRTHDAY FROM TEACHER;

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

33、查詢成績比該課程平均成績低的同學的成績表。(須注意此題)
SELECT A.* FROM SCORE A 
WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO);

34、查詢所有目前有帶課程的教師的Tname和Depart.
解法一:
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);
實際分析,第一種揭發貌似更好,至少掃描次數最少。

35  查詢所有未講課的教師的Tname和Depart.
解法一:
SELECT TNAME,DEPART FROM TEACHER A LEFT JOIN COURSE B USING(TNO) WHERE ISNUL (B.tno);
解法二:
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);
NOT IN的方法效率最差,其余兩種差不多

36、查詢至少有2名男生的班號。
SELECT CLASS FROM STUDENT A WHERE SSEX='' 
GROUP BY CLASS HAVING COUNT(SSEX)>1;

37、查詢Student表中不姓“王”的同學記錄。
SELECT * FROM STUDENT A WHERE SNAME not like '王%';

38、查詢Student表中每個學生的姓名和年齡。
SELECT SNAME,(YEAR(NOW())-YEAR(SBIRTHDAY)) AS AGE FROM STUDENT;

39、a.查詢Student表中最大和最小生日的姓名和生日日期。 
select sname,sbirthday as THEMAX from student 
where sbirthday =(select min(SBIRTHDAY) from student)
union
select sname,sbirthday as THEMIN from student 
where sbirthday =(select max(SBIRTHDAY) from student);

40、以班號和年齡從大到小的順序查詢Student表中的全部記錄。
SELECT CLASS,(YEAR(NOW())-YEAR(SBIRTHDAY)) AS AGE FROM STUDENT 
ORDER BY CLASS DESC,AGE DESC;

41、查詢“男”教師及其所上的課程。
SELECT A.TNAME,B.CNAME FROM TEACHER A JOIN COURSE B 
USING(TNO) WHERE A.TSEX='';

42、查詢最高分同學的Sno、Cno和Degree列。
SELECT A.* FROM SCORE A 
WHERE DEGREE=(SELECT MAX(DEGREE) FROM SCORE B );

43、查詢和“李軍”同性別的所有同學的Sname.
SELECT SNAME FROM STUDENT A 
WHERE SSEX=(SELECT SSEX FROM STUDENT B WHERE B.SNAME='李軍');

44、查詢和“李軍”同性別並同班的同學Sname.
SELECT SNAME FROM STUDENT A 
WHERE SSEX=(SELECT SSEX FROM STUDENT B WHERE B.SNAME='李軍' )
AND CLASS=(SELECT CLASS FROM STUDENT C WHERE c.SNAME='李軍');

45、查詢所有選修“計算機導論”課程的“男”同學的成績表
解法一:
SELECT A.* FROM SCORE A JOIN (STUDENT B,COURSE C) 
USING(sno,CNO) WHERE B.SSEX='' AND C.CNAME='計算機導論';
解法二:
select * from score 
where sno in(select sno from student where ssex='') 
and cno=(select cno from course where cname='計算機導論');
View Code

 

文章來源:經典SQL練習題

 

站內擴展閱讀:

SQL Server知識匯總

SQL多表查詢:內連接、外連接(左連接、右連接)、全連接、交叉連接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM