关于 “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)内得到一个随机 ...
随机推荐
- vbs实现的支持拖动的txt文本切割器
vbs实现的支持拖动的txt文本切割器 作者: 字体:[增加 减小] 类型:转载 时间:2008-06-20我要评论 用vbs实现的txt文本文件切割器,默认为8000个字符切为一个文件.支持拖动. ...
- matlab绘制二维图形
常用的二维图形命令: plot:绘制二维图形 loglog:用全对数坐标绘图 semilogx:用半对数坐标(X)绘图 semilogy:用半对数坐标(Y)绘图 fill:绘制二维多边填充图形 pol ...
- LeetCode 笔记28 Maximum Gap
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- 浪潮之巅——IT那点事之二—蓝色巨人IBM
蓝色巨人IBM的全称是国际商用机器公司(International Business Machines Corporation),纵观IBM的发展历史,可以看出IBM与机器结缘,以商用为主的发展策略. ...
- SVN中trunk、branches、tags用法详解
Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/. 那么标准的svn布局是:svn://proj/|+-trunk+-branches+-t ...
- 20145316GDB调试汇编堆栈
GDB调试例子的汇编堆栈 代码 直接-m32编译出现问题 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386 编 ...
- JqueryEasyUI教程入门篇
什么是jQueryEasyUI? JqueryUI是一组基于jQuery的UI插件集合 学习jQueryEasyUI的条件? 必须掌握Jquery的基本语法知识 jQueryEasyUI的特点? 1. ...
- 13.C#分部类型和静态类(七章7.1-7.2)
再大的东西不去找,也就没了,再小的知识不去记,也就忘了.今天来写一写C#中的分部类型和静态工具类,这些两个概念可能在我们的日常使用过程中都使用过,可能大家对这些内容觉得这些不是应该有的东西嘛,那就来复 ...
- [C#]exchange发送,收件箱操作类
最近项目中需要用到exchange的操作,就参照msdn弄了一个简单的操作类.目前先实现了,发送邮件和拉取收件箱的功能,其他的以后在慢慢的添加. using Microsoft.Exchange.We ...
- 每天一个linux命令(50):telnet命令
telnet 命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是 Internet远程登陆服务的标准协议和主要方式.它为 ...