mysql 多表查詢,內連接、外連接( left join、right join、full join)union與union all


學生表數據

 班級表數據

 部門表數據

內連接 合並具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行

1. 交叉連接查詢(基本不會使用-得到的是兩個表的乘積) (這種查詢時候會產生笛卡爾積)

多表查詢會產生笛卡爾積:

假設集合a={b,c},集合b={0,1,2},則兩個集合的笛卡爾積為{(b,0),(b,1),(b,2),(c,0),(c,1),(c,2)}

實際運行環境線下,應避免使用權笛卡爾積

解決方案:在where加入有效的條件-->等值連接(等值連接找的是列的值一樣的數據,跟列名稱和列類型無關

語法: 

  1.1  select * from A,B;

       1.2 select * from A cross join B;

  1.3 select * from A natural join B;(自然連接,底層先笛卡爾積,然后按照所有同名同值列自動進行等值篩選。)

2. 內連接查詢(使用的關鍵字 inner join )
隱式內連接: select * from A,B where 條件;
顯示內連接: select * from A inner join B on 條件;后面接 兩張表中中需要關聯的字段 (字段名稱不需要一樣 A.id = B.id )

      select * from A inner join B using 條件;using 后面接 兩張表中都存在的字段 (字段名稱 一樣)

外連接 

外連接: 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 ,這種連接稱為左(或右) 外連接。沒有匹配的行時, 結果表中相應的列為空(NULL). 外連接的 WHERE 子句條件類似於內部連接, 但連接條件中沒有匹配行的表的列后面要加外連接運算符, 即用圓括號括起來的加號(+).

左連接LEFT JOIN的含義就是求兩個表的交集外加左表剩下的數據。依舊從笛卡爾積的角度講,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄

右連接RIGHT JOIN就是求兩個表的交集外加右表剩下的數據。再次從笛卡爾積的角度描述,右連接就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上右表中剩余的記錄

全連接,MySQL目前不支持此種方式。

union   操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重復的數據。過濾重復,即重復的數據不顯示。同時必須保證 兩個表的列數要相同,列的類型要一致。

union all 用於將不同表中相同列中查詢的數據展示出來;(包括重復數據)。同時必須保證 兩個表的列數要相同,列的類型要一致。

內連接 交叉連接例子

 

內連接 隱式內連接 等值連接(等值連接找的是列的值一樣的數據,跟列名稱和列類型無關

 

  內連接 自然連接(自然連接,底層先笛卡爾積,然后按照所有同名同值列自動進行等值篩選。)

  內連接 顯示內連接

 

 

 

 

 

 

左外連接(先把dept表的did=3的列的值改為30,讓學生表did=3的部門在部門表里不存在)右連接同理。

 左外連接的含義:兩個表的交集外加左表剩下的數據。依舊從笛卡爾積的角度講,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄

 union 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重復的數據。過濾重復,即重復的數據不顯示。同時必須保證 兩個表的列數要相同,列的類型要一致

 

 

 union all 用於將不同表中相同列中查詢的數據展示出來;(包括重復數據)。同時必須保證 兩個表的列數要相同,列的類型要一致。

 

 

  group by分組函數 在mysql中沒有強調select指定的字段必須屬於group by后的條件。若符合條件的字段有多個,則只顯示第一次出現的字段。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM