一、表的加法(Union)
1、用法:將兩個表合并成一個表

2、語句:
select 查詢結果
from 從哪張表查詢
union
select 查詢結果
from 從哪張表查詢
*需保留重復行*
select 查詢結果
from 從哪張表查詢
union all
select 查詢結果
from 從哪張表查詢
練習:
將課程表及課程表1合并在一起
課程表1:

課程表2:

合并結果:
1)不保留重復行

2)保留重復行

二、表的聯結
聯結:表和表之間是通過列產生關系,聯結就是通過表和表之間關系將兩個表合并在一起的操作。
表的聯結分為:交叉聯結(cross join)、內聯結(inner join)、左聯結(left join)、右聯結(right join)、全聯結(full join);內聯結、左聯結、右聯結這3種是較常用的聯結方法。
1、交叉聯結(cross join)
將表的每一行與另一個表的每一行聯結在一起,行數是兩個表行數的乘積;不常用,結果行數太多。
2、內聯結(inner join)
查找出同時存在于兩張表的數據。
語句:
select....
from 表1 as a
inner join 表2 as b
on a.列名=b.列名;

3、左聯結(left join)
將左側的表作為主表,主表中的數據全部讀取出來,右邊的表只選取與主表有相同列的表。
語句:
select....
from 表1 as a
left join 表2 as b
on a.列名=b.列名;

*在左聯結基礎上去掉兩表共同的部分*
select....
from 表1 as a
left join 表2 as b
on a.列名=b.列名
where b.列名 is null;

4、右聯結(right join)
將右表作為主表,主表中的數據全部讀取出來,左邊的表只選取與主表有相同列的表。
語句:
select....
from 表1 as a
right join 表2 as b
on a.列名=b.列名;

*在右聯結基礎上去掉兩表共同的部分*
select....
from 表1 as a
right join 表2 as b
on a.列名=b.列名
where b.列名 is null;

5、全聯結(full join)
返回左表和右表中所有的行,當某行與另一表中有匹配的行,兩行會進行合并,當某行與另一表中無匹配行,另一表對應的行會填充成空值;mysql不支持全聯結。

練習:
1、用內聯結將學生和成績表合并在一起

2、用左聯結將學生和成績表合并在一起

*在左聯結基礎上去掉兩表共同的部分*

3、用右聯結將學生和成績表合并在一起

*在右聯結基礎上去掉兩表共同的部分*

三、聯結應用案例
1、查詢所有學生的學號、姓名、選課數、總成績

2、查詢平均成績大于85的所有學生的學號、姓名和平均成績

3、查詢學生的選課情況:學號、姓名、課程號、課程名稱

四、case表達式
使用case表達式可以幫助處理復雜的查詢問題,相當于一個條件判斷的函數,判斷每一行是不是滿足某一條件。

1、注意事項:
1)else可以省略不寫,默認為else為空值,最好不省略;
2)end不可以省略。
2、如何使用
當有多種情況需要條件判斷時使用,可以用于sql語句的任意語句中。
練習:
1、查詢出每門課程的及格人數和不及格人數

2、使用分段[100-85]、[85-70]、[70-60]、[<60]來統計各科成績,分別統計各分數段人數:課程ID和課程名稱

五、sqlzoo練習
JOIN











