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