【MySQL】經典資料庫SQL語句編寫練習題——SQL語句掃盲

林加欣發表於2017-10-28

【MySQL】資料庫原理複習——SQL語言

 

對基本的SQL語句編寫的練習題,其中的題目的答案可能會有多種書寫方式。

 

1、題目1

 

1.1 關係模式

 

學生student:SNO:學號,SNAME:姓名,AGE:年齡 SEX:性別

SNO

SNAME

AGE

SEX

1

李強

23

2

劉麗

22

5

張友

22

       課程course:CNO:課程程式碼,CNAME:課程名稱,TEACHER:教師

CNO

CNAME

TEACHER

K1

C語言

王華

K5

資料庫原理

程軍

K8

編譯原理

程軍

    學生成績SC:SNO:學號,CNO:課程程式碼,SCORE:成績

SNO

CNO

SCORE

1

K1

83

2

K1

85

5

K1

92

2

K5

90

5

K5

84

5

K8

 80

 

1.2 要求一

 

用SQL語言完成表的建立以及資料的插入:

 

 

[sql] view plain copy
 
  1. use test;  
  2.   
  3. create table if not exists student  
  4. (  
  5.     SNO varchar(20) primary key,  
  6.     SNAME varchar(20) character set gbk,  
  7.     AGE int,  
  8.     SEX  char(2) character set gbk CHECK(SEX IN('男','女'))   
  9. );  
  10. insert into student values('1','李強',23,'男');  
  11. insert into student values('2','劉麗',22,'女');  
  12. insert into student values('5','張友',22,'男');  
  13.   
  14. create table if not exists course  
  15. (  
  16.     CNO varchar(20) primary key,  
  17.     CNAME varchar(20) character set gbk,  
  18.     TEACHER varchar(20) character set gbk  
  19. );  
  20. insert into course values('K1','C語言','王華');  
  21. insert into course values('K5','資料庫原理','程軍');  
  22. insert into course values('K8','編譯原理','程軍');  
  23.   
  24. create table if not exists sc  
  25. (  
  26.     SNO varchar(20) NOT NULL,  
  27.     CNO varchar(20) NOT NULL,  
  28.     SCORE int NOT NULL,  
  29.     primary key (SNO,CNO),  
  30.     foreign key (SNO) references student(SNO),  
  31.     foreign key (CNO) references course(CNO)  
  32. );  
  33. insert into sc values('1','K1',83);  
  34. insert into sc values('2','K1',85);  
  35. insert into sc values('5','K1',92);  
  36. insert into sc values('2','K5',90);  
  37. insert into sc values('5','K5',84);  
  38. insert into sc values('5','K8',80);  

 

 

1.3 要求二

 

 

用SQL語言完成如下要求:

(1)       檢索至少選修"程軍"老師所授全部課程的學生姓名(SNAME);

     本題的另外一種說法就是,檢索選修了“程軍”老師所授全部課程的學生姓名

[sql] view plain copy
 
  1. select sname from student  
  2. where not exists  
  3. (  
  4.    select * from course  
  5.    where teacher='程軍' and not exists  
  6.    (  
  7.        select * from sc   
  8.        where sc.sno=student.sno and sc.cno=course.cno  
  9.     )  
  10. );  

 

這裡的檢索結果是:

+-------+
| sname |
+-------+
| 張友  |
+-------+
1 row in set (0.00 sec)

 

(2)       檢索"李強"同學不學課程的課程號(CNO);

 

[sql] view plain copy
 
  1. select course.cno from course  
  2. where course.cno not in  
  3. (  
  4. select sc.cno from sc,student  
  5. where student.sname='李強' and student.sno=sc.sno  
  6. );  

 


+-----+
| cno |
+-----+
| K5  |
| K8  |
+-----+
2 rows in set (0.22 sec)

(3)       檢索選修不少於3門課程的學生學號(SNO);

 

[sql] view plain copy
 
  1. SELECT sc.sno  
  2. FROM sc  
  3. GROUP BY sc.sno HAVING count(*)>=3  
  4. ;  

 


+-----+
| sno |
+-----+
| 5   |
+-----+
1 row in set (0.09 sec)

(4)       檢索選修全部課程的學生姓名(SNAME)。

 

[sql] view plain copy
 
  1. SELECT sname FROM student  
  2. WHERE NOT EXISTS  
  3. (  
  4. SELECT * FROM course  
  5. WHERE NOT EXISTS  
  6.     (  
  7.         SELECT * FROM sc  
  8.         WHERE course.cno=sc.cno and student.sno=sc.sno  
  9.     )  
  10. );  

 

+-------+
| sname |
+-------+
| 張友  |
+-------+
1 row in set (0.02 sec)


(5)       檢索不學"C語言"的學生資訊

[sql] view plain copy
 
  1. SELECT * FROM student  
  2. WHERE sno not in  
  3. (  
  4.     SELECT sc.sno FROM sc,course  
  5.     WHERE course.cno=sc.cno  
  6. );  

 


1.4 要求三

 

 

請用SQL語言完成如下查詢:

(1)查詢“程軍”老師所教授的所有課程;

 

[sql] view plain copy
 
  1. SELECT * FROM course  
  2. WHERE teacher='程軍';  
(2)查詢“李強”同學所有課程的成績;

 

 

[sql] view plain copy
 
  1. SELECT score FROM student,sc  
  2. WHERE student.sname='李強' AND student.sno=sc.sno  

 

(3)查詢課程名為“C語言”的平均成績;

 

[sql] view plain copy
 
  1. SELECT AVG(score) FROM sc,course  
  2. WHERE course.cname='C語言' AND course.cno=sc.cno  

 

(4)查詢選修了所有課程的同學資訊。

 

[sql] view plain copy
 
  1. SELECT * FROM student   
  2. WHERE NOT EXISTS  
  3. (  
  4.     SELECT * FROM course  
  5.     WHERE NOT EXISTS  
  6.     (  
  7.          SELECT * FROM sc  
  8.          WHERE course.cno=sc.cno AND student.sno=sc.sno  
  9.     )  
  10. );  

 

1.5 要求四

 

(1)檢索王老師所授課程的課程號和課程名。

 

[sql] view plain copy
 
  1. SELECT cno,cname FROM course WHERE teacher LIKE '王%';  

(2)檢索年齡大於23歲的男學生的學號和姓名。

 

 

[sql] view plain copy
 
  1. SELECT sno,sname FROM student  
  2. WHERE age>23;  

(3)檢索至少選修王老師所授課程中一門課程的女學生姓名。

 

 

[sql] view plain copy
 
  1. SELECT sname FROM student  
  2. WHERE sex='女' AND sno IN  
  3. (  
  4.     SELECT distinct sno FROM sc,course  
  5.     WHERE teacher LIKE '王%' AND sc.cno=course.cno  
  6. );  
(4)檢索李同學不學的課程的課程號。

 

 

[sql] view plain copy
 
  1. SELECT course.cno FROM course  
  2. WHERE course.cno NOT IN  
  3. (  
  4.     SELECT sc.cno FROM sc,student  
  5.     WHERE student.sname LIKE '李%' AND sc.sno=student.sno  
  6. );  
(5)檢索至少選修兩門課程的學生學號。

 

 

[sql] view plain copy
 
  1. SELECT sno FROM sc  
  2. GROUP BY sno HAVING (count(*)>=2);  
(6)檢索全部學生都選修的課程的課程號與課程名。

 

 

[sql] view plain copy
 
  1. SELECT course.cno,course.cname FROM course   
  2. WHERE course.cno IN  
  3. (  
  4.     SELECT cno FROM sc  
  5.     GROUP BY cno HAVing count(*)=(SELECT count(*) FROM student)  
  6. );  
(7)檢索選修課程包含王老師所授課的學生學號。
[sql] view plain copy
 
  1. SELECT DISTINCT sno FROM sc  
  2. WHERE cno IN  
  3. (  
  4.     SELECT cno FROM course  
  5.     WHERE teacher LIKE '王%'  
  6. );  
(8)統計有學生選修的課程門數。

 

 

[sql] view plain copy
 
  1. SELECT count(*)  NumberOfCourse  
  2. FROM   
  3. (  
  4.       SELECT DISTINCT cno FROM sc  
  5.       GROUP BY cno  
  6. AS testTab;  
(9)求選修K1課程的學生的平均年齡。

 

 

[sql] view plain copy
 
  1. SELECT AVG(age) AverageOfAge  
  2. FROM student   
  3. WHERE sno IN  
  4. (  
  5.     SELECT sno FROM sc  
  6.     WHERE cno='K1'  
  7. );  
(10)求王老師所授課程的每門課程的學生平均成績。

 

 

[sql] view plain copy
 
  1. SELECT sc.cno,AVG(sc.score)  
  2. FROM sc  
  3. WHERE sc.cno IN  
  4. (  
  5. SELECT course.cno FROM course  
  6. WHERE course.teacher LIKE '王%'  
  7. )  
  8. GROUP BY sc.cno  
(11)統計每門課程的學生選修人數(超過2人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列。

 

 

[sql] view plain copy
 
  1. SELECT cno,Num  
  2. FROM   
  3. (  
  4. SELECT cno,count(*) as Num  
  5. FROM sc  
  6. GROUP BY cno HAVING (count(*) >= 2)  
  7. ) tb_temp  
  8. ORDER BY Num DESC,cno ASC  
  9. ;  
(12)檢索學號比李同學大,而年齡比他小的學生姓名。

 

 

[sql] view plain copy
 
  1. SELECT stu1.sname   
  2. FROM student stu1,  
  3. (  
  4.     SELECT max(sno) snoLi,min(age) ageLi FROM student   
  5.     WHERE sname LIKE '李%'  
  6. AS stuLi  
  7. WHERE (stu1.age < stuLi.ageLi) AND (stu1.sno>stuLi.snoLi)  
  8. ;   
(13)檢索姓名以李打頭的所有學生的姓名和年齡。

 

 

[sql] view plain copy
 
  1. SELECT sname,age FROM student  
  2. WHERE sname LIKE '李%'  
  3. ;  
(14)在SC中檢索成績為空值的學生學號和課程號。

 

 

[sql] view plain copy
 
  1. SELECT sno,cno FROM sc  
  2. WHERE score IS NULL;  
(15)求年齡大於女同學平均年齡的男學生姓名和年齡。

 

 

[sql] view plain copy
 
  1. SELECT sname,age FROM student  
  2. WHERE  
  3. sex='男' AND age > (  
  4.                       SELECT AVG(age)  
  5.                       FROM student  
  6.                       WHERE sex='女'  
  7.                    )  
  8. ;  
(16)求年齡大於所有女同學年齡的男學生姓名和年齡。

 


[sql] view plain copy
 
  1. SELECT sname,age  
  2. FROM student  
  3. WHERE sex='男' AND age > (  
  4.                             SELECT max(age)  
  5.                              FROM student  
  6.                             WHERE sex='女'  
  7.                          )  
  8. ;  
版權宣告:本文為博主原創文章,未經博主允許不得轉載。

相關文章