Mysql 存在的SQL查询没有如我所想的那样工作

Mysql 存在的SQL查询没有如我所想的那样工作,mysql,sql,Mysql,Sql,这两个SQL查询返回相同的结果 SELECT DISTINCT ItemID FROM Sale INNER JOIN Department ON Department.DepartmentID = Sale.DepartmentID WHERE DepartmentFloor = 2 ORDER BY ItemID SELECT DISTINCT ItemID FROM Sale WHERE EXISTS (SELECT * FROM Department WHERE Sale.Depar

这两个SQL查询返回相同的结果

SELECT DISTINCT ItemID
FROM Sale INNER JOIN Department
ON Department.DepartmentID = Sale.DepartmentID
WHERE DepartmentFloor = 2
ORDER BY ItemID


SELECT DISTINCT ItemID
FROM Sale
WHERE EXISTS
(SELECT *
FROM Department
WHERE Sale.DepartmentID = Department.DepartmentID
AND DepartmentFloor = 2)
ORDER BY ItemID;
Exists中的子查询返回True,那么为什么secod查询不返回

SELECT DISTINCT ItemID
FROM Sale

因为查询的UPPER部分相当于

   SELECT DISTINCT ItemID FROM Sale where EXISTS (true)

上限是唯一真正检查条件的查询

您被
EXISTS()
弄糊涂了。。它基于表的相关性逐行发生,而不仅仅是一个真/假。子查询的这一行是您的关联子句:

Sale.DepartmentID = Department.DepartmentID
它的意思是“仅显示Sale.ItemIDs,该ItemID的Sale.DepartmentID在Department中的位置。”

它实现了与连接谓词相同的功能,如在第一个查询中:

FROM Sale S
JOIN Department D on S.DepartmentID = D.DepartmentID --here
相反,此查询:

SELECT DISTINCT ItemID
FROM Sale
没有限制因素

另一方面,您还可以通过以下方式进一步限制每个查询的结果:

WHERE DepartmentFloor = 2

但我不认为这是让你不高兴的部分,我认为这是一个概念,即每个记录都会出现一个相关的子查询。如果要删除correling子句,那么子查询实际上将始终返回true,并且您将返回所有结果。

子查询并不总是返回true。它将对每一行进行评估,并在DepartmentID上连接,其中DepartmentFloor为2

MySQL 5.6架构设置

CREATE TABLE Sale ( ItemID int, DepartmentID int ) ;

INSERT INTO Sale ( ItemID, DepartmentID )
VALUES (1,1), (2,2), (3,3), (4,1), (5,4), (6,2), (7,3), (8,4) ;

CREATE TABLE Department ( DepartmentID int, DepartmentFloor int ) ;

INSERT INTO Department ( DepartmentID, DepartmentFloor )
VALUES (1,1), (2,1), (3,2), (4,2) ;
SELECT *
FROM Department
WHERE DepartmentFloor = 2 
SELECT *
FROM Sale
SELECT *
FROM Sale
WHERE DepartmentID IN (3,4)
查询1

CREATE TABLE Sale ( ItemID int, DepartmentID int ) ;

INSERT INTO Sale ( ItemID, DepartmentID )
VALUES (1,1), (2,2), (3,3), (4,1), (5,4), (6,2), (7,3), (8,4) ;

CREATE TABLE Department ( DepartmentID int, DepartmentFloor int ) ;

INSERT INTO Department ( DepartmentID, DepartmentFloor )
VALUES (1,1), (2,1), (3,2), (4,2) ;
SELECT *
FROM Department
WHERE DepartmentFloor = 2 
SELECT *
FROM Sale
SELECT *
FROM Sale
WHERE DepartmentID IN (3,4)
:仅列出部门楼层2上的部门

| DepartmentID | DepartmentFloor |
|--------------|-----------------|
|            3 |               2 |
|            4 |               2 |
查询2

CREATE TABLE Sale ( ItemID int, DepartmentID int ) ;

INSERT INTO Sale ( ItemID, DepartmentID )
VALUES (1,1), (2,2), (3,3), (4,1), (5,4), (6,2), (7,3), (8,4) ;

CREATE TABLE Department ( DepartmentID int, DepartmentFloor int ) ;

INSERT INTO Department ( DepartmentID, DepartmentFloor )
VALUES (1,1), (2,1), (3,2), (4,2) ;
SELECT *
FROM Department
WHERE DepartmentFloor = 2 
SELECT *
FROM Sale
SELECT *
FROM Sale
WHERE DepartmentID IN (3,4)
:此列表列出了您的所有销售额

| ItemID | DepartmentID |
|--------|--------------|
|      1 |            1 |
|      2 |            2 |
|      3 |            3 |
|      4 |            1 |
|      5 |            4 |
|      6 |            2 |
|      7 |            3 |
|      8 |            4 |
查询3

CREATE TABLE Sale ( ItemID int, DepartmentID int ) ;

INSERT INTO Sale ( ItemID, DepartmentID )
VALUES (1,1), (2,2), (3,3), (4,1), (5,4), (6,2), (7,3), (8,4) ;

CREATE TABLE Department ( DepartmentID int, DepartmentFloor int ) ;

INSERT INTO Department ( DepartmentID, DepartmentFloor )
VALUES (1,1), (2,1), (3,2), (4,2) ;
SELECT *
FROM Department
WHERE DepartmentFloor = 2 
SELECT *
FROM Sale
SELECT *
FROM Sale
WHERE DepartmentID IN (3,4)
:这一条显示了与您的EXISTS语句等价的内容。它只显示了我的数据中匹配的4行。所以你只能得到条目ID 3、5、7和8

| ItemID | DepartmentID |
|--------|--------------|
|      3 |            3 |
|      5 |            4 |
|      7 |            3 |
|      8 |            4 |

对不起,我不太明白。如果子查询返回true,那么查询不应该从Sale中选择DISTINCT ItemID吗?如果true的意思是“在每种情况下”(在此上下文中)则与其中的1=1完全相反。子查询是否总是返回true?似乎有些销售部门id不在楼层2上是的,但我认为一旦其中一个返回True,那么如果某个部门仅为DepartmentFloor=1或DepartmentID没有销售记录,则从sale中选择DISTINCT ItemID即可执行,然后EXISTS查询将为Sale中的行返回FALSE,并排除该DepartmentID的记录。