透彻理解mysql的左连接使用
从句和WHERE子句之间的区别用零子句来更好地理解复杂匹配条件的一种简单方法
匹配条件和条件之间的区别
关于条件表达式的左连接b的一点提示
使用条件(在条件表达式中的左连接B上)用于确定如何从B表检索数据行。
如果B表中的任何一行数据与on的条件相匹配,则将生成null的所有列的附加行。
不使用匹配阶段中WHERE子句的条件。在匹配阶段完成之后,将使用WHERE子句条件。它将从匹配阶段生成的数据中检索过滤。
让我们看看一个例子加入左:
创建表产品(
` ID ` int(10)符号的非空auto_increment,
数量int(10)无符号默认NULL,
主键(id)
auto_increment = 5 = MyISAM引擎默认的字符集latin1)
MySQL >创建表` product_details `(
id int(10)未签名不空,
权重int(10)无符号缺省null,
存在int(10)无符号缺省null,
主键(id)
= MyISAM引擎默认的字符集latin1)
插入产品(ID、数量)
值(1100)、(2200)、(3300)、(4400);
查询OK,4行受影响(0秒)
记录:4个重复:0个警告:0
MySQL >插入product_details(ID、重量、存在)
值(2,22,0),(4,44,1),(5,55,0),(6,66,1);
查询OK,4行受影响(0秒)
记录:4个重复:0个警告:0
从产品中选择*;
+——+ -------- +
| ID |量|
+——+ -------- +
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
| 4 | 400 |
+——+ -------- +
4行(0秒)
MySQL SELECT * FROM product_details >;
+ -- + + + -------- -------
我的体重存在| | | |
+ -- + + + -------- -------
| 2 | 22 | 0 |
| 4 | 44 | 1 |
| 5 | 55 | 0 |
| 6 | 66 | 1 |
+ -- + + + -------- -------
4行(0秒)
MySQL >选择*从产品离开加入product_details
在(product.id = product_details。ID);
+ -- + + + + -------- ------ -------- ------- +
ID身份| | | |重量|存在|
+ -- + + + + -------- ------ -------- ------- +
| 1 | 100 |空|空|空|
| 2 | 200 2 22 0 | | | |
| 3 | 300 |空|空|空|
| 4 | 400 4 44 1 | | | |
+ -- + + + + -------- ------ -------- ------- +
4行(0秒)
从句和WHERE子句有什么区别
一个问题:下面两个查询的结果集有什么不同吗
1。SELECT * FROM产品左连接product_details
在(product.id = product_details。ID)
和product_details id = 2;
2。SELECT * FROM产品左连接product_details
在(product.id = product_details。ID)
在product_details id = 2;
最好用例子来理解。
MySQL >选择*从产品离开加入product_details
在(product.id = product_details。ID)
和product_details id = 2;
+ -- + + + + -------- ------ -------- ------- +
ID身份| | | |重量|存在|
+ -- + + + + -------- ------ -------- ------- +
| 1 | 100 |空|空|空|
| 2 | 200 2 22 0 | | | |
| 3 | 300 |空|空|空|
| 4 | 400 |空|空|空|
+ -- + + + + -------- ------ -------- ------- +
4行(0秒)
MySQL >选择*从产品离开加入product_details
在(product.id = product_details。ID)
在product_details id = 2;
+——+——+ -------- ------- -------- + + +
ID身份| | | |重量|存在|
+——+——+ -------- ------- -------- + + +
| 2 | 200 2 22 0 | | | |
+——+——+ -------- ------- -------- + + +
1行集(0.01秒)
第一个查询使用的确定都是从product_details表在左行数据连接条件。
第二个查询生成一个简单的左连接,然后使用WHERE子句过滤来自左连接的数据的非条件数据行。
再看一些例子。
MySQL >
MySQL >选择*从产品离开加入product_details
在product.id = product_details.id
和产品数量= 100;
+ -- + + + + -------- ------ -------- ------- +
ID身份| | | |重量|存在|
+ -- + + + + -------- ------ -------- ------- +
| 1 | 100 |空|空|空|
| 2 | 200 |空|空|空|
| 3 | 300 |空|空|空|
| 4 | 400 |空|空|空|
+ -- + + + + -------- ------ -------- ------- +
4行(0秒)
检索所有数据行的产品表,但他们不匹配的记录在product_details表(product.id = product_details.id和产品。金额= 100条件不匹配任何数据)。
MySQL >选择*从产品离开加入product_details
在(product.id = product_details。ID)
和产品数量= 200;
+ -- + + + + -------- ------ -------- ------- +
ID身份| | | |重量|存在|
+ -- + + + + -------- ------ -------- ------- +
| 1 | 100 |空|空|空|
| 2 | 200 2 22 0 | | | |
| 3 | 300 |空|空|空|
| 4 | 400 |空|空|空|
+ -- + + + + -------- ------ -------- ------- +
4行(0.01秒)
类似地,检索产品表中的所有数据行,并匹配一个数据。
左连接使用…无效条款
当你使用的时候会发生什么…是空子句吗
正如前面提到的,条件查询在匹配阶段之后发生,这意味着在哪里…在匹配阶段之后,null子句将过滤不匹配匹配数据的数据行。
这在报纸上很清楚,但是当你在从句中使用多个条件时,你会感到困惑。
我总结了一个简单的方法来理解上面:
NULL作为负匹配条件。
使用!(a和b)a或=!B逻辑!
请看下面的例子:
MySQL >选择A *产品加入product_details B左
对数据和b.weight张=!= 44和b.exist = 0
其中数据为空;
+——+ -------- +
| ID |量|
+——+ -------- +
| 1 | 100 |
| 3 | 300 |
| 4 | 400 |
+——+ -------- +
3行(0秒)
让我们来看看配子句:
(张=数据)和(b.weight!= 44)和(b.exist = 0)
我们可以把空子句看作匹配条件。
这意味着我们将检索以下几行:
(存在(数据,等于张)和b.weight!= 44和b.exist = 0)
(数据存在,等于!A.id | |)!(b.weight!= 44)| |!(b.exist = 0)
(数据存在,等于!张b.weight = 44 = 1 b.exist | | | |)
与C语言中的逻辑和逻辑或表达式一样,操作数从左到右求值。如果第一个参数足以判断操作结果,则第二个参数将不被计算(短路)。
看看其他例子:
MySQL >选择A *产品加入product_details B左
对数据和b.weight张=!= 44和b.exist = 1
其中数据为空;
+——+ -------- +
| ID |量|
+——+ -------- +
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
| 4 | 400 |
+——+ -------- +
4行(0秒)
匹配条件与条件之间的战斗
如果将基本查询条件放在on子句中,将剩余的否定条件放在WHERE子句中,那么将得到相同的结果。
例如,你不能写这个:
选择A *产品加入product_details B左
对数据和b.weight张=!= 44和b.exist = 0
其中数据为空;
你可以写这个:
选择A *产品加入product_details B左
在张=数据
其中数据为空或b.weight = 44或b.exist = 1;
MySQL >选择A *产品加入product_details B左
在张=数据
其中数据为空或b.weight = 44或b.exist = 1;
+——+ -------- +
| ID |量|
+——+ -------- +
| 1 | 100 |
| 3 | 300 |
| 4 | 400 |
+——+ -------- +
3行(0秒)
你不能写这个:
选择A *产品加入product_details B左
对数据和b.weight张=!= 44和b.exist!= 0
其中数据为空;
它可以这样写:
选择A *产品加入product_details B左
在张=数据
其中数据为空或b.weight = 44或b.exist = 0;
MySQL >选择A *产品加入product_details B左
在张=数据
其中数据为空或b.weight = 44或b.exist = 0;
+——+ -------- +
| ID |量|
+——+ -------- +
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
| 4 | 400 |
+——+ -------- +
4行(0秒)
这些查询真的是一样的吗
如果只需要第一个表中的数据,这些查询将返回相同的结果集。其中一个例子是,如果从左连接表中检索数据,则查询的结果是不同的。
和前面一样,在匹配阶段过滤后使用WHERE子句。
例如:
MySQL >选择*从产品加入product_details B左
对数据和b.weight张=!= 44和b.exist = 1
其中数据为空;
+ -- + + + + -------- ------ -------- ------- +
ID身份| | | |重量|存在|
+ -- + + + + -------- ------ -------- ------- +
| 1 | 100 |空|空|空|
| 2 | 200 |空|空|空|
| 3 | 300 |空|空|空|
| 4 | 400 |空|空|空|
+ -- + + + + -------- ------ -------- ------- +
4行(0秒)
MySQL >选择*从产品加入product_details B左
在张=数据
其中数据为空或b.weight = 44或b.exist = 0;
+ -- + + + + -------- ------ -------- ------- +
ID身份| | | |重量|存在|
+ -- + + + + -------- ------ -------- ------- +
| 1 | 100 |空|空|空|
| 2 | 200 2 22 0 | | | |
| 3 | 300 |空|空|空|
| 4 | 400 4 44 1 | | | |
+ -- + + + + -------- ------ -------- ------- +
4行(0秒)
一般注意事项:
如果你使用左连接找到不在一些记录存在,你需要做以下试验:在col_name部分为空(的col_name列定义为非空,MySQL)在查询到左,加入条件将停止更多的搜索(在一个特定的组合键下面)。