我明天有考试,模拟考试的其中一个问题是显示给定查询提供的输出。所以我使用工作副本数据库运行并遵循相同的语法。
数据如下:
SELECT vendor_id, name FROM Vendor;
+-----------+--------------+
| vendor_id | name |
+-----------+--------------+
| 1 | Tiger Direct |
| 2 | Newegg |
| 3 | Micro Center |
+-----------+--------------+
给出的查询是:
SELECT vendor_id, COUNT(*) FROM Vendor v1
WHERE EXISTS(SELECT * FROM Vendor v2 WHERE v2.vendor_id<>v1.vendor_id) GROUP BY vendor_id;
+-----------+----------+
| vendor_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
+-----------+----------+
但是当我只检查 exists 表中的实际内容时,我得到:
SELECT v1.vendor_id FROM Vendor v1, Vendor v2 WHERE v1.vendor_id <> v2.vendor_id;
+-----------+
| vendor_id |
+-----------+
| 2 |
| 3 |
| 1 |
| 3 |
| 1 |
| 2 |
+-----------+
所以我的问题是:
为什么计数不是 2 而不是 1?
如果这是一个愚蠢的问题,我深表歉意,但我正在学习 SQL,这个问题让我很困惑。
编辑:
我收到的答案很好,但现在我不得不问:
Attends:
SSN NUMBER
123456789 670
123456789 680
891234567 680
234567891 670
这个查询的结果是什么:
select SSN, count(*), avg(Number) from Attends S1
where exists
(select * from Attends S2 where S1.SSN <> S2.SSN) group by SSN
我现在明白 count(*) 永远是 1,因为只有 4 个不同的元组,但这与 AVG(Number) 有什么关系。是否有任何东西实际上是平均的,或者它只是返回原始数字。
最佳答案
您的连接返回不匹配的每一行并将它们连接在一起,乘以您的结果数量,其中 exists 不这样做,它应用减少而不改变内存中的结果。
SELECT v1.vendor_id, v2.vendor_id v2id FROM Vendor v1, Vendor v2 WHERE v1.vendor_id <> v2.vendor_id;
+-----------+-----------+
| vendor_id | v2id |
+-----------+-----------+
| 2 | 1 |
| 3 | 1 |
| 1 | 2 |
| 3 | 2 |
| 1 | 3 |
| 2 | 3 |
+-----------+-----------+
关于mysql - 使用 count(*) 并存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23500104/