之前在寫(xiě)連表查詢的時(shí)候,老是分不清楚where和on的區(qū)別,導(dǎo)致有時(shí)寫(xiě)的SQL會(huì)出現(xiàn)一點(diǎn)小的問(wèn)題,這里專門(mén)寫(xiě)篇文章做下記錄,如果你也分不清,那么請(qǐng)參考
二者的區(qū)別及什么時(shí)候使用
說(shuō)明:區(qū)分on和where首先我們將連接分為內(nèi)部連接和非內(nèi)部連接,內(nèi)部連接時(shí)on和where的作用是一樣的,通常我們分不清它們的區(qū)別說(shuō)的是非內(nèi)部連接
一般on用來(lái)連接兩個(gè)表,只的是連接的條件,在內(nèi)部連接時(shí),可以省略on,此時(shí)它表示的是兩個(gè)表的笛卡爾積;使用on連接后,mysql會(huì)生成一張臨時(shí)表,而where就是在臨時(shí)表的基礎(chǔ)上,根據(jù)where子句來(lái)篩選出符合條件的記錄,因此where是用來(lái)篩選的
內(nèi)部連接(inner join)
說(shuō)明:join默認(rèn)為inner join,當(dāng)為內(nèi)部連接時(shí),on和where的作用你可以看做是一樣的
非內(nèi)部連接(left join、right join、full join等)
一般分不清區(qū)別就是在使用非內(nèi)部連接時(shí),
實(shí)例說(shuō)明
下面我們建兩張表(每個(gè)表中插入4條數(shù)據(jù),兩個(gè)表通過(guò)trade_id來(lái)關(guān)聯(lián)),來(lái)說(shuō)明它們的區(qū)別,此文章的最下面附有SQL腳本,然后我們通過(guò)連表查詢來(lái)說(shuō)明on和where的區(qū)別
1、inner join 連接兩個(gè)表(無(wú)on和where)
select * from hopegaming_main.test_1234 join hopegaming_main.test_1235
等價(jià)于
select * from hopegaming_main.test_1234,hopegaming_main.test_1235
結(jié)果集是兩個(gè)表的笛卡爾積
2、inner join 連接兩個(gè)表(有on)
select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id
結(jié)果集是兩個(gè)表有相同trade_id的數(shù)據(jù)
3、inner join 連接兩個(gè)表(有where)
select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 where t1.trade_id = t2.trade_id
結(jié)果集是結(jié)果集是兩個(gè)表有相同trade_id的數(shù)據(jù)
從2和3的結(jié)果中我們可以看出,在使用inner join連接時(shí),on和where的作用相等
4、left join(下面以left join為例來(lái)連接兩個(gè)表) 連接兩個(gè)表
select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id
結(jié)果集是以左面的表為基礎(chǔ),直接根據(jù)trade_id去右邊查詢相等的值然后連接,如果右表沒(méi)有符合的數(shù)據(jù),則都顯示為null
5、left join(下面以left join為例來(lái)連接兩個(gè)表) 連接兩個(gè)表,連接條件中有常量等式
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'
結(jié)果集是以左面的表為基礎(chǔ),如果on連接條件最后沒(méi)有找到匹配的記錄,則都顯示null
6、left join(下面以left join為例來(lái)連接兩個(gè)表) 連接兩個(gè)表,將常量表達(dá)式放入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''
結(jié)果只會(huì)顯示符合where子句的數(shù)據(jù),只要沒(méi)有符合的都不會(huì)顯示,因?yàn)樗呛Y選連接后的臨時(shí)表中的數(shù)據(jù),而on
只是連接,如果右邊沒(méi)有符合的數(shù)據(jù),就顯示null,而左邊的數(shù)據(jù)都會(huì)顯示,不會(huì)被過(guò)濾,這就是where和on最大的區(qū)別
建表和插入數(shù)據(jù)的腳本:
CREATE TABLE `hopegaming_main`.`test_1234` (
`id` varchar(30) NOT NULL COMMENT '身份證號(hào)',
`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 '身份證號(hào)',
`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');
總結(jié)
到此這篇關(guān)于Mysql中where與on的區(qū)別及何時(shí)使用的文章就介紹到這了,更多相關(guān)Mysql中where與on區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- MySQL查詢條件中放置on和where的區(qū)別分析
- MySQL left join操作中on和where放置條件的區(qū)別介紹
- mysql中l(wèi)eft join設(shè)置條件在on與where時(shí)的用法區(qū)別分析