Mysql 存在的SQL查询没有如我所想的那样工作
这两个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
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的记录。