sql语句exists 用法
参考:SQL语句exists用法,Sql语句中IN和exists的区别及应用
现在有三张表
学生表S: sno ,sname
课程表C:cno ,cname
学生选课表SC: sno ,cno
查询选了所有课程的学生信息
SELECT *
FROM S T1
WHERE NOT EXISTS (SELECT 1
FROM C T2
WHERE NOT EXISTS (SELECT 1
FROM SC T3
WHERE T1.SNO = T3.SNO
AND T2.CNO = T3.CNO))
我理解就是,上面的语句是查询不存在每门课都没有选的学生,那就是选择了所有课程的学生。上面的语句使用了两个NOT EXISTS,如果使用EXISTS又是什么意思呢?
SELECT *
FROM S T1
WHERE EXISTS (SELECT 1
FROM C T2
WHERE NOT EXISTS (SELECT 1
FROM SC T3
WHERE T1.SNO = T3.SNO
AND T2.CNO = T3.CNO))
查询存在着有一门课没有选择的学生信息。
SELECT *
FROM S T1
WHERE NOT EXISTS (SELECT 1
FROM C T2
WHEREEXISTS (SELECT 1
FROM SC T3
WHERE T1.SNO = T3.SNO
AND T2.CNO = T3.CNO))
查询不存在选择了一门课的学生,就是查询没有选课的学生信息。
SELECT *
FROM S T1
WHERE EXISTS (SELECT 1
FROM C T2
WHEREEXISTS (SELECT 1
FROM SC T3
WHERE T1.SNO = T3.SNO
AND T2.CNO = T3.CNO))
查询选择了一门课或多门课的学生信息,就是查询至少选择了一门课的学生信息。
平常用的多是IN,那么IN和EXISTS有什么区别呢?
对IN执行过程的描述
确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。
对EXISTS执行过程的描述
定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
区别即应用场景
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
sql语句exists 用法的更多相关文章
- SQL语句exists用法
首先头脑中有三点概念: 1 . EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2 . 建立程序循环的概念,这是一个动态的查 ...
- SQL语句---nvl 用法
SQL语句---nvl 用法 一NVL函数是一个空值转换函数 NVL(表达式1,表达式2) 如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值. 该函数的目的是把一个空值(nul ...
- SQL 语句日期用法及函数
SQL 语句日期用法及函数 --DAY().MONTH().YEAR()——返回指定日期的天数.月数.年数:select day(cl_s_time) as '日' from class --返回天 ...
- SQL语句的用法
1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME DROP COLUMNc ...
- sql 中 exists用法
SQL中EXISTS的用法 比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(S ...
- SQL语句——exists和in区别
表结构及数据 user表 order表 in select * from table A where id in (xxxxxxxxxxx):满足条件的数据会被查出来: 先查询子查询的表,然后将内表. ...
- 6 Django系列之关于models的sql语句日常用法总结
preface Django提供了强大的ORM,我们可以通过ORM快速的写出我们想要对数据做什么样操作的代码.下面就说说我在日常工作中的用法: 外键关联精确查询 应用场景:表A host字段关联到了表 ...
- “取出数据表中第10条到第20条记录”的sql语句+selecttop用法
1.首先,select top用法: 参考问题 select top n * from和select * from的区别 select * from table -- 取所有数据,返回无序集合 sel ...
- sql中exists和notexists用法总结(并和in的比较)
首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如 ...
随机推荐
- 【maven】IDEA:存在jar包,pom.xml文件没报错,但是Maven-Project-Dependencies有红线报错
1.这个问题很简单 把pom.xml里这些出错的jar包的引用先删除,再刷新一次,再添上,就行了 2.大概是idea有点反应迟钝
- MSDN上对yield关键字的示例
public class PowersOf2 { static void Main() { // Display powers of 2 up to the exponent of 8: , )) { ...
- java面试题全集(下)
这部分主要是开源Java EE框架方面的内容,包括Hibernate.MyBatis.Spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试 ...
- phpstudy使用PHP+nginx配置Laravel
一.需要注意把vhosts.conf文件内root项目路径的\换成/例如 root "D:/laravelApp/test/public"; 二.若文件根目录下没有 .env1.. ...
- ACM常用之 异或运算的性质。
- MyBatis:Parameter Maps collection does not contain value for 的问题解决
Result Maps collection does not contain value for frontpreviewprofitManage.cdata 出现上述错误 主要是因为你的sel ...
- java面向对象4-多态
5 多态 5.1多态:polymorphism概念 定义:某一类事物的多种存在形态表现形式:父类变量指向子类实例 例:动物中猫,狗 猫这个对象对应的类型是猫类型 猫 x = new 猫(); 同时猫也 ...
- select 语句关键字优先级
1.select 语句优先级 select classid, userid, name, age from study where userid > 15 group by classid ha ...
- Jackson和fastjson简单用法及性能对比
背景: Java处理JSON数据有三个比较流行的类库FastJSON.Gson和Jackson.fastjson是阿里做的国有开源Java工具包,jackson是spring mvc内置的json转换 ...
- Codeforces 988D Points and Powers of Two ( 思维 || 二的幂特点 )
题目链接 题意 : 给出坐标轴上的 n 个点的横坐标,要你选出最多的点,使得这些点两两距离是二的幂 ( 特殊情况 : 选出的集合只有一个点也满足条件 ) 分析 : 官方题解已经说的很好了 最关键是是判 ...