[英]Difference between the AND statement in an Inner Join or in a WHERE clause
[英]Difference in where clause and join
我對SQL非常陌生,目前正與我一起工作,這是我生命中的第一次。 我現在想弄清楚的是試圖使查詢之間的區別。
查詢1:
SELECT name
FROM actor
JOIN casting ON id = actorid
where (SELECT COUNT(ord) FROM casting join actor on actorid = actor.id AND ord=1) >= 30
GROUP BY name
查詢2:
SELECT name
FROM actor
JOIN casting ON id = actorid
AND (SELECT COUNT(ord) FROM casting WHERE actorid = actor.id AND ord=1)>=30)
GROUP BY name
所以我認為
FROM casting join actor on actorid = actor.id
在子查詢中與
FROM casting WHERE actorid = actor.id.
但顯然不是。 誰能幫助我並解釋原因?
編輯:如果有人想知道:查詢基於來自http://sqlzoo.net/wiki/More_JOIN_operations的問題13
在第二個查詢中,您的嵌套查詢從其根查詢中獲取actor.id
,並僅計算該查詢的結果。 在第一個查詢中,您的嵌套查詢將對所有參與者的結果進行計數,而不僅是指定參與者的結果。
實際上,真正看起來像“ where”語句的部分只是關鍵字ON
之后的內容。 在此階段,有時我們會直接使用查詢來執行一些數據過濾,但是其實際目的是指定所使用的條件
“ 連接 ”是一種非常常見的操作,包括根據共同的標准將兩個不同的表的行關聯起來。 例如,如果您一方面有一個包含客戶列表的表,其中每個客戶都有一個唯一的客戶編號,另一方面,有一個訂單列表表,其中每個訂單都包含客戶的編號,那么您可能想要將后一個表的編號“解析”為它的名稱,地址等。
在SQL92之前(26年前),實現此目的的唯一方法是編寫如下內容:
SELECT client.name,
client.adress,
orders.product,
orders.totalprice
FROM client,orders
WHERE orders.clientNumber = client.clientNumber
AND orders.totalprice > 100.00
從兩個(或多個)表中選擇某項會產生“笛卡爾積”,實際上是將第一組中的每一行與第二組中的每一行相關聯。 這意味着,如果您的第一張表包含3行,第二張表包含8行,則結果集將為24行寬。 其中,您可以使用WHERE子句基本排除所有內容,並僅保留客戶端編號在兩側相同的行。
我們知道,如果不同表的內容超過幾行(通常是這種情況),則過濾前結果集的大小會成倍增長(如果總是這樣),並且如果隱含兩個以上的表,則可能變得更糟。 而且,在程序員方面,它很快變得不可讀。
因此,如果這是您真正想要做的,那么您現在可以顯式地告訴服務器有關信息,並首先指定條件,這樣可以避免不必要的臨時子集增長,同時仍然可以根據需要使用WHERE過濾結果。
SELECT client.name,
client.adress,
orders.product,
orders.totalprice
FROM client
JOIN orders
ON orders.clientNumber = client.clientNumber
WHERE orders.totalprice > 100.00
在單個查詢中執行多個JOIN時,尤其是同時執行INNER和OUTER聯接時,它變得至關重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.