关于sql中where exists的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于sql中where exists的问题相关的知识,希望对你有一定的参考价值。

select st_name from st_info
where exists
(
select *from s_c_info
where c_no='19010122 '....这一行是自己填空...
)

题目要求是查询选修了课程名为19010122的学生的名字
我选中这一行
select *from s_c_info
where c_no='19010122 '
查询的结果只有一行,是正确的,可是把这整个语句查询的时候输出框出现的就是st_info中的所有st_name
于是我很不明白exists到底是干嘛用的。。。

EXISTS
指定一个子查询,检测行的存在。
语法
EXISTS subquery
参数
subquery
是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息,请参见 SELECT 中有关子查询的讨论。
结果类型
Boolean
结果值
如果子查询包含行,则返回 TRUE。追问

不好意思还是没理解,麻烦你结合这一题给我讲一下吧

追答

题目要求是查询选修了课程名为19010122的学生的名字
你的这个查询应这样写

select st_name from st_info
where st_id in
(
select st_id from s_c_info
where c_no='19010122 '
)

参考技术A exists 翻译成中文就是是否存在的意思,
整个语句翻译:
查询name这个列 如果存在课程名为19010122的学生的名字
-----------存在了 就查询 整个列了。
你只运行这一行 是查询 课程号为19010122的学生的 全部信息。追问

恩恩,是,可是现在问题是查询name的时候应该只是在全部信息的基础上把名字提取出来吧,我想问的就是为什么查询所有信息只有一行而查询name的时候就跟直接把整个表的名字全部提出来的结果是一样的

追答

select st_name from st_info
where 列名 in
(
select 列名 from s_c_info
where c_no='19010122 '....)
感受一下 in 和 exists 的区别 不懂追问。
select name from 表 where id in (2,3,4)-------查询id 是2,3,4,三个人的名字
select name from 表 where exists (语句)----语句成立执行前面,语句不成立(没结果)整条语句不执行

exists(语句)----括号内语句的内容并不重要,而是真假性重要,

本回答被提问者采纳

使用 SQL Where Exists() 过滤结果

【中文标题】使用 SQL Where Exists() 过滤结果【英文标题】:Filtering results using SQL Where Exists() 【发布时间】:2022-01-03 01:56:14 【问题描述】:

我使用的软件允许我输入 SQL 语句的 WHERE... 部分。

所以我可以在where子句中使用EXISTS()语句...

然而,

这个查询...

SELECT DISTINCT Left([PR].[WBS1],5)&"-000" AS WBS1
FROM PR
GROUP BY Left([PR].[WBS1],5), Right([PR].[WBS1],3), PR.Status
HAVING ((Right(PR.WBS1,3)<>'000') And ((PR.Status)='A') And (Count(PR.Org))>1)

...返回 78 条记录。

还是

与 WHERE EXISTS... 的查询几乎相同

SELECT PR.WBS1 FROM PR WHERE EXISTS (

SELECT DISTINCT Left([PR].[WBS1],5)&"-000" AS WBS1
FROM PR
GROUP BY Left([PR].[WBS1],5), Right([PR].[WBS1],3), PR.Status
HAVING ((Right(PR.WBS1,3)<>'000') And ((PR.Status)='A') And (Count(PR.Org))>1)

)

...返回所有 31,114 条记录

我真的不明白为什么。

我做错了什么;有人可以向我解释一下吗?

编辑:我可以在这里放什么来返回相同的 78 条记录:

SELECT * FROM PR WHERE (

     ?

)

我使用的会计软件只允许我编辑“位置”部分。

【问题讨论】:

【参考方案1】:

如果括号内的子查询返回至少 1 行,则EXISTS 返回 TRUE,如果子查询未返回任何行,则返回 FALSE

在您的情况下,子查询返回 78 行,因此 EXISTS 返回 TRUE

所以你的第二个查询相当于:

SELECT PR.WBS1 FROM PR WHERE 1=1 -- any boolean expression that returns TRUE

或者简单地说:

SELECT PR.WBS1 FROM PR 

【讨论】:

以上是关于关于sql中where exists的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于MySQL 中 EXISTS 的用法

使用 where exists 子句更新多个值

关于sql中的exists,写上和不写是否没啥区别,是否只是提高了执行效率

关于SQL语句中exists与not exists的问题

关于sql中in 和 exists 的效率问题,in真的效率低吗

MySQL关于命令的问题Exists关键字