検索

ホームページ  >  に質問  >  本文

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

伊谢尔伦伊谢尔伦2786日前679

全員に返信(5)返信します

  • 大家讲道理

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

    これについては前にも考えたことがあります。
    結論としては、インターネット上で提供される情報は、おおよそ SQL 全体に関するものであり、mysql に関するものではありません。

    MySQL の処理方法は途中に仮想テーブル (または一時テーブル) を生成し、この仮想テーブルによって生成されるカラムは select に依存するため、実際には仮想テーブルを作成した後の操作に似ていると思います。 table は select に基づいて内部で生成されており、列の後には当然のように as が続きます。

    返事
    0
  • 大家讲道理

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

    where は選択クエリの前にフィルタリングされ、having は選択クエリの後にフィルタリングされたことを覚えています。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 14:42:18

    実行と解析は別のことです。として宣言されたエイリアスが認識された場合、select キーワードの実行順序は、すでに実行されているとしか言えません。

    返事
    0
  • 黄舟

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

    MSSQL は HAVING でエイリアスを使用できませんが、MYSQL では使用できます。実行プランを表示すると、次のように 2 つの処理方法が異なることがわかります。
    MSSQL:
    < 画像src="http://img.php.cn/upload/image/000/000/000/d41efcd586bb305e2a3bbfb9289ad3ac-0.png">

    MYSQL:

    返事
    0
  • 迷茫

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

    sqlserver

    1: クエリの論理的な実行シーケンス

    (1) <左テーブル> から

    (3) < 結合タイプ> < 結合条件>

    (4) WHERE <場所の条件>

    (5) グループ化

    (6) {キューブ} 付き

    (7) HAVING

    (8) SELECT (9) DISTINCT (11) < 選択リスト>

    (10) 注文順 < order_by_list>

    標準の SQL 解析順序は次のとおりです:

    (1).FROM 句は、さまざまなデータ ソースからデータをアセンブルします

    (2).WHERE 句は、指定された条件に基づいてレコードをフィルタリングします

    (3).GROUP BY 句はデータを複数のグループに分割します

    (4). 計算には集計関数を使用します。

    (5). HAVING 句を使用してグループをフィルタリングします。

    (6). すべての式を計算します

    (7). ORDER BY を使用して結果セットを並べ替えます。

    2 実行シーケンス:

    1.FROM: FROM 句の最初の 2 つのテーブルに対してデカルト積を実行し、仮想テーブル vt1 を生成します。

    2.ON: ON フィルターを vt1 テーブルに適用すると、< join_condition> を満たす行のみが vt2 に挿入されます。

    3.OUTER(join): OUTER JOIN が指定されている場合、保存されたテーブルに見つからない行が外部行として vt2 に追加され、t3 に 3 つ以上のテーブルが含まれている場合、前の結合によって生成された結果が生成されます。テーブルと次のテーブルに対して手順を繰り返し、直接終了します。

    4.WHERE: WHERE フィルターを vt3 に適用します。<where_condition> が true に設定されている行のみが vt4 に挿入されます。

    5.GROUP BY: GROUP BY 句の列リストに従って vt4 の行をグループ化し、vt5 を生成します。

    6.CUBE|ROLLUP: スーパーグループを vt6 に挿入して vt6 を生成します

    7.HAVING: HAVING フィルターを vt6 に適用します。<having_condition> が true に設定されているグループのみが vt7 に挿入されます。

    8.SELECT: 選択リストを処理して vt8 を生成します

    9.DISTINCT: vt8 から重複行を削除して vt9 を生成します

    10.ORDER BY: order by 句の列リストに従って vt9 の行を並べ替えて、カーソル vc10 を生成します。

    11.TOP: vc10 の先頭から指定された数または割合の行を選択して vt11 を生成し、呼び出し元に戻ります。

    返事
    0
  • キャンセル返事