mysq 的连接查询分为内连接查询及外连接查询
内连接查询:inner join on:两边的数据进行笛卡尔积操作。
外链接查询:left join:以左边为主。righr join:以右表为主。
创建测试表:
create table join2( id int auto_increment not NULL primary KEY, name varchar(30) ) engine = innodb DEFAULT charset=utf8; create table join1( id int auto_increment not NULL primary KEY, name varchar(30) ) engine = innodb DEFAULT charset=utf8; insert into join1(name) values ('1'),('2'),('3'),('4'); insert into join2(name) values ('1'),('2'),('5');
join1表数据:
join2表数据:
left join:select * from join1 a left join join2 b on a.name = b.name;
查看sql结果
即以左表为主,在右表中寻找符合on条件的数据,如果不匹配,右边对应数据显示为空。
right join:select * from join1 a right join join2 b on a.name = b.name;
查看sql结果
即以右表为主,在左表匹配符合on条件的数据,如果不匹配。左边对应数据显示为空
inner join:select * from join1 a inner join join2 b on a.name = b.name;
查看sql结果:
即求左右表数据的笛卡尔积。简单的理解成,只匹配两边都有数据的记录,只要有一边没有对应匹配记录,则不不将记录加入结果中。例:join1表的name=4是独有的,join2表没有,所以结果中没有name=4,同样,join2表的name=5是独有的,join1没有匹配这个数据,则结果也没有name=5
合并查询:分为union和union all
union:删除重复记录,返回的行都是唯一的。 确保两个查询的列数一样。
union all:不删除重复记录也不对结果进行自动排序。确保两个查询的列数一样
这里要注意,合并的两个查询的结果集,字符集要一样,即我们创建表的时候设置的charset=utf8;
union:
SELECT a.name FROM join1 a
UNION
SELECT b.name FROM join2 b;
结果
可以清晰看到,重读的数据合并了!
union all:
SELECT a.name FROM join1 a
UNION all
SELECT b.name FROM join2 b;
结果
可以清晰看到重复的数据没有合并,全部显示!