簡體   English   中英

where子句和join的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM