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条件的记 ...
随机推荐
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)
1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...
- XenApp6.5产品BUG
外网登录报错,手机登录报错问题解决: XenApp6.5产品BUG, 在WI服务器的两个web站点中修改defalut.ica文件中添加一行,CGPAddr=即可. 路径:C:\inetpub\www ...
- Faiss in python and GPU报错:NotImplementedError: Wrong number or type of arguments for overloaded function 'new_GpuIndexFlatL2'.
最近在玩faiss,运行这段代码的时候报错了: res = faiss.StandardGpuResources()flat_config = 0index = faiss.GpuIndexFlatL ...
- mysql 定时计划任务 wish 按照id分组定时循环启动
SELECT count(*) FROM wish_sellers_in;UPDATE wish_sellers_in SET act_status =0 WHERE id >=1 AND ...
- 解析如何实现微信唤醒默认浏览器下载app教程!
前言 现如今微信对第三方app下载链接的拦截是越来越严格了,下载链接在微信中分享转发经常会被拦截,一旦被拦截用户就只能复制链接手动打开浏览器粘贴才能访问,如此给用户带来的体验台差,用户量无法有效地累积 ...
- 容器——list(双向链表)
做了一道list可以解决的题,才发现list多么的好 转自https://www.cnblogs.com/BeyondAnyTime/archive/2012/08/10/2631191.html 1 ...
- Python创建随机用户名密码并存放于Access数据库
利用random库随机生成4到32位包含字母跟数字的用户名密码,利用win32com库连接到access数据库并写入table,要更改创建的用户名密码数量修改18行代码的数字即可. import wi ...
- springmvc+mybatis环境搭建
1.spring+mybatis 环境搭建: A.配置jdbc和dbcp数据源:注意版本com.mysql.cj.jdbc.Driver B.配置sessionfactory,绑定dbcp及配置map ...
- 前端生成pdf
https://stackoverflow.com/questions/31610129/pdfmake-html-table-to-pdfmake-table https://www.jianshu ...
- C#读取OPC server
1.安装opc server https://blog.csdn.net/yhtppp/article/details/80676118 2.c#读取opc https://github.com/le ...