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