首頁  >  問答  >  主體

mysql - SQL语句中having为什么可以操作as声明的别名?

伊谢尔伦伊谢尔伦2742 天前640

全部回覆(5)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 14:42:18

    我之前也考慮過這個問題。
    結論是:網路上給的資料都是大概的針對整個sql來說,而並非針對mysql.

    mysql的處理方式是中間產生虛擬表(或稱為臨時表),而這個虛擬表的產生的列靠的就是select,所以猜測類似having之後的操作,其實內部已經根據select產生了虛擬表,列自然也是as後的。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:42:18

    我記得where在select查詢前過濾,having在select之後過濾

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 14:42:18

    運行和解析是兩回事啊,as 聲明的別名被識別只能說是有解析.select關鍵字運行順序在having後已經是運行了.

    回覆
    0
  • 黄舟

    黄舟2017-04-17 14:42:18

    MSSQL 在HAVING中不可以用別名,MYSQL可以,透過查看執行計劃,可以看出兩者處理方式不同,如下:
    MSSQL:

    MYSQL:

    回覆
    0
  • 迷茫

    迷茫2017-04-17 14:42:18

    sqlserver

    一:查詢的邏輯執行順序

    (1) FROM < left_table>

    (3) < join_type> JOIN < right_table> (2) ON < join_condition>

    (4) WHERE < where_condition>

    (5) GROUP BY < group_by_list>

    (6) WITH {cube | rollup}

    (7) HAVING < having_condition>

    (8) SELECT (9) DISTINCT (11) < top_specification> < select_list>

    (10) ORDER BY < order_by_list>

    標準的SQL 的解析順序為:

    (1).FROM 子句 組裝不同資料來源的資料

    (2).WHERE 子句 基於指定的條件對記錄進行篩選

    (3).GROUP BY 子句 將資料分割為多個分組

    (4).使用聚合函數進行計算

    (5).使用HAVING子句篩選分組

    (6).計算所有的表達式

    (7).使用ORDER BY對結果集進行排序

    二 執行順序:

    1.FROM:對FROM子句中前兩個表執行笛卡爾積產生虛擬表vt1

    2.ON:對vt1表應用ON篩選器只有滿足< join_condition> 為真的行才被插入vt2

    3.OUTER(join):如果指定了OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯結生成的結果表和下一個表重複執行步驟和步驟直接結束

    4.WHERE:對vt3應用 WHERE 篩選器只有使< where_condition> 為true的行才被插入vt4

    5.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組產生vt5

    6.CUBE|ROLLUP:把超組(supergroups)插入vt6 產生vt6

    7.HAVING:對vt6應用HAVING篩選器只有使< having_condition> 為true的群組才插入vt7

    8.SELECT:處理select列表產生vt8

    9.DISTINCT:將重複的行從vt8中移除產生vt9

    10.ORDER BY:將vt9的行依order by子句中的列列表排序產生一個遊標vc10

    11.TOP:從vc10的開始處選擇指定數量或比例的行產生vt11 並傳回呼叫者

    回覆
    0
  • 取消回覆