日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql多表查询(一口气解决掉:自连接 左右连接 满连接等)

發(fā)布時間:2023/12/14 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql多表查询(一口气解决掉:自连接 左右连接 满连接等) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

多表查詢,也稱為關(guān)聯(lián)查詢,指兩個或更多個表一起完成查詢操作。

前提條件:這些一起查詢的表之間是有關(guān)系的(一對一、一對多),它們之間一定是有關(guān)聯(lián)字段,這個關(guān)聯(lián)字段可能建立了外鍵,也可能沒有建立外鍵。比如:員工表和部門表,這兩個表依靠“部門編號”進(jì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ù)學(xué)運算。假設(shè)我有兩個集合 X 和 Y,那么 X 和 Y 的笛卡爾積就是 X 和 Y 的所有可能組合,也就是第一個對象來自于 X,第二個對象來自于 Y 的所有可能。組合的個數(shù)即為兩個集合中元素個數(shù)的乘積數(shù)。

SQL92中,笛卡爾積也稱為交叉連接,英文是 CROSS JOIN。在 SQL99 中也是使用 CROSS JOIN表示交叉連接。它的作用就是可以把任意表進(jìn)行連接,即使這兩張表不相關(guān)

?

?

?

?

?阿里開發(fā)規(guī)范:

【強(qiáng)制】對于數(shù)據(jù)庫中表記錄的查詢和變更,只要涉及多個表,都需要在列名前加表的別名(或表名)進(jìn)行限定。

說明:對多表進(jìn)行查詢記錄、更新記錄、刪除記錄時,如果對操作列沒有限定表的別名(或表名),并且操作列在多個表中存在時,就會拋異常。

正例: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。



?自連接?

當(dāng)table1和table2本質(zhì)上是同一張表,只是用取別名的方式虛擬成兩張表以代表不同的意義。然后兩個表再進(jìn)行內(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 存在不同版本的標(biāo)準(zhǔn)規(guī)范,因為不同規(guī)范下的表連接操作是有區(qū)別的。SQL 有兩個主要的標(biāo)準(zhǔn),分別是 SQL92 和 SQL99。92 和 99 代表了標(biāo)準(zhǔn)提出的時間,SQL92 就是 92 年提出的標(biāo)準(zhǔn)規(guī)范。

當(dāng)然除了 SQL92 和 SQL99 以外,還存在 SQL-86、SQL-89、SQL:2003、SQL:2008、SQL:2011 和 SQL:2016 等其他的標(biāo)準(zhǔn)。這么多標(biāo)準(zhǔn),到底該學(xué)習(xí)哪個呢?

實際上最重要的 SQL 標(biāo)準(zhǔn)就是 SQL92 和 SQL99。一般來說 SQL92 的形式更簡單,但是寫的 SQL 語句會比較長,可讀性較差。

而 SQL99 相比于 SQL92 來說,語法更加復(fù)雜,但可讀性更強(qiáng)。我們從這兩個標(biāo)準(zhǔn)發(fā)布的頁數(shù)也能看出,SQL92 的標(biāo)準(zhǔn)有 500 頁,而 SQL99 標(biāo)準(zhǔn)超過了1000 頁。

實際上從 SQL99 之后,很少有人能掌握所有內(nèi)容,因為確實太多了。就好比我們使用Windows、Linux 和 Office 的時候,很少有人能掌握全部內(nèi)容一樣。我們只需要掌握一些核心的功能,滿足日常工作的需求即可

。SQL92 和 SQL99 是經(jīng)典的 SQL 標(biāo)準(zhǔn),也分別叫做 SQL-2 和 SQL-3 標(biāo)準(zhǔn)。也正是在這兩個標(biāo)準(zhǔn)發(fā)布之后,SQL 影響力越來越大,甚至超越了數(shù)據(jù)庫領(lǐng)域。現(xiàn)如今 SQL 已經(jīng)不僅僅是數(shù)據(jù)庫領(lǐng)域的主流語言,還是信息

?

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的mysql多表查询(一口气解决掉:自连接 左右连接 满连接等)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。