Mysql 试图理解IN和EXISTS之间的区别

Mysql 试图理解IN和EXISTS之间的区别,mysql,sql,Mysql,Sql,我目前正在学习一门课程,在一次考试中,我遇到了这个问题 数学学生和英语学生表有以下列: 学生id、年级、名、姓 使用子查询,找出数学课和英语课的成绩等级。 我使用的查询是这样的 select distinct grade from math_students where grade in ( select grade from english_students ); 但是,它被评为不正确,正确答案为 SELECT grade FROM math_students WHERE EXISTS

我目前正在学习一门课程,在一次考试中,我遇到了这个问题

数学学生和英语学生表有以下列:

学生id、年级、名、姓

使用子查询,找出数学课和英语课的成绩等级。

我使用的查询是这样的

select distinct grade 
from math_students 
where grade in (
select grade 
from english_students
);
但是,它被评为不正确,正确答案为

SELECT grade
FROM math_students
WHERE EXISTS (
  SELECT grade
  FROM english_students
);

如果有人能帮助我理解这两个查询中的差异,我将不胜感激,因为两种情况下的输出都是相同的。另外,为什么查询不包含distinct?

存在
的版本不正确。时期它是在回答“问题”:

如果至少有一名英语学生,则返回数学学生的所有成绩

不是很有用。正确的
存在
应该是:

SELECT DISTINCT grade
FROM math_students ms
WHERE EXISTS (
  SELECT 1
  FROM english_students es
  WHERE ms.grade = es.grade
);
如果您的数据库支持,我希望您也能学习:

select grade
from math_students
intersect
select grade
from english_students;
“子句中的”检查该值是否为所提供列表的成员,这可以是硬编码列表,也可以是查询结果

在您的示例中,如果表english_students定义为

id name grade
-- ---- -----
1  Joe  6
2  Bill 8
3  Sue  7
查询:

select distinct grade 
from math_students 
where grade in (
select grade 
from english_students
);
将评估:

select distinct grade 
from math_students 
where grade in (
"6","8","7"
);
操作顺序首先执行parens中的查询,然后执行外部查询 既然你说

select grade 
from english_students
它将返回“6”、“8”、“7”,然后执行外部查询

您的第二个问题:

SELECT grade
FROM math_students
WHERE EXISTS (
  SELECT grade
  FROM english_students
);
“Exists”只检查数据(或对象)的存在性,因此,正如戈登指出的那样,如果英语学生中存在数据,那么你是说选择数学学生中的所有数据

回答标题中的问题。“
中的”与“存在”之间的最大区别是:“中的”的计算结果是“给我任何与这些值之一匹配的值”,而“存在”的计算结果是“给我任何存在的值”

第二种方法不需要使用distinct的原因可能与数据有关


正如Gordon指出的那样,“intersect”会将多个结果附加到同一个结果集中,并返回不同的记录。

对于一个
存在的
通常不需要不同的
,因为这里只有一个表。除非在任何情况下,外表必须加以区分,否则很难说与问题无关。还要注意的是,在
不在
的情况下,作为习惯的力量,请始终使用
不在/存在
我之所以要问,是因为distinct显示的分数没有重复,这基本上就是他们要问的。问题是“找出数学课和英语课都代表了什么等级”。如果没有明显的区别,结果显示太多的重复并不完全符合目的。话虽如此,我对SQL非常陌生,所以不确定我是否正确理解了它。如果这是他们想要的,那么,是的,你需要一个独特的。明白了。谢谢。这是一个很假的问题。谢谢你的回答。再说一次,我对SQL非常陌生,如果您能更详细地解释一下您提到的EXISTS查询,我将不胜感激。另外,您能告诉我为什么用in代替EXISTS的代码是不正确的。@SQLROOKEY the
EXISTS
忽略内部
SELECT
中的任何内容,它实际上只是说“那张桌子上还有行吗“答案永远是肯定的。您需要一个
WHERE
将内部查询与外部查询关联起来。谢谢。为什么
查询中的
效率低下?一个好的DBMS(如SQL Server)无论如何都会将其转换为半联接,就像一个
存在的
一样。你是对的,这表明我使用旧DBMS系统的年龄。编辑并删除了该行,因此我编写的IN查询是正确的,我不需要强制自己使用NOT/EXISTS来避免错误。这是正确的吗?不是真的,它有一个问题,要求是“使用子查询,找出数学和英语课中代表的年级水平。”使用in查询可以,但如果“english_students”表中的某个年级的学生在math_students表中不存在该怎么办?in查询只返回包含在english_students表中的数据,因此Gordon提供的intersect查询是更好的选择。我肯定会继续使用intersect,但为了回答测试问题,可接受的答案需要包含子查询。我现在看到了差异,但不知何故,我仍然很困惑,当查询仅基于成绩的存在时,为什么两个表中的学生都存在会很重要。就像我说的,我是新来的,所以我非常好奇,可能会错过一些东西。