mysql 的连接查询及合并查询

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;

结果


可以清晰看到重复的数据没有合并,全部显示!









猜你喜欢

转载自blog.csdn.net/qq_32844875/article/details/80549109