MySQL の where と on の違いと、いつ使用するか

MySQL の where と on の違いと、いつ使用するか

以前、テーブル結合クエリを書いていたとき、whereとonの違いがわからず、SQLに小さな問題が発生することがありました。ここでは、その違いを記録するための特別な記事を用意しました。違いがわからない場合は、

この2つの違いと、いつ使うべきか

注意: on と where を区別してください。まず、接続を内部接続と非内部接続に分けます。内部接続の場合、on と where の機能は同じです。通常、それらの違いを区別することはできず、非内部接続について話しています。

通常、onは2つのテーブルを接続するために使用されます。これは接続の条件のみです。内部接続では、onは省略できます。このとき、2つのテーブルの直積を表します。on接続を使用した後、MySQLは一時テーブルを生成し、whereは一時テーブルに基づいて、where句に従って条件を満たすレコードをフィルタリングします。そのため、whereはフィルタリングに使用されます。

内部結合

注: join はデフォルトで inner join になります。inner join の場合、on と where は同じ効果を持つと考えることができます。

非内部結合(左結合、右結合、完全結合など)

一般的に、非内部接続を使用する場合、違いは明確ではありません。


次に、違いを示すために 2 つのテーブルを作成します (各テーブルに 4 つのデータ レコードを挿入し、2 つのテーブルは trade_id によってリンクされます)。SQL スクリプトはこの記事の下部に添付されています。次に、結合テーブル クエリを使用して、on と where の違いを示します。

1. 内部結合は 2 つのテーブルを接続します (on と where なし)

hopegaming_main.test_1234 から * を選択し、hopegaming_main.test_1235 に参加します。

同等

hopegaming_main.test_1234、hopegaming_main.test_1235 から * を選択

結果セットは2つのテーブルの直積である。

2. 内部結合は2つのテーブルを接続します(オンの場合)

hopegaming_main.test_1234 t1 から * を選択し、 t1.trade_id = t2.trade_id で hopegaming_main.test_1235 t2 に参加します。 

結果セットは、2つのテーブルで同じtrade_idを持つデータです。

3. 内部結合は2つのテーブルを接続します(whereを使用)

hopegaming_main.test_1234 t1 から * を選択し、hopegaming_main.test_1235 t2 に参加します。ここで、t1.trade_id = t2.trade_id です。 

結果セットは2つのテーブル内の同じtrade_idのデータです

2 と 3 の結果から、inner join を使用する場合、on と where は同じ効果があることがわかります。

4. 左結合(次の例では、左結合を使用して 2 つのテーブルを接続します)

選択*からhopegaming_main.test_1234 t1左結合hopegaming_main.test_1235 t2 t1.trade_id = t2.trade_id  

結果セットは左側のテーブルに基づいています。trade_id に基づいて右側の等しい値を直接検索し、結合します。右側のテーブルに一致するデータがない場合、null として表示されます。

5. 左結合(次の例では、左結合を使用して2つのテーブルを接続します)2つのテーブルを接続し、接続条件に定数式があります

hopegaming_main.test_1234 t1 から * を選択し、 t1.trade_id = t2.trade_id および t2.nick_name = 'wangwu' で hopegaming_main.test_1235 t2 を結合します。

結果セットは左側のテーブルに基づいています。結合条件で一致するレコードが見つからない場合は、null が表示されます。

6. 左結合(次の例では、左結合を使用して2つのテーブルを接続します)2つのテーブルを接続し、定数式をwhere句に入れます

* を hopegaming_main.test_1234 t1 から選択し、 t1.trade_id = t2.trade_id で、 t2.nick_name = 'wangwu' で、 hopegaming_main.test_1235 t2 に参加します。

結果には、where 句に一致するデータのみが表示されます。一致するものがない場合、接続をフィルタリングした後の一時テーブル内のデータであるため、表示されません。
単なる接続です。右側に一致するデータがない場合には null が表示され、左側のデータはフィルタリングされずに表示されます。これが where と on の最大の違いです。

テーブルを作成し、データを挿入するためのスクリプト:

テーブル `hopegaming_main`.`test_1234` を作成します (
  `id` varchar(30) NOT NULL COMMENT 'ID番号',
  `name` varchar(100) デフォルト NULL コメント '名前',
  `trade_id` varchar(100) デフォルト NULL コメント 'トランザクションID',
  `gender` tinyint(4) デフォルト NULL コメント '性別',
  `birthday` タイムスタンプ(6) NOT NULL COMMENT '生年月日',
  BTREEを使用した主キー(`id`)
  キー `idx_trade_id` (`trade_id`) BTREE の使用
) ENGINE=InnoDB デフォルト CHARSET=utf8 ROW_FORMAT=DYNAMIC;

hopegaming_main.test_1234 に挿入
(ID、名前、取引ID、性別、誕生日)
VALUES('1', 'zhangsan', '123', 0, CURRENT_TIMESTAMP(6)),
('2', 'zhaosi', '124', 0, CURRENT_TIMESTAMP(6)),
('3', '王武', '125', 0, CURRENT_TIMESTAMP(6)),
('4', 'maqi', '126', 0, CURRENT_TIMESTAMP(6));


テーブル `hopegaming_main`.`test_1235` を作成します (
  `id` varchar(30) NOT NULL COMMENT 'ID番号',
  `nick_name` varchar(100) デフォルト NULL コメント 'エイリアス',
  `trade_id` varchar(100) デフォルト NULL コメント 'トランザクションID',
  `address` varchar(100) デフォルト NULL コメント 'アドレス',
  `email` varchar(6) NOT NULL COMMENT '生年月日',
  BTREEを使用した主キー(`id`)
  キー `idx_trade_id` (`trade_id`) BTREE の使用
) ENGINE=InnoDB デフォルト CHARSET=utf8 ROW_FORMAT=DYNAMIC;

hopegaming_main.test_1235 に挿入
(ID、ニックネーム、取引ID、住所、メールアドレス)
値('1', '張山', '123', '北京', '0000'),
('2'、'王武'、'123'、'天津'、'1111')、
('3'、'maqi'、'124'、'上海'、'2222')、
('4'、'楊柳'、'127'、'山西'、'3333');

要約する

MySQL の where と on の違いと、それらをいつ使用するかについての記事はこれで終わりです。MySQL の where と on の違いについての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLクエリ条件におけるonとwhereの配置の違いの分析
  • MySQL の左結合操作における on 条件と where 条件の違いの紹介
  • MySQL の on と where における左結合設定条件の使用法の違いの分析

<<:  レスポンシブ Web デザイン手法を実装し、ウォーターフォール モデルに別れを告げる 5 つのステップ (グラフィック チュートリアル)

>>:  ネイティブ JavaScript でオブジェクトが空かどうかをチェックする実装例

推薦する

ページ下部のフッターを修正する方法(複数の方法)

フロントエンド Web エンジニアとして、ページ効果を作成するときに次の現象に遭遇したことがあるはず...

Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析

目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...

MySQL関連のツールをいくつかお勧めします

序文:インターネット技術の継続的な発展に伴い、MySQL 関連のエコシステムはますます充実し、ますま...

Windows での MySQL 8.0.18 インストール チュートリアル (図解)

ダウンロードダウンロードアドレス: https://dev.mysql.com/downloads/...

MySQL シリーズ 7 MySQL ストレージ エンジン

1. MyISAM ストレージエンジン欠点:トランザクションはサポートされていません最小粒度ロック:...

Linux での MySQL 5.7 の導入とリモート アクセス構成

前書き: 最近、私はパートナーとチームを組んで .NET Core プロジェクトに取り組む予定です。...

HTML の表のフレームとルール属性の詳細な説明

テーブル タグの frame 属性と rules 属性は境界線の表示を制御できます。フレーム プロパ...

HTML iframe で親ページと子ページ間の双方向メッセージングを実装する例

ある日、リーダーはメイン ページに iframe を埋め込み、親ページと子ページ間で双方向にメッセー...

Linux システムでの nginx サーバーのインストールと負荷分散構成の詳細な説明

nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバー、メール プ...

Vue 仮想 DOM クイックスタート

目次仮想DOM仮想DOMとは何か仮想DOMの役割Vue の仮想 DOM vノードvNodeとはvNo...

React Routerの歴史について簡単に説明します

React Router を理解したいなら、まず歴史を理解する必要があります。より具体的には、Rea...

Dockerイメージをインポートおよびエクスポートする方法

この記事では、移行、バックアップ、アップグレードなどのシナリオで使用される Docker イメージの...

Linux を使用して時間指定ファイルが占有するディスク容量を計算する方法

スケジュールされたタスク エディターを開きます。Cent は、デフォルトで vim を使用して直接開...

MySQL GTID マスターとスレーブの不一致を修復するソリューション

目次解決策1: レプリカを再構築する前提条件アドバンテージ欠点手順マスター奴隷解決策2: データ修復...

HTML でのフォームとフォーム送信操作に関する情報のコレクション

ここでは、フォーム要素とフォーム送信に関する知識を紹介します。フォーム要素フォーム要素の DOM イ...