MySQL的left join中on与where的区别
2016-06-15 11:31
651 查看
参考:http://blog.csdn.net/longyulu/article/category/960994
转载地址:http://www.oschina.net/question/89964_65912?from=20120826
关于“ALEFTJOINBON条件表达式”的一点提醒
ON条件(“ALEFTJOINBON条件表达式”中的ON)用来决定如何从B表中检索数据行,即使on中包含有A表中的列的限制条件,也不会过滤A的任何数据(A的数据只会通过where过滤)。
如果B表中没有任何一行数据匹配ON的条件,将会额外生成一行所有列为NULL的数据
在匹配阶段WHERE子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。
让我们看一个LFETJOIN示例:
ON子句和WHERE子句有什么不同?
一个问题:下面两个查询的结果集有什么不同么?
用例子来理解最好不过了:
第一条查询使用ON条件决定了从LEFTJOIN的product_details表中检索符合的所有数据行。
第二条查询做了简单的LEFTJOIN,然后使用WHERE子句从LEFTJOIN的数据中过滤掉不符合条件的数据行。
再来看一些示例:
所有来自product表的数据行都被检索到了,但没有在product_details表中匹配到记录(product.id=product_details.idANDproduct.amount=100条件并没有匹配到任何数据)
同样,所有来自product表的数据行都被检索到了,有一条数据匹配到了。
转载地址:
关于“ALEFTJOINBON条件表达式”的一点提醒
ON条件(“ALEFTJOINBON条件表达式”中的ON)用来决定如何从B表中检索数据行,即使on中包含有A表中的列的限制条件,也不会过滤A的任何数据(A的数据只会通过where过滤)。
如果B表中没有任何一行数据匹配ON的条件,将会额外生成一行所有列为NULL的数据
在匹配阶段WHERE子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。
让我们看一个LFETJOIN示例:
01 | mysql> CREATE TABLE `product` ( |
02 | `id` int (10) unsigned NOT NULL auto_increment, |
03 | `amount` int (10) unsigned default NULL , |
04 | PRIMARY KEY (`id`) |
05 | ) ENGINE=MyISAMAUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
06 |
07 | mysql> CREATE TABLE `product_details` ( |
08 | `id` int (10) unsigned NOT NULL , |
09 | `weight` int (10) unsigned default NULL , |
10 | `exist` int (10) unsigned default NULL , |
11 | PRIMARY KEY (`id`) |
12 | ) DEFAULT CHARSET=latin1 |
13 |
14 | mysql> INSERT INTO product (id,amount) |
15 | VALUES (1,100),(2,200),(3,300),(4,400); |
16 | Query rows affected |
17 | Records: |
18 |
19 | mysql> INSERT INTO product_details (id,weight,exist) |
20 | VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1); |
21 | Query rows affected |
22 | Records: |
23 |
24 | mysql> SELECT * FROM product; |
25 | + ----+--------+ |
26 | | |
27 | + ----+--------+ |
28 | | |
29 | | |
30 | | |
31 | | |
32 | + ----+--------+ |
33 | 4 rows in set (0.00 sec) |
34 |
35 | mysql> SELECT * FROM product_details; |
36 | + ----+--------+-------+ |
37 | | |
38 | + ----+--------+-------+ |
39 | | |
40 | | |
41 | | |
42 | | |
43 | + ----+--------+-------+ |
44 | 4 rows in set (0.00 sec) |
45 |
46 | mysql> SELECT * FROM product LEFT JOIN product_details |
47 | ON (product.id |
48 | + ----+--------+------+--------+-------+ |
49 | | |
50 | + ----+--------+------+--------+-------+ |
51 | | NULL | NULL | NULL | |
52 | | |
53 | | NULL | NULL | NULL | |
54 | | |
55 | + ----+--------+------+--------+-------+ |
56 | 4 rows in set (0.00 sec) |
一个问题:下面两个查询的结果集有什么不同么?
1 | 1. SELECT * FROM product LEFT JOIN product_details |
2 | ON (product.id |
3 | AND product_details.id=2; |
4 | 2. SELECT * FROM product LEFT JOIN product_details |
5 | ON (product.id |
6 | WHERE product_details.id=2; |
01 | mysql> SELECT * FROM product LEFT JOIN product_details |
02 | ON (product.id |
03 | AND product_details.id=2; |
04 | + ----+--------+------+--------+-------+ |
05 | | |
06 | + ----+--------+------+--------+-------+ |
07 | | NULL | NULL | NULL | |
08 | | |
09 | | NULL | NULL | NULL | |
10 | | NULL | NULL | NULL | |
11 | + ----+--------+------+--------+-------+ |
12 | 4 rows in set (0.00 sec) |
13 |
14 | mysql> SELECT * FROM product LEFT JOIN product_details |
15 | ON (product.id |
16 | WHERE product_details.id=2; |
17 | + ----+--------+----+--------+-------+ |
18 | | |
19 | + ----+--------+----+--------+-------+ |
20 | | |
21 | + ----+--------+----+--------+-------+ |
22 | 1 in set (0.01 sec) |
第二条查询做了简单的LEFTJOIN,然后使用WHERE子句从LEFTJOIN的数据中过滤掉不符合条件的数据行。
再来看一些示例:
01 | mysql> |
02 | mysql> SELECT * FROM product LEFT JOIN product_details |
03 | ON product.id |
04 | AND product.amount=100; |
05 | + ----+--------+------+--------+-------+ |
06 | | |
07 | + ----+--------+------+--------+-------+ |
08 | | NULL | NULL | NULL | |
09 | | NULL | NULL | NULL | |
10 | | NULL | NULL | NULL | |
11 | | NULL | NULL | NULL | |
12 | + ----+--------+------+--------+-------+ |
13 | 4 rows in set (0.00 sec) |
01 | mysql> SELECT * FROM product LEFT JOIN product_details |
02 | ON (product.id |
03 | AND product.amount=200; |
04 | + ----+--------+------+--------+-------+ |
05 | | |
06 | + ----+--------+------+--------+-------+ |
07 | | NULL | NULL | NULL | |
08 | | |
09 | | NULL | NULL | NULL | |
10 | | NULL | NULL | NULL | |
11 | + ----+--------+------+--------+-------+ |
12 | 4 rows in set (0.01 sec) |
相关文章推荐
- MySQL存储引擎中的MyISAM和InnoDB区别
- mysql 5.7 用户管理新特性
- mysql datetime设置now()无效,直接用程序设置默认值比较好
- Mysql常用命令
- windows 下 mysql 导入 大文本数据
- 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist 解决的方法是:
- MySQL索引原理及慢查询优化
- 解决VS2013使用MySQL无法创建ADO.NET实体数据类型的问题
- MYSQL 笔记
- mysql查询语句in和exists二者的区别和性能影响
- navicat远程连接报 access denied for user'root'@'your mysql server ip'(using pasword:yes" 错误
- MySQL命令大全
- 欢迎使用CSDN-markdown编辑器
- MySQL选择优化的数据类型
- 昨天学到的使用SSM框架时从mysql中查到数据并展示出来的的两个下拉框
- MYSQL通用分页存储过程
- there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
- mysql多实例(个人的情况,不是大众的)里面有配置好的脚本+主从复制
- MySQL之char、varchar和text的设计
- SSH项目中MySQL8小时自动断开连接配置文件解决方案