天天看點

case when 子查詢_SQL 多表查詢

case when 子查詢_SQL 多表查詢

實際工作中,絕大部分查詢并非一個表可以解決,我們需要合并,連接配接表格。所有查詢都其實都是在簡單查詢的基礎上進行的。

一、表格的合并(縱向增加)

表格的合并或者說加法,是把兩個表格加在一起,這個操作增加的是行,也就是說表格會邊長。

假設有個兩個表如下

case when 子查詢_SQL 多表查詢

表 :course

case when 子查詢_SQL 多表查詢

表: course1

case when 子查詢_SQL 多表查詢

經過這個union 操作後,兩個表合在一起,可以看到是長度增加了,union操作預設是自動去重的,這個類似Python 裡的set 的union操作。如果要保留的話,union 後面要加上關鍵字 all。

case when 子查詢_SQL 多表查詢

這裡要強調一下,通常資料庫裡并不希望有重複資料,資料分析的清洗階段,如果沒有特殊要求,也是要去重的,重複的資料會影響資料的正确性和統一性。是以沒有一般的要求,union不用增加 all 關鍵字。

(二)表格的連接配接(橫向增加)

每個表格都代表一定的關系,如果要把這些關系關聯起來,就需要做表格的連接配接操作(join),join和union 不同,union後的表格列是不變的,增加的是記錄。join操作,row 不會增加,還可能因為條件而減少,但是新的表格代表了另外一個關系,表格會變寬,新增加的列代表了原有關系基礎上增加或者新發現的關系。在資料庫中,表的關聯比表格的增加用的更多,能夠表達和實作的功能也更多。

連接配接方式:

交叉連接配接,左連接配接,右連接配接,内連接配接

交叉連接配接

即笛卡爾積,又叫全連接配接,A表的每一列都和B 表的每一列連接配接。形成的表格長度是A的行數*B的行數。表格大的時候,謹慎使用,表格會變得非常大,備援資料會非常多。全連接配接不需要where條件

内連接配接

: 連接配接兩個表格的共有部分相關的記錄。

左連接配接

:A 左連接配接B,新表中是所有A的記錄和B表中與A表有共同資料的記錄

右連接配接

:A 右連接配接B,新表中是所有B的記錄和A表中與B表有共同資料的記錄

表的連接配接使用join,join 後面用ON 連接配接,表明兩個表通過哪些列産生比對關系,而不是where。 JOIN 語句需要使用别名友善操作。

舉例如下:

外連接配接:

case when 子查詢_SQL 多表查詢

全連接配接

從上圖可以看到,全連接配接表格會很大,而且實際生活中沒有太大的意義,是以用的并不多。

下面針對以下兩個表做一下左連接配接和右連接配接操作

case when 子查詢_SQL 多表查詢

score

case when 子查詢_SQL 多表查詢

course1

左連接配接

case when 子查詢_SQL 多表查詢

右連接配接

case when 子查詢_SQL 多表查詢

可以從學号這列資料的順序看出來SQL操作實際是不同的

内連接配接

case when 子查詢_SQL 多表查詢

從結果可以看出來,1 左連接配接和右連接配接會分别保留左邊或者右邊的表格,有空值項也不會影響操作,被連接配接進來的表格根據連接配接條件,滿足的被加進來。2 内連接配接是左側和右側同時隻保留符合條件的記錄,不符合條件的記錄就不再加進來了。

左連接配接和右連接配接的作用是,可以對集合做減法或者指定要保留某個表的全部資料,,這個在實際中會用到,其他時候都是内連接配接。

現在可以根據以上做一個查詢,成績表和學生表中找到學生的總成績和選課數目

成績表和學生表分别如下

case when 子查詢_SQL 多表查詢
case when 子查詢_SQL 多表查詢

計算過程和結果如下

case when 子查詢_SQL 多表查詢

或者查詢平均成績大于85分的學生

case when 子查詢_SQL 多表查詢

查詢學号,姓名,課程号,課程名稱

因為表結構的關系,需要三個表才能找到所有資料,學生選課資訊在成績表裡,課程名稱在課程表裡。用where或者join 都可以,需要注意,where 語句是把連接配接的兩個表寫在一起,而join不行,要join一個,寫好條件後 ,再join 另外一個。具體操作如圖所示

case when 子查詢_SQL 多表查詢
case when 子查詢_SQL 多表查詢

(三) case語句

分類計算表達式,基本結構

case when 判斷 then 表達式

when 判斷 then 表達式

。。。。。

when 判斷 then 表達式

else

end

case中滿足條件後,後面的語句就不執行了。需要注意的是,else可以不寫,但是不建議這麼做。End 不能省,表示語句結束。Case表達式可以寫在任意語句中。下面這個例子中,case 語句分别對成績做判斷,然後生成一個新的列,然後同時對這個新生成的列做了求和操作,可見case 語句可是生成新的列,并且可以放在sql 的很多地方。此外,因為select 中隻能是group by裡的名稱,加上需要顯示課程名稱,是以group by需要加上課程名稱,groupby 後面加的列要求對結果沒影響,否則不能加上,這個比較好了解,分組的資料不能影響SQL的結果。

舉例如下: 學生成績分段統計,

case when 子查詢_SQL 多表查詢

繼續閱讀