mysql - SQL语句中having为什么可以操作as声明的别名?
伊谢尔伦
伊谢尔伦 2017-04-17 14:40:18
0
5
675
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(5)
大家讲道理

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

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

いいねを押す +0
大家讲道理

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

いいねを押す +0
左手右手慢动作

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

いいねを押す +0
黄舟

MSSQL は HAVING でエイリアスを使用できませんが、MYSQL では使用できます。実行プランを表示すると、次のように 2 つの処理方法が異なることがわかります。
MSSQL:

MYSQL:

いいねを押す +0
迷茫

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
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート