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 でオブジェクトが空かどうかをチェックする実装例

推薦する

ゲーム開発におけるサウンド処理にCocosCreatorを使用する方法

目次1. Cocos Creatorでのオーディオ再生の基本1. 基本2. 一般的な方法2. Coc...

中国のウェブサイトユーザーエクスペリエンスランキング

<br />ユーザーエクスペリエンスは中国のウェブサイトでますます重視されており、ユーザ...

意外と知らないJSのループ速度テストのいろいろを徹底解説

目次序文1. forループ2. whileループとdo-whileループ3. forEach、map...

CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する複数の方法

CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する 7 つの方法。コー...

XMLとCSSスタイルの組み合わせ

学生.xml <?xml バージョン="1.0" エンコーディング=&qu...

Linux での MySQL 5.7.18 yum のアンインストールからインストールまでのプロセスの図

いろいろ苦労しましたが、やっと yum インストールの手順がわかりました。以前、バイナリ パッケージ...

W3C チュートリアル (4): W3C XHTML アクティビティ

HTML は、World Wide Web 上で公開するために使用されるハイブリッド言語です。 XH...

Linux リモート開発に vs2019 を使用する方法

通常、Linux プログラムを開発する場合、次の 2 つのオプションがあります。 Linux上で直接...

mysql ルートユーザーを認証できず、Navicat リモート認証プロンプト 1044 の問題を解決します

まず解決策を見てみましょう #------------mysql の root ユーザーに権限を付与...

HTMLのposition属性の使い方(4種類)の詳しい説明

位置の 4 つのプロパティ値は次のとおりです。 1.相対的な2.絶対3.修正4.静的これら 4 つの...

MySQLデータベースの管理者パスワードを忘れた場合の解決策

1. コマンド mysqld --skip-grant-tables を入力します (前提条件: m...

フロントエンドの上級者向けコースでは、JavaScript のストレージ機能の使い方を学習します。

目次序文背景実施計画の考え方js ストレージ機能ソリューション設計やっと要約する序文どの SaaS ...

Linux trコマンドの使い方

01. コマンドの概要tr コマンドは、標準入力からの文字を置換、圧縮、削除できます。ある文字セット...