千家信息网

sql中exists和not exists怎么用

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章主要介绍了sql中exists和not exists怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。exists:强调的是
千家信息网最后更新 2024年09月22日sql中exists和not exists怎么用

这篇文章主要介绍了sql中exists和not exists怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

exists:

强调的是是否有返回集,不需知道具体返回的是什么,比如:

      SELECT        *      FROM        customer     WHERE         not EXISTS (                SELECT                        0                FROM                        customer_goods                WHERE                        customer_id = 1        )

只要exists引导的子句有结果集返回,这个条件就算成立。这个返回的字段始终是0,改成1,则始终返回的是1,所以exists不

在乎返回的是什么内容,只在乎是否有结果集返回。

exists 和in 的区别

这二者最大的区别,是使用in只能返回一个字段值

     SELECT        *     FROM        customer c     WHERE     c.id          not in (                SELECT                        customer_id                FROM                        customer_goods                WHERE                        customer_id = 1        )

但exists允许返回多个字段。

not in 和not exists 分别为in 和exists的对立面。

exists(sql 返回结果集为真)

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

not exists详细介绍:

表customer:

表customer_goods:

二者的干系:customer_goods.customer_id = customer.id

(1) 查询:

     SELECT        *     FROM        customer c     WHERE        NOT EXISTS (                SELECT                        *                FROM                        customer_goods  cg                WHERE                         cg.customer_id =1          )

结果:

无返回结果

(2)查询:

    SELECT        *    FROM        customer c    WHERE        NOT EXISTS (                SELECT                        *                FROM                        customer_goods  cg                WHERE                          c.id =1              )

结果:

(3)分析:

发现二者差别只是是否not exists字句查询的查询条件是否跟外面查询条件有关,如果not exists子查询只有自己本身的查询条件,这样只要子查询中有数据返回,就证明是false,结果在整体执行就无返回值;一旦跟外面的查询关联上,就能准确查出数据。

而我遇到的问题正是这个。

经过分析,我认为一旦跟外层查询关联上,就会扫描外面查询的表。而没一旦二者不添加关联关系,只会根据not exists返回是否有结果集来判断,这也是为什么一旦子查询有数据,就查不到所有的数据了。

附案例分析

来看看not exists或exists是如何用的吧。

# 学生表CREATE TABLE `Student`(    `s_id` VARCHAR(20),    `s_name` VARCHAR(20) NOT NULL DEFAULT '',    `s_birth` VARCHAR(20) NOT NULL DEFAULT '',    `s_sex` VARCHAR(10) NOT NULL DEFAULT '',    PRIMARY KEY(`s_id`));# 课程表CREATE TABLE `Course`(    `c_id`  VARCHAR(20),    `c_name` VARCHAR(20) NOT NULL DEFAULT '',    `t_id` VARCHAR(20) NOT NULL,    PRIMARY KEY(`c_id`));# 教师表CREATE TABLE `Teacher`(    `t_id` VARCHAR(20),    `t_name` VARCHAR(20) NOT NULL DEFAULT '',    PRIMARY KEY(`t_id`));# 成绩表CREATE TABLE `Score`(    `s_id` VARCHAR(20),    `c_id`  VARCHAR(20),    `s_score` INT(3),    PRIMARY KEY(`s_id`,`c_id`));# 插入学生表测试数据insert into Student values('01' , '赵雷' , '1990-01-01' , '男');insert into Student values('02' , '钱电' , '1990-12-21' , '男');insert into Student values('03' , '孙风' , '1990-05-20' , '男');insert into Student values('04' , '李云' , '1990-08-06' , '男');insert into Student values('05' , '周梅' , '1991-12-01' , '女');insert into Student values('06' , '吴兰' , '1992-03-01' , '女');insert into Student values('07' , '郑竹' , '1989-07-01' , '女');insert into Student values('08' , '王菊' , '1990-01-20' , '女');#课程表测试数据insert into Course values('01' , '语文' , '02');insert into Course values('02' , '数学' , '01');insert into Course values('03' , '英语' , '03');# 教师表测试数据insert into Teacher values('01' , '张三');insert into Teacher values('02' , '李四');insert into Teacher values('03' , '王五');#成绩表测试数据insert into Score values('01' , '01' , 80);insert into Score values('01' , '02' , 90);insert into Score values('01' , '03' , 99);insert into Score values('02' , '01' , 70);insert into Score values('02' , '02' , 60);insert into Score values('02' , '03' , 80);insert into Score values('03' , '01' , 80);insert into Score values('03' , '02' , 80);insert into Score values('03' , '03' , 80);insert into Score values('04' , '01' , 50);insert into Score values('04' , '02' , 30);insert into Score values('04' , '03' , 20);insert into Score values('05' , '01' , 76);insert into Score values('05' , '02' , 87);insert into Score values('06' , '01' , 31);insert into Score values('06' , '03' , 34);insert into Score values('07' , '02' , 89);insert into Score values('07' , '03' , 98);

题目是查询和"01"号的同学学习的课程完全相同的其他同学的信息,直接做确实有点麻烦,我们可以先做做这题:查看学了所有课程的同学的信息。

学了所有课程的同学的信息,那不就是这些同学没有一门课程没有学吗。

select * from Student st where not exists(select * from Course c where not exists(select * from Score sc where sc.c_id = c.c_id and sc.s_id = st.s_id));

然后我们再回过来看这题,把所有的课程换成01同学学的课程。

select * from Student st where not exists(select * from( select s2.c_id as c_id from Student s1 inner join Score s2 on s1.s_id = s2.s_id where s1.s_id = 01) t where  not exists (select * from Score sc where sc.c_id = t.c_id and sc.s_id = st.s_id and st.s_id != 01));

感谢你能够认真阅读完这篇文章,希望小编分享的"sql中exists和not exists怎么用"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

查询 结果 数据 课程 同学 条件 篇文章 测试 信息 字段 关联 分析 学生 师表 成绩 课程表 学习 相同 价值 兴趣 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器是用来做什么的 方舟端游怎么创建服务器手机版 我的世界2服务器进不去 数据库脱敏 广东厂家 中国期刊数据库有几个 服务器上如何获取管理员身份 本科毕业软件开发工资待遇 mt管理器我的世界服务器 在线软件开发平台有哪些 普及金融网络安全宣传总结 福建定制网络技术咨询哪个正规 新型软件开发原理 网络安全工作室逃生 自己电脑怎么开mc服务器 手机之间怎样转移数据库 服务器管理ip怎么配 深圳市优多特网络技术公司 数据库引擎无法锁定表 广东第七城网络技术公司怎么样 如何成应用软件开发者 查看某个数据库的所有表 手机时间与服务器时间 欧盟 网络安全政策 网络平台开发是软件开发吗 吃鸡合并服务器 商品规格json数据库 苹果qq购买会员连接不上服务器 pcs7服务器数据传输 关注网络安全 保护个人隐私 10g数据库支持增量导入
0