一、表的聯合
union 将兩張表聯合成為一張表并且
會去掉重複資料
union all将兩張表聯合成為一張表并且
不會去掉重複資料
二、表的聯結
聯結關系圖
常用的聯結:cross join、inner join、left join、right join、full join幾種
1.交叉聯結(cross join)笛卡爾積:表1的資料和表2的資料逐一進行組合,共生成的資料總數等于(表1資料總數)與(表2資料總數)的乘積,需要大量的運算
2.内聯結(inner join):用于查找同時存在于兩張表中的資料,當表1和表2中僅有一列列名一 緻,用于查找對應列名的資料時,可以使用 natural join 達到相同效果,省略on 表1.列名=表2.列名
3.左聯結(left join):兩個表進行比對關系,将左側的表作為
主表讀取全部資料和右表中的資料進行交叉聯結,未比對成功的資料顯示為NULL
可找到僅存在于左表中的資料,不與右表中的資料重合部分
4.右聯結(right join):同理右側的表作為
主表讀取全部資料與左表中的資料進行交叉聯結,未比對成功的資料顯示為NULL,查找僅存在于右表中的資料可使用where 左表中資料為NULL(未比對成功的資料),進行查找
5.全聯結(full join):查詢結果傳回左表與右表中所有行,比對成功合并,比對失敗顯示NULL(MYSQL不支援)
三、練習
1.查詢所有學生的學号、姓名、選課數、總成績
分析:學号存在于student表和score表中,姓名存在于student表中,選課數需要先對score表中學号group by再計算課程号count總和,總成績需要先對score表中學号group by再計算sum成績,需要傳回所有學生是以使用student left join score
2.查詢平均成績大于85的所有學生的學号、姓名、平均成績
分析:學号存在于student表和score表中,姓名存在于student表中,平均成績是對score表中的學号group by再對分組後的avg求出平均成績,用比較運算>85得出結果
3.查詢學生的選課情況:學号、姓名、課程号、課程名稱
分析:學号和姓名存在于student表中,學号和課程号存在于score表中,課程号和課程名稱存在于course表中,student表和score表通過學号進行聯結,course表和score表通過課程号進行聯結
四、case 表達式:多種條件進行判斷
case when <判斷表達式> then<表達式>...
else<表達式>
end
五、SQLZOO
使用sum和case when 同時使用,可得到某一資料出現的總和,group by可對最終select出的資料進行逐一分組確定資料可傳回
分析:POL參與的賽事可在主場和客場的 team1 或team2中找到,而GER進球數則要在goal表中擷取進球資料
分析:需要傳回某一表中全部資料則使用left join 或 right join