MySQL の on と where における左結合設定条件の使用法の違いの分析

MySQL の on と where における左結合設定条件の使用法の違いの分析

この記事では、MySQL の左結合における on 条件と where 条件の使用法の違いを例を使って説明します。ご参考までに、詳細は以下の通りです。

1. まず、テスト用に 2 つのテーブルを準備します。

テーブル `a` を作成します (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `name` varchar(32) デフォルト '' コメント 'name',
 主キー (`id`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

テーブル `b` を作成します (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `a_id` int(11) デフォルト '0' コメント 'テーブルID',
 `name` varchar(32) デフォルト '' コメント 'name',
 主キー (`id`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

2 つのテーブルのデータは図に示されています。

次の左結合クエリを実行します。

a の左から * を選択し、b を a.id = b.a_id で結合します。

実行結果が同じかどうかを確認するために、それぞれ on と where の後に条件を追加します。

a から * を選択し、a.id = b.a_id かつ b.id > 3 で b を左結合します。

a の左から * を選択し、b を a.id = b.a_id で結合します (b.id > 3)。

上記の 2 つのステートメントでは、設定した条件は同じで、両方とも b.id > 3 ですが、表示される結果が異なるのはなぜでしょうか。

SQL文のクエリのキーワードシーケンスは、一般的には > where > group by > having > order by となります。

左結合が from 範囲内にある場合、on 条件は最初に左結合の右側のテーブルをフィルターし、次に where 条件の結果をフィルターします。

複数の左結合により、一時テーブルが生成されます。on 条件は左結合の右テーブルをフィルター処理し、where 条件は最後に生成された一時テーブルをフィルター処理します。

それで:

on の後に条件 b.id > 3 が記述されている場合、最初に右側のテーブル (関連テーブル) をスクリーニングして条件を満たす行を取得し、次にメイン テーブルを左結合してメイン テーブルのすべての行を返します。右側のテーブルで一致しない行は null で表されます。

条件 b.id > 3 が where の後に記述されている場合、メイン テーブルは右側のテーブル (関連付けられたテーブル) と左結合されてすべての行が返され、その後 where 条件を使用して結果がフィルター処理されます。

注: on の後の条件は右側のテーブル (関連付けられたテーブル) に対するものであり、メイン テーブルには影響しません。

a の左から * を選択し、a.id = b.a_id かつ a.id > 3 で b を結合します。

後でメイン テーブルに条件 a.id > 3 を追加しましたが、メイン テーブルのすべてのデータは引き続き表示されますが、右側のテーブル (関連テーブル) の表示に影響します。

メインテーブルをフィルタリングする場合は、where の後に条件を記述する必要があります。

a の左から * を選択し、b を a.id = b.a_id で結合します (a.id > 3)。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL の左 (右) 結合での on と where フィルタリングの違いを分析する
  • MySQL の左結合操作における on 条件と where 条件の違いの紹介
  • MySQLクエリ条件におけるonとwhereの配置の違いの分析
  • MySQL の ON と Where の違いの詳細な説明

<<:  Ubuntu 20.04 をインストールした後に行うべきこと (初心者向けガイド)

>>:  知らないかもしれない実用的なTypeScriptのヒント

推薦する

ウェブページのアクセス速度に関する主な問題と解決策

<br />ウェブサイトのアクセス速度はウェブサイトのトラフィックに直接影響を及ぼし、ウ...

MySQL トリガーの原理と使用例の分析

この記事では、例を使用して、MySQL トリガーの原理と使用方法を説明します。ご参考までに、詳細は以...

Centos サーバーに MySql をデプロイし、Navicat に接続するプロセスの詳細な説明

(1)サーバー構成: [root@localhost ~]# cd /usr/local/src/ ...

MySQL エラー番号 1129 の解決方法

SQLyog が MySQL に接続する際にエラー番号 1129 が発生します: mysql エラー...

dockerにmysqlをインストールした後にNavicatが接続できない問題に対する完璧な解決策

1. Dockerがイメージをプルするdocker pull mysql (デフォルトで最新バージョ...

DOCTYPE HTMLを使用する理由

これがないと、ブラウザはページをレンダリングするときに Quirks モードを使用することがわかって...

Linux 7.7 でスワップ パーティション SWAP を設定する方法

Linux システムの Swap パーティション、つまり swap パーティションは、一般に仮想メモ...

純粋な CSS を使用してユーザーが Web ページのコンテンツをコピーするのを防ぐ方法

序文私自身の個人ブログを入力しているときに、ブログの詳細ページでさまざまなコンテンツをコピーするさま...

JavaScript の継承についてどれくらい知っていますか?

目次序文コンストラクタ、プロトタイプオブジェクト、インスタンスオブジェクトの関係プロトタイプチェーン...

プレーンな JS オブジェクトの代わりに Map を使用する場合

目次1. マップは任意のタイプのキーを受け入れます2. マップにはキー名に関する制限はありません3....

Linux で 1 回限りのスケジュールされたタスクを実行するための at コマンドの使用に関する詳細な説明

目次序文1. 一度限りの計画タスクの紹介2. コマンド3. 1回限りのスケジュールタスクを作成する4...

MySQL トランザクションの詳細

目次導入取引の4つの特徴トランザクション分離レベル確認するMVCC現在の読書スナップショット読み取り...

CentOS での MySQL ログイン 1045 問題を解決する

アプリケーション全体を CentOS にデプロイする必要があるため、当然ながらデータベース操作は不可...

クラウドサーバーを購入し、Alibaba Cloud に Pagoda Panel をインストールする手順

アリババクラウドがサーバーを購入クラウドサーバーを購入し、サーバーバージョンとしてcentos 7....

Dockerfileの指示と基本構造の説明

Dockerfile を使用すると、ユーザーはカスタム イメージを作成できます。基本構造Docker...