inner join 和 left join
2016-07-22 本文已影响0人
xiaolin_188
/*表结构及数据*/
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` varchar(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES ('1', '张三', '18', '男');
INSERT INTO `test` VALUES ('2', '李四', '20', '女');
INSERT INTO `test` VALUES ('3', '王五', '32', '男');
/*--------------------------*/
CREATE TABLE `demo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) DEFAULT NULL,
`change` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `demo` VALUES ('1', '2', '15');
INSERT INTO `demo` VALUES ('2', '3', '58');
INSERT INTO `demo` VALUES ('3', '2', '16');
情况1:on条件是1=1
sql
/*当on的条件是1=1的时候,inner join和left join的结果是一致的*/
select * from test left join demo on 1 = 1;
select * from test inner join demo on 1 = 1
结果:(条数是:3*3=9条)
![](https://img.haomeiwen.com/i1859466/ac19ffb4099fd919.jpg)
情况2:添加实际的on条件,一个on条件,left join方式
/**
在情况1的基础上,挨个判断是否满足on的条件,如果满足则保留
如果不满足,则左表保留一条记录,右表的记录为null
**/
select * from test left join demo on test.id = demo.uid;
![](https://img.haomeiwen.com/i1859466/f290d3b315abdad9.jpg)
情况3:添加实际的on条件,一个on条件,inner join方式
/**
在情况1的基础上,挨个判断是否满足on的条件,如果满足则保留,如果不满足,则丢弃
**/
select * from test inner join demo on test.id = demo.uid;
![](https://img.haomeiwen.com/i1859466/497b49c353ba5c29.jpg)
情况4:添加实际的on条件,两个on条件,left join方式
/**
在情况1的基础上,挨个判断是否同时满足on的所有条件,如果满足则保留
如果不满足,则左表保留一条记录,右表的记录为null
**/
select * from test left join demo on test.id = demo.uid and test.id > 2;
![](https://img.haomeiwen.com/i1859466/8168f62538bcd68e.jpg)
情况5:添加实际的on条件,两个on条件,inner join方式
/**
在情况1的基础上,挨个判断是否同时满足on的所有条件,如果满足则保留
如果不满足,则丢弃
**/
select * from test inner join demo on test.id = demo.uid and test.id > 2;
![](https://img.haomeiwen.com/i1859466/03827601a618f1b7.jpg)