SQLクエリの実行順序をゼロから学ぶ

SQLクエリの実行順序をゼロから学ぶ

SQL クエリ ステートメントの実行順序は次のとおりです。

(7)選択 
(8) DISTINCT <選択リスト>
(1)<left_table>から
(3)<結合タイプ> JOIN <右テーブル>
(2)ON <結合条件>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <制限数>

事前準備

1. 新しいテストデータベースを作成する

データベース testData を作成します。

2. テスト テーブルを作成し、次のようにデータを挿入します。

ユーザーテーブル


注文フォーム


SQL論理クエリテストステートメントを準備する

a.user_id、COUNT(b.order_id) を total_orders として選択します。
ユーザーからの
LEFT JOINはbとして注文する
a.user_id = b.user_id の場合
ここで、a.city = '北京'
GROUP BY a.user_id
COUNT(b.order_id) < 2 である
ORDER BY total_orders desc

上記の SQL クエリを使用して、注文が 2 件未満の北京の顧客を取得します。

これらの SQL ステートメントの実行中に、SQL ステートメントの実行結果を保存するための仮想テーブルが生成されます。

1. FROMステートメントを実行する

最初のステップは、 FROMステートメントを実行することです。まず、どのテーブルから開始するかを知る必要があります。これは、 FROMによってわかります。現在、 <left_table><right_table>という 2 つのテーブルがありますが、どちらのテーブルから始めるべきでしょうか。それとも、2 つのテーブル間に何らかの接続を作成してから始めるべきでしょうか。それらは互いにどのように関係しているのでしょうか? — デカルト積

FROM ステートメントが 2 つのテーブルに対して直積を実行すると、次の内容を持つ仮想テーブル VT1 (仮想テーブル 1) が取得されます。


合計で 28 件 (ユーザーレコード数 * 注文レコード数) のレコードがあります。これは VT1 の結果です。以下の操作は VT1 に基づいています。

2. ONフィルタリングを実行する

デカルト積を実行した後、 ON a.user_id = b.user_id条件フィルタリングが実行されます。 ONで指定された条件に従って、条件を満たさないデータが削除され、次のように VT2 が得られます。

select * from user as a inner JOIN orders as b ON a.user_id = b.user_id; 


3. 外部行を追加する

このステップは、結合タイプがOUTER JOIN ( LEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOINなど) の場合にのみ実行されます。ほとんどの場合、 OUTERキーワードは省略しますが、 OUTER外部行の概念を表します。

LEFT OUTER JOIN 、左側のテーブルを予約済みテーブルとしてマークします。つまり、左側のテーブルのすべてのデータが照会され、右側のテーブルに対応するデータがない場合、NULL で埋められます。


RIGHT OUTER JOIN 、右側のテーブルを予約済みテーブルとしてマークします。つまり、右側のテーブルのすべてのデータが照会され、左側のテーブルに対応するデータがない場合、NULL が追加されます。


FULL OUTER JOIN左側のテーブルと右側のテーブルの両方を予約済みテーブルとして使用しますが、MySQL は完全結合をサポートしていません。完全結合は次の方法で実装できます。

準備したテスト SQL クエリ ロジック ステートメントで LEFT JOIN を使用したため、結果の VT3 テーブルは次のようになります。


4. where条件フィルタリングを実行する

外部行が追加されたデータは、where 条件によってフィルタリングされます。<where_condition> 条件を満たすレコードのみがフィルタリングされます。次のように WHERE a.city = 'beijing' を実行して VT4 を取得します。


ただし、WHERE 句を使用する場合は、次の 2 つの点に注意する必要があります。

1. データがまだグループ化されていないため、where フィルター条件で where_condition=MIN(col) を使用してグループ統計をフィルターすることはできません。

2. 列選択操作が実行されていないため、選択で列エイリアスを使用することもできません。たとえば、c='beijing' の場合、table1 から city as c を選択することは許可されません。

5. group byステートメントを実行する

GROU BY句は主に、 WHERE句を使用して取得した仮想テーブルをグループ化するために使用されます。次のように GROUP BY a.user_id を実行して VT5 を取得します。


6. 所有の執行

HAVING句は主にGROUP BY句と組み合わせて使用​​され、グループ化によって得られた VT5 のデータに対して条件付きフィルタリングを実行します。次のように HAVING COUNT(b.order_id) < 2 を実行して VT6 を取得します。


7. リストを選択

SELECT句は今のみ実行されます。最初の行に記述されているからといって、 SELECT句が最初に実行される句であると想定しないでください。

テスト ステートメントでSELECT a.user_id,user_name,COUNT(b.order_id) as total_ordersを実行し、VT6 から必要なコンテンツを選択して、次のように VT7 を取得します。


8. 重複データを排除するためにdistinctを実行する

クエリでDISTINCT句が指定されている場合は、一時的なメモリ内テーブルが作成されます (メモリに収まらない場合は、ディスクに保存する必要があります)。この一時テーブルのテーブル構造は、前の手順で生成された仮想テーブルと同じです。違いは、重複データを排除するために、DISTINCT 操作の列に一意のインデックスが追加されていることです。テスト SQL にはDISTINCT句が含まれていないため、実行されません。

9. order by句を実行する

仮想テーブル VT7 の内容を指定された列で並べ替え、新しい仮想テーブルを返します。テスト SQL ステートメントでORDER BY total_orders DESCを実行すると、次の結果が得られます。

DESCは降順で並び替え、ASCは昇順で並び替えます


10. 制限文を実行する

LIMIT 句は、前の手順で取得した仮想テーブルから指定された位置から指定された行データを選択します。これは、ページングによく使用されます。

MySQLデータベースのLIMITは次のオプションをサポートしています: limit n,m

n 番目のレコードから始まる m 個のレコードを選択することを示します。データが小さい場合は、LIMIT 句を使用しても問題ありません。ただし、データ量が非常に多い場合は、LIMIT n, m を使用することは非常に非効率的です。 LIMIT メカニズムは毎回先頭からスキャンするため、600,000 行目から 3 つのデータを読み取る必要がある場合は、最初に 600,000 行目までスキャンしてから読み取る必要があります。スキャン処理は非常に非効率的な処理です。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • PHP で mysqli を使用して複数の SQL クエリ ステートメントを同時に実行する例
  • MySQLクエリ文の実行プロセスを理解するための記事
  • MySQLでSQLクエリ文がどのように実行されるかを分析する
  • Mysql系SQLクエリ文の書き順と実行順を詳しく解説
  • MySQL では SQL クエリはどのように実行されますか?
  • SQLクエリステートメントの実行プロセス

<<:  Dockerイメージの階層化の原理の詳細な説明

>>:  vue プロジェクトで rem を使用して px を置き換える例

推薦する

MySQLパーティションテーブルの詳細な説明

序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...

jsでライトスイッチの効果を実現

この記事の例では、ライトスイッチ効果を実現するためのjsの具体的なコードを参考までに共有しています。...

VMware vSAN 入門概要

1. 背景1. vSphere の共有ストレージの背景を簡単に紹介するvSphere の重要な機能は...

LinuxでIPアドレスを手動で設定するための詳細な手順

目次1.まずネットワークカードの設定ディレクトリに入る2. ifcfg-ens33ネットワークカード...

forループ内のvarの問題の解決

序文var は ES5 における変数宣言方法です。var で変数を宣言するとループ変数がグローバル変...

React-Native環境のセットアップと基本的な紹介

環境の準備1. 環境構築React Native 中国語ウェブサイト2. 開発ツール フロントエンド...

Ubuntu 18.04 (物理マシン) で OpenWRT 開発環境を構成する方法

1. 仮想マシン(物理マシン)をインストールする仮想マシンまたは物理マシンにインストールできます。 ...

ディレクトリスクロール効果を実現するネイティブJS

これはネイティブ JS で実装されたテキスト スクロール効果です。この効果は通常、ニュース、ダイナミ...

MySql ログイン パスワードを忘れた場合とパスワードを忘れた場合の解決策

方法1: MySQL では、次のコマンド ラインで MySQL サーバーを起動することにより、アクセ...

MySQL8のパスワードを忘れた場合の簡単な解決策

序文MySQL データベースのパスワードを忘れると、データベースに正常にアクセスできなくなり、パスワ...

角度付き双方向バインディングの詳細な説明

目次双方向バインディングの原理ngモデルレンダリングカスタム双方向バインディングプロパティコンポーネ...

MySQL 分離レベルの詳細な説明と例

目次MySQL の 4 つの分離レベルデータ テーブルを作成します。分離レベルの設定物事の分離レベル...

MySQL における between の境界と範囲の説明

境界範囲間のmysql間の範囲は両側の境界値を含む例: 3 から 7 までの id は、id >...

HTML テーブルタグチュートリアル (32): セルの水平方向の配置属性 ALIGN

水平方向では、セルの配置を左、中央、右に設定できます。基本的な構文<TD ALIGN=&quo...

Nginx ロケーション設定のチュートリアル (ゼロから)

基礎位置の一致順序は、「最初に正規表現に一致し、次に共通表現に一致」です。実際のロケーションの一致順...