left join中where与on的区别
举例进行说明,我们现在有两个表,即商品表(products)与sales_detail(销售记录表)。我们主要是通过这两个表来对MySQL关联left join 条件on与where 条件的不同之处进行讲述。
1、数据准备
创建products表并插入数据
drop table if exists products;
CREATE TABLE `products` (
`pid` INT (3) NOT NULL auto_increment,
`pname` VARCHAR (20) NOT NULL,
`pcode` VARCHAR (20) NOT NULL,
PRIMARY KEY (`pid`)
) ENGINE = MyISAM AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8; INSERT INTO `products` (`pid`, `pname`, `pcode`)
VALUES
(1, '商品1', 'AC90'),
(2, '商品2', 'DE78'),
(3, '商品3', 'XXXX');
创建sales_detail表并插入数据
drop table if exists sales_detail;
CREATE TABLE `sales_detail` (
`aid` INT (3) NOT NULL auto_increment,
`pcode` VARCHAR (20) NOT NULL,
`saletime` date NOT NULL,
PRIMARY KEY (`aid`)
) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1; INSERT INTO `sales_detail` (`aid`, `pcode`, `saletime`)
VALUES
(1, 'AC90', '2008-09-22'),
(2, 'DE78', '2008-09-22'),
(3, 'AC90', '2008-09-23'),
(4, 'AC90', '2008-09-24');
数据库中的数据如下:
| pid | pname | pcode |
| 1 | 商品1 | AC90 |
| 2 | 商品2 | DE78 |
| 3 | 商品3 | XXXX |
| aid | pcode | saletime |
| 1 | AC90 | 2008-09-22 |
| 2 | DE78 | 2008-09-22 |
| 3 | AC90 | 2008-09-23 |
| 4 | AC90 | 2008-09-24 |
2、测试
现在有个场景,按商品在某个时间段内的销售量来排行,比如我想统计23-24号这两天的销售数量并排行。(注:DE78这个商品在这两天没有销售,但是也要显示出来,只是数量为0)
使用where条件查询:
SELECT
p.pname,
p.pcode,
s.saletime,
count(s.aid) AS total
FROM
products AS p
LEFT JOIN sales_detail AS s ON (s.pcode = p.pcode)
WHERE
s.saletime IN ('2008-09-23', '2008-09-24')
GROUP BY
p.pcode
ORDER BY
total DESC,
p.pid ASC
结果:
| pname | pcode | saletime | total |
| 商品1 | AC90 | 2008-09-23 | 2 |
这里的查询过程可以分成两部,首先通过on条件生成中间表(总共有3条数据),然后用where条件过滤中间表得到最后的结果。
使用on条件查询:
SELECT
p.pname,
p.pcode,
s.saletime,
count(s.aid) AS total
FROM
products AS p
LEFT JOIN sales_detail AS s ON (
(s.pcode = p.pcode)
AND s.saletime IN ('2008-09-23', '2008-09-24')
)
GROUP BY
p.pcode
ORDER BY
total DESC,
p.pid ASC
结果:
| pname | pcode | saletime | total |
| 商品1 | AC90 | 2009-09-23 | 2 |
| 商品2 | DE78 | NULL | 0 |
| 商品3 | XXXX | NULL | 0 |
这里直接通过on条件得到结果,不管on上的条件是否为真都会返回left表中的记录,如果需要不满足连接条件的行也出现在查询结果中,必须把连接条件放在on上。以上查询等价于:
SELECT
p.pname,
p.pcode,
s.saletime,
count(s.aid) AS total
FROM
products AS p
LEFT JOIN (select * from sales_detail s where s.saletime IN ('2008-09-23', '2008-09-24')) as s ON
(s.pcode = p.pcode)
GROUP BY
p.pcode
ORDER BY
total DESC,
p.pid ASC
3、结论
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
left join中where与on的区别的更多相关文章
- SQL JOIN 中 on 与 where 的区别
left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join : 内连 ...
- 深入Oracle的left join中on和where的区别详解
-- from http://blog.itpub.net/30175262/viewspace-1472060/ 今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 日期 ...
- MySQL的left join中on与where的区别
关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行,即使on中包含有A表中的列 ...
- 关联查询left join中on 和where 的区别
关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行. 如果 B 表中没有任何一 ...
- ql语句中left join和inner join中的on与where的区别分析
sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用到 ...
- sql语句中left join、inner join中的on与where的区别
table a(id, type): id type ---------------------------------- 1 1 2 1 3 2 table b ...
- 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条件的记 ...
随机推荐
- python 之修饰器
from functools import update_wrapper def debug(func): def wrapper(): print "[DEBUG]: enter {}() ...
- Jsp页面输入中文,MYSQL数据库乱码???问题
首先,先看一下自己mysql数据库的编码格式 其次,cmd模式下执行命令set names gbk 最后,更改my.ini文件文件参数为gbk 那为什么会产生乱码问题呢? 原因有以下几种: 一.项目编 ...
- redis数据转移随笔
生产环境有一批版本比较老的redis主从架构,是一主多从,版本是2.8 由于想迁移到阿里云上,那么问题来了,怎么把redis数据转移到阿里云上 为了省事,阿里云也是和生产环境一样的版本,架构也一致,其 ...
- Python 学习笔记03篇
看着直播,想着未赶完的工作 真的很想学好一门编程语言
- Win10 远程桌面连接出现“要求的函数不受支持”的解决办法之修改注册表
问题起因 笔者自己在阿里云上搞服务器,有一台 Windows Server 必须通过远程桌面连接来管理,由于没能完全关掉 Win10 自带的烦人的系统更新,导致昨天安装完更新后出现了连接远程桌面时“要 ...
- Masonry与AmazeUI结合实现瀑布流
做一个图片列表展示,由于照片数量太多,决定用瀑布流来实现 由于之前没有接触过瀑布流,不知从何下手 百度一下大家都在用Masonry 官网 https://masonry.desandro.com/ 这 ...
- step_by_step_Angularjs-UI-Grid使用简介
了解 Angularjs UI-Grid 起因:项目需要一个可以固定列和表头的表格,因为表格要显示很多列,当水平滚动条拉至后边时可能无法看到前边的某些信息. 以前在angularjs 1.x 中一直都 ...
- 【相关网站 - 02】- Java 好文博客
一.源码分析博客 还有这种操作?浅析为什么要看源码 你觉得什么才是 Java 的基础知识? 1. JDK 2. Mybatis 3. Spring 4. Sring Boot 5. Spring Cl ...
- python测试开发django-3.url配置
前言 我们在浏览器访问一个网页是通过url地址去访问的,django管理url配置是在urls.py文件.当一个页面数据很多时候,通过会有翻页的情况,那么页数是不固定的,如:page=1.也就是url ...
- innodb 关键特性(两次写与自适应哈希索引)
两次写: 场景: 当发生数据库宕机时,可能innodb存储引擎正在写入某个页到表中,而这个页只写了一部分,这种情况被称为部分写失效,如果发生,可以通过重做日志进行恢复,重做日志中记录的是对页的物理操作 ...