學生表數據
班級表數據
部門表數據
內連接 合並具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行
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后的條件。若符合條件的字段有多個,則只顯示第一次出現的字段。