列数とデータ型の互換性
結果セットを結合するために満たすべきルールと、よくある不一致エラーを学びます。
「列数とデータ型の互換性」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
面接官が確認する互換性のルール
すべての集合演算(UNION、INTERSECT、EXCEPT)では、2つの結果セットがUNION互換である必要があります。面接官は、こうしたクエリが気付きにくい形で失敗する原因を理解しているか確認します。
互換性を決めるルールは2つあります。列数が一致していることと、位置ごとにデータ型に互換性があることです。どちらかを間違えると、エラーになったり予想外の結果になったりします。
ルール1:列数が同じであること
両方のクエリで、同じ数の列を返す必要があります。最初のクエリが3列を返し、2つ目のクエリが2列を返す場合、データベースはその文を拒否します。
これは面接で最もよくある集合演算のエラーです。特に、誰かが一方の分岐を編集して、もう一方を修正し忘れた場合に起こりやすくなります。
SELECT id, name, city FROM a
UNION
SELECT id, name FROM b;
-- ERROR: each UNION query must have the same number of columnsルール2:位置ごとに互換性のある型であること
列は名前ではなく位置で対応付けられます。クエリ1の1列目はクエリ2の1列目と対応し、以降も同様です。それぞれの組み合わせで、型に互換性が必要です。
互換性があるとは、通常、暗黙的に変換できることを意味します。INTとBIGINTは問題ありませんが、INTとDATEは一般的に互換性がありません。
SELECT id, signup_date FROM a
UNION
SELECT id, signup_date FROM b;
-- positions: (int,date) vs (int,date) -> OK重要なのは名前ではなく位置
見落としやすい点として、列の名前が異なっていても、位置と型が揃っていれば結合できます。逆に、名前が一致していても順序が間違っていれば、データの対応がずれてしまいます。
集合演算は必ず列の位置で読み取ってください。面接官は、これを確認するために列の順序を入れ替えた例を出すことがあります。
SELECT name, id FROM a
UNION ALL
SELECT id, name FROM b;
-- name<->id swapped: types may clash or data lands in wrong column出力列名
結果セットの列名は最初のクエリから取得されます。2つ目のクエリのラベルは破棄されます。ヘッダーを制御するには、最初の分岐で列にエイリアスを付けます。
そのため、後続の ORDER BY では、最初のクエリの名前を参照するか、序数位置を使用する必要があります。
SELECT id AS user_id, city AS location FROM a
UNION ALL
SELECT id, town FROM b;
-- output headers: user_id, location暗黙的な型変換
位置で対応する2つの列の型が異なっていても互換性がある場合、エンジンは両方の値を格納できる十分な幅の結果型を選択します。INT と DECIMAL を組み合わせると、通常は DECIMAL になります。
面接でこの型変換に触れると、理解の深さを示せます。列がエラーになるのではなく、より広い型に昇格することを理解しているからです。
SELECT amount FROM int_table -- INT
UNION ALL
SELECT amount FROM dec_table; -- DECIMAL
-- result column is DECIMAL不足する列をNULLで補う
2つのクエリの列構成が自然に異なる場合は、プレースホルダー列を追加して揃えます。よく使われる方法は、もう一方の分岐に存在する列の位置を埋めるために、NULL(多くの場合は型を指定してキャストします)を選択することです。
NULLをキャストすると、エンジンによる型の推測を避けられ、列の互換性を維持できます。
SELECT id, phone, CAST(NULL AS VARCHAR) AS email FROM a
UNION ALL
SELECT id, CAST(NULL AS VARCHAR), email FROM b;型の不一致によるエラーの例
ここでは、一方の分岐では2列目が日付で、もう一方では文字列になっています。厳格なエンジンはこれを拒否しますが、寛容なエンジンでは予測できない形で変換される可能性があります。安全な解決策は、明示的な CAST を使って両側の型を一致させることです。
面接では、暗黙的な変換に頼るのではなく、CASTを提案してください。
SELECT id, CAST(event_date AS VARCHAR) FROM a
UNION ALL
SELECT id, label FROM b;
-- both second columns now VARCHAR -> compatibleこれらのルールはすべての集合演算子に適用される
列数と型の互換性に関するルールは、UNION、UNION ALL、INTERSECT、EXCEPT のすべてで同じです。どれも結果セットを縦方向に積み重ね、入力にUNION互換性を要求します。
つまり、すべての集合演算に同じチェック項目を使えます。列数を数え、位置ごとに型を確認し、最初のクエリで列名を制御します。
SELECT id, city FROM a
INTERSECT
SELECT id, city FROM b;
-- same compatibility rules as UNION実行前のチェックリスト
結果セットを結合する前に、次の点を確認してください。
- すべての分岐で列数が同じであること。
- 位置ごとの組み合わせで型に互換性があること(不確かな場合はキャストします)。
- 列が同じ論理的な順序に並んでいること。
- 出力名をわかりやすくするため、最初のクエリにエイリアスを設定していること。
面接でこのチェックリストを声に出して確認すると、気付きにくい対応ずれのバグを防げます。
全体をつなげて理解する
互換性に関する失敗のほとんどは避けられます。列数が異なる場合はエラーが明確に発生しますが、列の入れ替えや予想外の型変換では、気付かないまま問題が起こります。クエリを列の位置で読み取り、意図的にキャストすれば、集合演算を正しく保てます。
自信を持って答えるには、両方のルール、位置による対応付け、出力名が最初のクエリから決まることを説明してください。
クイックチェック
SQLでは、2つのUNIONの分岐のどの列同士が対応すると判断しますか?
復習
重要なポイント:
- すべての集合演算子で、すべての分岐の列数が同じである必要があります。
- 列は位置で対応付けられ、それぞれの組み合わせで型に互換性が必要です。
- 互換性のある型は、より幅の広い共通型に変換されることがあります。
- 列構成が異なる場合は、
CAST(NULL AS type)を使って不足する列を補います。 - 出力名は最初のクエリから取得されます。
よくある質問
「列数とデータ型の互換性」レッスンは無料ですか?
はい。「列数とデータ型の互換性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「列数とデータ型の互換性」で何を学びますか?
結果セットを結合するために満たすべきルールと、よくある不一致エラーを学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「列数とデータ型の互換性」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。