sql 縱向求和 SQL 多表查詢

2021-10-14 08:31:38 字數 2740 閱讀 6217

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

一、**的合併(縱向增加)

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

假設有個兩個表如下

表 :course

表: course1

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

這裡要強調一下,通常資料庫裡並不希望有重複資料,資料分析的清洗階段,如果沒有特殊要求,也是要去重的,重複的資料會影響資料的正確性和統一性。所以沒有一般的要求,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 語句需要使用別名方便操作。

舉例如下:

外連線:

全連線

從上圖可以看到,全連線**會很大,而且實際生活中沒有太大的意義,所以用的並不多。

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

左連線

右連線可以從學號這列資料的順序看出來sql操作實際是不同的

內連線

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

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

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

成績表和學生表分別如下

計算過程和結果如下

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

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

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

(三) case語句

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

case when 判斷 then 表示式

when 判斷 then 表示式

when 判斷 then 表示式

else

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

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

多表sql查詢求和

昨天由於需要統計某一時間段內的資料,需要兩張關聯表的資料和,表a的sql查詢結果 select count from 表a a where a.task type 2 and a.create time to date 2017 01 30 yyyy mm dd and a.create time ...

sql 縱向求和 乙個求和的sql語句 sum

表描述 表名 sum test id name count type 1 a 12 1 2 b 12 1 3 c 12 1 4 d 12 1 5 b 12 2 6 b 12 1 7 a 12 2 8 a 12 1 9 c 12 1 10 b 12 1 結果 type 1 84 type 2 36 求...

SQL 多表查詢

不同的 sql join inner join 內連線 如果表中至少有乙個匹配,也從左表返回所有的行 left join 左連線 即使右表中沒有匹配,也從右表返回所有的行 right join 右連線 即使左表中沒有匹配,也從右表返回所有的行 full join 全連線 只有其中乙個表中存在匹配也從...