语句 查询每个人每个科目的最高分_转行数据分析师专栏(SQL篇)-05多表查询...
生活随笔
收集整理的這篇文章主要介紹了
语句 查询每个人每个科目的最高分_转行数据分析师专栏(SQL篇)-05多表查询...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據表(4張)及數據情況:搭建數據表數據參考:空杯希望:轉行數據分析師專欄(SQL篇)-01SQL入門?zhuanlan.zhihu.com
注意:UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。-- 對重復的數據(0001,語文,教師號)只保留一行 SELECT 課程號,課程名稱 FROM course UNION SELECT 課程號,課程名稱 FROM course1-- 保留重復的數據 SELECT 課程號,課程名稱 FROM course UNION ALL SELECT 課程號,課程名稱 FROM course1
一、表的加法
1、先新建一個表course1(和course表數據結構一致,但數據不一樣)
course1表2、union:將course和course1表數據合并
UNION 操作符用于合并兩個或多個 SELECT 語句的結果集。注意:UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。-- 對重復的數據(0001,語文,教師號)只保留一行 SELECT 課程號,課程名稱 FROM course UNION SELECT 課程號,課程名稱 FROM course1-- 保留重復的數據 SELECT 課程號,課程名稱 FROM course UNION ALL SELECT 課程號,課程名稱 FROM course1
二、表的聯結
1、內聯結(inner join,默認為join)
只返回兩個表中聯結字段相等的行案例:查詢有考試記錄的每個學生考過哪些課程,列名包括學號,姓名,課程號
-- 1、0002學號在score表里沒有0001課程號的數據,所以查詢結果不存在這行數據 -- 2、0004學號在score表里沒有任何課程號的數據,所以查詢結果沒有這位學生數據 SELECT a.學號,a.姓名,b.課程號 FROM student AS a INNER JOIN score AS b ON a.學號 = b.學號2、左聯結(left join)
返回包括左表中的所有記錄和右表中聯結字段相等的記錄案例1:查詢全部學生的學號,姓名及考試科目(課程號)
-- 0004學號在score表雖然沒有記錄,但因為是左表的數據,所以會保留在查詢結果 SELECT a.學號,a.姓名,b.課程號 FROM student AS a LEFT JOIN score AS b ON a.學號 = b.學號案例2:不顯示案例1王思聰的數據
SELECT a.學號,a.姓名,b.課程號,b.成績 FROM student AS a LEFT JOIN score AS b ON a.學號 = b.學號 WHERE b.學號 IS NOT NULL3、右聯結(right join)
返回包括右表中的所有記錄和左表中聯結字段相等的記錄案例:查詢考過課程的學生信息,列名包括學號、姓名和課程號、分數(跟左聯結的案例2結果一直)
SELECT a.學號,a.姓名,b.課程號,b.成績 FROM student AS a RIGHT JOIN score AS b ON a.學號 = b.學號4、全聯結(full join)
存在匹配,匹配顯示;同時,將各個表中不匹配的數據與空數據行匹配進行顯示??梢钥闯墒亲笸膺B接與右外連接的并集。注意:Mysql不支持full join5、一張圖總結SQL聯結
三、聯結應用綜合案例
1、查詢所有學生的學號、姓名、選課數、總成績
-- 1)學號、姓名(學生表student) -- 2)選課數(每個學生的選課數目:成績表score,按學號分組,對課程號計數count) -- 3)總成績(每個學生的總成績:成績表score,按學號分組,對成績求和sum) SELECT st.學號,st.姓名,count(課程號),sum(成績) FROM student as st LEFT JOIN score as sc on st.學號=sc.學號 GROUP BY 學號2、查詢平均成績大于85的所有學生的學號、姓名和平均成績
-- 1)查詢出所有學生的學號,成名,平均成績,學號,姓名(在學生表student) -- 平均成績(每個學生的平均成績:在成績表score,按學號分組,平均成績:avg(成績)) -- 2) 平均成績>85 SELECT st.學號,st.姓名,avg(成績) FROM student AS st RIGHT JOIN score AS sc ON st.學號 = sc.學號 GROUP BY 學號 HAVING AVG(成績) > 85;四、case表達式
案例1:查詢出每門課程的及格人數和不及格人數
SELECT 課程號, SUM(CASE WHEN 成績>=60 THEN 1 ELSE 0 END) AS 及格人數, SUM(CASE WHEN 成績<60 THEN 1 ELSE 0 END) AS 不及格人數 FROM score GROUP BY 課程號案例2:使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計:各分段人數,課程號和課程名稱。
SELECT SUM(CASE WHEN sc.成績<=100 AND sc.成績>=85 THEN 1 ELSE 0 END)AS '[100-85]', SUM(CASE WHEN sc.成績>=70 AND sc.成績<85 THEN 1 ELSE 0 END)AS '[85-70]', SUM(CASE WHEN sc.成績<70 AND sc.成績>=60 THEN 1 ELSE 0 END)AS '[70-60]', SUM(CASE WHEN sc.成績<60 THEN 1 ELSE 0 END)AS '[<60]' ,sc.課程號,co.課程名稱 FROM course as co RIGHT JOIN score as sc ON co.課程號=sc.課程號 GROUP BY sc.課程號,co.課程名稱五、練習題
鏈接:The JOIN operation/zh?sqlzoo.net往期數據分析專欄:轉行數據分析師專欄(Excel篇)?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的语句 查询每个人每个科目的最高分_转行数据分析师专栏(SQL篇)-05多表查询...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js return的值取不到_【JS基础
- 下一篇: plsql 设置鼠标行执行_如何制作键盘