1. 程式人生 > >SQL進階練習題50道

SQL進階練習題50道

表及資料

student
SNO    SNAME    SAGE    SSEX
01    趙雷    1990-01-01 00:00:00    男
02    錢電    1990-12-21 00:00:00    男
03    孫風    1990-05-20 00:00:00    男
04    李雲    1990-08-06 00:00:00    男
06    吳蘭    1992-03-01 00:00:00    女
07    鄭竹    1989-07-01 00:00:00    女
08    王菊    1990-01-20 00:00:00    女
05    周梅    1991-12-01 00:00:00    女
sc
SNO    CNO    SCORE
01    01    80.0
01    02    90.0
01    03    99.0
02    01    70.0
02    02    60.0
02    03    80.0
03    01    80.0
03    02    80.0
03    03    80.0
04    01    50.0
04    02    30.0
04    03    20.0
05    01    76.0
05    02    87.0
06    01    31.0
06    03    34.0
07    02    89.0
07    03    98.0
teacher
TNO    TNAME
01    張三
02    李四
03    王五
course
CNO    CNAME    TNO
01    語文    02
02    數學    01
03    英語    03
01    語文    02
02    數學    01
03    英語    03

問題

1、查詢"01"課程比"02"課程成績高的學生的資訊及課程分數
2、查詢"01"課程比"02"課程成績低的學生的資訊及課程分數
3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績
5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
6、查詢"李"姓老師的數量
7、查詢學過"張三"老師授課的同學的資訊
8、查詢沒學過"張三"老師授課的同學的資訊
9、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的資訊
10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的資訊
11、查詢沒有學全所有課程的同學的資訊
12、查詢至少有一門課與學號為"01"的同學所學相同的同學的資訊
13、查詢和"01"號的同學學習的課程完全相同的其他同學的資訊
14、查詢沒學過"張三"老師講授的任一門課程的學生姓名
15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
16、檢索"01"課程分數小於60,按分數降序排列的學生資訊
17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
18、查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平
均分,及格率,中等率,優良率,優秀率(及格為>=60,中等為:70-80,優良為:80-90,優秀為:
>=90)
19、按各科成績進行排序,並顯示排名

20、查詢學生的總成績並進行排名
21、查詢不同老師所教不同課程平均分從高到低顯示
22、查詢所有課程的成績第2名到第3名的學生資訊及該課程成績
23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所佔百分比
24、查詢學生平均成績及其名次
25、查詢各科成績前三名的記錄
26、查詢每門課程被選修的學生數
27、查詢出只有兩門課程的全部學生的學號和姓名
28、查詢男生、女生人數
29、查詢名字中含有"風"字的學生資訊
30、查詢同名同性學生名單,並統計同名人數
31、查詢1990年出生的學生名單
32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
33、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績
34、查詢課程名稱為"數學",且分數低於60的學生姓名和分數
35、查詢所有學生的課程及分數情況
36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數
37、查詢不及格的課程
38、查詢課程編號為01且課程成績在80分以上的學生的學號和姓名
39、求每門課程的學生人數
40、查詢選修"張三"老師所授課程的學生中,成績最高的學生資訊及其成績

41、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
42、查詢每門功成績最好的前兩名
43、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按
人數降序排列,若人數相同,按課程號升序排列
44、檢索至少選修兩門課程的學生學號
45、查詢選修了全部課程的學生資訊
46、查詢各學生的年齡
47、查詢本週過生日的學生
48、查詢下週過生日的學生
49、查詢本月過生日的學生
50、查詢下月過生日的學生

查詢語句

#SQL練習50道題

#建立資料庫,表,及新增資料
CREATE DATABASE PRACTICE;
CREATE TABLE STUDENT(SNO VARCHAR(10),SNAME NVARCHAR(10),SAGE DATETIME,SSEX NVARCHAR(10));
INSERT INTO STUDENT VALUES
('01' , N'趙雷' , '1990-01-01' , N'男'),
('02' , N'錢電' , '1990-12-21' , N'男'),
('03' , N'孫風' , '1990-05-20' , N'男'),
('04' , N'李雲' , '1990-08-06' , N'男'),
('05' , N'周梅' , '1991-12-01' , N'女'),
('06' , N'吳蘭' , '1992-03-01' , N'女'),
('07' , N'鄭竹' , '1989-07-01' , N'女'),
('08' , N'王菊' , '1990-01-20' , N'女');
CREATE TABLE COURSE(CNO VARCHAR(10),CNAME NVARCHAR(10),TNO VARCHAR(10));
INSERT INTO COURSE VALUES
('01' , N'語文' , '02'),
('02' , N'數學' , '01'),
('03' , N'英語' , '03');
CREATE TABLE TEACHER(TNO VARCHAR(10),TNAME NVARCHAR(10));
INSERT INTO TEACHER VALUES
('01' , N'張三'),
('02' , N'李四'),
('03' , N'王五');
CREATE TABLE SC(SNO VARCHAR(10),CNO VARCHAR(10),SCORE DECIMAL(18,1));
INSERT INTO SC VALUES
('01' , '01' , 80),
('01' , '02' , 90),
('01' , '03' , 99),
('02' , '01' , 70),
('02' , '02' , 60),
('02' , '03' , 80),
('03' , '01' , 80),
('03' , '02' , 80),
('03' , '03' , 80),
('04' , '01' , 50),
('04' , '02' , 30),
('04' , '03' , 20),
('05' , '01' , 76),
('05' , '02' , 87),
('06' , '01' , 31),
('06' , '03' , 34),
('07' , '02' , 89),
('07' , '03' , 98);

#查詢語句
1、查詢"01"課程比"02"課程成績高的學生的資訊及課程分數
SELECT A.* ,B.SCORE '01課程成績',C.SCORE '02課程成績'
FROM STUDENT A INNER JOIN (SC B,SC C)
ON A.SNO=B.SNO AND A.SNO=C.SNO AND B.CNO='01' AND C.CNO='02'
WHERE B.SCORE>C.SCORE;

2、查詢"01"課程比"02"課程成績低的學生的資訊及課程分數
SELECT A.* ,B.SCORE '01課程成績',C.SCORE '02課程成績'
FROM STUDENT A INNER JOIN (SC B,SC C)
ON A.SNO=B.SNO AND A.SNO=C.SNO AND B.CNO='01' AND C.CNO='02'
WHERE B.SCORE<C.SCORE;

3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
SELECT A.SNO,A.SNAME,AVG(SCORE) '平均成績'
FROM STUDENT A INNER JOIN SC B
ON A.SNO=B.SNO
GROUP BY SNO 
HAVING AVG(SCORE)>=60;

4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績
SELECT A.SNO,A.SNAME,AVG(SCORE) '平均成績'
FROM STUDENT A INNER JOIN SC B
ON A.SNO=B.SNO
GROUP BY SNO
HAVING AVG(SCORE)<60;

5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
SELECT A.SNO,A.SNAME,COUNT(CNO) '選課總數',SUM(SCORE) '課程總成績'
FROM STUDENT A INNER JOIN SC B
ON A.SNO=B.SNO
GROUP BY B.SNO;

6、查詢"李"姓老師的數量
SELECT COUNT(TNAME)
FROM TEACHER
WHERE TNAME LIKE '李%';

7、查詢學過"張三"老師授課的同學的資訊
SELECT DISTINCT A.*
FROM STUDENT A INNER JOIN (TEACHER B,COURSE C,SC D)
ON A.SNO=D.SNO AND D.CNO=C.CNO AND C.TNO=B.TNO
WHERE TNAME='張三'

8、查詢沒學過"張三"老師授課的同學的資訊
SELECT DISTINCT A.*
FROM STUDENT A INNER JOIN (TEACHER B,COURSE C,SC D)
ON A.SNO=D.SNO AND D.CNO=C.CNO AND C.TNO=B.TNO
WHERE TNAME!='張三'

9、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的資訊
SELECT * FROM STUDENT
WHERE SNO IN (
SELECT A.SNO FROM SC A ,SC B 
WHERE A.SNO=B.SNO AND A.CNO='01' AND B.CNO='02');

10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的資訊
SELECT * FROM STUDENT
WHERE SNO IN (
SELECT SNO FROM SC WHERE CNO='01')
AND SNO NOT IN(
SELECT SNO FROM SC WHERE CNO='02');

11、查詢沒有學全所有課程的同學的資訊
SELECT A.* 
FROM STUDENT A INNER JOIN SC B
ON A.SNO=B.SNO
GROUP BY B.SNO
HAVING COUNT(B.CNO)<3;

12、查詢至少有一門課與學號為"01"的同學所學相同的同學的資訊
SELECT DISTINCT A.* FROM STUDENT A ,SC B
WHERE A.SNO=B.SNO AND CNO IN
(SELECT CNO FROM SC WHERE SNO=01) 
AND A.SNO<>01

13、查詢和"01"號的同學學習的課程完全相同的其他同學的資訊
解法一:
SELECT DISTINCT A.* FROM STUDENT A,SC B
WHERE A.SNO=B.SNO AND CNO IN 
(SELECT CNO FROM SC WHERE SNO=01)
AND A.SNO<>01
GROUP BY A.SNO
HAVING COUNT(CNO)=(SELECT COUNT(*) FROM SC WHERE SNO=01);
解法二:
SELECT * FROM STUDENT
WHERE SNO IN (
SELECT A.SNO FROM STUDENT A  INNER JOIN SC B ON A.SNO=B.SNO
WHERE A.SNO<>01 AND B.CNO IN (SELECT CNO FROM SC WHERE SNO=01)
GROUP BY A.SNO HAVING COUNT(B.CNO)=(SELECT COUNT(*) FROM SC WHERE SNO=01)
); 

14、查詢沒學過"張三"老師講授的任一門課程的學生姓名
SELECT DISTINCT A.SNAME
FROM STUDENT A INNER JOIN (TEACHER B,COURSE C,SC D)
ON A.SNO=D.SNO AND D.CNO=C.CNO AND C.TNO=B.TNO
WHERE TNAME NOT IN ('張三')

15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
SELECT A.SNO,A.SNAME,AVG(SCORE) '平均成績'
FROM STUDENT A,SC B
WHERE A.SNO=B.SNO AND B.SCORE<60
GROUP BY A.SNO
HAVING COUNT(*)>2;

16、檢索"01"課程分數小於60,按分數降序排列的學生資訊
SELECT A.*
FROM STUDENT A INNER JOIN SC B
ON A.SNO=B.SNO
WHERE SCORE<60 AND CNO=01
ORDER BY SCORE;

17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
SELECT SNO,GROUP_CONCAT(CNO),GROUP_CONCAT(SCORE),AVG(SCORE) 
FROM SC
GROUP BY SNO 
ORDER BY AVG(SCORE) DESC;

18、查詢各科成績最高分、最低分和平均分:
以如下形式顯示:課程ID,課程name,最高分,最低分,平
均分,及格率,中等率,優良率,優秀率
(及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=9
SELECT CNO,CNAME,
(SELECT MAX(SCORE) FROM SC WHERE CNO=A.CNO)MAX_SCORE,
(SELECT MIN(SCORE) FROM SC WHERE CNO=A.CNO)MIN_SCORE,
(SELECT AVG(SCORE) FROM SC WHERE CNO=A.CNO)AVG_SCORE,
(SELECT COUNT(*) FROM SC WHERE CNO=A.CNO AND SCORE>=60)/(SELECT COUNT(*) FROM SC WHERE CNO=A.CNO)*100 '及格率%'
(SELECT COUNT(*) FROM SC WHERE CNO=A.CNO AND SCORE>=70 AND SCORE<80)/(SELECT COUNT(*) FROM SC WHERE CNO=A.CNO)*100 '中等率%'
(SELECT COUNT(*) FROM SC WHERE CNO=A.CNO AND SCORE>=80 AND SCORE<90)/(SELECT COUNT(*) FROM SC WHERE CNO=A.CNO)*100 '優良率%'
(SELECT COUNT(*) FROM SC WHERE CNO=A.CNO AND SCORE>=90)/(SELECT COUNT(*) FROM SC WHERE CNO=A.CNO)*100 '優秀率%'
FROM COURSE AS A ORDER BY CNO;

19、按各科成績進行排序,並顯示排名
SELECT SNO,CNO,SCORE,(SELECT COUNT(1)+1 FROM SC WHERE SCORE>A.SCORE AND CNO=A.CNO) RANK
FROM SC A
ORDER BY CNO,SCORE DESC;

20、查詢學生的總成績並進行排名
SELECT SNO,SUM(SCORE)
FROM SC
GROUP BY SNO 
ORDER BY SUM(SCORE) DESC;

21、查詢不同老師所教不同課程平均分從高到低顯示
SELECT CNO,AVG(SCORE)
FROM SC
GROUP BY CNO
ORDER BY AVG(SCORE) DESC;

22、查詢所有課程的成績第2名到第3名的學生資訊及該課程成績


23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所佔百分比
24、查詢學生平均成績及其名次
SELECT A.SNO,A.AVG,COUNT(*) '名次'
FROM (SELECT SNO,AVG(SCORE) AVG FROM SC GROUP BY SNO) A
INNER JOIN (SELECT SNO,AVG(SCORE) AVG FROM SC GROUP BY SNO) B
ON A.AVG<=B.AVG
GROUP BY A.SNO
ORDER BY A.AVG DESC

25、查詢各科成績前三名的記錄


26、查詢每門課程被選修的學生數
SELECT CNO,COUNT(SNO)
FROM SC
GROUP BY CNO;

27、查詢出只有兩門課程的全部學生的學號和姓名
SELECT A.SNO,B.SNAME
FROM SC A INNER JOIN STUDENT B
ON A.SNO=B.SNO
GROUP BY A.SNO
HAVING COUNT(cno)=2;

28、查詢男生、女生人數
SELECT SSEX,COUNT(*)'人數' 
FROM STUDENT 
GROUP BY SSEX;

29、查詢名字中含有"風"字的學生資訊
SELECT * FROM STUDENT
WHERE SNAME LIKE '%風%';

30、查詢同名同姓學生名單,並統計同名人數
SELECT SNAME,COUNT(*)
FROM STUDENT 
GROUP BY SNAME
HAVING COUNT(*)>1

31、查詢1990年出生的學生名單
SELECT SNAME
FROM STUDENT
WHERE YEAR(SAGE)=1990;

32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
SELECT CNO,AVG(SCORE)
FROM SC
GROUP BY CNO
ORDER BY AVG(SCORE) DESC,CNO ASC;

33、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績
SELECT A.SNO,B.SNAME,AVG(A.SCORE) AVG_SCORE
FROM SC A INNER JOIN STUDENT B
ON A.SNO=B.SNO
GROUP BY A.SNO
HAVING AVG(A.SCORE)>=85;

34、查詢課程名稱為"數學",且分數低於60的學生姓名和分數
SELECT A.SNO, A.SNAME,B.SCORE
FROM STUDENT A INNER JOIN (SC B,COURSE C)
ON A.SNO=B.SNO AND B.CNO=C.CNO
WHERE C.CNAME='數學' AND B.SCORE<60;

35、查詢所有學生的課程及分數情況
SELECT DISTINCT A.SNAME,C.CNAME,B.SCORE
FROM STUDENT A INNER JOIN (SC B,COURSE C)
ON A.SNO=B.SNO AND B.CNO=C.CNO;

36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數
SELECT DISTINCT A.SNAME,C.CNAME,B.SCORE
FROM STUDENT A INNER JOIN (SC B,COURSE C)
ON A.SNO=B.SNO AND B.CNO=C.CNO
WHERE B.SCORE>70;

37、查詢不及格的課程
SELECT SNO,CNO,SCORE
FROM SC
WHERE SCORE<60;

38、查詢課程編號為01且課程成績在80分以上的學生的學號和姓名
SELECT A.SNO,A.SNAME
FROM STUDENT A INNER JOIN SC B
ON A.SNO=B.SNO
WHERE B.CNO='01' AND B.SCORE>=80;

39、求每門課程的學生人數
SELECT CNO,COUNT(SCORE)
FROM SC
GROUP BY CNO;

40、查詢選修"張三"老師所授課程的學生中,成績最高的學生資訊及其成績
SELECT A.SNO,A.SNAME,B.CNO,MAX(B.SCORE)
FROM STUDENT A INNER JOIN (SC B,COURSE C,TEACHER D)
ON A.SNO=B.SNO AND B.CNO=C.CNO AND C.TNO=D.TNO
WHERE D.TNAME='張三';

41、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
SELECT DISTINCT A.* 
FROM SC A INNER JOIN SC B
ON A.SNO=B.SNO
WHERE A.CNO<>B.CNO 
AND A.SCORE=B.SCORE;

42、查詢每門功課成績最好的前兩名
SELECT SNO,CNO,MAX(SCORE)
FROM SC
GROUP BY CNO

43、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按
人數降序排列,若人數相同,按課程號升序排列
SELECT CNO,COUNT(*)
FROM SC
GROUP BY CNO
HAVING COUNT(*)>=5
ORDER BY COUNT(*) DESC,CNO ASC;

44、檢索至少選修兩門課程的學生學號
SELECT SNO
FROM SC
GROUP BY SNO
HAVING COUNT(CNO)>=2;

45、查詢選修了全部課程的學生資訊
SELECT A.*
FROM STUDENT A INNER JOIN SC B
ON A.SNO=B.SNO
GROUP BY SNO 
HAVING COUNT(CNO)=3;

46、查詢各學生的年齡
SELECT SNO,SNAME,(YEAR(NOW())-YEAR(SAGE))AGE
FROM STUDENT;

47、查詢本週過生日的學生
SELECT SNAME
FROM STUDENT
WHERE WEEK(SAGE)=WEEK(NOW());

48、查詢下週過生日的學生
SELECT SNAME
FROM STUDENT
WHERE WEEK(SAGE)=WEEK(NOW())+1;

49、查詢本月過生日的學生
SELECT SNAME
FROM STUDENT
WHERE MONTH(SAGE)=MONTH(NOW());

50、查詢下月過生日的學生
SELECT SNAME
FROM STUDENT
WHERE MONTH(SAGE)=MONTH(NOW())+1;