mysql内连接 外连接速度_mysql的内连接 左连接 右外连接总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值