大家讲道理2017-04-17 14:42:18
これについては前にも考えたことがあります。
結論としては、インターネット上で提供される情報は、おおよそ SQL 全体に関するものであり、mysql に関するものではありません。
MySQL の処理方法は途中に仮想テーブル (または一時テーブル) を生成し、この仮想テーブルによって生成されるカラムは select に依存するため、実際には仮想テーブルを作成した後の操作に似ていると思います。 table は select に基づいて内部で生成されており、列の後には当然のように as が続きます。
ringa_lee2017-04-17 14:42:18
実行と解析は別のことです。として宣言されたエイリアスが認識された場合、select キーワードの実行順序は、すでに実行されているとしか言えません。
黄舟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:
迷茫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 を生成し、呼び出し元に戻ります。