关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒
ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行,即使on中包含有A表中的列的限制条件,也不会过滤A的任何数据(A的数据只会通过where过滤)。
如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据
在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。
让我们看一个 LFET JOIN 示例:
01 |
mysql> CREATE TABLE `product` ( |
02 |
`id` int(10) unsigned NOT NULL auto_increment, |
03 |
`amount` int(10) unsigned default NULL, |
05 |
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
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, |
12 |
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
14 |
mysql> INSERT INTO product (id,amount) |
15 |
VALUES (1,100),(2,200),(3,300),(4,400); |
16 |
Query OK, 4 rows affected (0.00 sec) |
17 |
Records: 4 Duplicates: 0 Warnings: 0 |
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 OK, 4 rows affected (0.00 sec) |
22 |
Records: 4 Duplicates: 0 Warnings: 0 |
24 |
mysql> SELECT * FROM product; |
33 |
4 rows in set (0.00 sec) |
35 |
mysql> SELECT * FROM product_details; |
36 |
+----+--------+-------+ |
37 |
| id | weight | exist | |
38 |
+----+--------+-------+ |
43 |
+----+--------+-------+ |
44 |
4 rows in set (0.00 sec) |
46 |
mysql> SELECT * FROM product LEFT JOIN product_details |
47 |
ON (product.id = product_details.id); |
48 |
+----+--------+------+--------+-------+ |
49 |
| id | amount | id | weight | exist | |
50 |
+----+--------+------+--------+-------+ |
51 |
| 1 | 100 | NULL | NULL | NULL | |
52 |
| 2 | 200 | 2 | 22 | 0 | |
53 |
| 3 | 300 | NULL | NULL | NULL | |
54 |
| 4 | 400 | 4 | 44 | 1 | |
55 |
+----+--------+------+--------+-------+ |
56 |
4 rows in set (0.00 sec) |
ON 子句和 WHERE 子句有什么不同?
一个问题:下面两个查询的结果集有什么不同么?
1 |
1. SELECT * FROM product LEFT JOIN product_details |
2 |
ON (product.id = product_details.id) |
3 |
AND product_details.id=2; |
4 |
2. SELECT * FROM product LEFT JOIN product_details |
5 |
ON (product.id = product_details.id) |
6 |
WHERE product_details.id=2; |
用例子来理解最好不过了:
01 |
mysql> SELECT * FROM product LEFT JOIN product_details |
02 |
ON (product.id = product_details.id) |
03 |
AND product_details.id=2; |
04 |
+----+--------+------+--------+-------+ |
05 |
| id | amount | id | weight | exist | |
06 |
+----+--------+------+--------+-------+ |
07 |
| 1 | 100 | NULL | NULL | NULL | |
08 |
| 2 | 200 | 2 | 22 | 0 | |
09 |
| 3 | 300 | NULL | NULL | NULL | |
10 |
| 4 | 400 | NULL | NULL | NULL | |
11 |
+----+--------+------+--------+-------+ |
12 |
4 rows in set (0.00 sec) |
14 |
mysql> SELECT * FROM product LEFT JOIN product_details |
15 |
ON (product.id = product_details.id) |
16 |
WHERE product_details.id=2; |
17 |
+----+--------+----+--------+-------+ |
18 |
| id | amount | id | weight | exist | |
19 |
+----+--------+----+--------+-------+ |
20 |
| 2 | 200 | 2 | 22 | 0 | |
21 |
+----+--------+----+--------+-------+ |
22 |
1 row in set (0.01 sec) |
第一条查询使用 ON 条件决定了从 LEFT JOIN的 product_details表中检索符合的所有数据行。
第二条查询做了简单的LEFT JOIN,然后使用 WHERE 子句从 LEFT JOIN的数据中过滤掉不符合条件的数据行。
再来看一些示例:
02 |
mysql> SELECT * FROM product LEFT JOIN product_details |
03 |
ON product.id = product_details.id |
04 |
AND product.amount=100; |
05 |
+----+--------+------+--------+-------+ |
06 |
| id | amount | id | weight | exist | |
07 |
+----+--------+------+--------+-------+ |
08 |
| 1 | 100 | NULL | NULL | NULL | |
09 |
| 2 | 200 | NULL | NULL | NULL | |
10 |
| 3 | 300 | NULL | NULL | NULL | |
11 |
| 4 | 400 | NULL | NULL | NULL | |
12 |
+----+--------+------+--------+-------+ |
13 |
4 rows in set (0.00 sec) |
所有来自product表的数据行都被检索到了,但没有在product_details表中匹配到记录(product.id = product_details.id AND product.amount=100 条件并没有匹配到任何数据)
01 |
mysql> SELECT * FROM product LEFT JOIN product_details |
02 |
ON (product.id = product_details.id) |
03 |
AND product.amount=200; |
04 |
+----+--------+------+--------+-------+ |
05 |
| id | amount | id | weight | exist | |
06 |
+----+--------+------+--------+-------+ |
07 |
| 1 | 100 | NULL | NULL | NULL | |
08 |
| 2 | 200 | 2 | 22 | 0 | |
09 |
| 3 | 300 | NULL | NULL | NULL | |
10 |
| 4 | 400 | NULL | NULL | NULL | |
11 |
+----+--------+------+--------+-------+ |
12 |
4 rows in set (0.01 sec) |
同样,所有来自product表的数据行都被检索到了,有一条数据匹配到了。
原文地址:http://blog.csdn.net/longyulu/article/details/7924833
- MySQL之LEFT JOIN中使用ON和WHRERE对表数据
背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论.商城里一个货物有多少评论.一条评论有多少个赞等等.但是由于对join.on.where等关键字的不 ...
- left join中where与on的区别
举例进行说明,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两个表来对MySQL关联left join 条件on与where 条件的不同之处进 ...
- SQL JOIN 中 on 与 where 的区别
left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join : 内连 ...
- 关联查询left join中on 和where 的区别
关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行. 如果 B 表中没有任何一 ...
- 深入Oracle的left join中on和where的区别详解
-- from http://blog.itpub.net/30175262/viewspace-1472060/ 今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 日期 ...
- mysql中left join中的on条件 和 where条件区别
需要知道sql中关键字的执行顺序. FROM-> ON->JOIN-> WHERE->GROUP BY-> HAVING->SELECT-> DISTINCT ...
- mysql left join中where和on条件的区别
left join中关于where和on条件的几个知识点: 1.多表left join是会生成一张临时表,并返回给用户 2.where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件 ...
- mysql left join中on后加条件判断和where中加条件的区别
left join中关于where和on条件的几个知识点: .多表left join是会生成一张临时表,并返回给用户 .where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件的记 ...
- 转: 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
随机推荐
- 使用JQuery能做什么(zz)
jQuery库为Web脚本编程提供了通用(跨浏览器)的抽象层,使得它几乎适用于任何脚本编程的情形.jQuery通常能为我们提供以下功能: 1.方便快捷获取DOM元素 如果使用纯JavaScript的方 ...
- 移动统计工具Flurry
网址:http://www.flurry.com/ 1注册和下载对应SDK 2集成SDK 3自定义统计项 至于怎么使用,后期会更新
- Jenkins进阶系列之——14配置Jenkins用户和权限
今天给大家说说使用Jenkins专有用户数据库的配置,和一些常用的权限配置. 配置用户注册 在已运行的Jenkins主页中,点击左侧的系统管理—>Configure Global Securit ...
- Android中RelativeLayout属性详细说明
android:layout_above="@id/xxx" --将控件置于给定ID控件之上android:layout_below="@id/xxx" - ...
- C#出题库项目的总结(1)
前记: 截止18点05分(4月9号),完成了代码部分的编写,明天争取把文档完成,毕竟在这个上面花的时间太多了,还有单词和书需要背,好吧,不说废话啦,下面进入正题. (PS:因为学院的模拟招聘笔试出题和 ...
- Hibernate一级缓存与二级缓存的区别
一级缓存: 就是Session级别的缓存.一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中. 如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...
- 在Ubuntu-14.04.3配置并成功编译Android6_r1源码
折腾了一周,终于把Android6_r1的源码编译成功.先上图,这是在ubuntu中运行的Android模拟器: 由于我是在win8中安装虚拟机VMware,然后在虚拟机中安装Ubuntu进行编译,所 ...
- C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...
- Linq之Lambda表达式初步认识
目录 写在前面 匿名方法 一个例子 Lambda 定义 一个例子 总结 参考文章 写在前面 元旦三天在家闲着无事,就看了看Linq的相关内容,也准备系统的学习一下,作为学习Linq的前奏,还是先得说说 ...
- 第三章:模块加载系统(requirejs)
任何一门语言在大规模应用阶段,必然要经历拆分模块的过程.便于维护与团队协作,与java走的最近的dojo率先引入加载器,早期的加载器都是同步的,使用document.write与同步Ajax请求实现. ...