Mysql INTERSECT优先于子查询吗?

Mysql INTERSECT优先于子查询吗?,mysql,Mysql,我正在研究这个问题 查找没有出现在“喜欢”表中的所有学生(作为喜欢或被喜欢的学生),并返回他们的姓名和成绩。按等级排序,然后在每个等级内按名称排序 我建议做以下工作,让所有不喜欢的人都参与进来,让那些不喜欢任何人的人参与进来: SELECT name, grade FROM Highschooler h1 LEFT JOIN Likes l1 ON (l1.ID1 = h1.ID) WHERE l1.ID1 IS NULL INTERSECT SELECT name, grade F

我正在研究这个问题

查找没有出现在“喜欢”表中的所有学生(作为喜欢或被喜欢的学生),并返回他们的姓名和成绩。按等级排序,然后在每个等级内按名称排序

我建议做以下工作,让所有不喜欢的人都参与进来,让那些不喜欢任何人的人参与进来:

SELECT name, grade
  FROM Highschooler h1
LEFT JOIN Likes l1
  ON (l1.ID1 = h1.ID)
WHERE l1.ID1 IS NULL
INTERSECT
SELECT name, grade
  FROM Highschooler h1
LEFT JOIN Likes l1
  ON (l1.ID2 = h1.ID)
WHERE l1.ID2 IS NULL
ORDER BY grade, name
另一种方法是使用子查询(如我在网上找到的)


哪种方式比较好?我认为我的方法更具可读性。

正如阿德里安所说,这两种方法都是可以接受的, 我认为您的方式更具可读性,因为大写的函数和更好的缩进,而不是因为查询本身

我会这样做,例如:

SELECT name, grade
FROM Highschooler H1
LEFT JOIN Likes AS L1 ON L1.ID1 = H1.ID OR L1.ID2 = H1.ID
WHERE L1.ID1 IS NULL
ORDER BY grade, name
这种情况称为反连接。阅读更多关于这些的信息

下面是另一篇关于不同类型连接的精彩博文,并附有一些图表:


我们的案例是

不,您的查询不太可读。用通俗易懂的英语读:1。把所有的学生和他们喜欢的人列一个大名单。2.如果未找到某个学生的LIKE记录,请将该学生记录保留为NOTHELESS。3.然后删除所有包含喜欢的记录(因此只保留那些没有喜欢的学生)。4.-6. 对喜欢表中的其他人也这样做。7.将两个结果集相交

最初的任务只是:找到不存在于表中的学生

select name, grade
from highschooler
where not exists
(
  select *
  from likes
  where likes.id1 = highschooler.id
     or likes.id2 = highschooler.id
)
order by grade, name;
让您的查询尽可能简单。SQL的读法或多或少就像你用英语写任务一样。不可能总是以如此简单的形式制定任务,但您可以尝试:-)


在intersect查询中使用的反连接模式是一个技巧,可以克服年轻DBMS中的弱点,这些弱点在中处理得不好,而且还存在。你应该只在必要时才使用技巧,而不是在处理给定的简单任务时。

我认为这两种方法都是可以接受的。差异可能在于性能,这方面通常取决于给定的应用程序。我认为MySQL不支持intersect。这是一个反连接?是的,您正在连接一个表,但实际上您希望第一个表中的所有值都不匹配。仅在您的情况下,我们匹配的是2个值,而不是1@Phil添加了另一个链接,它有一些很好的维恩图,包括我们的案例。你是一个非常了不起的人!:)谢谢你,很高兴能帮上忙。别忘了接受答案,将问题标记为已解决,但前提是你觉得你的问题已得到完全回答。如果您还有其他问题,我很乐意为您提供帮助,请随时在您将来可能遇到的任何问题下的评论中注明我的姓名
select name, grade
from highschooler
where not exists
(
  select *
  from likes
  where likes.id1 = highschooler.id
     or likes.id2 = highschooler.id
)
order by grade, name;