mysql中的join和where優(yōu)先級順序解讀
mysql 的 join 和 where 優(yōu)先級
定義
join功能
- inner join(內(nèi)連接,或等值連接) : 獲取兩個表中字段匹配關(guān)系的記錄。
- left join (左連接) : 獲取左表所有記錄,即使右表沒有對應(yīng)匹配的記錄。
- right join (右連接) : 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒有對應(yīng)匹配的記錄。
where
where 是 mysql 語句的查詢條件
測試數(shù)據(jù)表
- 表 a1
x | y |
---|---|
1 | 10 |
2 | 20 |
3 | 30 |
- 表 a2
x | y |
---|---|
10 | 100 |
20 | 200 |
20 | 300 |
create table if not exists `a1`( `x` int(10), `y` int(10) ); create table if not exists `a2`( `y` int(10), `z` int(10) )
查詢 sql 及結(jié)果
正常左連接
select * from a1 left join a2 on a1.y = a2.y;
x | y | y | z |
---|---|---|---|
1 | 10 | 10 | 100 |
2 | 20 | 20 | 200 |
2 | 20 | 20 | 300 |
3 | 30 | NULL | NULL |
左連情況下, 由于左邊a1.y = 30在右表無數(shù)據(jù)所以右表數(shù)據(jù) (y,z)為 NULL
左連 on && and
select * from a1 left join a2 on a1.y = a2.y and a2.y = 10;
x | y | y | z |
---|---|---|---|
1 | 10 | 10 | 100 |
2 | 20 | NULL | NULL |
3 | 30 | NULL | NULL |
由于是左連, 所以判斷 (a1.y = a2.y && a2.y = 10) 只能篩選出(10, 100)與左邊匹配, 所以后面均為 NULL.
即實際優(yōu)先級是
select * from (a1 left join a2 on a1.y = a2.y and a2.y = 10)
左連 on && where
select * from a1 left join a2 on a1.y = a2.y where a2.y = 10;
x | y | y | z |
---|---|---|---|
1 | 10 | 10 | 100 |
只有一條數(shù)據(jù), 因此可判斷其優(yōu)先級為
select * from (a1 left join a2 on a1.y = a2.y) where a2.y = 10???????
也就是說 會先左連生成臨時表, 然后再在整體表上進(jìn)行 where 查詢.
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mySql關(guān)于統(tǒng)計數(shù)量的SQL查詢操作
這篇文章主要介紹了mySql關(guān)于統(tǒng)計數(shù)量的SQL查詢操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01MYSQL數(shù)據(jù)庫數(shù)據(jù)拆分之分庫分表總結(jié)
這篇文章主要介紹了MYSQL數(shù)據(jù)庫數(shù)據(jù)拆分之分庫分表總結(jié),需要的朋友可以參考下2016-07-07mysql數(shù)據(jù)遷移到Oracle的正確方法
這篇文章主要為大家詳細(xì)介紹了mysql數(shù)據(jù)遷移到Oracle的正確方法,文中步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02MySQL下使用Inplace和Online方式創(chuàng)建索引的教程
這篇文章主要介紹了MySQL下使用Inplace和Online方式創(chuàng)建索引的教程,針對InnoDB為存儲引擎的情況,需要的朋友可以參考下2015-11-11zabbix監(jiān)控MySQL主從狀態(tài)的方法詳解
這篇文章主要介紹了zabbix--監(jiān)控MySQL主從狀態(tài)的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-06-06