我明天參加考試,練習考試的其中一個問題是顯示給定查詢提供的輸出。所以我運行了一個工作副本數據庫,並遵循相同的語法。使用次數(*)並存在
下面是數據:
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
我現在明白了,數(*)將永遠是一個,因爲只有4個不同的元組,但是這對AVG(Number)有什麼影響。有沒有什麼東西實際上是平均值,或者只是返回原始數字。
我想讓你知道隱式連接像這樣'FROM Vendor v1,Vendor v2 WHERE v1.vendor_id <> v2.vendor_id'並不是最好的實踐,而是顯式連接像'FROM Vendor v1 INNER JOIN Vendor v2 ON v1.vendor_id <> v2.vendor_id '更好的做法 – AeroX