Syntax

是否可以在分配別名之前引用它?

  • September 19, 2019

下面顯示的查詢是否有效?(對不起這種類型的問題,但我是新手,我現在無法執行它)。

SELECT
  table.id 
  SUM(10/ta.value) AS amount 
JOIN tableA ta 
        ON ta.key = t.key

我很好奇是否可以在它被分配“之前”(即更高)引用別名。

謝謝!

FROM 在邏輯上是在 SELECT 之前進行評估的,因此儘管查詢的文本順序不同,但 ta 對於 SUM 是已知的。

但是,您的查詢中有許多內容不起作用:

  1. 你需要一個 FROM 子句
  2. 在 2 個表之間執行 JOIN

您可能可以將查詢重寫為:

SELECT table.id 
    , SUM(10/ta.value) AS amount 
FROM tableA ta
WHERE ...

但也許這就是你的意思?

SELECT t.id 
    , SUM(10/ta.value) AS amount 
FROM ... as t
JOIN tableA ta 
    ON ta.key = t.key
WHERE ta.key = t.key
GROUP BY t.id

請注意,後一個查詢需要 GROUP BY

下面由Jim Horn提供的連結是更好理解的良好開端,因此我將添加幾行關於構造查詢的方法。

第一步,弄清楚所涉及的關係以及它們之間的關係。例子:

FROM customers as c
JOIN orders as o 
   ON c.custno = o.custno

SQL 在 JOIN、UNION 等操作下是關閉的,這意味著結果是一個新的關係。它通常沒有名稱,但在這種情況下,我們可以將其視為 customer_orders

第二步,我們對什麼 customer_orders 感興趣?

FROM customers as c
JOIN orders as o 
   ON c.custno = o.custno
WHERE year(order_date) = 2019

我們對這些 customer_orders 的哪些細節感興趣?在這個例子中,我假設我們想知道每個客戶有多少訂單:

SELECT c.custno, count(o.orderno)
FROM customers as c
JOIN orders as o 
   ON c.custno = o.custno
WHERE year(order_date) = 2019
GROUP BY c.custno

在 where 子句中引用聚合函式是無效的,因為在where clause聚合之前計算 (count(…)),但可以使用類似的構造。假設我們想知道哪些客戶的訂單超過 20 個:

SELECT c.custno, count(o.orderno)
FROM customers as c
JOIN orders as o 
   ON c.custno = o.custno
WHERE year(order_date) = 2019
GROUP BY c.custno
HAVING count(o.orderno) > 20

這與以下內容相同:

SELECT custno, cnt
FROM (
   SELECT c.custno, count(o.orderno) as num_orders
   FROM customers as c
   JOIN orders as o 
       ON c.custno = o.custno
   WHERE year(order_date) = 2019
   GROUP BY c.custno
) as customer_orders
WHERE num_orders > 20

最後,您可能希望以特定順序檢索行。

SELECT c.custno, count(o.orderno)
FROM customers as c
JOIN orders as o 
   ON c.custno = o.custno
WHERE year(order_date) = 2019
GROUP BY c.custno
HAVING count(o.orderno) > 20
ORDER BY count(o.orderno) desc -- most orders first

直到最後一步,結果都是一個關係,但是 order by 使關係是無序的基本屬性無效。這似乎是一個無關緊要的註釋,但如果 DBMS 不必考慮行的順序,它更容易優化查詢。

Lennart 的回答是正確的。為了讓你更清楚一點,我會要求你改變你對“之前”的定義。

SWEATY (SELECT)
FEET (FROM, with JOINs)
WILL (WHERE)
GIVE (GROUP BY)
HORRIBLE (HAVING)
ODORS (ORDER BY)  (Good luck getting that out of your head)

…遵循查詢執行順序(連結),這是查詢的處理方式,與輸入方式不同。

查看連結,在一個部分中定義的任何別名都可以被它下面的任何部分使用。

引用自:https://dba.stackexchange.com/questions/249185