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

推薦する

jQueryはテーブル行データのスクロール効果を実現します

この記事の例では、テーブル行データのスクロール効果を実現するためのjQueryの具体的なコードを参考...

Windows 10 で MySQL の解凍バージョンをインストールする方法の詳細なグラフィック チュートリアル

MySQL のインストールは、インストール バージョンと解凍バージョンに分かれています。インストール...

ウェブデザインにおけるキーワード設計手法の紹介

多くの場合、ホームページを作成するときに、Web ページ ヘッダー属性の設定を無視します。 Web ...

Linux周辺ファイルシステムのカスタマイズ方法

序文一般的に、Linux システムについて話すときは、Linux カーネルと GNU プロジェクトに...

MySql 5.7.21 無料インストール バージョンの構成方法 (Win10 の場合)

1.インストールしたい場所に解凍し、my.iniファイルを作成します。 my.iniの内容は次のと...

Windows で MySQL のルート パスワードをリセットする方法

今日、WordPress がデータベースに接続できないことがわかりました。ウィンドウ サーバーにログ...

Linux サーバーに埋め込まれた ddgs および qW3xT.2 マイニング ウイルスの対処の実践記録

序文仮想通貨の狂気的な投機により、マイニングウイルスは犯罪者が最も頻繁に使用する攻撃方法の 1 つに...

Ubuntu 18.04 のすべての Python ライブラリを一度にアップグレードする方法

ピップとは何かpip は、Python パッケージの検索、ダウンロード、インストール、アンインストー...

MySQL がデュアルマスターで構成されている場合にデータループの競合を回避する方法

あなたはこの質問について考えたことがあるでしょうか?デュアルアクティブが構成されている場合、データル...

js の parseInt() の奇妙な動作の調査と修正

背景: parseInt(0.006) または parseInt(0.0006) は 0 という値を...

nginxフォワードプロキシとリバースプロキシの詳細な説明

目次フォワードプロキシnginx リバースプロキシnginx リバースプロキシ 02リバースプロキシ...

proxy_pass がパス パスに従って転送する場合の "/" 問題の詳細な説明

nginx で proxy_pass を設定するときに、^~ に従ってパスを一致させる場合は、pro...

Mysql の大きな SQL ファイルの高速リカバリ ソリューションの共有

序文MySQL データベースを使用する過程では、データベースのバックアップと復元が必要になることがよ...

iframeを使用してページを呼び出すとページがキャッシュされるかどうかの簡単な分析

最近、毎日変更されるページを iframe を使用して呼び出す必要があるプロジェクトがあります。その...

Bootstrap 3.0 学習ノート CSS関連補足

この記事の主な内容は次のとおりです。 1. ブラウザのサポート2. 画像3. レスポンシブツール4....