您好,登錄后才能下訂單哦!
這篇文章主要講解了“Mysql中where與on的區別是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Mysql中where與on的區別是什么”吧!
之前在寫連表查詢的時候,老是分不清楚where和on的區別,導致有時寫的SQL會出現一點小的問題,這里專門寫篇文章做下記錄,如果你也分不清,那么請參考
說明:區分on和where首先我們將連接分為內部連接和非內部連接,內部連接時on和where的作用是一樣的,通常我們分不清它們的區別說的是非內部連接
一般on用來連接兩個表,只的是連接的條件,在內部連接時,可以省略on,此時它表示的是兩個表的笛卡爾積;使用on連接后,mysql會生成一張臨時表,而where就是在臨時表的基礎上,根據where子句來篩選出符合條件的記錄,因此where是用來篩選的
內部連接(inner join)
說明:join默認為inner join,當為內部連接時,on和where的作用你可以看做是一樣的
非內部連接(left join、right join、full join等)
一般分不清區別就是在使用非內部連接時,
實例說明
下面我們建兩張表(每個表中插入4條數據,兩個表通過trade_id來關聯),來說明它們的區別,此文章的最下面附有SQL腳本,然后我們通過連表查詢來說明on和where的區別
1、inner join 連接兩個表(無on和where)
select * from hopegaming_main.test_1234 join hopegaming_main.test_1235
等價于
select * from hopegaming_main.test_1234,hopegaming_main.test_1235
結果集是兩個表的笛卡爾積
2、inner join 連接兩個表(有on)
select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id
結果集是兩個表有相同trade_id的數據
3、inner join 連接兩個表(有where)
select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 where t1.trade_id = t2.trade_id
結果集是結果集是兩個表有相同trade_id的數據
從2和3的結果中我們可以看出,在使用inner join連接時,on和where的作用相等
4、left join(下面以left join為例來連接兩個表) 連接兩個表
select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id
結果集是以左面的表為基礎,直接根據trade_id去右邊查詢相等的值然后連接,如果右表沒有符合的數據,則都顯示為null
5、left join(下面以left join為例來連接兩個表) 連接兩個表,連接條件中有常量等式
select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id and t2.nick_name = 'wangwu'
結果集是以左面的表為基礎,如果on連接條件最后沒有找到匹配的記錄,則都顯示null
6、left join(下面以left join為例來連接兩個表) 連接兩個表,將常量表達式放入where子句中
select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id where t2.nick_name = 'wangwu''
結果只會顯示符合where子句的數據,只要沒有符合的都不會顯示,因為它是篩選連接后的臨時表中的數據,而on
只是連接,如果右邊沒有符合的數據,就顯示null,而左邊的數據都會顯示,不會被過濾,這就是where和on最大的區別
建表和插入數據的腳本:
CREATE TABLE `hopegaming_main`.`test_1234` ( `id` varchar(30) NOT NULL COMMENT '身份證號', `name` varchar(100) DEFAULT NULL COMMENT '姓名', `trade_id` varchar(100) DEFAULT NULL COMMENT '交易id', `gender` tinyint(4) DEFAULT NULL COMMENT '性別', `birthday` timestamp(6) NOT NULL COMMENT '出生日期', PRIMARY KEY (`id`) USING BTREE, KEY `idx_trade_id` (`trade_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; INSERT INTO hopegaming_main.test_1234 (id, name, trade_id, gender, birthday) VALUES('1', 'zhangsan', '123', 0, CURRENT_TIMESTAMP(6)), ('2', 'zhaosi', '124', 0, CURRENT_TIMESTAMP(6)), ('3', 'wangwu', '125', 0, CURRENT_TIMESTAMP(6)), ('4', 'maqi', '126', 0, CURRENT_TIMESTAMP(6)); CREATE TABLE `hopegaming_main`.`test_1235` ( `id` varchar(30) NOT NULL COMMENT '身份證號', `nick_name` varchar(100) DEFAULT NULL COMMENT '別名', `trade_id` varchar(100) DEFAULT NULL COMMENT '交易id', `address` varchar(100) DEFAULT NULL COMMENT '地址', `email` varchar(6) NOT NULL COMMENT '出生日期', PRIMARY KEY (`id`) USING BTREE, KEY `idx_trade_id` (`trade_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; INSERT INTO hopegaming_main.test_1235 (id, nick_name, trade_id, address, email) VALUES('1', 'zhangsan', '123', 'beijing', '0000'), ('2', 'wangwu', '123', 'tianjin', '1111'), ('3', 'maqi', '124', 'shanghai', '2222'), ('4', 'yangliu', '127', 'shanxi', '3333');
感謝各位的閱讀,以上就是“Mysql中where與on的區別是什么”的內容了,經過本文的學習后,相信大家對Mysql中where與on的區別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。