MySQL練習(學生表,課程表,選課表)超詳解

環境: win10系統,MySQL數據庫

一、題目:

已知關係:
S(Sno,Sname,Sage,Ssex,Sdept)
C(cno,cname,cpno,ccredit)
SC(sno,cno,grade)
(其中sno:學號;sname:姓名;Ssex:性別;Sdept:系別;Sage :年齡;cno:課程號;cname:課程名;
cpno: 直接先行課;ccredit:學分;grade:成績)1、查詢“CS”系學生的基本信息;

2、查詢“CS”系學生年齡不在1921之間的學生的學號、姓名;

3、查詢學生中的最大年齡;

4、找出“計算機”系年齡最大的學生,顯示其學號、姓名;

5、統計各系學生的人數,結果按升序排列;

6、按系統計各系學生的平均年齡,結果按降序排列;

7、查詢選修了“1”或“2”號課程的學生學號和姓名;

8、查詢選修了課程名爲“數據庫”且成績在60分以下的學生的學號、姓名和成績;

9、查詢選修了3門以上課程的學生學號;

10、查詢選修課程成績至少有一門在80分以上的學生學號;

11、查詢選修課程成績均在80分以上的學生學號;

12、查詢選修課程平均成績在80分以上的學生學號

13、找出各系年齡最大的學生,顯示其學號、姓名;

二、創建學生,課程,選課表並插入數據

#創建學生表:包括學號,姓名,年齡,性別,院系
CREATE TABLE S
(
Sno VARCHAR(7)PRIMARY KEY,
Sname VARCHAR(10)NOT NULL,
Sage INT,
Ssex VARCHAR(2),
Sdept VARCHAR(20)DEFAULT('計算機系')
);

#創建課程表:包括課程號,課程名,選修課課程號,學分
CREATE TABLE C
(
Cno VARCHAR(10)PRIMARY KEY,
Cname VARCHAR (20)NOT NULL,
Cpno VARCHAR(10),
Ccredit INT
);

#創建選課表
CREATE TABLE SC
(
Sno VARCHAR(7),
Cno VARCHAR(10),
grade INT,
FOREIGN KEY (sno) REFERENCES S(Sno),
FOREIGN KEY (cno) REFERENCES C(cno)
);

#  向學生表S中插入數據
INSERT INTO s
   (Sno,Sname,Sage,Ssex,Sdept)
VALUE
   ("10001","張三",20,'男','計算機'),
   ("10002","李梅",19,'女','計算機'),
   ("10003","王五",18,'男','CS'),
   ("10004","小明",21,'男','計算機'),
   ("10006","黎明",18,'男','藝術表演'),
   ("10008","傑克",21,'男','計算機'),
   ("10005","小紅",22,'女','CS');

#  向課程表C中插入數據   
INSERT INTO c
   (Cno,Cname,Cpno,Ccredit)
VALUE
   ("1","離散數學",NULL,5),
   ("2","線性代數",'3',6),
   ("3","高等數學",NULL,4),
   ("4","數據結構",'3',6),
   ("5","操作系統",'1',4),
   ("6","數據庫",'4',5);
DELETE FROM c; 

#  向選課表SC中插入數據  
INSERT INTO sc
  (Sno,Cno,grade)
VALUE
  ("10001","1",70),
  ("10001","6",56),
  ("10003","4",90),
  ("10003","5",83),
  ("10004","1",75),
  ("10004","3",90),
  ("10008","1",70),
  ("10008","5",70),
  ("10008","6",88),
  ("10002","1",85),
  ("10002","6",89);

三、習題答案

# 1、查詢“CS”系學生的基本信息;
SELECT * FROM s WHERE Sdept="CS";

# 2、查詢“CS”系學生年齡不在19到21之間的學生的學號、姓名;
SELECT Sno,Sname,Sage,Sdept 
FROM s 
WHERE (Sage<19 OR Sage>21) AND Sdept = "CS";

# 3、查詢學生中的最大年齡;
SELECT MAX(Sage) FROM s;

# 4、找出“計算機”系年齡最大的學生,顯示其學號、姓名;
SELECT Sno, Sname 
FROM s 
WHERE Sdept="計算機" 
ORDER BY Sage DESC 
LIMIT 1;

# 5、統計各系學生的人數,結果按升序排列;
SELECT Sdept,COUNT(*) '人數' 
FROM s 
GROUP BY Sdept 
ORDER BY '人數';

# 6、按系統計各系學生的平均年齡,結果按降序排列;
SELECT Sdept,AVG(Sage) '平均年齡'
FROM s 
GROUP BY Sdept 
ORDER BY '平均年齡'DESC;

# 7、查詢選修了“1”或“2”號課程的學生學號和姓名;
SELECT s.Sno,Sname 
FROM s JOIN sc ON s.`Sno`=sc.`Sno` 
WHERE Cno IN ("1","2");

# 8、查詢選修了課程名爲“數據庫”且成績在60分以下的學生的學號、姓名和成績;
SELECT s.Sno,Sname 
FROM s JOIN sc ON s.`Sno`=sc.`Sno` 
JOIN c ON sc.`Cno`=c.`Cno`
WHERE Cname ="數據庫" AND grade<60;

# 9、查詢選修了3門以上課程的學生學號;
SELECT sno 
FROM sc 
GROUP BY sc.Sno 
HAVING COUNT(*)>=3;

# 10、查詢選修課程成績至少有一門在80分以上的學生學號;
SELECT sno
FROM sc 
GROUP BY sc.Sno 
HAVING MAX(grade)>80;

# 11、查詢選修課程成績均在80分以上的學生學號;
SELECT sno 
FROM sc 
GROUP BY sc.Sno 
HAVING MIN(grade)>80;

# 12、查詢選修課程平均成績在80分以上的學生學號
SELECT sno
FROM sc 
GROUP BY sc.Sno 
HAVING AVG(grade)>80;

# 13、找出各系年齡最大的學生,顯示其學號、姓名;
SELECT sno,Sname
FROM s JOIN 
	(SELECT Sdept,MAX(Sage) Sage
	FROM s
	GROUP BY Sdept) a
ON (s.`Sage`=a.Sage AND s.`Sdept` = a.Sdept) ;

如果對你有幫助,請點個贊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章