几种mysql连接查询操作方法综述

几种mysql连接查询操作方法综述
前言

现在,该系统的各种业务是非常复杂的,在各种数据库中的表数据的存在,如主键、外键的表和表,并依靠这些主键和外键。当我们做业务,我们需要建立多个表之间的关系,使用SQL语句,然后执行各种SQL操作。所以当使用SQL写的各种操作,你如何使用SQL语句和业务关联的多个表这篇文章是对这一点知识的总结。

连接查询是一种常见的数据库操作,即在两个表(多个表)中进行匹配的操作:

交叉连接(交叉连接)
内部连接(内部连接)
外部连接(外部连接)
其他
在执行各种连接操作时,我们必须回顾SQL逻辑查询执行序列中SQL逻辑查询执行的前三个步骤

执行从语句(笛卡尔乘积)
Executing ON filtering
添加外部行
每一个连接只发生在两个表之间,即使多个表包含在from子句中,每个连接操作只执行逻辑查询语句的前三个步骤,每次都生成一个虚拟表。虚拟表顺序地连接到下一个from子句表,重复上述步骤,直到处理from子句中的表为止。

事先的准备工作

1。建立一个新的测试数据库库。

语句创建数据库;
创建测试表表和表;
创建表的表

customer_id varchar(10)不为空,
varchar(10)不为空的城市,
主键(customer_id)
发动机= InnoDB默认的字符集utf8;

创建表的表

order_id INT NOT NULL auto_increment,
customer_id varchar(10),
主键(order_id)
)发动机= InnoDB默认的字符集utf8;

插入测试数据;
插入表(customer_id,市)值('163 ','hangzhou);
插入表(customer_id,市)值('9you,上海);
插入表(customer_id,市)值('tx ','hangzhou);
插入表(customer_id,市)值('baidu ','hangzhou);

插入表(customer_id)值('163);
插入表(customer_id)值('163);
插入表(customer_id)值('9you);
插入表(customer_id)值('9you);
插入表(customer_id)值('9you);
插入表(customer_id)值('tx);

在准备工作完成后,表1和表像下面这样:
MySQL SELECT * FROM表>;
------------- ---------- + + +
| customer_id |市|
------------- ---------- + + +
| 163 |杭州|
| 9you |上海|
|百度|杭州|
| TX |杭州|
------------- ---------- + + +
4行(0秒)

mysql select * from表>;
---------- ------------- + + +
| order_id | customer_id |
---------- ------------- + + +
| 1 | 163 |
| 2 | 163 |
| 3 | 9you |
| 4 | 9you |
| 5 | 9you |
| 6 | TX |
---------- ------------- + + +
7行(0秒)

准备工作大致相同。让我们今天开始总结。

交叉连接连接(交叉连接)

交叉连接执行的语句(笛卡儿积)在两个表的操作,并返回在两个表中的所有列的组合。如果左表有m行数据和右表有n行数据,交叉连接的执行将返回m×n行数据的交叉连接。只执行第一三的SQL逻辑查询执行步骤的第一步。

交叉连接能做什么由于交叉连接只执行笛卡尔乘积运算,不进行滤波,所以在实际应用中,我们可以使用交叉连接生成大量的测试数据。

对于上述测试数据,请使用以下查询:
SELECT * FROM表1交叉连接表;

将得到以下结果:
+ + + + ------------- ---------- ---------- ------------- +
customer_id市order_id | | | | customer_id |
+ + + + ------------- ---------- ---------- ------------- +
| 163 |杭州| 1 | 163 |
| 9you |上海| 1 | 163 |
|百度|杭州| 1 | 163 |
| TX |杭州| 1 | 163 |
| 163 |杭州| 2 | 163 |
| 9you |上海| 2 | 163 |
|百度|杭州| 2 | 163 |
| TX |杭州| 2 | 163 |
| 163 |杭州| 3 | 9you |
| 9you |上海| 3 | 9you |
|百度|杭州| 3 | 9you |
| TX |杭州| 3 | 9you |
| 163 |杭州| 4 | 9you |
| 9you |上海| 4 | 9you |
|百度|杭州| 4 | 9you |
| TX |杭州| 4 | 9you |
| 163 |杭州| 5 | 9you |
| 9you |上海| 5 | 9you |
|百度|杭州| 5 | 9you |
| TX |杭州| 5 | 9you |
| 163 |杭州| 6 | TX |
| 9you |上海| 6 | TX |
|百度|杭州| 6 | TX |
| TX |杭州| 6 | TX |
+ + + + ------------- ---------- ---------- ------------- +

内部连接连接(内部连接)

一点内加入比交叉连接,内部连接可以根据一些过滤条件表之间的数据。在第一个三的SQL查询执行的逻辑步骤,内加入执行第一和第二步,即没有第三步和不增加外排,这是一个内部连接和下一个外连接的最大区别

现在来看一下使用内部连接来查询:
选择*
从表1
内部联接表
在表1。customer_id = table2.customer_id;

将得到以下结果:
+ + + + ------------- ---------- ---------- ------------- +
customer_id市order_id | | | | customer_id |
+ + + + ------------- ---------- ---------- ------------- +
| 163 |杭州| 1 | 163 |
| 163 |杭州| 2 | 163 |
| 9you |上海| 3 | 9you |
| 9you |上海| 4 | 9you |
| 9you |上海| 5 | 9you |
| TX |杭州| 6 | TX |
+ + + + ------------- ---------- ---------- ------------- +

内部连接,内部连接和交叉的效果,如果有条件,不使用过滤器的加入是一样的。当过滤条件设置列中具有相同的名称,我们可以使用使用关键词缩写的过滤条件,使SQL语句可以简化,例如:
SELECT * FROM表内加入表使用(customer_id);

当SQL语句实际写入时,我们可以省略内部关键字,例如:
选择*
从表1
加入表
在表1。customer_id = table2.customer_id;

但是请记住,这是内部连接。

外部连接连接(外部连接)

哦,记得有一次采访,问问题,然后总结出这里有外连接,我们可以通过一些过滤条件表之间的数据相匹配。套外连接结果等于套内连接结果加外排;也就是说,使用外加入的时候,第一三的SQL逻辑查询执行的步骤将被执行。至于如何添加外部行,指的是文章中的SQL查询语句的执行顺序逻辑外排除。

MySQL数据库支持左外部连接和右外部连接,而与内部键一样,我们可以省略外部关键字。对于外部连接,同样也可以用于使用下面的SQL语句简化子句:
选择*
从表1
左外连接表
在表1。customer_id = table2.customer_id;

我们可以简单地写这个:
选择*
从表1
左连接表
使用(customer_id);

但是,与内部联接不同的是,对于外部联接,必须指定一个上(或使用)子句,否则MySQL数据库将抛出一个异常。

自然连接(自然连接)

自然连接相当于内部(外部)连接和使用的组合,隐式用于匹配两个表中具有相同名称的列。同样,自然的左(右)连接相当于左(右)连接和使用的组合:
选择*
从表1
加入表
使用(customer_id);


选择*
从表1
自然连接表;

等价。

在:
选择*
从表1
左连接表
使用(customer_id);


选择*
从表1
自然左连接表;

等价。

straight_join连接

straight_join是不是一个新的连接类型,但SQL优化用户控制,这相当于加入。通过straight_join,MySQL数据库是被迫看左边第一个表。例如,例如,下面的SQL语句:
解释选择*
从表1和表
在表1。customer_id = table2.customer_id;

其主要输出部分如下:
+ -- + + + + ------------- -------- ------ --------------- +
我select_type表| | | |型| possible_keys |
+ -- + + + + ------------- -------- ------ --------------- +
| 1 |简单表所有空| | | |
| 1 |简单表所有主要| | | |
+ -- + + + + ------------- -------- ------ --------------- +

我们可以清楚地看到,MySQL是第一选择的表表,然后进行匹配。如果我们指定的straight_join模式,例如:
解释选择*
从表1 straight_join表
在表1。customer_id = table2.customer_id;

上述声明的主要输出部分如下:
+ -- + + + + ------------- -------- ------ --------------- +
我select_type表| | | |型| possible_keys |
+ -- + + + + ------------- -------- ------ --------------- +
| 1 |简单表所有主要| | | |
| 1 |简单表所有空| | | |
+ -- + + + + ------------- -------- ------ --------------- +

As you can see, when the STRAIGHT_JOIN mode is specified, MySQL selects the table1 table first and then matches again.

然后读者问,什么是好的性能或性能。因为我有更少的测试数据和访问大量的数据,我们指定straight_join让MySQL读左表先让MySQL按我们的意愿完成连接操作。进行性能优化的时候,我们可以考虑使用straight_join。

多表连接

在上面所有的示例中,我使用两个表之间的连接,而且更频繁地,我们不仅可以连接两个表,而且还包括三个或多个表连接查询操作。

多表连接的连接查询,表的顺序可以安排将不影响查询结果。这是因为优化器自动评估访问表的顺序根据成本。如果你想指定连接的顺序,你可以使用straight_join,总结以上。

对于外部连接的多表连接查询,表的位置是不同的,涉及到添加外部行的问题,这可能会影响最终结果。

总结

这是mysql中连接操作的全部内容。虽然内容很多,但比较简单。结合文章中的例子,我们可以自己做这篇文章。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部