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

MySQL连接Join on是一种用于连接两个或多个相关表的操作。内连接会返回两个表中至少有一个匹配的行。在使用Join on时,需要指定连接条件,即通过指定两个表中的某个字段进行匹配。例如,使用Join on可以查询参加了考试的同学的学号、姓名、科目编号和分数。 在MySQL中,可以使用以下语法进行内连接查询: ``` SELECT 列名 FROM 表1 JOIN 表2 ON 表1.字段 = 表2.字段; ``` 其中,表1和表2是要连接的两个表,字段是用于匹配的字段。 举个例子,假设有两个表student和result,我们想要查询参加了考试的同学的信息,可以使用内连接查询: ``` SELECT s.studentno, studentname, subjectno, studentresult FROM student AS s JOIN result AS r ON s.studentno = r.studentno; ``` 这个查询会返回学号、姓名、科目编号和分数。 除了内连接,还有左连接和右连接。左连接会从左表中返回所有的值,即使右表中没有匹配;右连接会从右表中返回所有的值,即使左表中没有匹配。可以根据具体需求选择合适的连接方式。 希望以上信息对您有帮助。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [MySQL中的join以及on条件的用法](https://blog.youkuaiyun.com/weixin_44177568/article/details/103038236)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MySql 联表查询 Join ON详解](https://blog.youkuaiyun.com/m0_52641831/article/details/125242509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值