天天看點

MySQL學習筆記(8)--連接配接查詢·概念·交叉連接配接·内連接配接·外連接配接·自然連接配接

·概念

将多張表連在一起查詢(會導緻記錄數行和字段數列發生改變)

意義:

在關系型資料庫設計過程中,實體與實體之間是存在很多聯系的。

在關系型資料庫表的設計過程中,遵循着關系來設計:一對一,一對多,多對多。通常在實際操作中,需要利用這層關系來保證資料的完整性。

·交叉連接配接

将兩張表的資料與另外一張表彼此交叉(笛卡爾積)

表1 cross join 表2
--執行個體
select * from my_student cross join my_teacher;
           

笛卡爾積沒有意義,應該盡量避免,存在的意義是保證這種結構的完整性。

·内連接配接

[inner] join,從左表中取出每一條記錄,去右表中與所有的記錄進行比對:比對必須是某個條件在左表中與右表中相同最終才會保留結果,否則不保留。

表1 [inner] join 表2 on 比對條件
--執行個體
select * from my_student inner join my_class;  --不給定條件結果仍然是笛卡爾積
select * from my_student inner join my_class on class_id = id;
           

在查詢資料的時候,不同表可能會有同名字段,這個時候需要加上表名才能區分

而表名太長時,通常可以使用别名。

注:

  1. 内連接配接連接配接比對的時候必須比對到才會儲存(不比對的記錄直接丢掉)
  2. 内連接配接還可以使用where代替on關鍵字(where是在交叉連接配接之後再篩選,是以建議用on)
  3. 内連接配接通常是在對資料有精确要求的地方使用:必須保證兩種表中都能進行資料比對

·外連接配接

outer join,按照某一張表作為主表(表中所有記錄在最後都被被保留),取出裡面的所有記錄,然後每條與另外一張表(從表)進行連接配接:不管能不能比對上條件,最終都會保留:能比對,正確定留;不能比對,從表的字段都置空NULL。

外連接配接分為兩種:

  1. Left join:左外連接配接(左連接配接),以左表為主表
  2. Right join:右外連接配接(右連接配接),以右表為主表

    左連接配接對應的主表資料在左邊,右連接配接對應的主表資料在右邊。

左連接配接:主表 left join 從表 on 連接配接條件
右連接配接:從表 right join 主表 on 連接配接條件
--執行個體
select * from my_student s left join my_class t on s.class_id = t.id;
--class 表裡隻有1班和2班
           
MySQL學習筆記(8)--連接配接查詢·概念·交叉連接配接·内連接配接·外連接配接·自然連接配接

注:非常常用的一種擷取資料的方式,作為資料擷取對應主表以及其他關聯資料

·自然連接配接

自然連接配接:natural join,自然連接配接,就是自動比對連接配接條件:系統以字段名字作為比對模式(同名字段就作為條件,多個同名字段都作為條件)。

1.自然内連接配接

表1 natural join 表2
--執行個體
alter table my_student change class_id id int after stu_name;
select * from my_student natural join my_class;
           
MySQL學習筆記(8)--連接配接查詢·概念·交叉連接配接·内連接配接·外連接配接·自然連接配接

2.自然外連接配接

左表 natural  left/right join 右表
--執行個體
select * from my_student natural left join my_class;
           
MySQL學習筆記(8)--連接配接查詢·概念·交叉連接配接·内連接配接·外連接配接·自然連接配接

·using 關鍵字

在連接配接查詢中用來代替on關鍵字的,進行條件比對。

原理:

  1. 在使用連接配接查詢時使用on的地方用using代替
  2. 使用using的前提是對應的兩張表連接配接的字段是同名(類似自然連接配接自動比對)
  3. 如果使用using關鍵字,那麼對應的同名字段,最終在結果中隻會保留一個
表1 [inner, left, right] join 表2 using (同名字段清單)
--執行個體
select * from my_student left join my_class using (id)  --結果同上
           

通常不會用到因為設計表的時候不會出現同名字段