1。多表
连接类型 1。MySQL中的笛卡尔乘积(交叉连接)可以是交叉连接或省略交叉、连接或使用,作为:
SELECT * FROM表1交叉连接表
SELECT * FROM表1和表
SELECT * FROM表1,表2
因为它的返回结果是连接的两个数据表的乘积,所以在有、使用或使用
条件时一般不
推荐,因为当数据项太多时,它们将非常慢。
2、内部连接内部连接。我们称MySQL中的内部连接等价连接,也就是说,我们需要指定等价的连接条件。在MySQL,跨内加入分区together.join_table:table_reference { }内交叉加入table_factor { } | join_condition
3的外部连接。MySQL分为左外部连接和右连接。也就是说,除了返回符合连接条件的结果外,它还返回到左表(左连接)或右表(右连接)不符合连接条件的结果,相应地使用空对应。
实例uff1a
用户表:
我的
名字|
—
1 | libk
2 | zyfon
3 |道道
user_action表:
user_id行动|
———
1 |跳
1 |踢
1 |跳
2 |
运行 4 |游泳
Sql:
从用户中选择ID、名称、动作
左连接在u.id = a.user_id user_action
结果:
我的名字| |行动
---- ----—
1 | libk |跳1。
1 | libk |踢2
1 | libk |跳3
2 | zyfon |运行。
3 |道道|空。
分析uff1a
注意,有一个user_id = 4,在user_action行动=游泳记录,但没有结果,
和ID = 3和名称=在用户表中的用户user_action道道没有相应的记录,但他们出现在结果集
因为现在是左联接,所以所有的
工作都是基于左边的。
结果1, 2, 3和4都在左、右表,5在左表,不在右表上。
工作原理uff1a
从左表中读取一个,并选择与右表记录匹配的所有右表记录(n条),以形成n个记录(包括重复行,如结果1和结果3)。如果没有与右边的条件匹配的表,则连接的字段为空,然后读下一个。
延伸:
我们可以使用
正确的表而不用匹配来
显示null规则,找出左边表上的所有记录,而不是在右边表上,并注意要确定的列必须声明为null。
如:
Sql:
从用户中选择ID、名称、动作
左连接在u.id = a.user_id user_action
在a.user_id是空的
小心:
1。列值是NULL,应该使用NULL,而不是=空。
2。的a.user_id柱必须声明为这里不空。
结果:以上SQL
我的名字| |行动
---- ----
3 |道道|空
----……----……----—
一般使用:
A.左{ }连接:
除了返回符合连接条件的结果外,还需要显示不符合左表中连接条件的数据列,相对于空对应。
复制代码代码如下:选择column_name从表1左{外}加入表在表1.柱= table2.column
B.右{ }联接:
右类似于左连接,它只显示符合连接条件的数据,也需要显示不符合右表中连接条件的数据列,并相应地使用空对应。
复制代码代码如下:选择column_name从表1右{外}加入表在表1.柱= table2.column
提示:
1。在a.c1 = b.c1等于使用(C1)
2。内部连接和(逗号)在语义上是等价的。
三.当MySQL从一个表中检索信息时,您可以提示它选择的索引。
如果解释说明MySQL在可能的索引列表中使用了
错误的索引,这个特性将非常有用。
通过指定使用索引(key_list),你可以告诉MySQL的使用可能的指标最合适的索引查找表中的记录行。
可选的两个可选的句法忽视指数(key_list)可以用来告诉MySQL特定的指标是没有用的。如:
MySQL > SELECT * FROM表使用索引(KEY1、KEY2)
key1 = 1 = 2 = 3,KEY3键->;
MySQL >选择*从表1忽略指数(KEY3)
key1 = 1 = 2 = 3,KEY3键->;
2的制约因素。表连接
添加显示条件
1。WHERE子句
MySQL >
复制代码代码如下:SELECT * FROM表1,表2,表1。ID = table2.id;
2。在
MySQL >
复制代码代码如下:SELECT * FROM表1左连接表在表1. id = table2.id;
SELECT * FROM表1左连接表在表1. id = table2.id
左表表ID = table3.id加入;
3。使用子句,如果两个连接表连接的两个列具有相同的名称,则可以使用
例如:
从左连接中选择(使用)
两个以上的表连接的例子:
MySQL >
选择艺术家。艺术家,cds.title,genres.genre
从CD
左连接类型N cds.genreid = genres.genreid
左连接cds.artistid = artists.artistid艺术家;
或MySQL >
选择艺术家。艺术家,cds.title,genres.genre
从CD
左连接cds.genreid = genres.genreid流派
左连接艺术家->在cds.artistid = artists.artistid
在(genres.genre =打开引擎);
中国
MySQL中需要注意的另一个地方涉及多个表
查询,根据查询需要找出哪个连接更有效。
1。交叉连接(笛卡儿积)或{ }内加入|交叉连接
2。左{ }加入左外部连接或连接右}外部联接,该连接指定
位置、开始、使用的连接条件。
三.如何
优化左连接和右连接
在MySQL中,加入B的左join_condition
执行过程如下:
1)。根据表A和A的所有表来
设置表B。
2)。根据左连接条件中使用的所有表(除b)设置表A。
3)。左连接条件用于决定如何从表B中
搜索行(换句话说,不要使用WHERE子句中的任何条件)。
4)。所有的标准连接都可以优化,只有一个表异常只能从它所依赖的所有表中读取。如果存在循环依赖,MySQL提示符就有错误。
5)。实现所有标准的最优化。
6)。如果A中的一行匹配WHERE子句,但B中没有一个匹配条件,则生成另一行B,所有这些行都被设置为null。
7)如果你使用左连接
发现不在表中的一些列的存在,并进行了以下试验:在col_name部分为空col_name,这是一个空的不列声明,停止MySQL找到匹配的左连接条件(特定的关键字组合搜索后)其他线。
右连接的执行类似于左连接,它与表的
作用相反。
加入优化计算的
顺序表应加入。强制表的阅读顺序左连接和straight_join可以帮助加入优化工作得更快,因为查表交流少。请注意,如果以下类型的查询,MySQL是完全扫描B,因为左连接迫使它读过D:
*选择
从A,B和C(左上c.key = a)左连接D
在b.key = d.key;
在这种
情况下,在a的逆序中,b被列在from子句中:
*选择
B、左加入C(c.key = a)左连接D
在b.key = d.key;
MySQL可以执行下面的左联接优化:如果生成空行,则WHERE条件总是错误的,左连接成为一个公共连接。
例如,在下面的查询,如果t2.column1是null,WHERE子句将假:
复制代码代码如下:SELECT * FROM T1和T2(左1)T2
方法= 5;
因此,您可以安全地将查询
转换为公共连接:
复制代码如下:SELECT * FROM T1,T2,T2和T1,column2 = 5 = t2.column1之内;
这可以更快,因为如果你可以查询,MySQL可以在表T1 T2使用表,力表
命令的使用,使用straight_join。
以上是本文的全部内容,希望能对大家有所帮助。