天天看點

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

多表連接配接的基本概念

  • 從連接配接方向上看,有橫向連接配接和縱向連接配接,其中橫向連接配接又分為左連接配接、内連接配接、右連接配接(MySQL隻支援這三種連接配接方式)
  • 左連接配接和右連接配接的功能一緻,隻需要将表的順序調換,是以常用的是左連接配接和内連接配接
  • 左連接配接語句:left join,内連接配接語句:inner join (inner可以省略)
  • 左連接配接會擷取左表的所有記錄,右表對應的資料進行拼接,沒有對應的資料傳回空值
  • 内連接配接擷取兩表共有的記錄,其他的記錄不被輸出
  • 縱向連接配接分為去重和不去重,去重是union,不去重是 union all
  • 在橫向連接配接中,對應關系分為一對一連接配接、一對多連接配接、多對多連接配接,連接配接字段無重複即為一,連接配接字段有重複即為多,常用的對應關系是一對多連接配接
  • 在一對多連接配接中,一表的資料會進行複制,比對多表的資料
  • 如果是多對多連接配接,左表及右表的資料都會複制,最後導緻查詢結果出現重複

多表連接配接示範

有學生表stu,字段分别是學生編号s_id,學生姓名s_name,出生日期s_age,性别s_sex

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

有成績表sc,字段分别是學生編号s_id,課程編号c_id,成績score

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

有課程表co,字段分别是課程編号c_id,課程名稱c_name,教師編号t_id

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

将學生表和成績表連接配接

兩表的連接配接字段是s_id,學生表的s_id不重複,成績表的s_id有重複,是一對多連接配接,這時一表的資料會複制。學生表有編号為08的記錄,成績表沒有08的記錄,如果選擇用内連接配接(兩表共有的資訊)會導緻08的記錄不被輸出;如果用學生表左連(擷取左表所有資訊,右表對應資料進行拼接,如果沒有傳回空值)成績表,保證資訊不丢失。

選擇哪種連接配接方式,要看資料和查詢要求,具體情況具體決定。

學生表内連接配接成績表,on後面跟連接配接條件,可以使一個條件也可以是多個條件

select 
           

結果如下,傳回18條記錄,08号同學的資訊沒有輸出

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

用學生表左連成績表

select 
           

結果如下,傳回19條記錄,08号同學的資訊被輸出,但對應的成績資訊為null

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

将學生表、成績表、課程表三表連接配接

為了保證資訊不丢失,用學生表左連成績表,再左連課程表,成績表和課程表的連結字段是c_id。代碼很簡單,直接添加left join

select 
           

結果如下,傳回19條記錄

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

将成績表與成績表做橫向拼接

因為成績表的s_id是重複的,是多對多連接配接,多對多連接配接兩表資料都會複制,導緻結果是有重複的

select 
           

結果如下,左表的s_id為01的有3條記錄,右表s_id為01的也有三條記錄,最後傳回3*3=9條01的記錄,其他類推,結果為48條

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

将學生表與學生表縱向拼接

去重用union

  • 縱向拼接前後都是查詢語句,将查詢結果縱向拼接再一起,要保證上下兩個表的列數一樣,如果不一樣會報錯,并且以上表的字段名稱為查詢結果的字段名稱
select 
           

不去重用union all

select 
           

查詢所有同學的學生編号、學生姓名、選課總數、所有課程的總成績

在寫字段時,如果是兩表共有的字段,要表明字段來自哪個表,否則會報錯說字段重複,比如stu.s_id,是來自學生表的學生标号

将學生表和成績表連接配接,針對s_id分組

select 
           

結果如下:

detachedcriteria查詢去重_MySQL查詢語句:多表連接配接的使用

查詢課程編号為01且課程成績在80分以上的學生的學号和姓名

select  
           

查詢兩門及其以上不及格課程的同學的學号,姓名及其平均成績

select 
           

group by語句的用法:https://zhuanlan.zhihu.com/p/106767752

having語句的用法:https://zhuanlan.zhihu.com/p/107495600

子查詢的用法:https://zhuanlan.zhihu.com/p/138058160

繼續閱讀