一、表的加法
union:将多個表的資料記錄按行合并在一起(即多個表的并集),同時傳回的結果會删除重複行,重複的記錄隻保留一行。如果需要保留重複行,可以使用union all

二、表的聯結
1.交叉聯結(cross join)
也叫笛卡兒積,指将表中的每一行和另外一個表的每一行合并在一起,傳回的結果的行數等于兩個表的行數的乘積,交叉聯結是所有聯結的基礎。
2.内聯結(inner join)
指查找同時存在于兩張表的資料,即兩個表的交集
3.左聯結(left join)
指将左側的表中的資料全部取出
4.右聯結(right join)
指将右側的表中的資料全部取出
5.全聯結(full join)
指傳回的是左表和右表中的所有行,如果沒有比對的行則會顯示空值,MySQL不支援全聯結
6.選擇聯結的方法
根據想要保留哪一部分資料來選擇用哪一種聯結,當需要生成固定行數的表單或者需要指定取出哪一張表中的全部資料的時候,使用left join或right join,其他情況則用inner join,另外,聯結不會影響SQL運作順序。
三、聯結的應用案例
練習:
左聯結,題目要求是所有學生,是以以學生表為主表,以學生表的學号分組
having子句對分組結果指定條件
3張表的聯結
四、case表達式
1.case表達式用于多種情況的條件判斷
case when 判斷表達式 then 表達式
when 判斷表達式 then 表達式
...
else 表達式
end
when子句的判斷表達式用于判斷某一行資料是否符合某個條件,若符合則傳回then子句的表達式,若不符合則繼續執行下一個when子句,如果所有的when子句都不符合,則傳回else子句的表達式。
2.注意事項
①else子句可以省略不寫,預設為else null,但不建議省略
②end不能省略
③case表達式可以書寫在任意子句中
練習:
按課程号分組,通過sum求和計算人數
自定義分組,因為課程号和課程名稱是一對一的對應關系,是以group by後面可以加課程名稱,如果兩者不是一對一的對應關系,則不能添加
Group by 分組時,當用多個列來分組時,這幾個列的值要全部相同才算一組,例如以上的課程号和課程名稱要一一對應。
五、SQLzoo練習題
where子句中的條件:主隊是德國或者客隊是德國,比如德國 和 A隊比賽(德國是主隊),進球的是A隊,A隊和德國比賽(德國是客隊),進球的是A隊,内聯結的結果中入球球員有重複值,用distinct去重複值
比賽地點(比賽資訊表game),和每個比賽地點的進球數(進球資訊表goal:按比賽地點分組,對進球人員進行彙總count(player),要查出比賽資訊表game中全部比賽地點,是以是左聯結,game表是主表
查找出有波蘭球隊'POL'參加的比賽編号,比賽日期,對應這場比賽的進球數
比賽編号,比賽日期(在比賽資訊表game)和'GER'得分的進球數(進球資訊表goal:按比賽地點分組,對進球人員進行彙總count(player)
查找出所有比賽的日期,每場比賽中對戰雙方各自的進球數(也就是team1進球數,team2進球數),當比賽資訊表game中的球隊編号(team1)也出現在進球資訊表(goal)中時,表示這個球隊進球了,使用case語句來統計,要查出game表中的全部比賽日期,是以用左聯結,game表是主表