実行順序選択問題

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-23 13:42:41789ブラウズ

製品テーブル tp_goods:
mysql> select * from tp_goods; - --------+--------------+--------+
商品名 | 市場価格 | -+----------------------+-------------+----------- - ----+--------+ 1 | スマートフォン t1 ホワイト エディション 1998.00 | 2 |条件 | 29.80 |
4 | 2998.00 | OSA レディース ダウンジャケット | 1510.00 | +- ------------------------+---------------+---------- ------ -+--------+

オンライン情報によると
mysql> select cat_id,goods_name,goods_price from tp_goods where cat_id=1; まず from 操作を実行して仮想テーブルを取得します。 VT1 ??> 次に、 where 操作を実行し、cat_id=1 の行をすべて除外し、仮想テーブル VT2 を取得します。このときの列は tp_goods テーブルのすべての列ですか??> 最後に、このときの列は cat_id、goods_name、goods_price の列になります。
----------------------------------------------- - ------------
mysql> select cat_id,max(goods_price) as max_price from tp_goods group by cat_id
質問:
1. このステートメントまた、どのように実行されますか? group by 関数と max 関数は同時に実行されますか?
2. group by と select を最初に実行するのは誰ですか?



ディスカッションへの返信 (解決策)

1.group by ?First

where > group by > 1.groupby ?First

2.group by ? まず

where > group by > select

group by の実行後に生成される仮想テーブルとは何ですか?

あなたが理解している実行順序は間違っています。少なくともそれは非科学的です
tp_goods に 10000000 件のレコードがあり、cat_id=1 に一致するレコードが 1 つだけある場合
その場合、tp_goods を VT1 にコピーする最初のステップは、多くの時間とスペースを無駄にします?

したがって、次のようになります:

仮想テーブル VT を作成します (cat_id、goods_name、goods_price の 3 列のみ)

tp_goods を走査し、cat_id=1 に一致するレコードを VT に追加します
VT の内容を出力します

select cat_id,max(goods_price) についてcat_id による tp_goods グループの max_price として

実行プロセスは次のようになります:
仮想テーブル VT を作成します (cat_id、max_price の 2 つの列のみ、cat_id をクラスタリングとして、max_price を計算として識別します)
tp_goods を走査し、VT にレコードを追加します。メソッドは次のとおりです。 tp_goods.cat_id の値は VT.cat_id にすでに存在します。次に、対応する max_price を max(goods_price,max_price) に変更します。それ以外の場合は、 を追加して VT の内容を出力します



あなたが理解している実行順序は間違っています。少なくともそれは非科学的です
tp_goods に 10000000 件のレコードがあり、cat_id=1 に一致するレコードが 1 つだけある場合
その場合、tp_goods を VT1 にコピーする最初のステップは、多くの時間とスペースを無駄にします?

したがって、次のようになります:
仮想テーブル VT を作成します (cat_id、goods_name、goods_price の 3 列のみ)
tp_goods を走査し、cat_id=1 に一致するレコードを VT に追加します
VT の内容を出力します

select cat_id,max(goods_price) についてcat_id による tp_goods グループの max_price として
実行プロセスは次のようになります:
仮想テーブル VT を作成します (cat_id、max_price の 2 つの列のみ、cat_id をクラスタリングとして、max_price を計算として識別します)
tp_goods を走査し、レコードを VT に追加します。メソッドは次のとおりです。 tp_goods.cat_id の値は VT.cat_id にすでに存在します。次に、対応する max_price を max(goods_price,max_price) に変更します。それ以外の場合は、 を追加します
VT の内容を出力します


モデレーター、実行プロセスの説明を含むお勧めの本はありますか

本は間違いなくあり、推定されています1990年代のものになります。でも、私は見ていません(見せても必ず見るとは限りません)

プロセスによれば、php の連想配列を使って簡単にプロセスをシミュレートできます
mysql の開発者は、あなたが理解できるほど愚かではありませんその過程を追った本があるはずだと聞いたのですが、それは1990年代のものに違いありません。でも、私は見ていません(見せても必ず見るとは限りません)

プロセスによれば、php の連想配列を使って簡単にプロセスをシミュレートできます

mysql の開発者は、あなたが理解できるほど愚かではありませんプロセスをシミュレートするにはどうすればよいですか?
それで、mysql 開発者がプロ​​グラム内でどのように動作するのか知りたいです

モデレーターによると、生成される仮想テーブルは 1 つだけですか?ステートメントに複数の選択がある場合、複数の仮想テーブルが存在しますか? 例:

select * from tp_goods where cat_id=(select id from tp_cat where cat_name='mobilephone');
モデレータはより複雑なものを与えることができますか? ? where、group by、having、orderby などのステートメントについて、その最初のステップの実行プロセスを説明してください。

1. from 句は、さまざまなデータ ソースからデータを組み立てるために使用されます 2、where 句は、指定された条件に基づいてフィルター処理するために使用されます 3. group by 句は、データを複数のグループに分割するために使用されます 4、集計関数を使用します計算の場合 5. グループ化をフィルタリングするには、having 句を使用します。 6. すべての式を計算します。 7. order by を使用して、すべての結果セットを並べ替えます。
上記の括弧に遭遇した場合、もちろん、上記のように括弧内の優先順位に従って実行が実行されます。 。

質問してみましょう: 外側にある iPhone 6 は本物ですか?


特に「High-Performance MySQL」(第 2 版) を確認しましたが、投稿者が言及したクエリ シーケンスに関する関連する説明は見つかりませんでした。次のスクリーンショットが投稿者の助けになれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。