LEFT JOIN、Right、Full后ON和WHERE的区别
今天在工作的时候碰到了一个问题,A表B表left join后在on后面关于A表的条件过滤语句没起到我想要的过滤作用,还是对左连接等理解的不够呀。
SELECT * FROM student;
SELECT * FROM class;
以下是两张表的查询结果:

student表 class表
先来看一下student表和class表根据cla_id左连接返回的结果
SELECT * FROM student stu
LEFT JOIN class cla
ON stu.cla_id = cla.cla_id
返回的结果也正如我的预期,那么就再来看看加上一个stu_id=1条件后返回的结果
SELECT * FROM student stu
LEFT JOIN class cla
ON stu.cla_id = cla.cla_id
AND stu.stu_id=1
我当时怎么也想不明白,天怎么会返回四条记录,我不是在后面加了个stu_id=1的条件吗?不是过滤了student表应该只返回第一条数据吗?当时听一些人说不管on后面跟什么条件,
左表的数据会全部查出来,因此要想过滤需要把条件放到where后面比如把SQL改成这样:
SELECT * FROM student stu
LEFT JOIN class cla
ON stu.cla_id = cla.cla_id
WHERE stu.stu_id=1
那么on和where的区别就在于:
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录,而where条件是在临时表生成好后,再对临时表进行过滤的条件。而且除了stu_id=1的
那条记录,class表中字段不满足过滤条件的记录(即使被关联到了)全是NULL,所以on后面的语句最好只写两个表相关联的语句,并不能做单方面的过滤。也可以这么简单的理解,以坐标
为主,先查询出左表的全部记录,然后关联右表,将符合条件的记录的数据填充进查询出来的结果。right join 和 full join 具有相同的特性,但是inner join不同,它可以在on 那
里做过滤处理,也就是说放在on后面和where后面作用是一样的。
顺便提一下,当我们对一个字段进行了处理重命名后,就直接在where语句后面用做过滤条件的话,会报不能识别的列。下面我以mysql的方言为例。
SELECT id, begintime, from_unixtime((UNIX_TIMESTAMP(begintime)*1000+auctiontime)/1000) AS endtime FROM auctioncommendity where endtime>NOW();
这条语句会提示endtime是不能识别的列,要在这个查询作为一个结果集在外围where条件做过滤才可行,例如这样:
select a.* from (SELECT id, begintime, from_unixtime((UNIX_TIMESTAMP(begintime)*1000+auctiontime)/1000) AS endtime FROM auctioncommendity ) a
where endtime>NOW();
但是又有些情况下是可以的,比如order by 和group后在having后面做过滤不需要用到子查询就可以直接使用经过处理的重命名字段。关于原因....先睡觉,以后再找
话说写博客可真花时间呀.....
LEFT JOIN、Right、Full后ON和WHERE的区别的更多相关文章
- left join on 后and 和 where 的区别
SELECT * FROM student a LEFT JOIN sc b ON a.Sid = b.Sid AND a.Sname="赵雷" 结果:(left join 左连接 ...
- mysql中join后on、where的区别
SELECT * FROM A; SELECT * FROM B; 以上是两张表的机构 SELECT * FROM A LEFT JOIN B ON A.id=b.a_id ; ; ; 两个语句查询出 ...
- mysql left join中on后加条件判断和where中加条件的区别
left join中关于where和on条件的几个知识点: .多表left join是会生成一张临时表,并返回给用户 .where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件的记 ...
- MySQL left join操作中 on与where放置条件的区别
优先级 两者放置相同条件,之所以可能会导致结果集不同,就是因为优先级.on的优先级是高于where的. 1 1 首先明确两个概念: LEFT JOIN 关键字会从左表 (table_name1) 那里 ...
- sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十五)
Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...
- java中sleep和join和yield和wait和notify的区别
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- MySQL的join on和 where 的执行顺序和区别,以及各种连接说明
目录 1.各种连接的解读说明: 1.1.各种连接的含义和说明 1.1.1 所有连接分类 1.1.2 left join 和 left outer join 区别 1.2.神图参考 1.4.一些参考说明 ...
- [Reprint]C++函数前和函数后加const修饰符区别
c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...
- C++函数前和函数后加const修饰符区别
class Test(){ public: Test(){} const int foo(int a); const int foo(int a) const; }; 一.概念 当const在函数名前 ...
随机推荐
- lagstash + elasticsearch + kibana 3 + kafka 日志管理系统部署 02
因公司数据安全和分析的需要,故调研了一下 GlusterFS + lagstash + elasticsearch + kibana 3 + redis 整合在一起的日志管理应用: 安装,配置过程,使 ...
- Sqli-labs less 17
Less-17 本关我们可以看到是一个修改密码的过程,利用的是update语句,与在用select时是一样的,我们仅需要将原先的闭合,构造自己的payload. 尝试报错 Username:admin ...
- Sqli-labs less 46
Less-46 从本关开始,我们开始学习order by 相关注入的知识. 本关的sql语句为$sql = "SELECT * FROM users ORDER BY $id"; ...
- 金融证券协议FIX/FAST/STEP
金融信息交换协议FIX是适用于实时证券.金融电子交易的数据通信标准.它是把各类证券金融业务需求流程格式化,使之成为一个可用计 算机语言描述的功能流程,并在每个业务功能接口上统一交换格式.STEP(Se ...
- sql Server2005 master损坏处理
一.准备条件 a) 假设Master 数据库Hung:关闭SQL Server 服务(关闭MSSQLSERVER,SQL Server Agent其他的没有影响),然后剪切C:/Pro ...
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- CF 197 DIV2 Xenia and Bit Operations 线段树
线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...
- OpenGL程序运行提示glut32.dll丢失问题
转: http://blog.csdn.net/liufeng520/article/details/8064170 今天调试OpenGl的源程序,编译通过,但一运行就提示,计算机丢失 glut32. ...
- 【查找结构 2】二叉查找树 [BST]
当所有的静态查找结构添加和删除一个数据的时候,整个结构都需要重建.这对于常常需要在查找过程中动态改变数据而言,是灾难性的.因此人们就必须去寻找高效的动态查找结构,我们在这讨论一个非常常用的动态查找树— ...
- TCP释放连接的四次挥手过程
TCP断开连接的过程:TCP四次挥手. 数据传输结束后,通信的双方都可释放连接.现在A和B都处于ESTABLISHED状态.A的应用进程先向TCP发出连接释放报文段,主动关闭TCP连接.A把连接释放报 ...
返回的结果也正如我的预期,那么就再来看看加上一个stu_id=1条件后返回的结果
我当时怎么也想不明白,天怎么会返回四条记录,我不是在后面加了个stu_id=1的条件吗?不是过滤了student表应该只返回第一条数据吗?当时听一些人说不管on后面跟什么条件,