MySql连接JOIN

Mysql

准备

create table a
(
    m varchar(10) not null
        primary key,
    n varchar(10) null,
    k varchar(10) null
);
create table b
(
    k varchar(10) not null
        primary key,
    l varchar(10) null
);
create table c
(
    o varchar(10) not null
        primary key,
    p varchar(10) null
);
create table d
(
    k varchar(10) not null
        primary key,
    l varchar(10) null
);
insert into a (m, n, k) values ('m1','n1','k1'), ('m2', 'n2', 'k2'), ('m3', 'n0', 'k0'), ('m4', null, 'k4');
insert into b (k, l) values ('k1','l1'), ('k2', 'l2'), ('k3', 'l0'), ('k4', null);
insert into c (o, p) values ('o1','p1'), ('o2', 'p2'), ('o3', 'p3');
insert into d (k, l) values ('k1','l1'), ('k2', 'l2'), ('k3', 'l9');

结果:
a

mnk
m1n1k1
m2n2k2
m3n0k0
m4nullk4

b

kl
k1l1
k2l2
k3l0
k4null

c

op
o1p1
o2p2
o3p3

d

kl
k1l1
k2l2
k3l9

交叉连接

    交叉连接 即 笛卡儿积

select * from a,b;

含义:将a表中的每一行与b表中的每一行进行组合,即 m * n 的形式

外连接

外连接分为左连接和右连接;
左外连接与左连接(右外连接与右连接)区别在于sql语句的where查询条件

左连接     select * from a left join b on a.k = b.k;
左外连接 select * from a left join b on a.k = b.k where b.k is null;
右连接     select * from a right join b on a.k = b.k;
右外连接 select * from a right join b on a.k = b.k where a.k is null;

连接说明
左连接在a表中匹配,即使b表中不存在也可以匹配
左外连接在a表中匹配且在b表中不存在时匹配
右连接在b表中匹配,即使a表中不存在也可以匹配
右外连接在b表中匹配且在a表中不存在时匹配

12
34

内连接

内连接

  • 等值连接
  • 不等值连接
  • 自连接

等值连接     select * from a inner join b on a.k = b.k;
不等值连接 select * from a inner join b on a.k > b.k;
自连接        select * from a inner join a as c on a.k = c.k;

联合查询

联合查询分为union 与 union all

unionunion all
以前表为基准,将结果集合并,并去除重复记录以前表为基准,将结果集合并,但不去除重复记录

使用union(union all)的两个表必须拥有相同数量的列

b表和c表 select * from b union select * from c;
b表和c表 select * from b union all select * from c;
b表和d表 select * from b union select * from d;
b表和d表 select * from b union all select * from d;

结果
1 2 3 4
注意后两个表的区别

全连接

mysql对全连接(全外连接)没有直接支持,但可以通过union来间接实现。

全连接 = 左连接 union 右连接
全外连接 = 左外连接 union 右外连接

1

select * from a left join b on a.k = b.k
union
select * from a right join b on a.k = b.k;

结果:
1

select * from a left join b on a.k = b.k
union
select * from a right join b on a.k = b.k;

2

select * from a left join b on a.k = b.k where b.k is null
union
select * from a right join b on a.k = b.k where a.k is null;

结果:
2

自然连接

自然连接 是一种特殊的等值连接,与等值连接的区别在于去除重复的列,而等值连接不会去除。

select * from a inner join b on a.k = b.k;
select * from a natural join b;
结果:
1
2
当两张表没有相同属性列时使用自然连接会怎么样呢?

此时自然连接的效果与交叉连接,即笛卡尔积结果相同。
因此,可以认为自然连接是 在两张表的笛卡尔积中选取属性列相等的数据行,然后去除重复的列。

select * from a,b;
select * from a natural join b;
结果:
1
2

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值