Mysql中where與on的區別及何時使用詳析

2022-09-21 23:24:14 字數 3541 閱讀 6854

說明:區分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.traqsouade_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 = 'wangw程式設計客棧u''

結果只會顯示符合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 comme '交易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, cu程式設計客棧rrent_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, tradeqsoua_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語句

我們知道從mysql表中使用sql select 語句來讀取資料。如需有條件地從表中選取資料,可將 where 子句新增到 select 語句中。語法 select field1,field2,fieldn from table name1,table name2.where condition1 ...

sql中on與where的區別

資料庫在通過連線兩張或者多張表返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者 在使用inner join 內連線 沒有區別,但是 在使用left jion時,on和where條件的區別如下 1 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記...

SQL中 where 與on 的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。在使用left jion時,on和where條件的區別如下 1 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。2 where條件是在臨時表生成好後,再對臨時表...