精华内容
下载资源
问答
  • 主要介绍了mysql exists与not exists实例详解的相关资料,鉴于 not exists 的效率往往要高于 not in , 所以一般情况下会使用前者替代后者,需要的朋友可以参考下
  • exists,not exists的使用方法示例,需要的朋友可以参考下。
  • exists与not exists的原理讲解

    万次阅读 多人点赞 2018-07-23 15:43:48
    在项目后期优化部分,mysql优化势必是一个重头戏,今天笔者就sql中的exists与not exist的原理及用法给大伙讲解一番,希望能给大家带来启发; 2.原理解释 EXISTS (sql 返回结果集为真) NOT EXISTS(sql 不返回结果...

    1.场景还原

        在项目后期优化部分,mysql优化势必是一个重头戏,今天笔者就sql中的exists与not exist的原理及用法给大伙讲解一番,希望能给大家带来启发;

    2.原理解释

    EXISTS (sql 返回结果集为真)
    NOT EXISTS(sql 不返回结果集为真(或返回结果集为假))

    3.拆解过程

    ①exists与not exists案例解析

    SELECT
     A.*
    FROM
     A
    WHERE
    EXISTS (SELECT B.* FROM B WHEN A.id = B.id)

    SELECT
     A.*
    FROM
     A
    WHERE
    NOT 
    EXISTS (SELECT B.* FROM B WHEN A.id = B.id)

    首先mysql底层先执行

    SELECT A.* FROM  A

    然后将其结果集作为条件,在where中进行筛选,exists筛选结果集为true的数据项,而not exists相反,返回结果集为false的数据项

    4.exists与in,not exists与not in的区别

    ①当A表数据大于B表数据时,选择in比exists执行效率要高

    实现同上述exits的效果

    SELECT
     A.*
    FROM
    展开全文
  • mysql 子关联查询之 EXISTS 和 NOT EXISTS(一)

    万次阅读 多人点赞 2019-03-05 21:24:46
    MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT … FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据...

    MySQL EXISTS 和 NOT EXISTS 子查询语法如下:

    SELECT … FROM table WHERE EXISTS (subquery)

    该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。

    范例一:

    下面以实际的例子来理解 EXISTS 子查询。下面是原始的数据表:

    article 文章表:

    aidtitlecontentuid
    1文章1文章1正文内容…1
    2文章2文章2正文内容…1
    3文章3文章3正文内容…2
    4文章4文章4正文内容…4

    user 用户表:

    uidtitlecontent
    1adminadmin@5idev.com
    2小明xiao@163.com
    3Jackjack@gmail.com

    我们要查出 article 表中的数据,但要求 uid 必须在 user 表中存在。SQL 语句如下:

    SELECT * FROM article WHERE EXISTS (SELECT * FROM user WHERE article.uid = user.uid)

    返回查询结果如下:

    aidtitlecontentuid
    1文章1文章1正文内容…1
    2文章2文章2正文内容…1
    3文章3文章3正文内容…2

    从语句执行结果可以看出,article 表中第 4 条记录没有被保留,原因就是该条记录的数据在子查询中返回的结果是 FALSE 。 
    当上面的 SQL 使用 NOT EXISTS 时,查询的结果就是 article 表中 uid 不存在于 user 表中的数据记录。

    范例二:

    我们先介绍下使用的3个数据表:

    student数据表:

    sno 学号snamessexsage
    20161181Altair20
    20161182Desmond18
    20161183Ezio22
    20161184Christina19

    course数据表:

    cno 课程编号cname 课程名
    1C语言
    2数据结构
    3信号与系统
    4模拟电子技术
    5高数

    sc数据表:

    sno 学号cno 课程编号grade 成绩
    20161181199
    20161182298
    20161181297
    20161181395
    20161184392
    20161181490
    20161181588
    20161183558

    EXISTS

    EXISTS代表存在量词∃。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或者逻辑假值“false”。

    查询选修了课程”信号与系统“的同学 

    其他方式:

                   还可以通过三表联查的方式查询(join)

    SELECT s.Sname FROM student s
    WHERE EXISTS  
    (SELECT * FROM sc, course c WHERE sc.sno = s.sno AND sc.cno = c.cno AND c.cname = '信号与系统')

    使用存在量词EXISTS后,若内层查询结果为非空,则外层的WHERE子句返回值为真,否则返回值为假。

    在本例中,首先分析最内层的语句:

    SELECT * FROM sc, course c WHERE sc.sno = s.sno AND sc.cno = c.cno AND c.cname = '信号与系统'

    本例中的子查询的查询条件依赖于外层父查询的某个属性值(本例中的是Student的Sno值),这个相关子查询的处理过程是:

    首先取外层查询中(student)表的第一个元组,根据它与内层查询相关的属性值(Sno值)处理内层查询,若外层的WHERE返回为真,则取外层查询中该元组的Sname放入结果表;

    然后再取(student)表的下一组,重复这一过程,直至外层(Student)表全部检查完毕。

    查询结果表:

    Sname
    Altair
    Christina

    NOT EXISTS

    与EXISTS谓词相对的是NOT EXISTS谓词。使用存在量词NOT EXISTS后,若对应查询结果为空,则外层的WHERE子语句返回值为真值,否则返回假值。

     查询没有选修课程”信号与系统“的同学

    SELECT s.Sname FROM student s
    WHERE NOT EXISTS  
    (SELECT * FROM sc, course c WHERE sc.sno = s.sno AND sc.cno = c.cno AND c.cname = '信号与系统')

    使用NOT EXISTS之后,若内层查询结果为非空,则对应的NOT EXISTS不成立,所以对应的WHERE语句也不成立。

    范例中李勇同学对应的记录符合内层的select语句的,所以返回该记录数据,但是对应的NOT EXISTS不成立,WHERE语句也不成立,表示这不是我们要查询的数据。

    查询结果表:

    Sname
    Desmond
    Ezio

    查询选修了全部课程的学生姓名:(这是一个用NOT EXISTS表示全称量词的例子)

    其他方式:

                   可以查询sc数据表  group by sno 学号 having count (sno 学号) >  course数据表全部课程的数量来查询

    SELECT Sname  
    FROM Student   
    WHERE NOT EXISTS  
    (SELECT * FROM Course WHERE NOT EXISTS  
         (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno)  
    );  

    这个算是一个比较复杂的sql语句了,两个EXISTS和三个WHERE。

    这个sql语句可以分为3层,最外层语句,最内层语句,中间层语句。

    我们很关心最外层语句,因为结果表中的数据都是最外层的查询的表中的数据,我们更关心最内层的数据,因为最内层的数据包含了全部的判断语句,决定了student表中的那一条记录是我们查询的记录。

    我们由内而外进行分析:

    最外层的student表中的第一条记录是Altair同学对应的记录,然后中间层的course表的第一条记录是数据库对应的记录,然后对该数据进行判断(最内层的WHERE语句),结果返回真,则内层的NOT EXISTS为假, 
    然后继续对course表中的下一条记录进行判断,返现NOT EXISTS的值也为假,直到遍历完course表中的所有的数据,内层的NOT EXISTS的值一直都是假,所以中间层的WHERE语句的值也一直都是假。 
    对应student的Altair记录,course表中的所有的记录对应的中间层的返回值为假,所以最外层的NOT EXISTS对应的值为真,最外层的WHERE的值也为真,则Altair对应的记录符合查询条件,装入结果表中。 
    然后继续对student表中的下一条记录进行判断,直达student表中的所有数据都遍历完毕。

    先取一条student记录,进入中层,再取一条course的记录,进入内层,此时student的记录和course的记录,作为内层判断的条件,比如此时我取的第一条记录是Altair,那么我里面的Sql就可以写成

    SELECT * FROM Course WHERE NOT EXISTS  
         (SELECT * FROM SC WHERE Sno = '20161181' AND Cno=Course.Cno)  
    )

    此处 sno 20161181即Altair的学号,这条sql的意思是选出没有被Altair选择的课程,如果不存在,则返回false,再跟最外层的NOT EXISTS关联,负负得正。每一条循环的意思就是指,筛选出的每一个学生都不存在没有被他选取的那门课,即选了所有课。

    最终查询结果:

    Sname
    Altair

    参考:https://blog.csdn.net/qq_27571221/article/details/53090467 

    展开全文
  • IF NOT EXISTS和 IF EXISTS的区别

    万次阅读 2018-08-05 11:26:23
    if not exists 即如果不存在,if exists 即如果存在 2.使用 a.判断数据库不存在时 if not exists(select * from sys.databases where name = ‘database_name’) b.判断表不存在时 if not exists (select * ...

    1.介绍
    if not exists 即如果不存在,if exists 即如果存在

    2.使用
    a.判断数据库不存在时
    if not exists(select * from sys.databases where name = ‘database_name’)

    b.判断表不存在时
    if not exists (select * from sysobjects where id = object_id(‘table_name’) and OBJECTPROPERTY(id, ’IsUserTable’) = 1)

    c.判断列不存在

    if not exists (select * from syscolumns where id=object_id(’table_name’) and name=’column_name’)
    当判断的表不存时,我可以执行创建数据库,创建表,增加列,可以执行相应的SQL语句;

    而if exists同理判断,首先判断查询结果是否存在,如果存在执行判断后面的语句,查询的数据库,表,列的方法相同由此可见,“IF EXISTS“可以避免删除不存在的数据库出现的MySQL错误信息。另外需要注意的是:使用DROP DATABASE 或DROP SCHEMA 语句会删除指定的整个数据库,该数据库中的所有表(包含其中的数据)也将永远删除。因此使用时需谨慎,以免错误删除。

    展开全文
  • 摘要:Delphi源码,数据库应用,exists Delphi使用exists和noexists进行数据库的查询实例。可以求交集和差集,有兴趣参考下。带有数据库文件,在Database文件夹下,测试前请附加好数据库并连接数据库信息。 运行环境...
  • SQL 语句中 exists和not exists的用法

    万次阅读 多人点赞 2018-10-08 00:08:14
    exists (返回结果集,为真) not exists (不返回结果集,为真)  表A  ID NAME 1 A1  2 A2  3 A3  表B  ID AID NAME  1 1 B1  2 2 B2 3 2 B3 ...

    exists           (返回结果集,为真)   
    not exists       (不返回结果集,为真) 

    表A 
    ID   NAME   
    1       A1 
    2       A2 
    3       A3 

    表B 
    ID   AID   NAME 
    1       1       B1 
    2       2       B2   
    3       2       B3  

    表A和表B是1对多的关系   A.ID   =>   B.AID 

     

    1.SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID = B.AID);

    执行结果:

    ID   NAME   
    1       A1 
    2       A2 

    原理如下:

    (1)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=1) 
    ---> SELECT   *   FROM   B   WHERE   B.AID=1有值,返回真,所以有数据

    (2)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=2) 
    ---> SELECT   *   FROM   B   WHERE   B.AID=2有值,返回真,所以有数据

    (3)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=3) 
    ---> SELECT   *   FROM   B   WHERE   B.AID=3无值,返回假,所以没有数据

    得到的结果为,A.ID=1或2时才有数据,所以最终的条件等于

    SELECT ID,NAME FROM A where id in (1,2);

    扩展:

    SELECT A.ID AID,A.NAME A_NAME,B.ID BID,B.AID B_AID,B.NAME B_NAME FROM A,B WHERE A.ID = B.AID;

    多表关联时,是将相关联的记录拼合到一起,而非多次拼合(而当两张表是相同的表是,会多次拼合)

     

    2. 同时,我们也可以作用于多个列

    在某张表中,有A->B冲突,同时B->A冲突的记录(重复记录),我们以sid<tid的记录为真实记录

    create table C(
    sid number,
    tid number
    )
    
    insert into c values (1,2);
    insert into c values (2,1);
    insert into c values (2,3);
    insert into c values (3,2);
    insert into c values (3,4);
    insert into c values (4,3);
    insert into c values (5,6);

    (1)找到A<->B的记录对

    select distinct *  from C C1,C C2 WHERE C1.SID =C2.TID AND C1.TID = C2.SID; (切记去重)

    (2)找到其中sid>tid的记录

    select distinct C1.SID,C1.TID  from C C1,C C2 WHERE C1.SID =C2.TID AND C1.TID = C2.SID and C1.SID > C1.TID

    (3)删除这些记录

    DELETE C WHERE EXISTS (
    select distinct C1.SID,C1.TID  from C C1,C C2 WHERE C1.SID =C2.TID AND C1.TID = C2.SID and C1.SID > C1.TID
    AND C.SID = C1.SID AND C.TID = C1.TID
    );

    此时在c表中删除的就是c.sid和c.tid符合这个条件的记录了

    展开全文
  • SQL 子查询 EXISTS 和 NOT EXISTS

    万次阅读 多人点赞 2016-11-08 23:00:19
    MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT … FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果...
  • 1. EXISTS的执行流程 select * from t1 where exists ( select null from t2 where y = x ) 可以理解为: 代码如下: for x in ( select * from t1 ) loop if ( exists ( select null from t2 where y = x.x ) then ...
  • in和exist的区别 从sql编程角度来说,in直观,exists不直观多一个select, in可以用于各种子查询,而exists好像只用于关联子查询 从性能上来看 exists是用loop的方式,循环的次数影响大,外表要记录数少,内表就...
  • 真正理解exists 和not exists

    千次阅读 多人点赞 2020-10-29 18:51:00
    前言 今天看了下mysql训练题,其中有一题很有意思。 ​     下面也写了sql解答,使用了group_concat()函数,这个函数是分组后将一组的字段(比如name)拼接在一起,默认以...exists与not exist.
  • if exists 用法

    2017-10-13 08:47:08
    if exists用法,里面包含各种需要用到if exists的情况。
  • EXISTS用法

    2017-12-15 15:06:57
    exists用法
  • Hive exists 用法

    千次阅读 2021-01-10 15:19:46
    where exists(select c2/1/*/key2from tb2 where tb2.key2 = tb1.key1) exists()中的select后面跟其他字段也行,where后面用关联字段即可! selec * : in : exists(select *) : exists...
  • 详解SQL EXISTS 运算符

    2020-12-14 08:16:51
    EXISTS 运算符 EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。 SQL EXISTS 语法 SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM ...
  • oracle中exists ,not exists用法

    万次阅读 2019-02-17 08:45:15
    WHERE EXISTS(SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) analyze: 这里面的EXISTS是如何运作呢?子查询返回的是OrderID字段,可是外面的查询要找的是CustomerId和Com...
  • 使用EXISTS(或NOT EXISTS)关键字引入一个子查询时,子查询实际上不产生任何数据;它只返回TRUE或FALS值。 指定一个子查询,检测行的存在。 如果子查询包含行,则返回 TRUE IN效率要差(返回子查询)
  • Rails利用SQL EXISTS条件的强大功能 描述 这个gem确实完成了两件事: 选择每个具有特定关联对象的模型对象 选择没有任何关联对象的每个模型对象 它使用SQL 来快速完成它,并使用where_exists和where_not_exists...
  • not existsexists

    千次阅读 2016-07-04 14:35:43
    exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1 A1 2 A2 3 A3 表B ID AID NAME 1 1 B1 2 2 B2 3 2 B3 表A和表B是1对多的关系 A.ID => B.AID SELECT ID,...
  • sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
  • mysql exists和not exists使用

    千次阅读 2017-11-27 22:00:01
    EXISTS代表存在量词∃。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或者逻辑假值“false”
  • sql中exists和not exists用法

    万次阅读 多人点赞 2017-05-14 11:16:54
    之所以要说这个问题,是因为项目中用到了not exists,但两者写的语句只有一点差别,结果一个有问题了,一个没问题。具体问题下面详细说明,先来看看exists如何应用。 exists:  强调的是是否有返回集,不需...
  • MySQL优化之in,exists,not in,not exists的区别in与existsin查询过程结论:exists查询过程:结论:not in与not existsnot in查询过程:结论:not exists查询过程:结论: 首先我们使用两个用户表作为实例 insert ...
  • __if_exists 语句 __if_exists 语句测试指定的标识符是否存在。如果该标识符存在,则执行指定的语句块。 语法 __if_exists ( identifier ) { statements }; 参数 参数 说明 identifier 要测试其存在性的...
  • Exists 用法解释

    千次阅读 多人点赞 2019-12-10 09:27:39
    exists的实例解析 现有两个表 a: b: 现有sql语句如下 select * from a where exists (select 1 from b where b.b_id = a.id); 执行结果如下: 含义解析:exists 的意思是用于检查子查询是否至少会返回一行数据,该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 986,314
精华内容 394,525
关键字:

exsist