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

歡迎訪問 生活随笔!

生活随笔

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

数据库

Mysql 多表查询详解

發(fā)布時間:2023/12/14 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql 多表查询详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Mysql 多表查詢詳解

一.前言?

二.示例

三.注意事項

一.前言?

上篇講到Mysql中關(guān)鍵字執(zhí)行的順序,只涉及了一張表;實際應(yīng)用大部分情況下,查詢語句都會涉及到多張表格 :

1.1?多表連接有哪些分類?

1.2?針對這些分類有哪些連接方法?

1.3?這些連接方法分別作用于哪些應(yīng)用場景?

這篇針對這三個點通過實例來講述,目的是窮盡所有的場景和所有的方法,并且對每個方法的使用做實例。

首先先列舉本篇用到的分類(內(nèi)連接,外連接,交叉連接)和連接方法(如下):

A)內(nèi)連接join,inner join

B)外連接left join,left outer join,right join,right outer join,union

C)交叉連接cross join


二.下面以實例進行分析

兩張假設(shè)有兩張表格A和B,把表格當(dāng)作一個集合,那么表格中的記錄就是集合中的一個元素。

兩張表格如下:

TableA:TableB:

2.1?內(nèi)連接(只有一種場景)

inner join 或者join(等同于inner join)

select a.*, b.* from tablea a inner join tableb b on a.id = b.id

select a.*, b.* from tablea a join tableb b on a.id = b.id

結(jié)果如下:

應(yīng)用場景:

這種場景下得到的是滿足某一條件的A,B內(nèi)部的數(shù)據(jù);正因為得到的是內(nèi)部共有數(shù)據(jù),所以連接方式稱為內(nèi)連接。

2.2?外連接(六種場景)

2.2.1?left join 或者left outer join(等同于left join)

select a.*, b.* from tablea a left join tableb b on a.id = b.id

或者

select a.*, b.* from tablea a left outer join tableb b on a.id = b.id

結(jié)果如下,TableB中更不存在的記錄填充Null:


應(yīng)用場景:


這種場景下得到的是A的所有數(shù)據(jù),和滿足某一條件的B的數(shù)據(jù);

2.2.2 ?[left ? join 或者left outer join(等同于left join)] ?+ ?[where B.column is null]

select a.id aid,a.age,b.id bid,b.name from tablea a left join tableb b on a.id = b.id Where b.id is null

結(jié)果如下:


應(yīng)用場景:

這種場景下得到的是A中的所有數(shù)據(jù)減去"與B滿足同一條件 的數(shù)據(jù)",然后得到的A剩余數(shù)據(jù);

2.2.3 ?right join 或者fight outer join(等同于right join)

select a.id aid,a.age,b.id bid,b.name from tablea a right join tableb b on a.id = b.id 結(jié)果如下,TableB中更不存在的記錄填充Null:

應(yīng)用場景:


這種場景下得到的是B的所有數(shù)據(jù),和滿足某一條件的A的數(shù)據(jù);

2.2.4 [left ? join 或者left outer join(等同于left join)] ?+ ?[where A.column is null]

select a.id aid,a.age,b.id bid,b.name from tablea a right join tableb b on a.id = b.id where a.id is null 結(jié)果如下:


應(yīng)用場景:


這種場景下得到的是B中的所有數(shù)據(jù)減去 "與A滿足同一條件 的數(shù)據(jù)“,然后得到的B剩余數(shù)據(jù);

2.2.5 full join (mysql不支持,但是可以用 left join ?union right join代替)

select a.id aid,a.age,b.id bid,b.name from tablea a left join tableb b on a.id = b.id union select a.id aid,a.age,b.id bid,b.name from tablea a right join tableb b on a.id = b.id union過后,重復(fù)的記錄會合并(id為2,3,4的三條記錄),所以結(jié)果如下:

應(yīng)用場景:



這種場景下得到的是滿足某一條件的公共記錄,和獨有的記錄

2.2.6 full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+isnull代替)

select a.id aid,a.age,b.id bid,b.name from tablea a left join tableb b on a.id = b.id where b.id is null union select a.id aid,a.age,b.id bid,b.name from tablea a right join tableb b on a.id = b.id where a.id is null 結(jié)果如下:


應(yīng)用場景:


這種場景下得到的是A,B中不滿足某一條件的記錄之和

注:上面共有其中七(2^3-1)種應(yīng)用場景,還有一種是全空白,那就是什么都不查,七種情形包含了實際應(yīng)用所有可能的場景

2.3 交叉連接 (cross join)

2.3.1 實際應(yīng)用中還有這樣一種情形,想得到A,B記錄的排列組合,即笛卡兒積,這個就不好用集合和元素來表示了。需要用到cross join:

select a.id aid,a.age,b.id bid,b.name from tablea a cross join tableb b


2.3.2 還可以為cross ?join指定條件 (where):

select a.id aid,a.age,b.id bid,b.name from tablea a cross join tableb b where a.id = b.id 結(jié)果如下;

注:這種情況下實際上實現(xiàn)了內(nèi)連接的效果

三 注意事項

上面仍然存在遺漏,那就是mysql對sql語句的容錯問題,即在sql語句不完全符合書寫建議的情況,mysql會允許這種情況,盡可能地解釋它:

3.1?一般cross join后面加上where條件,但是用cross join+on也是被解釋為cross join+where;

3.2?一般內(nèi)連接都需要加上on限定條件,如上面場景2.1;如果不加會被解釋為交叉連接;

3.3?如果連接表格使用的是逗號,會被解釋為交叉連接;

注:sql標(biāo)準(zhǔn)中還有union join和natural ?inner join,mysql不支持,而且本身也沒有多大意義,其結(jié)果可以用上面的幾種連接方式得到

總結(jié):總結(jié)了mysql所有連接方法,其中有一些是之前沒有注意到的問題,平時開發(fā)也都不外乎這些。

PS-1: 鑒于之前排版不夠美觀,現(xiàn)本文已重新整理,以便更好為大家學(xué)習(xí)交流

總結(jié)

以上是生活随笔為你收集整理的Mysql 多表查询详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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