CREATE TABLE `sdb_b2c_te` (
`id` int(2) unsigned NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL DEFAULT '0',
`ship_name` varchar(50) NOT NULL DEFAULT '',
`age` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `sdb_b2c_te` (`id`, `order_id`, `ship_name`, `age`)
VALUES
(1, 1, 'zhangsan', 10),
(2, 2, 'lisi', 10),
(3, 3, 'wangwu', 10),
(4, 5, 'kobe', 40);
CREATE TABLE `sdb_b2c_te1` (
`id` int(2) unsigned NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL DEFAULT '0',
`goods_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `sdb_b2c_te1` (`id`, `order_id`, `goods_id`)
VALUES
(1, 1, 100),
(2, 2, 200),
(3, 5, 100),
(4, 4, 100);
测试inner join:
select sdb_b2c_te.id as 'sdb_b2c_te.id',sdb_b2c_te.age as 'sdb_b2c_te.age',sdb_b2c_te1.id as 'sdb_b2c_te1.id',sdb_b2c_te1.goods_id as 'sdb_b2c_te1.goods_id' from sdb_b2c_te inner join sdb_b2c_te1 on sdb_b2c_te.order_id=sdb_b2c_te1.order_id
总结:inner join取的是两个表的交集,如:a inner join b on a.order_id=b.order_id,取的是a表和b表中order_id相等的数据,如果有where条件,就先过滤where条件,然后在过滤on,然后取过滤后的数据的交集部分。
测试left join:有where条件
select sdb_b2c_te.id as 'sdb_b2c_te.id',sdb_b2c_te.age as 'sdb_b2c_te.age',sdb_b2c_te1.id as 'sdb_b2c_te1.id',sdb_b2c_te1.goods_id as 'sdb_b2c_te1.goods_id' from sdb_b2c_te left join sdb_b2c_te1 on sdb_b2c_te.order_id=sdb_b2c_te1.order_id
where sdb_b2c_te.age = 10
总结:如果有where条件,则先过滤where条件,然后从过滤后的数据中取出所有主表(left join左边的表)中的数据,然后在根据on条件去辅表(left join右边)找数据,如果有,则直接取出数据,如果没有,则把辅表相关字段置为null。
测试right join:不加where条件
select sdb_b2c_te.id as 'sdb_b2c_te.id',sdb_b2c_te.age as 'sdb_b2c_te.age',sdb_b2c_te1.id as 'sdb_b2c_te1.id',sdb_b2c_te1.goods_id as 'sdb_b2c_te1.goods_id' from sdb_b2c_te left join sdb_b2c_te1 on sdb_b2c_te.order_id=sdb_b2c_te1.order_id
总结:没有where条件,则先取出主表中的所有数据,然后在根据on条件去辅表查数据,有,则直接取出,没有,则把辅表相关字段置为null。
right join其实跟left join的逻辑是一样的,只不过,left join左边的表是主表,右边的表是辅表。而right join右边的表是主表,左边的表是辅表。
总结:不管是inner join、left join、right join,如果有where条件,肯定是先过滤where,然后在对过滤后的数据进行操作。