我明天参加考试,其中一个关于练习考试的问题是显示给定查询提供的输出。所以我运行了一个工作副本数据库并遵循相同的语法。
以下是数据:
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 |
+-----------+----------+
但是当我只检查存在的表中的实际内容时,我得到了:
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)有什么关系。是否有任何实际上是平均值的,或者只是返回原始数字。
答案 0 :(得分:2)
您的联接返回的每一行都不匹配并将它们连接在一起,将结果数量相乘,如果不存在,则应用减少而不更改内存中的结果。
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 |
+-----------+-----------+
答案 1 :(得分:0)
如果子查询中存在行,则包含该行。由于原始表中只有3行,并且未加入任何内容,因此您的总行数仅为3,因此每个ID的计数为1。