mysql中的join和where優(yōu)先級順序解讀
更新時間:2023年03月20日 10:50:30 作者:所謂永恒
這篇文章主要介紹了mysql中的join和where優(yōu)先級順序解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
mysql 的 join 和 where 優(yōu)先級
定義
join功能
- inner join(內連接,或等值連接) : 獲取兩個表中字段匹配關系的記錄。
- left join (左連接) : 獲取左表所有記錄,即使右表沒有對應匹配的記錄。
- right join (右連接) : 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒有對應匹配的記錄。
where
where 是 mysql 語句的查詢條件
測試數據表
- 表 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 及結果
正常左連接
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在右表無數據所以右表數據 (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 |
只有一條數據, 因此可判斷其優(yōu)先級為
select * from (a1 left join a2 on a1.y = a2.y) where a2.y = 10???????
也就是說 會先左連生成臨時表, 然后再在整體表上進行 where 查詢.
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MySQL下使用Inplace和Online方式創(chuàng)建索引的教程
這篇文章主要介紹了MySQL下使用Inplace和Online方式創(chuàng)建索引的教程,針對InnoDB為存儲引擎的情況,需要的朋友可以參考下2015-11-11
zabbix監(jiān)控MySQL主從狀態(tài)的方法詳解
這篇文章主要介紹了zabbix--監(jiān)控MySQL主從狀態(tài)的方法,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-06-06

