exists

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

烂漫一生 提交于 2020-03-08 00:54:48
背景介绍 最近在写SQL语句时,对选择IN 还是Exists 犹豫不决,于是把两种方法的SQL都写出来对比一下执行效率,发现IN的查询效率比Exists高了很多,于是想当然的认为IN的效率比Exists好,但本着寻根究底的原则,我想知道这个结论是否适用所有场景,以及为什么会出现这个结果。 网上查了一下相关资料,大体可以归纳为:外部表小,内部表大时,适用Exists;外部表大,内部表小时,适用IN。那我就困惑了,因为我的SQL语句里面,外表只有1W级别的数据,内表有30W级别的数据,按网上的说法应该是Exists的效率会比IN高的,但我的结果刚好相反!! “没有调查就没有发言权”!于是我开始研究IN 和Exists的实际执行过程,从实践的角度出发,在根本上去寻找原因,于是有了这篇博文分享。 实验数据 我的实验数据包括两张表:t_author表 和 t_poetry表。 对应表的数据量: t_author表,13355条记录; t_poetry表,289917条记录。 对应的表结构如下: CREATE TABLE t_poetry ( id bigint(20) NOT NULL AUTO_INCREMENT, poetry_id bigint(20) NOT NULL COMMENT '诗词id', poetry_name varchar(200) NOT NULL COMMENT

vs 代码分析工具——FxCop analyzers & nuget 包 排除

对着背影说爱祢 提交于 2020-03-06 19:27:27
官方文档: Install FxCop analyzers in Visual Studio 1.安装 & 设置成功 2.release版本中删除相关Dll =》项目需要放到docker中,避免每次提交image过大,降低工作效率,故仅在debug时,才加入dll。 2.2.1 方式:编辑项目文件.csproject 修改相关condition : 其他为程序自动添加; 手动修改部分: And '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' <Import Project="..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.2.9.8\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props" Condition="Exists('..\packages\Microsoft.CodeAnalysis.FxCopAnalyzers.2.9.8\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props') And '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " /> <Import Project="..\packages\Microsoft

关系代数中除法的SQL实现

余生长醉 提交于 2020-03-06 01:37:59
关系代数中除法的SQL实现 文章目录 关系代数中除法的SQL实现 引言 除法 笛卡尔积的逆 SQL实现 应用场景举例 集合谓词的缺席 实现减法 实现除法 附录 实验用SQL 引言 关系代数中的运算主要有选择、投影、连接(或者说乘法,即笛卡尔积)、除法,以及集合运算。其中,选择、投影、连接能直接用SQL表达,但除法和大部分集合运算不能。尤其是除法的缺失,使得涉及该操作的查询难以编写。本文将介绍用如何现有SQL实现除法,并分析困难产生的原因。 除法 笛卡尔积的逆 关系除法可以看作笛卡尔积的逆,即对于 R ÷ S R\div S R ÷ S ,其结果为所有满足 T × S ⊆ R T\times S\subseteq R T × S ⊆ R 的 T T T 中最大的那个,有 T = π ( R ) − π ( ( π ( R ) × S ) − R ) T=\pi(R)-\pi((\pi(R)\times S)-R) T = π ( R ) − π ( ( π ( R ) × S ) − R ) 可以将该结论表达为SQL以实现除法吗?在不支持 MINUS , EXCEPT 的数据库中不能。由于R至少有两列,用NOT EXISTS实现MINUS并不简单。 SQL实现 应用场景举例 假设如下关系, 人与技能 person skill 张大仙 LOL 殷子 笑 卫小妹 CV 成少 LOL

mysql--多表连接查询

最后都变了- 提交于 2020-03-05 15:15:19
一.多表连接查询 SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;   1.交叉连接:不适用任何匹配条件.生成笛卡尔积 select * from department,employee; #表用逗号分隔,看我查询时表的顺序,先department后employee,所以你看结果表的这些字段,是不是就是我们两个表字段并且哪个表在前面,哪个表的字段就在前面   2.内连接:只连接匹配的行 select * from employee,department where employee.dep_id=department.id;   3.外连接: 左连接 优先显示左表全部记录 #本质就是:在内连接的基础上增加左边有右边没有的结果 #注意语法: select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;   4.外连接: 右连接 有限显示右表全部记录 本质就是:在内连接的基础上增加右边有左边没有的结果 select employee.id,employee.name,department.name as

quartz 数据库表含义解释

匆匆过客 提交于 2020-03-05 01:26:58
一、表信息解析: 1.1.qrtz_blob_triggers : 以Blob 类型存储的触发器。 1.2.qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范围。 1.3.qrtz_cron_triggers:存放cron类型的触发器。 1.4.qrtz_fired_triggers:存放已触发的触发器。 1.5.qrtz_job_details:存放一个jobDetail信息。 1.6.qrtz_job_listeners:job**监听器**。 1.7.qrtz_locks: 存储程序的悲观锁的信息(假如使用了悲观锁)。 1.8.qrtz_paused_trigger_graps:存放暂停掉的触发器。 1.9.qrtz_scheduler_state:调度器状态。 1.10.qrtz_simple_triggers:简单触发器的信息。 1.11.qrtz_trigger_listeners:触发器监听器。 1.12.qrtz_triggers:触发器的基本信息。 二、Quartz的触发时间的配置的三种方式: 2.1.cron 方式:采用cronExpression表达式配置时间。 2.2.simple 方式:和JavaTimer差不多,可以指定一个开始时间和结束时间外加一个循环时间。 2.3.calendars 方式:可以和cron配合使用

oracle exists,in

吃可爱长大的小学妹 提交于 2020-03-02 06:01:35
oracle中的exists 和not exists 用法详解 (2009-05-14 16:58:18) 转载 ▼ 标签: 杂谈 分类: Oracle 有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。 exists 用法: 请注意 1)句中的有颜色字体的部分 ,理解其含义; 其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于 “select 1 from T1,T2 where T1.a=T2.a” 但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。 “exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。 因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在

查询语句中in和exists的区别

不问归期 提交于 2020-03-02 05:04:45
in in 可以分为三类: 一、 形如 select * from t1 where f1 in ( &apos ; a &apos ;, &apos ; b &apos ;),应该和以下两种比较效率    select * from t1 where f1= &apos ; a &apos ; or f1= &apos ; b &apos ;   或者 select * from t1 where f1 = &apos ; a &apos ; union all select * from t1 f1= &apos ; b &apos ;   你可能指的不是这一类,这里不做讨论。 二、 形如 select * from t1 where f1 in ( select f1 from t2 where t2.fx= &apos ; x &apos ;),   其中子查询的 where 里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成 exist 语句,也就是效率和 exist 一样。 三、 形如 select * from t1 where f1 in ( select f1 from t2 where t2.fx=t1.fx ),   其中子查询的 where 里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如

oracle中in和exists的区别

不羁的心 提交于 2020-03-02 04:59:15
in 和 exists区别 in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。 一直以来认为exists比in效率高的说法是不准确的。 如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 例如:表A(小表),表B(大表) 1: select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引; select * from A where exists(select cc from B where cc=A.cc) 效率高,用到了B表上cc列的索引。 相反的 2: select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引; select * from B where exists(select cc from A where cc=B.cc) 效率低,用到了A表上cc列的索引。 带in的关联子查询是多余的,因为in子句和子查询中相关的操作的功能是一样的。如: select staff_name from staff_member where staff_id in (select staff_id

PHP文件操作类

对着背影说爱祢 提交于 2020-03-01 17:40:31
gistfile1.txt <?php /** * 操纵文件类 * * 例子: * FileUtil::createDir('a/1/2/3'); 测试建立文件夹 建一个a/1/2/3文件夹 * FileUtil::createFile('b/1/2/3'); 测试建立文件 在b/1/2/文件夹下面建一个3文件 * FileUtil::createFile('b/1/2/3.exe'); 测试建立文件 在b/1/2/文件夹下面建一个3.exe文件 * FileUtil::copyDir('b','d/e'); 测试复制文件夹 建立一个d/e文件夹,把b文件夹下的内容复制进去 * FileUtil::copyFile('b/1/2/3.exe','b/b/3.exe'); 测试复制文件 建立一个b/b文件夹,并把b/1/2文件夹中的3.exe文件复制进去 * FileUtil::moveDir('a/','b/c'); 测试移动文件夹 建立一个b/c文件夹,并把a文件夹下的内容移动进去,并删除a文件夹 * FileUtil::moveFile('b/1/2/3.exe','b/d/3.exe'); 测试移动文件 建立一个b/d文件夹,并把b/1/2中的3.exe移动进去 * FileUtil::unlinkFile('b/d/3.exe'); 测试删除文件 删除b/d/3.exe文件

ThinkPHP5无限循环输出无限分类【方案三】

有些话、适合烂在心里 提交于 2020-03-01 09:50:33
首先创建数据库: CREATE DATABASE IF NOT EXISTS `fenlei` DEFAULT character SET utf8 COLLATE utf8_general_ci; USE `fenlei`; CREATE TABLE IF NOT EXISTS `category` ( `catid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `upid` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '上级分类catid', `catname` varchar(255) NOT NULL DEFAULT '' COMMENT '分类名称', `displayorder` tinyint(1) NOT NULL DEFAULT '0' COMMENT '显示顺序', `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0-关闭,1-启用', PRIMARY KEY (`catid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章分类'; INSERT INTO `category` VALUES ('1', '0', '分类1',