今天有時間,咱們繼續把數據庫的查詢內容繼續補充,上次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