Mysql----sql語句練習題(二)

今天有時間,咱們繼續把數據庫的查詢內容繼續補充,上次sql語句練習一是單表查詢,今天的練習二是多表查詢,

前期準備工作:請看上一篇的單表查詢:https://www.cnblogs.com/xj-excellent/p/13331155.html;提前準備好三張表和數據,就可以開始多表查詢了

多表查詢

1.1內連接
查詢計算機系學生的選課情況,列出學生的名字、所選課程的課程號和考試成績
查詢“信息管理系”選了“計算機文學”課程的學生信息,列出學生姓名、課程名和成績
查詢所有選了"微機原理"課程的學生姓名和所在系
統計每個系學生的考試平均成績
統計計算機系學生中每門課程的選課人數、平均成績、最高成績和最低成績
1.2自連接
查詢與李四在同一個系學習的學生姓名和所在系
查詢與“數據結構與算法”課程在同一個學期開設的課程的課程名和開課學期
1.3外連接
查詢全體學生的選課情況,包括選了課的學生和沒有選課的學生
查詢沒有人選的課程的課程名
查詢計算機系沒有選課的學生,列出學生的姓名和性別
統計計算機系每個學生的選課門數,包括沒有選課的學生
查詢信息管理系選課門數少於3門的學生的學號和選課門數,包括沒選課的學生。查詢結果按選課門數遞增排序

2、top限制
查詢年齡最大的三個學生的姓名、年齡、所在系
查詢年齡最大的三個學生的姓名、年齡、所在系(包括年齡並列第3名)
查詢大學英語考試成績最高的的前三名學生的姓名、所在系和大學英語考試成績
查詢選課人數最少的兩門課程(不包括沒有人選的課程),列出課程號和選課人數
查詢計算機系選課門數超過兩門的學生中,考試平均成績最高的前兩名(包括並列的情況)學生的序號、選課門數和平均成績

3、將查詢結果保存到表中
查詢計算機系學生的學號、姓名、性別和年齡,並將查詢結果保存到新表student_CS中
查詢計算機系學生的學號、姓名、性別和年齡,並將查詢結果保存到臨時表student_CS_Two中

4、數據更改
4.1插入數據
將一個新生插入student表中,其學號爲0821105,姓名爲陳學冬,性別爲男,年齡18歲,信息管理系學生
4.2更新數據
將所有學生的年齡+1
將'0811103'號學生的年齡改爲17歲
將計算機系全體學生的成績加5分
4.3刪除數據
刪除所有不及格學生的修課記錄
刪除計算機系不及格學生的修課記錄

 

接下來,把所有的舉例的多表查詢的結果,放出來,供有需要的同學借鑑使用

/*1.1內連接*/
--查詢計算機系學生的選課情況,列出學生的名字、所選課程的課程號和考試成績
SELECT Sname,Cno,Grade FROM student JOIN sc ON student.Sno = sc.Sno WHERE Sdept = '計算機系'
SELECT Sname,Cno,Grade FROM student AS s  JOIN sc ON s.Sno = sc.Sno WHERE Sdept = '計算機系'
--查詢“信息管理系”選了“計算機文學”課程的學生信息,列出學生姓名、課程名和成績
SELECT Sname,Cname,Grade 
FROM student AS s JOIN sc ON s.Sno = sc.Sno 
JOIN Course ON course.Cno = sc.Cno 
WHERE sdept = '信息管理系' AND Cname = '計算機文化學'
-- 查詢所有選了"微機原理"課程的學生姓名和所在系
SELECT Sname,Sdept,Cname FROM student s 
JOIN sc ON s.Sno=sc.Sno
JOIN course ON course.Cno= sc.Cno
WHERE Cname = '微機原理'
-- 統計每個系學生的考試平均成績
SELECT Sdept,AVG(Grade) AS 平均成績 FROM student s JOIN sc ON s.Sno = sc.Sno GROUP BY Sdept
-- 統計計算機系學生中每門課程的選課人數、平均成績、最高成績和最低成績
SELECT Cno,COUNT(*) AS 選課人數,AVG(Grade) AS 平均成績,MAX(Grade) AS 最高成績,MIN(Grade) AS 最低成績 
FROM student s JOIN sc ON s.Sno = sc.Sno WHERE Sdept = '計算機系' GROUP BY Cno

/*1.2自連接*/
-- 查詢與李四在同一個系學習的學生姓名和所在系
SELECT s2.Sname,s2.Sdept 
FROM student s1 JOIN student s2 ON s1.Sdept = s2.Sdept 
WHERE s1.Sname = '李四'AND s2.Sname != '李四'
-- 查詢與“數據結構與算法”課程在同一個學期開設的課程的課程名和開課學期
SELECT c1.Cname,c1.Semester 
FROM course c1 JOIN course c2 ON c1.Semester = c2.Semester 
WHERE c2.Cname = "數據結構與算法"

/*1.3外連接*/
-- 查詢全體學生的選課情況,包括選了課的學生和沒有選課的學生
SELECT s.Sno,Sname,Cno,Grade FROM student s LEFT JOIN sc ON s.Sno = sc.Sno
-- 查詢沒有人選的課程的課程名
SELECT Cname FROM course c LEFT JOIN sc ON c.Cno = sc.Cno WHERE sc.Cno IS null
-- 查詢計算機系沒有選課的學生,列出學生的姓名和性別
SELECT Sname,Ssex FROM student s  LEFT JOIN  sc ON s.Sno = sc.Sno WHERE Sdept = '計算機系' AND sc.Sno IS null
-- 統計計算機系每個學生的選課門數,包括沒有選課的學生
SELECT Sname,s.Sno,COUNT(*) AS 選課門數 FROM student s  LEFT JOIN  sc ON s.Sno = sc.Sno WHERE Sdept = '計算機系' GROUP BY s.Sno
-- 查詢信息管理系選課門數少於3門的學生的學號和選課門數,包括沒選課的學生。查詢結果按選課門數遞增排序
SELECT s.Sno,Sname,COUNT(sc.Cno) AS 選課門數 
FROM student s  LEFT JOIN  sc ON s.Sno = sc.Sno 
WHERE Sdept = '信息管理系' 
GROUP BY s.Sno
HAVING COUNT(sc.Cno)<3
ORDER BY COUNT(sc.Cno) ASC


/*2、top限制*/
-- 查詢年齡最大的三個學生的姓名、年齡、所在系
SELECT top 3 Sname, Sage, Sdept FROM student ORDER BY Sage DESC
-- 查詢年齡最大的三個學生的姓名、年齡、所在系(包括年齡並列第3名)
SELECT top 3 WITH TIES Sname, Sage, Sdept FROM student ORDER BY Sage DESC
-- 查詢大學英語考試成績最高的的前三名學生的姓名、所在系和大學英語考試成績
SELECT top 3 WITH TIES Sname,Sdept,Cname,Grade FROM student s JOIN sc ON s.Sno = sc.Sno JOIN course ON course.Cno = sc.Cno WHERE Cname = '大學英語' ORDER BY Grade DESC
-- 查詢選課人數最少的兩門課程(不包括沒有人選的課程),列出課程號和選課人數
SELECT top 2 WITH TIES Cno,COUNT(*)AS 選課人數 FROM sc  GROUP BY Cno ORDER BY COUNT(*) ASC
-- 查詢計算機系選課門數超過兩門的學生中,考試平均成績最高的前兩名(包括並列的情況)學生的序號、選課門數和平均成績
SELECT top 2 WITH TIES s.Sno,AVG(Grade)AS 平均成績 ,COUNT(*) AS 選課門數 FROM student s JOIN sc ON s.Sno = sc.Sno 
WHERE Sdept = '計算機系' GROUP BY s.Sno HAVING COUNT(*) > 2 ORDER BY AVG(Grade) DESC

/*3、將查詢結果保存到表中*/
-- 查詢計算機系學生的學號、姓名、性別和年齡,並將查詢結果保存到新表student_CS中
SELECT Sno,Sname,Ssex,Sage INTO student_CS FROM student WHERE Sdept = '計算機系'
-- 查詢計算機系學生的學號、姓名、性別和年齡,並將查詢結果保存到臨時表student_CS_Two中
SELECT Sno,Sname,Ssex,Sage INTO #student_CS_Two FROM student WHERE Sdept = '計算機系'

/*4、數據更改*/
/*4.1插入數據*/
-- 將一個新生插入student表中,其學號爲0821105,姓名爲陳學冬,性別爲男,年齡18歲,信息管理系學生
INSERT INTO student VALUES('0821105','陳學冬','男','18','信息管理系')
/*4.2更新數據*/
-- 將所有學生的年齡+1
UPDATE student SET Sage = Sage + 1
-- 將'0811103'號學生的年齡改爲17歲
UPDATE student SET Sage = 17 WHERE Sno = '0811103'
-- 將計算機系全體學生的成績加5分
UPDATE sc SET Grade = Grade + 5 
FROM sc JOIN student  ON sc.Sno = student.Sno
WHERE Sdept = '計算機系'

/*4.3刪除數據*/
-- 刪除所有不及格學生的修課記錄
DELETE FROM sc WHERE Grade < 60
-- 刪除計算機系不及格學生的修課記錄
DELETE FROM sc 
   FROM sc JOIN student ON sc.Sno = student.Sno WHERE Sdept = '計算機系' AND Grade < 60 

  

  

 

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