天天看點

MySQL表連接配接(内連接配接、交叉連接配接、外連接配接、聯合查詢)MySQL表連接配接(内連接配接、交叉連接配接、外連接配接、聯合查詢)

MySQL表連接配接(内連接配接、交叉連接配接、外連接配接、聯合查詢)

一、内連接配接(INNER JOIN)

   SELECT * FROM 表1 INNER JOIN 表2   ON   條件

   SELECT * FROM 表1 INNER JOIN 表2   WHERE  條件

   典型的聯接運算,使用像 =  或 <> 之類的比較運算符)。包括相等聯接和自然聯接。内聯接使用比較運算符根據每個表共有的列的值比對兩個表中的行。例如,檢索 students和courses表中學生辨別号相同的所有行。

    說明:組合兩個表中的記錄,傳回關聯字段相符的記錄,也就是傳回兩個表的交集部分

    不寫條件會造成查詢笛卡爾乘積

  三表連接配接

  SELECT S.studentName AS 姓名,SU.subjectName AS 課程,R.studentResult AS 成績

  FROM student AS S

  INNER JOIN `result` AS R ON  (S.`studentNo` = R.`studentNo`)

  INNER JOIN `subject` AS SU ON (SU.subjectNo=R.subjectNo);

二、交叉連接配接(CROSS JOIN)

1、 隐式交叉連接配接(沒有CROSS JOIN)

 SELECT * FROM 表1,表2

 結果為笛卡爾乘積

2、顯式交叉連接配接

 SELECT * FROM 表1 CROSS JOIN 表2  

 交叉聯接傳回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。

 如果寫條件ON / WHERE 結果和内連接配接一樣

三、外連接配接(LEFT JOIN、RIGHT JOIN、FULL JOIN)

   1、SELECT * FROM 表1 LEFT JOIN 表2   ON   條件

   左向外聯接的結果集包括  LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所比對的行。如果左表的某行在右表中沒有比對行,則在相關聯的結果集行中右表的所有選擇清單列均為空值。   

    2、SELECT * FROM 表1 RIGHT JOIN 表2   ON   條件

   右向外聯接是左向外聯接的反向聯接。将傳回右表的所有行。如果右表的某行在左表中沒有比對行,則将為左表傳回空值。

    3、SELECT * FROM 表1 FULL JOIN 表2   ON   條件

     完整外部聯接傳回左表和右表中的所有行。當某行在另一個表中沒有比對行時,則另一個表的選擇清單列包含空值。如果表之間有比對行,則整個結果集行包含基表的資料值。  

    FROM 子句中的表或視圖可通過内聯接或完整外部聯接按任意順序指定;但是,用左或右向外聯接指定表或視圖時,表或視圖的順序很重要。 

    三者的共同點是都傳回符合連接配接條件和查詢條件(即:内連接配接)的資料行。不同點如下:

左外連接配接還傳回左表中不符合連接配接條件單符合查詢條件的資料行。

右外連接配接還傳回右表中不符合連接配接條件單符合查詢條件的資料行。

全外連接配接還傳回左表中不符合連接配接條件單符合查詢條件的資料行,并且還傳回右表中不符合連接配接條件單符合查詢條件的資料行。全外連接配接實際是上左外連接配接和右外連接配接的數學合集(去掉重複),即“全外=左外 UNION 右外”。

說明:左表就是在“(LEFT  JOIN)”關鍵字左邊的表。右表當然就是右邊的了。

四、聯合查詢

    聯合連接配接(UNION JOIN):這是一種很少見的連接配接方式。Oracle、MySQL均不支援,其作用是:找出全外連接配接和内連接配接之間差異的所有行。這在資料分析中排錯中比較常用。也可以利用資料庫的集合操作來實作此功能。

   MySQL裡有聯合查詢(UNION)、主要用作去重。  

 select 語句1

 union 【all | distinct】

 select 語句2;

  此聯合查詢語句,預設會“自動消除重複行”,即預設是distinct 如果想要将所有資料都顯示(允許重複行),就使用all

注意:

1,兩個select語句的查詢結果的“字段數”必須一緻;

2,通常,也應該讓兩個查詢語句的字段類型具有一緻性;

3,也可以聯合更多的查詢結果;

 4,應該将這個聯合查詢的結果了解為最終也是一個“表格資料”,且預設使用第一個select語句中的字段名

 5,預設情況下,order by子句和limit子句隻能對整個聯合之後的結果進行排序和數量限定:select... union select... order by XXX limit m,n;

6,最後,來一個“應用”,實作“全外連接配接”:

select  * f rom  表1  left  join 表2 on  條件

union

select  * f rom  表1  right  join 表2  on  條件

原文位址https://blog.csdn.net/qq_42351920/article/details/81410925