首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MYSQL 同样逻辑--四种SQL写法春夏秋冬

那问题就来了,不是说查询慢吗,查询是如何进行查询的,但实际上为什么在这个例子不慢。 MySQL查询是从外部到内部评估查询。也就是说,它首先获取外层表达式的值,然后运行查询并捕获它生成的行。...对于查询有用的优化是“通知”查询,只有内部表达式的条件等于外部表达式的那些行才可以进行优化,将一个适当的等式下推到查询WHERE子句中来实现的。...WHERE 外部条件=内部条件) 我们例子中的写法快的那个恰恰和这个写法相同,在转换之后,MySQL可以使用下推等式来限制它必须检查的行数来计算子查询,记得之前写过一篇关于 ICP 的文字,这里就不说...= 外部条件就不能下推到查询中。...所以这也是为什么人家子查询不慢,你的慢的一个因素,不要认为查询写的一样,结果就一样,各种前期不注意的地方,就能坑你一下。

80060
您找到你想要的搜索结果了吗?
是的
没有找到

盘点数据库中的一些坑(一)

join的笛卡尔积 我们都知道如果join的时候如果关联条件并不唯一,那么就有可能存在笛卡尔积,当然实际上join内连接查询就是通过两表相乘的笛卡尔积的形式进行拼接的,这时如果两个表的关联条件不是唯一的时候...in允许使用多个值 in 可以简化理解为多个OR语句的拼接 查询返回结果必须只有一个值,并且选取结果为true的值 查询会先根据条件把记录全部查出来 在有限并且数据量比较小的时候,in的执行效率很高...exists的用法 exists 返回的结果是一个 boolean 值 true 或者 false ,而不是某个结果集,exists 对外表用 loop 逐条查询,每次查询都会查看 exists条件语句...(row) } } in 和 exists区别 in进行查询会优先执行查询的内容,然后根据结果进行筛选,所以数据量比较小的时候in是比较快的。...外层查询表小于查询表,则用 「exists」 「,外层查询表大于查询表,则用 「in」 ,如果外层和查询表差不多,则爱用哪个用哪个。」

34320

Semi-join使用条件,派生表优化 (3)—mysql基于规则优化(四十六)

上面两个sql适用内连接,总结下来就是: 该组合必须和in组成布尔表达式,并在外层的where和on出现。 外层也可以有其他搜索条件,in查询搜索条件必须和and连接。...不适用semi-join 外层的where条件有其他其他搜索条件查询用or连接 SELECT * FROM s1 WHERE key1 IN (SELECT common_field FROM...(注意,这里物化之后是不能转成内连接,只能先扫描s1表,看key1的值是不是在物化表内) 不管是相关查询还是不想管查询,都可以吧in转换成exists查询,其实对于任意的in都可以转成exists,...OR key2 > 1000; 说到底,为什么要转换呢,这样就可以使用s2.key3的索引查询了,这样不是更快吗?...[NOT]EXISTS查询执行 SELECT * FROM s1 WHERE EXISTS (SELECT 1 FROM s2 WHERE key1 = 'a') OR key2

60320

数据库查询优化技术(二):查询优化

3连接操作 对应的是连接对象条件(格式类似“field_1field_2”,field_1和field_2表示不同表的列对象,op是操作符如“=”、“>”等),表示两个表连接的条件。...4 表查询 查询返回的结果集类型是一个表(多行多列)(return a table, one or more rows of one or more columns)。 为什么要做查询优化?...1 查询合并(SubQuery Coalescing) 在某些条件下(语义等价:两个查询块产生同样的结果集),多个子查询能够合并成一个查询(合并后还是查询,以后可以通过其他技术消除掉查询)。...a1<10 AND( EXISTS(SELECT a2 FROM t2 WHERE t2.a2<5 AND (t2.b2=1 OR t2.b2=2))         /*两个ESISTS子句合并为一个...from t1 where t1.a1>(select min(t2.a2) from t2); Q:MySQL为什么不支持聚集子查询消除?

3.1K00

Oracle 中的SELECT 关键字(查询、检索)

=,,,=,any,some,all 条件判断 列:查询工资大于2000的员工信息 select * from emp where sal>=2000 ; 列:查询工资等于800或3000...,数值不用加单引号 5. exists(sub-query)、not exists(sub-query) 查询 sub-query:查询 exists(sub-query):满足该条记录的查询时(...有查找到)执行该条记录父查询 not exists(sub-query):不满足该条记录的查询时执行父查询 如:select * from emp where exists(select *from...dept where LOC = 'DALLAS'); 查询中 LOC列存在DALLAS则执行父查询返回emp中所有列 注:exists是逐条记录去比较,查询能查到才会去执行父查询,同样子查询只有能查到结果就会执行父查询...,所有一般需要添加其他条件,例如: 使用exists查询部门名称为SALES和RESEARCH 的雇员姓名、工资、部门编号。

3.2K10

不要再问我 in,exists 走不走索引了...

区别是,用 exists 时,若查询查到了数据,则返回真。用 not exists 时,若查询没有查到数据,则返回真。 由于 exists 查询不关心具体返回的数据是什么。...(准确的说应该是常量值) in, exists 执行流程 1、 对于 in 查询来说,会先执行查询,如上边的 t2 表,然后把查询得到的结果和外表 t1 做笛卡尔积,再通过条件进行筛选(这里的条件就是指...2、对于 exists 来说,是先查询遍历外表 t1 ,然后每次遍历时,再检查在内表是否符合匹配条件,即检查是否存在 name 相等的数据。...(没有官方确切说法,所以,仅供参考) 多表涉及查询 我们主要是去看当前的这个例子中的两表查询时, in 和 exists 是否走索引。...按照网上对 in 和 exists 区别的通俗说法, 如果查询两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则查询表大的用exists查询表小的用in; 对应于此处就是

1.7K20

MySQL查询语句中的IN 和Exists 对比分析

好,但本着寻根究底的原则,我想知道这个结论是否适用所有场景,以及为什么会出现这个结果。...,查询条件是tabA.x在结果集B里面,可以使用到tabA表的索引x。...第二次实验 数据情况 t_author表,13355条记录;t_poetry表,查询筛选结果集 where poetry_id>3650 ,287838条记录; 执行时间 使用exists耗时0.12S...font color=red>查询结果集很大的情况下能显著改善查询匹配效率: 实验结论 根据上述两个实验及实验结果,我们可以较清晰的理解IN 和Exists的执行过程,并归纳出IN 和...具体查询条件为: where tp.poetry_id>3650,耗时0.13S where tp.poetry_id>293650,耗时0.46S 可能原因:条件值大,查询越靠后,需要遍历的记录越多,

1K10

MySQL(七)|MySQL中In与Exists的区别(1)

如果你试图在网上找出答案,你会发现所有的博客都是写着: 如果两个表中一个表大,另一个是表小,那么IN适合于外表大而查询表小的情况;EXISTS适合于外表小而查询表大的情况。...1.1、exists exists对外表用loop逐条查询,每次查询都会查看exists条件语句,当exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop...from user where user_id = 1 or user_id = 2 or user_id = 3; 总结:in查询就是先将查询条件的记录全都查出来,假设结果集为B,共有m条记录,然后再将查询条件的结果集分解成...通过以上分析,很容易得出下面的结论: 1、如果查询两个表大小相当,那么用in和exists差别不大。 2、如果两个表中一个表大,另一个是表小,那么IN适合于外表大而查询表小的情况。...3、如果两个表中一个表大,另一个是表小,EXISTS适合于外表小而查询表大的情况。 在一般情况下确实如此,这里需要考虑到索引原因。但特殊情况是什么情况呢?我目前也不知道。

14.9K61

MySQL(八)|MySQL中In与Exists的区别(2)

都写出来对比一下执行效率,发现IN的查询效率比Exists高了很多,于是想当然的认为IN的效率比Exists好,但本着寻根究底的原则,我想知道这个结论是否适用所有场景,以及为什么会出现这个结果。...表的查询查询条件是tabA.x在结果集B里面,可以使用到tabA表的索引x。...第二次实验 数据情况 t_author表,13355条记录;t_poetry表,查询筛选结果集 where poetry_id>3650 ,287838条记录; 执行时间 使用exists耗时0.12S...MySQL查询语句中的IN 和Exists 对比分析 实验结论 根据上述两个实验及实验结果,我们可以较清晰的理解IN 和Exists的执行过程,并归纳出IN 和Exists的适用场景: IN查询在内部表和外部表上都可以使用到索引...具体查询条件为: where tp.poetry_id>3650,耗时0.13S where tp.poetry_id>293650,耗时0.46S 可能原因:条件值大,查询越靠后,需要遍历的记录越多

1.8K40

oracle 查询转换初探

查询展开 查询展开是指优化器不再把子查询作为独立的单元处理,而是转换成等价的join方式。...查询前包含以下条件可以被展开: · any(= any和in等价) · all( all和not in等价) · exists ·...not exists · single row条件where后面接=,,=等条件查询展开的例子: 最终转换的语句: 可以看到查询中的dept表被拆出来,与外部查询块的...如果满足(不限于)下面的条件查询展开可能导致转换不等价,因此将不作展开: · where后面的连接符为=all或者any · exists后面的查询中带有rownum · exists后面的查询中带有...星型转换 星型转换为提高星型查询的效率发生,在原有条件基础上会产生新的查询对事实表做过滤,然后通过对事实表相应连接列的位图索引做位图操作,达到过滤事实表结果集的目的。

1.5K50

让SQL起飞(优化)

1.1 查询EXISTS代替IN 当IN的参数是查询时,数据库首先会执行查询,然后将结果存储在一张临时的工作表里(内联视图),然后扫描整个视图。很多情况下这种做法都非常耗费资源。...EXISTS时更快的原因有以下两个。...(同样的IN也可以使用索引,这不是重要原因) 如果使用EXISTS,那么只要查到一行数据满足条件就会终止查询,不用像使用IN时一样扫描全表。在这一点上NOT EXISTS也一样。...实际上,大部分情况在查询数量较小的场景下EXISTS和IN的查询性能不相上下,由EXISTS查询更快第二点可知,查询数量较大时使用EXISTS才会有明显优势。...原因有两个: 使用GROUP BY子句聚合时会进行排序,如果事先通过WHERE子句筛选出一部分行,就能够减轻排序的负担。 在WHERE子句的条件里可以使用索引。

1.4K42

MyBatis框架中的条件查询!关键字exists用法的详细解析

exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句...not exists: 如果括号内子查询语句结果为空,说明表示条件成立,就会执行主语句 如果括号内子查询语句结果不为空,说明表示条件不成立,就不会执行主语句 使用示例 exists: SELECT..., exists, not exists的区别: in: 确定给定的值是否与查询或者列表中的值匹配 in关键字选择与列表中任意一个值匹配的行 in关键字之后的项目必须用逗号隔开,并且括在括号中 not...in: 通过not in关键字引入的查询也返回一列零值或更多值 exists: 指定一个查询,检测行的存在 相当于两个集合的交集 exists后面可以是整句的查询语句 ,in后面只能是单列查询语句...not exists: 相当于两个集合的差集 exists和not exists返回的结果类型是Boolean: 如果子查询包含行: exists返回TRUE not exists返回FALSE

1.3K20

102-not in和not exists到底选哪个?这个问题有点复杂,但是结论很简单,不要被专家们带偏了。

但是not in(查询)不一样,如果满足条件,确实是可以走索引的,如上图所示。 既然大师都容易搞混的问题,我就想多花点时间再补充几句,于是就有了这篇文章。...正文: 网上关于not in和not exists的分析文章很多, 很多人都知道了下面两个知识点: 1.not in的写法在查询存在null记录的时候,整个查询结果为空(老虎刘注:这个情况不是数据库的...4.not in会优先扫描查询里面的表, 如果发现有null值就马上返回空结果集,不用再扫描主查询了;如果子查询没有null记录,会使用跟not exists一样的执行计划: 老虎刘简单点评: 通过两个反例来证明...如果关联字段上没有not null约束,而是sql中分别在主查询查询中增加is not null条件, 也等同于加了not null约束; 这种情况,如果适合走索引,not in和not exists...这也是为什么not exists被推荐使用的原因之二。

38140

Mysql数据库-查询

在上面的操作中,虽然查询出了结果。但是却分开了两个SQL语句来执行,这就导致效率不高的问题了。 -- 那么怎么解决呢? 可以使用查询。...行查询(一行) 少见 # 特点: 1. 查询放在小括号内 2. 查询一般放在条件的右侧 3. 使用注意点 a....查询exists 之后 在熟悉 exists查询使用之前,我们首先要了解一下 exists 的基本语法格式: # 语法: exists(完整的查询语句) # 特点: exists查询...同上, where 条件后面的 1,我们也可以使用 exists() 方法来替换,如下: select * from emp where exists(select * from emp where salary...视情况而定 -- 其他条件相同(有索引) -- 1. 主查询的结果集数量 比 查询的多 用 in -- 2. 主查询的结果集数量 比 查询少 用 exists

45.4K10

【MySQL】多表联合查询、连接查询查询「建议收藏」

文章目录 【1】连接查询 内连接查询 外连接查询 左连接 右连接 【2】联合查询 【3】查询 带in关键字的查询 带比较运算符的查询exists查询 带any关键字的查询 带all关键字的查询...基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段; on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id) 当两个表中存在相同意义的字段的时候...where sex="man" order by score;) 这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。...带exists查询 exists: 是否存在的意思, exists查询就是用来判断某些条件是否满足(跨表), exists是接在where之后 exists返回的结果只有0和1....any关键字的查询 any关键字表示满足其中的任意一个条件,使用any关键字时,只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句。

3.8K20

MySQL 相关子查询

我们先来弄清楚两种 SQL 的 explain 结果中,查询的 type、ref 列为什么会显示不一样?...) 在查询准备阶段,还没有确定子查询的执行策略之前,就会把主查询 where 条件中的 IN 条件字段和查询 select 子句中的字段组成新条件,并附加到查询where 条件中。...,如果查询优化阶段决定 IN 查询不转换为相关子查询,附加到查询 where 条件中的新条件怎么办?...8 如果执行查询查到了记录,说明主查询记录满足 city_id < 100 和 EXISTS 查询两个条件,把主查询记录返回给客户端,否则,回到步骤 1。...由于判断主查询记录是否匹配 IN 查询条件时,需要执行查询,成本比较高,所以,我们写 SQL 的时候最好是把不包含查询where 条件放在前面,包含查询where 条件放在最后。

47930
领券