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のヒント

推薦する

JS 矢印関数に適さないシナリオは何ですか?

目次概要オブジェクトにメソッドを定義するオブジェクトリテラルオブジェクトプロトタイプ動的コンテキスト...

Vue.jsは音楽プレーヤーを実装します

この記事では、音楽プレーヤーを実装するためのVue.jsの具体的なコードを参考までに共有します。具体...

SWFObjectを使用すると、HTMLにFlashを挿入する際のブラウザ互換性の問題を完全に解決できます。

一緒に学びましょう1. 伝統的な方法コードをコピーコードは次のとおりです。 <object c...

LinuxスレッドのPID(TID、LWP)を取得するいくつかの方法の詳細な説明

Linux C/C++ では、スレッド レベルの操作は通常、pthread ライブラリを通じて実行さ...

Reactの3つの主要属性における状態の使用の詳細な説明

目次クラスコンポーネント機能コンポーネントsetStateの落とし穴React では多くの場所でデー...

dockerでPostgreSQLを実行する方法

1. Dockerをインストールします。参考URL: Docker 入門インストールチュートリアル ...

CSSはクーポンスタイルを実装するために放射状グラデーションを使用します

この記事では、CSS で放射状グラデーションを使用して、次の図に示すクーポン スタイルの効果を実現す...

js に基づいて大きなファイルのアップロードとブレークポイントの再開を管理する方法

目次序文フロントエンド構造バックエンド構造(ノード+エクスプレス) FormDataに基づくファイル...

TypeScript デコレータ定義

目次1. コンセプト1.1 定義1.2 デコレータファクトリー1.3 デコレータの組み合わせ1.4 ...

nginxでgzip圧縮を有効にする手順を完了する

目次序文1. gzip圧縮を設定する2. 詳細設定3. nginxサービスを再起動する要約する序文ウ...

MySQL ビューの原理と使用法の詳細な分析

序文: MySQL では、ビューはおそらく最も一般的に使用されるデータベース オブジェクトの 1 つ...

Windows で Nginx を使用して https サーバーとリバース プロキシを構成する際の問題

リクエストロジックフロントエンド --> https経由でnginxをリクエストnginx -...

VS2022 リモート デバッグ ツールの使い方

WeChat 関連サービスをデバッグする場合など、職場のサーバー環境でリモートデバッグを行う必要があ...

初心者向けウェブサイト構築チュートリアルの概要

これら 6 つの記事を書いた後、私は少し混乱し始めました。次にどこに書けばいいのか分かりません。ドメ...

CocosCreator 一般的なフレームワーク設計リソース管理

目次Cocos Creator のリソース管理に関する問題リソースの依存関係リソースの使用レスローダ...