Mysql多表查询笔记
2019獨角獸企業重金招聘Python工程師標準>>>
MySQL連接的種類,JOIN左邊(前邊)的表是左邊,右邊(后邊)的是右表
- 逗號:做笛卡爾集連接
- INNER JOIN: 如果表中有至少一個匹配,則返回行
- LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
- RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
- NATURAL ?JOIN
- NATURAL LEFT JOIN
- NATURAL RIGHT JOIN
- CROSS JOIN
注:
- MySQL不支持FULL JOIN(只要其中一個表中存在匹配,就返回行),可以結合使用UNION、LEFT/RIGHT JOIN來實現;
- MySQL中LEFT/INNER?JOIN還可以寫成LEFT/INNER?OUTER JOIN;
- CROSS JOIN在標準SQL中是不帶ON子句的,作用是生成笛卡爾積,在MySQL中CROSS JOIN后帶ON子句時,CROSS會被忽略,就相當于JOIN;
- 不使用ON子句時,JOIN和INNER JOIN和CROSS JOIN和逗號是等價的,做笛卡爾積;
- 使用ON子句時,INNER/LEFT/RIGHT?JOIN不會生成笛卡爾集,直接根據條件生成臨時表
- 逗號操作符和其他幾種連接操作符的優先級不同,盡量不要同時使用避免出錯。
- 使用逗號連接加where子句和使用INNER JOIN加ON子句效果一樣
- join、inner join、cross join支持on和using語法,逗號不支持on和using語法
多表查詢的過程:
?
假設對表a、b、c進行聯合查詢
提示錯誤:Unknown column 'xxx' in 'on clause'
原因是FROM后面的兩張表沒有使用括號包裹起來
--錯誤的寫法 select * from a,b left join c on 條件 where 條件--正確的寫法 select * from (a,b) left join c on 條件 where 條件如果左連接時某個字段為空,就讓他等于另外一個字段,使用IFNULL()
SELECTh.id AS id,h.goods_id AS goodsId,g.goods_advert AS goodsAdvert,IFNULL(aos.activity_price,g.sell_price) AS sellPrice,--注意g.sell_price不能用別名price代替g.goods_name AS goodsName,g.logo_url AS logoUrl,g.is_delivery AS isDelivery,g.sell_price AS price FROM(tb_house h,tb_goods g)LEFT JOIN tb_aos_goods_rt aos ON h.goods_id = aos.goods_id WHERE1 = 1 AND h.member_id = 107 AND h.goods_id = g.id AND h. STATUS = 1 ORDER BYh.create_date DESC如果某條數據的aos.activity_price為null,最后的結果集要以sellPrice排序,ORDER by后面應該寫別名sellPrice而不是寫aos.activity_price
CROSS JOIN的用法:http://www.yiibai.com/mysql/cross-join.html
左右連接能否同時使用
SQL 定義了兩種不同語法方式去表示"連接"。首先是"顯式連接符號",它顯式地使用關鍵字 JOIN,其次是"隱式連接符號",它使用所謂的"隱式連接符號"。隱式連接符號把需要連接的表放到 SELECT 語句的 FROM 部分,并用逗號隔開。這樣就構成了一個"交叉連接",WHERE 語句可能放置一些過濾謂詞(過濾條件)。那些過濾謂詞在功能上等價于顯式連接符號. SQL 89標準只支持內部連接與交叉連接,因此只有隱式連接這種表達方式;SQL 92標準增加了對外部連接的支持,這才有了JOIN表達式。
?
逗號連接加where子句和inner join加on子句的異同
在查詢條件相同時它們的查詢結果是相同的,但是查詢的過程不完全相同;
使用逗號操作符加where子句:首先生成笛卡爾積,因為在沒有on子句時,逗號和CROSS JOIN是相同的,然后通過條件去過濾。
使用inner join加on子句:直接通過條件去過濾生成臨時表,不會生成笛卡爾集,速度更快
開啟優化參數后MySQL會自動優化,通常使用,不會造成資源浪費;不使用逗號,全部使用JOIN是最好的,這樣既不會因為運算符優先級不同而出錯,也不會因為沒有開啟優化參數而造成資源浪費。
?
join的方式不同,cross join生成的是先生成笛卡爾集,然后on連接條件被視為了filter用于數據過濾,inner join是直接基于join condition做連接,生成的join集合就是最終的輸出結果,產生的中間數據更小。實際上MySQL優化器會將這兩條查詢都優化成同一種join方式,比如merge join或者nested loop join,如果你沒有開啟對應的優化參數,那么MySQL只有傻傻的去按指定的方式去做join
查詢條件放在ON后面和放在WHERE后面有什么差異
有上可知,在沒有ON時,INNER JOIN和CROSS JOIN是一樣的?,所以推薦使用INNER JOIN ON代替逗號加WHERE;
ON條件是生成臨時表時使用的條件,與JOIN的類型有關,不同類型產生的臨時表也不同,WHERE條件時在臨時表生成之后進行篩選的條件,在LEFT或RIGHT JOIN中條件是不能隨便放的
在where后面有多個條件時使用加個1=1的原因
轉載于:https://my.oschina.net/u/3160411/blog/1594763
總結
以上是生活随笔為你收集整理的Mysql多表查询笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LAMP架构(七)配置防盗链,访问控制
- 下一篇: CentOS 7 + nginx-1.1