Mysql 多表查询详解
Mysql 多表查詢詳解
一.前言?
二.示例
三.注意事項
一.前言?
上篇講到Mysql中關鍵字執(zhí)行的順序,只涉及了一張表;實際應用大部分情況下,查詢語句都會涉及到多張表格 :
1.1?多表連接有哪些分類?
1.2?針對這些分類有哪些連接方法?
1.3?這些連接方法分別作用于哪些應用場景?
這篇針對這三個點通過實例來講述,目的是窮盡所有的場景和所有的方法,并且對每個方法的使用做實例。
首先先列舉本篇用到的分類(內(nèi)連接,外連接,交叉連接)和連接方法(如下):
A)內(nèi)連接:join,inner join
B)外連接:left join,left outer join,right join,right outer join,union
C)交叉連接:cross join
二.下面以實例進行分析
兩張假設有兩張表格A和B,把表格當作一個集合,那么表格中的記錄就是集合中的一個元素。
兩張表格如下:
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結果如下:
應用場景:
這種場景下得到的是滿足某一條件的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結果如下,TableB中更不存在的記錄填充Null:
應用場景:
這種場景下得到的是A的所有數(shù)據(jù),和滿足某一條件的B的數(shù)據(jù);
2.2.2 ?[left ? join 或者left outer join(等同于left join)] ?+ ?[where B.column is null]
結果如下:
這種場景下得到的是A中的所有數(shù)據(jù)減去"與B滿足同一條件 的數(shù)據(jù)",然后得到的A剩余數(shù)據(jù);
2.2.3 ?right join 或者fight outer join(等同于right join)
應用場景:
這種場景下得到的是B的所有數(shù)據(jù),和滿足某一條件的A的數(shù)據(jù);
2.2.4 [left ? join 或者left outer join(等同于left join)] ?+ ?[where A.column is null]
應用場景:
這種場景下得到的是B中的所有數(shù)據(jù)減去 "與A滿足同一條件 的數(shù)據(jù)“,然后得到的B剩余數(shù)據(jù);
2.2.5 full join (mysql不支持,但是可以用 left join ?union right join代替)
應用場景:
這種場景下得到的是滿足某一條件的公共記錄,和獨有的記錄
2.2.6 full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+isnull代替)
應用場景:
這種場景下得到的是A,B中不滿足某一條件的記錄之和
注:上面共有其中七(2^3-1)種應用場景,還有一種是全空白,那就是什么都不查,七種情形包含了實際應用所有可能的場景
2.3 交叉連接 (cross join)
2.3.1 實際應用中還有這樣一種情形,想得到A,B記錄的排列組合,即笛卡兒積,這個就不好用集合和元素來表示了。需要用到cross join:
2.3.2 還可以為cross ?join指定條件 (where):
注:這種情況下實際上實現(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標準中還有union join和natural ?inner join,mysql不支持,而且本身也沒有多大意義,其結果可以用上面的幾種連接方式得到
總結:總結了mysql所有連接方法,其中有一些是之前沒有注意到的問題,平時開發(fā)也都不外乎這些。
PS-1: 鑒于之前排版不夠美觀,現(xiàn)本文已重新整理,以便更好為大家學習交流
總結
以上是生活随笔為你收集整理的Mysql 多表查询详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽世界私服搭建架设教程
- 下一篇: 中国联通dns服务器未响应,关于光猫设置