关于 “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)内得到一个随机 ...
随机推荐
- How to configure SRTM elevations in WorldWind WMS
In this thread I will try to explain how to serve SRTM elevations using NASA WorldWind WMS. ! Import ...
- 微信开放平台,微信登陆第三方网站 提示redirect_uri 参数错误
在微信开放平台上我填写的回调域是:bbs.qiaoshisui.com/LoginApi/WeiXinCallBack,我构造的链接是:https://open.weixin.qq.com/conne ...
- 在matlab中对hsv进行均匀量化和非均匀量化
首先,进行非均匀量化,H,S,V三通道分别量化为16,4,4级,返回一个向量.量化依据如下表: function vec = getHsvHist(Image) [M,N,O] = size(Imag ...
- Matlab 用fread、fwrite实现大文件读写
最近在分析一个35G的大数据文件,猛一看,是不是很吓人啊,不过还好,师兄写文件的格式非常规范,读取数据来也就很方便了,主要是使用了读写文件的两个函数fread和fwrite,下面用matlab简单尝试 ...
- js浮点数精确计算(加、减、乘、除)
<SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加 ...
- 20135208 第一次JAVA实验报告
课程:Java程序设计 班级: 1352 姓名:贺邦 学号:20135208 成绩: 指导教师:娄嘉鹏 实验日期:2 ...
- 信息安全系统设计基础实验五:简单嵌入式 WEB 服务器实验 (20135229,20135234)
http://www.cnblogs.com/mqy123/p/5002683.html
- Mininet的安装与卸载
1.Mininet的卸载比较简单,只需要执行以下命令: sudo rm -rf /usr/local/bin/mn /usr/local/bin/mnexec /usr/local/lib/pytho ...
- 我给出的一份Java服务器端面试题-适合电话面试
这部分内容,参考了<面试官的七种武器>一文. 电面与face2face的面试还是有区别的,很多考察方式无法使用. 从简历聊起,逐渐进入正题. Java语法 重载与重写的区别? java如何 ...
- 简单的音乐播放器(VS 2010 + Qt 4.8.5)
昨天历经千辛万苦,配置好了VS 2010中的Qt环境(包括Qt for VS插件),今天决定浅浅地品味一下将两者结合进行编程的魅力. 上网查了一些资料,学习了一些基础知识,决定做一个简单的音乐播放器, ...