首先我们先从自然连接和等值连接说起:
A | B | C |
1 |
2 | 3 |
2 | 1 | 4 |
3 | 4 | 5 |
4 | 6 | 7 |
A | B | C |
2 | 1 | 4 |
4 | 6 | 7 |
6 | 8 | 9 |
一、自然连接,要有相同的属性列才能进行,即等值连接之后要去除相同的属性列,不需要人为指定连接字段,自然会自动找同名字段进行连接,会删除连接后的重复列。 关键字 natural
两张表具有相同属性列
CREATE TABLE R (A INT, B INT, C INT);
CREATE TABLE C (A INT, B INT, C INT);
INSERT INTO R values ('1','2','3'),('2','1','4'),('3','4','5'),('4','6','7');
INSERT INTO C values ('2','1','4'),('4','6','7'),('6','8','9');
select * from R natural join C
两张表具有部分相同的属性列
create table p (
sysid serial ,
pid varchar(20) primary key,
pname varchar(50)
)
insert into p (pid, pname) values
('P001', '不锈钢F201'),
('P002', '不锈钢F202'),
('P004', '不锈钢F202') ;
create table s (
sysid serial,
thedate varchar(10),
pid varchar(20),
thequantity integer
)
insert into s (thedate,pid,thequantity) values
('2012/08/01', 'P001', 100),
('2012/08/02', 'P002', 200),
('2012/08/03', 'P003', 300) ;
select * from p natural join s
可以清晰的发现使用自然连接,两个表必须有相同的属性列,而且不需要指定连接字段,相同的属性名合并。
二、全连接返回左右数据表的所有行.关键字 full join
全连接类似做了一个笛卡尔积(不会百度去)形成新的表,新表行等于两个表行的乘积,列等于两个表列的和,不需要人为指定连接字段
以上面表为例
三、内连接
内连接和外连接,一般都需要和指定条件一起联合使用,但是不是必须的,mysql一般默认使用内连接, 关键字:inner,类似于以共同的相同属性值将两张表连接一起,属于水平拼接,不合并相同的属性名。
SELECT * FROM r INNER JOIN c ON r.A=c.A
SELECT * FROM p INNER JOIN s ON p.pid = s.pid
四、外部连接
包括左连接和右连接,关键词是:outer, 必须和 left 和 right 联合同时使用,但是如果有了left和right 关键字,outer可以省略。也就是说left/right outer jon 和left/right join 是一样的效果。但是左连接和右连接主要区别在于以哪个表为主
(一)左连接
SELECT * FROM p left JOIN s ON p.pid = s.pid
(二)右连接
重点看 left/right join的左右两边表,切记不要以为是on后边的条件左右。