mysql数据库支持以下四种连接:
内连接(inner join): 只连接匹配的行数据
左外连接(left join): 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行数据
右外连接(right join): 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行数据
全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
交叉连接 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行数据都一一匹配
实例如下,先建立两张测试表,dic_a、data_b:
表dic_a
CREATE TABLE dic_a(
id int(11) NOT NULL DEFAULT 0 ,
name varchar(255) CHARACTER SET utf8
COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (id)
);
insert into dic_a(id,name) values(1,'zhang');
insert into dic_a(id,name) values(2,'liu');
insert into dic_a(id,name) values(3,'wang');
mysql> select * from dic_a;
+----+-------+
| id | name |
+----+-------+
| 1 | zhang |
| 2 | liu |
| 3 | wang |
+----+-------+
2 rows in set (0.05 sec)
表data_b:
CREATE TABLE data_b(
id int(11) NOT NULL DEFAULT 0 ,
name varchar(255) CHARACTER SET utf8
COLLATE utf8_general_ci NULL DEFAULT NULL ,
dic_a_id int,
PRIMARY KEY (id)
);
insert into data_b(id,name,dic_a_id) values(1,'长江',1);
insert into data_b(id,name,dic_a_id) values(2,'黄河',3);
insert into data_b(id,name,dic_a_id) values(3,'淮河',20);
+----+-------------+
| id | name | dic_a_id |
+----+-------+----------+
| 1 | zhang | 1 |
| 2 | liu | 3 |
| 3 | wang | 20 |
二、左连接的使用
包容性:dic_a表包容data_b表,左连接左表是全的.(left join 或 left outer join )
SQL语句如下:
SELECT dic_a.name, data_b.name river
FROM dic_a
LEFT JOIN data_b ON dic_a.id = data_b.dic_a_id
--查询结果为:
name river
zhang 长江
liu NULL
wang 黄河
三、右连接的使用
包容性:data_b表包容dic_a表,右连接右表是全的.(right join 或 right outer join )
SQL语句如下:
SELECT dic_a.name, data_b.name river
FROM dic_a
RIGHT JOIN data_b ON dic_a.id = data_b.dic_a_id
--查询结果为:
name river
zhang 长江
wang 黄河
NULL 淮河
四、内连接的使用
排他性:dic_a,data_b表中至少有1个匹配时,才返回行。两表的交集
SQL语句如下:
SELECT dic_a.name, data_b.name river
FROM dic_a
inner JOIN data_b ON dic_a.id = data_b.dic_a_id
--查询结果为:
name river
zhang 长江
wang 黄河
inner join 内连接等价于下面的sql:
SELECT dic_a.name, data_b.name river
FROM dic_a
五、全外连接的使用
全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集 。(full join 或 full outer join )
SQL语句如下:
SELECT *
FROM dic_a
full join data_b
--查询结果为:
---+-------+----+--------+----------+
id | name | id | name | dic_a_id |
---+-------+----+--------+----------+
1 | zhang | 1 | 长江 | 1 |
2 | liu | 1 | 长江 | 1 |
3 | wang | 1 | 长江 | 1 |
1 | zhang | 2 | 黄河 | 3 |
2 | liu | 2 | 黄河 | 3 |
3 | wang | 2 | 黄河 | 3 |
1 | zhang | 3 | 淮河 | 20 |
2 | liu | 3 | 淮河 | 20 |
3 | wang | 3 | 淮河 | 20 |
---+-------+----+--------+----------+
注释:返回3*3=9条记录,即笛卡尔积
SQL语句如下:
SELECT * FROM dic_a
CROSS JOIN data_b
CROSS JOIN等价于:select * from dic_a,data_b