mysql多表查询(一口气解决掉:自连接 左右连接 满连接等)
多表查詢,也稱為關(guān)聯(lián)查詢,指兩個或更多個表一起完成查詢操作。
前提條件:這些一起查詢的表之間是有關(guān)系的(一對一、一對多),它們之間一定是有關(guān)聯(lián)字段,這個關(guān)聯(lián)字段可能建立了外鍵,也可能沒有建立外鍵。比如:員工表和部門表,這兩個表依靠“部門編號”進行關(guān)聯(lián)。
一個錯誤
#案例:查詢員工的姓名及其部門名稱 SELECT last_name, department_name FROM employees, departments;這是多表查詢菜鳥經(jīng)常犯的錯誤和誤解的地方,如果employees有3條數(shù)據(jù),departements有3條數(shù)據(jù),最后查出來的是3*3的條數(shù)據(jù)
我們把上述多表查詢中出現(xiàn)的問題稱為:笛卡爾積的錯誤。
笛卡爾積的錯誤。
笛卡爾乘積是一個數(shù)學運算。假設(shè)我有兩個集合 X 和 Y,那么 X 和 Y 的笛卡爾積就是 X 和 Y 的所有可能組合,也就是第一個對象來自于 X,第二個對象來自于 Y 的所有可能。組合的個數(shù)即為兩個集合中元素個數(shù)的乘積數(shù)。
SQL92中,笛卡爾積也稱為交叉連接,英文是 CROSS JOIN。在 SQL99 中也是使用 CROSS JOIN表示交叉連接。它的作用就是可以把任意表進行連接,即使這兩張表不相關(guān)
?
?
?
?
?阿里開發(fā)規(guī)范:
【強制】對于數(shù)據(jù)庫中表記錄的查詢和變更,只要涉及多個表,都需要在列名前加表的別名(或表名)進行限定。
說明:對多表進行查詢記錄、更新記錄、刪除記錄時,如果對操作列沒有限定表的別名(或表名),并且操作列在多個表中存在時,就會拋異常。
正例:select t1.name from table_first as t1 , table_second as t2 where t1.id=t2.id;
反例:在某業(yè)務(wù)中,由于多表關(guān)聯(lián)查詢語句沒有加表的別名(或表名)的限制,正常運行兩年后,最近在 某個表中增加一個同名字段,在預(yù)發(fā)布環(huán)境做數(shù)據(jù)庫變更后,線上查詢語句出現(xiàn)出1052 異常:Column 'name' in field list is ambiguous。
?自連接?
 
當table1和table2本質(zhì)上是同一張表,只是用取別名的方式虛擬成兩張表以代表不同的意義。然后兩個表再進行內(nèi)連接,外連接等查詢。
查詢出last_name為 ‘Chen’ 的員工的 manager 的信息。 employees員工表中只有manager的idSELECT m.* FROM employees e,employees m WHERE e.manager_id=m.employee_id AND e.last_name="chen"?
?
?內(nèi)連接(INNER JOIN)的實現(xiàn)
?
?外連接(OUTER JOIN)的實現(xiàn)
?左外連接(LEFT OUTER JOIN)
?右外連接(RIGHT OUTER JOIN)
?. UNION的使用
?
?
?
?
#中圖:內(nèi)連接 A∩B SELECT employee_id,last_name,department_name FROM employees e JOIN departments d ON e.`department_id` = d.`department_id`; #左上圖:左外連接 SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id`; #右上圖:右外連接 SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`; #左中圖:A - A∩B SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL?
#右中圖:B-A∩B SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL?
#左下圖:滿外連接# 左中圖 + 右上圖 A∪B SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL UNION ALL ?#沒有去重操作,效率高 SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`; #右下圖#左中圖 + 右中圖 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B) SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL UNION ALL SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department?
?
?在正式開始講連接表的種類時,我們首先需要知道 SQL 存在不同版本的標準規(guī)范,因為不同規(guī)范下的表連接操作是有區(qū)別的。SQL 有兩個主要的標準,分別是 SQL92 和 SQL99。92 和 99 代表了標準提出的時間,SQL92 就是 92 年提出的標準規(guī)范。
當然除了 SQL92 和 SQL99 以外,還存在 SQL-86、SQL-89、SQL:2003、SQL:2008、SQL:2011 和 SQL:2016 等其他的標準。這么多標準,到底該學習哪個呢?
實際上最重要的 SQL 標準就是 SQL92 和 SQL99。一般來說 SQL92 的形式更簡單,但是寫的 SQL 語句會比較長,可讀性較差。
而 SQL99 相比于 SQL92 來說,語法更加復(fù)雜,但可讀性更強。我們從這兩個標準發(fā)布的頁數(shù)也能看出,SQL92 的標準有 500 頁,而 SQL99 標準超過了1000 頁。
實際上從 SQL99 之后,很少有人能掌握所有內(nèi)容,因為確實太多了。就好比我們使用Windows、Linux 和 Office 的時候,很少有人能掌握全部內(nèi)容一樣。我們只需要掌握一些核心的功能,滿足日常工作的需求即可
。SQL92 和 SQL99 是經(jīng)典的 SQL 標準,也分別叫做 SQL-2 和 SQL-3 標準。也正是在這兩個標準發(fā)布之后,SQL 影響力越來越大,甚至超越了數(shù)據(jù)庫領(lǐng)域。現(xiàn)如今 SQL 已經(jīng)不僅僅是數(shù)據(jù)庫領(lǐng)域的主流語言,還是信息
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的mysql多表查询(一口气解决掉:自连接 左右连接 满连接等)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 基于php网上书店存在问题及解决方案,基
- 下一篇: 网上书店系统mysql设计_数据库设计-
