mysql 多表连接问题

本文详细介绍了MySQL中的多表连接,包括交叉连接、内连接(自然连接、等值连接、非等值连接)和外连接(左连接、右连接)。通过实例展示了各种连接方式的查询结果,帮助读者深入理解SQL查询中的连接操作。
摘要由CSDN通过智能技术生成

mysql 连接有 外链接(左连接和右连接),内连接,交叉连接(笛卡尔积)。

基于 mysql 建表语句如下:

drop table abc,cdef;
CREATE TABLE abc (
    a VARCHAR(20) NOT NULL DEFAULT '0' COMMENT 'a',
    b VARCHAR(20) NOT NULL DEFAULT '0' COMMENT 'b',
    c VARCHAR(20) NOT NULL DEFAULT '0' COMMENT 'c'
    
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='abc';


CREATE TABLE cdef (
    c VARCHAR(20) NOT NULL DEFAULT '0' COMMENT 'c',
    d VARCHAR(20) NOT NULL DEFAULT '0' COMMENT 'd',
    e VARCHAR(20) NOT NULL DEFAULT '0' COMMENT 'e',
    f VARCHAR(20) NOT NULL DEFAULT '0' COMMENT 'f'  
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='cdef';




insert into abc (a,b,c) values 
('a1','b1','c1'),
('a1','b1','c1'),
('a5','b5','c5'),
('a2','b2','c2');
insert into cdef (c,d,e,f) values 
('c1','d1','e1','f1'),
('c3','d3','e3','f3'),
('c2','d2','e2','f2'),
('c2','d2','e2','f2');

  • 一。交叉连接:  没有where子句的交叉连接将产生连接表的笛卡尔积。 总条数等于 两表数据总数 之 积。
--笛卡尔交叉连接
select *
from abc ,cdef;

结果:

a1 b1 c1 c1 d1 e1 f1
a1 b1 c1 c1 d1 e1 f1
a5 b5 c5 c1 d1 e1 f1
a2 b2 c2 c1 d1 e1 f1
a1 b1 c1 c3 d3 e3 f3
a1 b1 c1 c3 d3 e3 f3
a5 b5 c5 c3 d3 e3 f3
a2 b2 c2 c3 d3 e3 f3
a1 b1 c1 c2 d2 e2 f2
a1 b1 c1 c2 d2 e2 f2
a5 b5 c5 c2 d2 e2 f2
a2 b2 c2 c2 d2 e2 f2
a1 b1 c1 c2 d2 e2 f2
a1 b1 c1 c2 d2 e2 f2
a5 b5 c5 c2 d2 e2 f2
a2 b2 c2 c2 d2 e2 f2


  • 二。内连接:内连接分为三种:自然连接、等值连接、非等值连接

a.自然连接:  在连接条件中使用等于=运算符比较被连接列的列值,但删除连接表中重复列

select *
from abc natural join cdef;

c1 a1 b1 d1 e1 f1
c1 a1 b1 d1 e1 f1
c2 a2 b2 d2 e2 f2
c2 a2 b2 d2 e2 f2

b.等值连接:利用on 或者 where 增加连接条件 等于=运算符比较被连接列的列值,不删除重复列

select a.*,d.*
from  abc a, cdef d
where a.c = d.c;
a1 b1 c1 c1 d1 e1 f1
a1 b1 c1 c1 d1 e1 f1
a2 b2 c2 c2 d2 e2 f2
a2 b2 c2 c2 d2 e2 f2

c.非等值连接:   在连接条件中,可以使用其他比较运算符,比较被连接列的列值,如:<、>、!=等

select a.*,d.*
from  abc a, cdef d
where a.c != d.c;

结果:

a2 b2 c2 c1 d1 e1 f1
a1 b1 c1 c3 d3 e3 f3
a1 b1 c1 c3 d3 e3 f3
a5 b5 c5 c3 d3 e3 f3
a2 b2 c2 c3 d3 e3 f3
a1 b1 c1 c2 d2 e2 f2
a1 b1 c1 c2 d2 e2 f2
a5 b5 c5 c2 d2 e2 f2
a1 b1 c1 c2 d2 e2 f2
a1 b1 c1 c2 d2 e2 f2
a5 b5 c5 c2 d2 e2 f2

  • 三。外链接:包括 左连接,右连接

a.左连接:  左边为主,右边往左边连接,右边不存在对应的列 全为null

select a.*,d.*
from  abc a left join  cdef d on a.c = d.c;

结果:

a1 b1 c1 c1 d1 e1 f1
a1 b1 c1 c1 d1 e1 f1
a5 b5 c5 (null) (null) (null) (null)
a2 b2 c2 c2 d2 e2 f2
a2 b2 c2 c2 d2 e2 f2

b.右连接: 以右边为准,左边往右边连接,左边不存在对应的列全为null

select a.*,d.*
from  abc a right join  cdef d on a.c = d.c;

结果:

a1 b1 c1 c1 d1 e1 f1
a1 b1 c1 c1 d1 e1 f1
(null) (null) (null) c3 d3 e3 f3
a2 b2 c2 c2 d2 e2 f2
a2 b2 c2 c2 d2 e2 f2







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值