SQL语句中left join后用on还是where,区别大了!

兄弟你好,我们来说说面试的事情吧。
几年前的一次采访中,有人问我 LEFT JOIN 中 ON 和 WHERE 的区别。
我当时就是按照书上说的做的。
创建临时表时使用ON,过滤结果为WHERE。
据此,面试官当场要求他写SQL。
啊,当我运行它时,我想,“为什么不呢?”
我记得那年在北京面试一份大数据相关的工作。
面试官很年轻,问的问题也很有趣。
当时我用的是LEFT JOIN连接两张表,一张大表一张小表。
按理来说,一个大表中的所有记录都应该显示出来。
如果小表中没有匹配项,则应使用 NULL 代替。
然而,在ON条件下,即使小表中没有匹配的记录,大表中的所有记录仍然会出现。
这让我有点困惑。

想了想,发现这个ON条件其实是在创建临时表的时候用到的。
无论条件是否成立,都将包含大表中的记录。
这就像摆桌子一样。
不管你喜欢不喜欢桌子上的东西,桌子都得先摆好,对吧?
然后我尝试使用 WHERE 条件。
啊,这回有点意思了。
临时表建立起来了,但是WHERE条件就像一个筛子,过滤掉所有不符合条件的记录。
和桌子上的一样。
如果不合适,请勿将其留在那里。

当时我突然意识到ON和WHERE的活动时期和范围是不同的。
ON 在创建临时表时适用,WHERE 在创建临时表后过滤掉。
这两种情况的区别就像盖房子一样,先打地基,后装修。

当时我就觉得这个面试官很能干,给我上了宝贵的一课。
后来专门查了资料,发现INNER JOIN其实和LEFT JOIN的ON条件有些类似,只不过INNER JOIN只返回匹配的记录,排除不匹配的记录。

兄弟,如果你面试的时候遇到这个问题,别忘了ON和WHERE的区别。
利用这两个条件将使你的SQL查询更加准确和高效。
虽然这些只是一些细节,但其实非常重要。
在我们这个行业,细节决定成败!

mysql中where的用法 where条件查询语句使用详解

WHERE子句直接过滤数据,效率很高。

筛选薪资>5 000 名员工: sql 选择名字、姓氏、工资 来自员工 工资>5 000在哪里;
并且优先级高于OR。
括号控制优先级。
sql 选择名字、姓氏、部门 来自员工 地点(薪资 > 5 000 AND 部门 = 'IT') OR(薪资 > 7 000 AND 部门 = '销售');
= 比较相等。
!= 不等于。
< 超过。
<= 小于或等于。
查询BETWEEN范围(包括边界)。
sql 选择产品名称、价格 来自产品 价格从 1 0 到 5 0 是哪里;
IN 匹配列表值。
sql 选择客户名称 来自客户 B 国在哪里(“美国”、“加拿大”、“墨西哥”);
喜欢模糊匹配。
%任意字符。
_一个字符。
sql 选择名字、姓氏 来自员工 姓氏在哪里,比如“Joh%”;
NOTLIKE 排除匹配项。
使用 WHERE 函数将使索引无效。
sql -
错误演示(索引失败) SELECT FROM order WHERE YEAR(order_date) = 2 02 3 ;
-
优化计划 从订单中选择 WHERE order_date >= '2 02 3 -01 -01 ' AND order_date < '2 02 4 -01 -01 ';
条件序列的优化:首先,选择性高。
sql -
初始请求(可能无效) SELECT FROM h3_table WHERE status = 'active' AND user_id = 1 2 3 ;
-
优化后 从 h3_table 中选择,其中 user_id = 1 2 3 AND status = 'active';
数据类型必须一致。
sql -
错误示范 SELECT FROM products WHERE Product_code = 1 2 3 ;
-
正确演示 从产品中选择,其中product_code = '1 2 3 ';
ISNULL 处理 NULL 值。
可用子查询。
表达式评估支持。
sql 从订单中选择,其中 Shipping_address 为 NULL;
从产品中选择,其中类别_id IN (从类别中选择 ID,其中parent_id = 5 );
最佳实践: 1 、WHERE使用索引字段 2 .避免复杂的嵌套条件 3 、严格类型匹配 4 、无需计算函数。
5 . 重写无效查询 6 . 解释分析计划:自己权衡一下。

group、 having、 where的区别有哪些?

等等,我昨天帮邻居老王修电脑的时候,他正在用SQL查询库存。
他指着屏幕说道:“就是这个地方,GroupB,发生的事情真是一件大事。
”当时我翻了他们的打印单据,上面写着一个例子,好像是查某个仓库的货物数量,但是结果总是错的。

我记得那是2 02 3 年1 0月2 6 日下午,阳光透过窗户照进来,她敲着键盘,发出“啪”的一声。
他突然说道:“哎,你看这个数据,GROUP BY之后还需要用HAVING吗?”我弯下腰看着他。
屏幕上有一条声明。
最后添加一个ORDER BY聚合DESC,然后对数据进行归一化。
她拍着大腿说道:“这说明你必须先对分组进行排序,然后进行筛选,最后进行排序!”
我突然想到,是不是她的仓库管理系统升级数据库后出现了问题?他曾经使用旧版本的 SQL,但他现在切换到的版本对语句顺序特别严格。
他查了资料,说现在很多数据库优化器都会调整执行顺序,但最好按照规范来写。
等等,这就像编程中先初始化变量然后赋值一样。
如果顺序错误,就会出现bug。

例如这样的语句: SQL 选择类别、数量(件数)、价格 从库存中 过期地点 > '2 02 3 -1 2 -3 1 ' 按类别分组 计数(项目)> 1 0 ORDER BY PRICE DESC
他讲解了如何使用WHERE先过滤掉过期时间较长的商品,然后按类别分组,确保每组至少有1 0个商品,最后按价格降序排序。
如果顺序不正确,例如处于第一顺序,则可能无法正确应用分组条件。

老王说,他现在写SQL的时候,有先写过滤条件,然后做分组,最后过滤分组结果的习惯。
他还给我看了一张截图。
上面有错误信息:“Invalid use of group function”,说是直接在查询中使用了非聚合字段age。
当时他改了好几次才解决。

但是我想,如果数据量特别大,比如他的仓库里有几百万条记录,这样的查询会不会特别慢?他检查了性能日志,发现当 groupby 和 on 时,CPU 负载实际上是最高的。
加上索引后就好多了。
他给我看了一个号码。
结果发现,在不添加索引的情况下,查询耗时超过1 分钟,而添加索引后,查询耗时不到1 0秒。

现在想一想,这个SQL语句的顺序是不是和我们日常工作的逻辑很相似呢?首先定义条件(where),然后分类处理(group by),最后过滤结果(having)。
如果顺序颠倒的话,结果肯定是错误的。
正确的就像我帮老王修电脑时一样,首先要查病毒(哪里),然后按区域(按组)清理,最后整体优化(是)。

他最后说,其实很好理解。
数据库优化器会帮助我们优化,但是我们在写的时候还是要遵循规则的。
他指着我说,如果再遇到嵌套查询,我可能又会头疼了。