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