首先是針對左右鏈接,這裏與inner join區分mysql
在使用left join時,on and 和on where會有區別sql
1. on的條件是在鏈接生成臨時表時使用的條件,以左表爲基準 ,無論on中的條件真否,都會返回左表中的記錄
2.where條件是在臨時表生成好後,再對臨時表過濾。此時 和left join有區別(返回左表所有記錄),條件不爲真就所有過濾掉,on後的條件來生成左右表關聯的臨時表,
where後的條件是生成臨時表後對臨時表過濾spa
on and是進行韋恩運算時 鏈接時就作的動做,where是所有鏈接完後,再根據條件過濾rem
CREATE TABLE `a` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sid` int(11) NOT NULL, `type` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `a` (`id`, `sid`, `type`) VALUES (1, 1, 'a'); INSERT INTO `a` (`id`, `sid`, `type`) VALUES (2, 1, 'b'); INSERT INTO `a` (`id`, `sid`, `type`) VALUES (3, 2, 'c'); INSERT INTO `a` (`id`, `sid`, `type`) VALUES (4, 3, 'd'); CREATE TABLE `b` ( `sid` int(11) NOT NULL, `remark` char(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `b` (`sid`, `remark`) VALUES (1, 'A'); INSERT INTO `b` (`sid`, `remark`) VALUES (2, 'B'); INSERT INTO `b` (`sid`, `remark`) VALUES (3, 'C'); INSERT INTO `b` (`sid`, `remark`) VALUES (4, 'D');
mysql> select * from a; +----+-----+------+ | id | sid | type | +----+-----+------+ | 1 | 1 | a | | 2 | 1 | b | | 3 | 2 | c | | 4 | 3 | d | +----+-----+------+ 4 rows in set mysql> select * from b; +-----+--------+ | sid | remark | +-----+--------+ | 1 | A | | 2 | B | | 3 | C | | 4 | D | +-----+--------+ 4 rows in set mysql> select * from a left join b on a.sid=b.sid; +----+-----+------+-----+--------+ | id | sid | type | sid | remark | +----+-----+------+-----+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | | 3 | 2 | c | 2 | B | | 4 | 3 | d | 3 | C | +----+-----+------+-----+--------+ mysql> select * from a left join b on a.sid=b.sid and a.sid=1; +----+-----+------+------+--------+ | id | sid | type | sid | remark | +----+-----+------+------+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | | 3 | 2 | c | NULL | NULL | | 4 | 3 | d | NULL | NULL | +----+-----+------+------+--------+ mysql> select * from a left join b on a.sid=b.sid where a.sid=1; +----+-----+------+-----+--------+ | id | sid | type | sid | remark | +----+-----+------+-----+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | +----+-----+------+-----+--------+
對於inner joinselect
mysql> select * from a inner join b on a.sid=b.sid and a.sid=1; +----+-----+------+-----+--------+ | id | sid | type | sid | remark | +----+-----+------+-----+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | +----+-----+------+-----+--------+ mysql> select * from a inner join b on a.sid=b.sid where a.sid=1; +----+-----+------+-----+--------+ | id | sid | type | sid | remark | +----+-----+------+-----+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | +----+-----+------+-----+--------+
on and和on where結果一致
在使用inner join時,無論是對左表仍是右表進行篩選,on and和on where都會對生成的臨時表進行過濾方法