关于 “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)内得到一个随机 ...
随机推荐
- C#实现对指定文件夹中文件按修改时间排序
string path = "~/Document/Introduction/团队管理制度/"; DirectoryInfo dirinfo = new Di ...
- matlab绘制三维图形
原文地址:种三维曲面图. 程序如下: [x,y]=meshgrid(-8:0.5:8); z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps); subplot(2, ...
- 20145208 实验四 Android开发基础
20145208 实验四 Android开发基础 安装Android Studio 安装的具体步骤在老师的链接中已经很详细了,在此就不做赘述了. 在此提出我觉得安装的时候需要注意的两个地方 一是安装地 ...
- 使用git推送代码到开源中国以及IDEA环境下使用git
使用git推送代码到开源中国以及IDEA环境下使用git 在学习Java的过程中我们会使用到git这个工具来将我们本周所编写的代码上传到开源中国进行代码托管,而在使用git的时候有很多的同学由于不会操 ...
- Python3常用内置函数
数学相关 abs(a) : 求取绝对值.abs(-1) max(list) : 求取list最大值.max([1,2,3]) min(list) : 求取list最小值.min([1,2,3]) su ...
- IT男的”幸福”生活"续8
有段时间没写了,还是有点怀念的. 生活不记录下,怕真地会忘.. 以往的种种,时时刻刻回荡在我的脑海中, 最近看着孩子生活照, 猛得回首我便回了到了 续8. …… 坐在回去的公交车上,看着前面两M ...
- Entity Framework若干个扩展
声明 这里有此东西是参考各大神修改和补充而来,有些地方就找不到原文章的地址了,一参考地址如下: http://www.cnblogs.com/ahui/archive/2011/08/04/21272 ...
- Android应用程序模拟手机按键
记得以前在做一个C++项目时,需要在某一步操作之后人为用代码模拟敲键盘上的回车键(Enter)效果. 出于好奇,这几天研究了一下Android中手机(或平板)上各种按键的键值.模拟方法及最终效果. 1 ...
- [USACO2005][POJ3044]City Skyline(贪心+单调栈)
题目:http://poj.org/problem?id=3044 题意:以坐标的形式给出一张图,表示一些楼房的正视图,求出楼房的最少个数. 分析:和小学常做的立方体问题很像,很容易想到一个贪心方法, ...
- [AaronYang]C#人爱学不学[2]
1. 记事本写C#,脱离vs 新建记事本,名字为 helloworld.cs using System; namespace Hello{ public class HelloWorldSay{ st ...