[解決済み] MySQLのクエリでは、なぜwhereの代わりにjoinを使うのですか?
2022-09-11 09:12:36
質問
2つ以上のテーブルを結合するには、joinかwhereのどちらかを使用するようです。どちらか一方の利点は何ですか?
どのように解決するのですか?
複数のテーブルを含むクエリは、テーブル "A" からテーブル "B" に結果をリンクするために、何らかの形式の関連付けを必要とします。 これを行う伝統的な (ANSI-89) 手段は、次のとおりです。
- FROM 句に関係するテーブルをカンマ区切りでリストアップします。
-
WHERE句にテーブル間の関連付けを記述します。
SELECT * FROM TABLE_A a, TABLE_B b WHERE a.id = b.id
ANSI-92 JOIN構文を使って書き直したクエリがこちらです。
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
パフォーマンスの観点から
サポートされている場合(Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+)、どちらの構文を使っても、パフォーマンス上の利点はありません。 オプティマイザはこれらを同じクエリと見なします。 しかし、より複雑なクエリでは、ANSI-92 構文を使用することで利益を得ることができます。
- JOIN の順序を制御する能力 - テーブルがスキャンされる順序
- JOINの前にテーブルのフィルタ基準を適用する機能
メンテナンスの観点から
ANSI-89よりもANSI-92のJOIN構文を使用する理由は数多くあります。
- JOIN基準がWHERE句から分離されているため、より読みやすい。
- JOIN条件を見逃す可能性が低くなる
- INNER 以外の JOIN タイプに対する一貫した構文のサポートにより、他のデータベースでもクエリーを簡単に使用できるようになりました。
- WHERE 句は、結合されたテーブルのデカルト積のフィルタリングとしてのみ機能する。
設計の観点から
ANSI-92 JOIN構文はパターンであり、アンチパターンではありません。
- クエリの目的がより明確である。アプリケーションで使用されるカラムが明確である。
- 可能な限り厳密な型付けを使用するというモジュール性のルールに従います。 明示的な方がほぼ普遍的に良い。
結論
慣れや快適さを除けば、ANSI-92 JOIN構文ではなくANSI-89 WHERE句を使い続けることに何の利点も見当たりません。ANSI-92 構文はより冗長であると不満を持つ人もいるかもしれませんが、それが明示的である理由です。 より明示的であればあるほど、理解や保守が容易になります。
関連
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] 最初の行への結合方法
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】1052:フィールドリストの列「id」が曖昧である
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] SQLでランダムな行を要求する方法は?
-
[解決済み] SQL Server 2008を使用してIDENTITY_INSERTをオン/オフする方法は?
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?
-
[解決済み] VARCHARとCHARの違いは何ですか?
-
[解決済み】内部結合とWhereの比較
-
[解決済み] 異なる2つのデータベースのテーブル間でジョインしますか?