mysql多表查詢注意事項 MySQL的多表查詢

2021-10-17 20:35:39 字數 3019 閱讀 7419

一、表的加法

例如:將course和course1兩張表合併

兩張表的資料分別如圖所示:course表的資料course1表的資料

用union合併兩張表:course+course1(去重)

用union all合併兩張表course+course1(不去重)

注意:字段順序應保持一致。

二,多表聯結

聯結就是以各表的公共列(關係列)為基礎,把所有表合併為一張表。

聯結方式具體分為以下五種:交叉聯結(cross join)

內聯結(inner join)

左聯結(left join)

右聯結(right join)

全聯結(full join)

1、交叉聯結(cross join)

交叉聯結(又稱笛卡爾積)是將表1的每一行與表2的每一行都進行合併。

聯結後的行數是表1行數與表2行數的乘積。交叉聯結

交叉聯結日常工作用得較少,因為聯結後行數較多,查詢效率低。

交叉聯結是其他聯結方式的基礎。

2、內聯結(inner join)

內聯結是只保留兩張表的公共列都有的資料,然後以交叉聯結的方式進行合併。內聯結內聯結的執行邏輯

第一步,先取出兩張表的公共列都有的資料,案例中的公共列【學號】只有『0001』是兩表都有的。

第二步,將兩表取出的資料進行交叉聯結,得到最終效果。

內聯結的sql語句:

用關鍵字on指定各表的公共列

-- 內聯結selelct ,...

from 表1 inner join 表2

on =

3、左聯結(left join)

左聯結是僅保留公共列左表的資料,然後以交叉聯結的方式進行合併。左聯結左聯結的執行邏輯

第一步,先取出左表的資料,右表則取兩張表的公共列都有的資料,案例中的公共列【學號】只有『0001』是兩表都有的。

第二步,將兩表取出的資料進行交叉聯結,得到最終效果。因為右表不存在學號『0002』的資料,所有結果中『0002』的其他資料是空值。

-- 左聯結selelct ,...

from 表1 left join 表2

on =

4、右聯結(right join)

右聯結是僅保留公共列右表的資料,然後以交叉聯結的方式進行合併。右聯結右聯結的執行邏輯

第一步,先取出右表都有的資料,左表則取兩張表的公共列都有的資料,案例中的公共列【學號】只有『0001』是兩表都有的。

第二步,將兩表取出的資料進行交叉聯結,得到最終效果。因為左表不存在學號『0005』的資料,所有結果中除了『0005』對應的課程號『0003』,其他資料是空值。

-- 右聯結selelct ,...

from 表1 right join 表2

on =

5、全聯結(full join)

全聯結是保留兩張表的資料,然後以交叉聯結的方式進行合併。全聯結全聯結的執行邏輯

第一步,先將兩邊的資料都各自取出。

第二步,將兩表取出的資料進行合併,得到最終效果。

注意:mysql不支援全聯結,僅作為了解概念。但可通過union合併左聯結和右聯結,達到全聯結的效果。

-- 全聯結selelct ,...

from 表1 full join 表2

on =

sql聯結方式的總結:

如何選擇使用哪種聯結方式?

要生成固定行數的表單,或者保留某張表的全部資料時,選擇左聯結或者右聯結;其他情況,用內聯結獲取各表的公共部分

三、案例分析

例1:查詢所有學生的學號、姓名、選課數、總成績

第一步:翻譯成大白話

學號和姓名可從student表查詢,但選課數和總成績只能從score表查詢,所以這個問題涉及兩張表,需要使用聯結。

第二步:寫出分析思路

關鍵點1:如何聯結?

學號是兩張表的公共列(關係列),所以選擇學號。

關鍵點2:用哪種聯結?

題目要求保留每個學生的資料,因此選左聯結。

第三步:寫出對應的sql語句

因為select語句中有聚合函式,所以需要group by進行分組,最終結果如下所示:

四、case表示式

case表示式的作用是進行條件判斷,相當於excel的if函式。

語句中when後面的是需要判斷的條件,then後面的是符合該條件後輸出的值,不符合條件的,進入下乙個判斷條件······如果不符合全部條件,則輸出else指定的值。

例1:將score表中成績大於等於60的,標為『及格』;小於60的,標為『不及格』

select 學號,課程號,成績,

(case when 成績 >= 60 then '及格'

when 成績 < 60 then '不及格'

else null

end) as 是否及格

from score;

sql先選擇score表中【成績】的第一行資料,因為80符合第一條的條件判斷,所以標為『及格』,暫時結束判斷;

然後選擇第二行資料,50不符合第一條的條件判斷,進入下一條,符合第二條的條件判斷,標為『不及格』,暫時結束判斷;

如此迴圈,直到【成績】每行的資料都被判斷完畢。

例2:查詢出每門課程的及格人數和不及格人數

先查詢每門課程的人數

由於要將人數分為及格和不及格的,可以用case表示式進行分類統計,即用case表示式替換上圖紅框中的語句。

因為要彙總及格和不及格人數,所以需要在case表示式前加sum函式進行求和。sum + case 的執行邏輯

第一步:資料分組,先根據課程號進行分組

第二步:應用函式,先執行case表示式,後執行sum函式。case表示式依次對每個成績進行判斷,將成績大於等於60的,標為『1』,其他的標為『0』;然後sum函式對各分組進行求和,得到每個分組的及格人數。

case表示式的注意事項:else子句可以省略,預設為空值,建議寫上

end是必要的,不能省略

case表示式不僅可寫在select字句,還可寫在其他任意字句中

什麼時候使用case表示式?

需要進行條件判斷的時候

五、sqlzoo練習題

MyBatis多表關係查詢時的注意事項

property 類中的屬性名 column 表中的欄位名稱 sql語句查詢出來的字段的名稱 如果沒有起別名那麼預設的就是資料庫中表的別名 如果起別名那麼就要用別名 坑點 資料庫 注意看外來鍵關係 position表 user表 select p.u.id,u.username,u.password...

多表查詢之join關聯關係注意事項

今天在三表查詢時遇到乙個問題,引發了我的乙個總結 inner join,left join,right join 比如有三個a,b,c表,其中c表的a,b表的關係表,a,b 沒有相同字段,這樣關聯查詢的時候,只能將關係表c表作為主表查詢比如 其中role user 是中間關係表,user表和role...

模糊查詢 注意事項

1.動態查詢語句 2.sql中佔位符不能在單引號中,否則,會以?進行查詢資料 3.sql中不能使用加號進行字串拼接,加號是用來做運算的 d 4.mybatis進行拼串,拼串會出現 sql 注入情況 例如 or 1 1 5.使用內建方法進行拼串 concat 6.查詢條件值本身為 查詢出所有的資料 c...