0Pricing
SQL Interview Prep · レッスン

UNIONとUNION ALLの違い

重複除去とパフォーマンスの違い、そして通常はUNION ALLが意図される理由を学びます。

「UNIONとUNION ALLの違い」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。

面接官がUNIONについて尋ねる理由

集合演算は、1つの結果セットをもう1つの結果セットの下に縦方向に積み重ねます。UNIONとUNION ALLは、面接官が最初に取り上げる集合演算子です。両者の違いは一言で答えられますが、コストを理解しているかどうかが表れます。

質問はほぼ必ず次のような形です。「UNIONとUNION ALLの違いは何ですか。どちらを使うべきですか。」優れた回答では、重複排除、順序、パフォーマンスについてまとめて説明します。

UNIONの動作

UNIONは2つのクエリの行を1つの結果セットにまとめ、その後重複する行を削除します。2つの行が重複とみなされるのは、すべての列が一致する場合だけです。

重複を削除するには、エンジンが結合されたすべての行をソートまたはハッシュ化する必要があり、実際に処理コストがかかります。UNIONは数学的な意味での集合を返すため、同じ行は繰り返されません。

SELECT city FROM customers
UNION
SELECT city FROM suppliers;

UNION ALLの動作

UNION ALLは2つの結果セットを連結し、重複を含むすべての行を保持します。重複排除を行わないため、その目的でのソートやハッシュ化も行いません。

重複排除の手順を省くため、UNION ALLはほぼ常に高速です。行が重複しないとわかっている場合や、重複をそのまま必要とする場合に正しい選択です。

SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;

パフォーマンスの違い

面接での要点は、UNION ALLの方が低コストだということです。重複排除を行わないためです。UNIONでは、重複を削除するために結合された行を比較する必要があります。

  • UNION = UNION ALL + 暗黙的なDISTINCT処理。
  • 大きな結果セットでは、このDISTINCT処理がクエリコストの大部分を占めることがあります。

重複を削除する必要がないなら、UNIONを選ぶのはCPUとメモリの無駄です。

重複を含む実例

両方のクエリが'Paris'という行を返す可能性があるとします。UNIONではParisが1つになります。UNION ALLではParisが2つになります。

面接官は、行数を予測させる質問を好みます。まず連結直後の結果を思い浮かべ、その後で「この演算子は重複を取り除くか」と考えてください。

-- customers.city: Paris, Lyon
-- suppliers.city: Paris, Nice
-- UNION     -> Paris, Lyon, Nice   (3 rows)
-- UNION ALL -> Paris, Lyon, Paris, Nice (4 rows)

重複はすべての列を対象に定義される

よくある落とし穴は、選択したすべての列が等しい場合にのみ、2つの行が重複とみなされることです。異なる列を1つ追加すると、行は重複ではなくなるため、UNIONは両方を保持します。

同じテーブルに対するUNIONでも、SELECT cityよりSELECT id, cityの方が多くの行を返すことがあるのは、このためです。

SELECT id, city FROM customers
UNION
SELECT id, city FROM suppliers;
-- ids differ -> few or no duplicates removed

結合後の結果を並べ替える

個々の分岐にORDER BYを置くことはできません。ORDER BYは結合後の結果全体に適用され、最後に1回だけ記述する必要があります。

面接官からORDER BYをどこに置くか尋ねられたら、答えは「最後のクエリの後に1つだけ置き、出力列を名前または位置で参照する」です。

SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers
ORDER BY city;

列名は最初のクエリから決まる

最後の ORDER BY で列を参照するときは、最初の SELECT の名前(またはエイリアス)を使用します。2つ目のクエリの列名は、出力時のラベル付けには使用されません。

これは、各分岐で列名が異なる場合に重要です。最初の分岐にエイリアスを付けて、出力ヘッダーを制御します。

SELECT city AS location FROM customers
UNION ALL
SELECT town FROM suppliers
ORDER BY location;

UNIONを使うべき場合

UNION は、行が重複する可能性が実際にあり、それぞれの異なる行を1回ずつ取得したい場合に限り使用します。たとえば、同じ人物が両方に含まれる可能性のある2つの連絡先リストを統合する場合や、複数のソースから重複のない値の一覧を作成する場合です。

ソースが互いに重ならないと保証できるなら、UNION ALLを使うと同じ結果をより高速に得られます。

SELECT email FROM web_signups
UNION
SELECT email FROM store_signups;
-- one row per distinct email across both

UNION ALLを使うべき場合

重複が発生しない場合、重複に意味がある場合、または後で集計する場合は、UNION ALL を使用します。典型的な例は、互いに行が重複しない月別パーティションテーブルを積み重ねる処理です。

面接でのポイント:UNION ALLがデフォルトであり、重複排除が実際に必要な場合にのみUNIONを選ぶ、と説明してください。

SELECT * FROM sales_2023
UNION ALL
SELECT * FROM sales_2024;

まとめ

洗練された面接の回答は、次のようになります。「UNIONは重複行を削除するため、ソートまたはハッシュ処理が必要になり、UNION ALLより遅くなります。どちらも列数の一致と互換性のあるデータ型を必要とし、ORDER BYは最後に1回だけ指定します。重複排除が必要でない限り、デフォルトではUNION ALLを使用します。」

この一文だけで、正確性とパフォーマンスへの理解を同時に示せます。

クイックチェック

UNIONとUNION ALLの違いを理解できているか確認します。

復習

重要なポイント:

  • UNION = 結合して重複行を削除(暗黙のDISTINCT、追加コスト)。
  • UNION ALL = すべてを保持したまま結合する、より高速で妥当なデフォルト。
  • 重複とみなすにはすべての列が一致する必要があります。
  • ORDER BY は最後に1回だけ指定し、最初のクエリの列名を使用します。

デフォルトではUNION ALLを使用し、重複排除が本当に必要な場合にのみUNIONを選びます。

よくある質問

「UNIONとUNION ALLの違い」レッスンは無料ですか?

はい。「UNIONとUNION ALLの違い」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。

「UNIONとUNION ALLの違い」で何を学びますか?

重複除去とパフォーマンスの違い、そして通常はUNION ALLが意図される理由を学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「UNIONとUNION ALLの違い」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. UNIONとUNION ALLの違い
  2. 列数とデータ型の互換性
  3. 比較に使うINTERSECTとEXCEPT
  4. JOINで集合演算を再現する
← SQL Interview Prepに戻る