mysql - 使用 count(*) 并存在

标签 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 |
+-----------+----------+

但是当我只检查 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/

相关文章:

mysql - 运行 --exec-after 脚本时无响应

PHP + MySql,带有多个错误检查的 OR 查询

sql - MySQL MAX() 函数比较更新中的数值?

mysql - 如何计算总和的总和?

php - 从数据库中获取数据并在php中的邮件功能中使用

Mysql 查询 - 连接、子查询、如果存在

javascript - 错误做法 - 从 PHP while 循环为 getElementbyID 生成 javascript 代码

MYSQL 较高的 LIMIT 偏移量使查询变慢

python - 字符串编码 SQL 语句

php - SQL 'in' 遇到问题