使用count(*)并存在

时间:2014-05-06 16:29:15

标签: mysql sql

我明天参加考试,其中一个关于练习考试的问题是显示给定查询提供的输出。所以我运行了一个工作副本数据库并遵循相同的语法。

以下是数据:

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)有什么关系。是否有任何实际上是平均值的,或者只是返回原始数字。

2 个答案:

答案 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。