mysql中的join和where優(yōu)先級順序解讀
mysql 的 join 和 where 優(yōu)先級
定義
join功能
- inner join(內(nèi)連接,或等值連接) : 獲取兩個(gè)表中字段匹配關(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.
即實(shí)際優(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???????
也就是說 會(huì)先左連生成臨時(shí)表, 然后再在整體表上進(jìn)行 where 查詢.
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL存儲(chǔ)過程相互調(diào)用并獲得錯(cuò)誤碼示例
這篇文章主要介紹了MySQL存儲(chǔ)過程相互調(diào)用并獲得錯(cuò)誤碼,需要的朋友可以參考下2014-03-03
SQL如何使用正則表達(dá)式對數(shù)據(jù)進(jìn)行過濾
正則表達(dá)式的作用是匹配文本,將一個(gè)正則表達(dá)式與一個(gè)文本串進(jìn)行比較,下面這篇文章主要給大家介紹了關(guān)于SQL如何使用正則表達(dá)式對數(shù)據(jù)進(jìn)行過濾的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09

