列の射影とエイリアスの落とし穴
WHEREでSELECTのエイリアスを参照できない理由と、面接で問われるエイリアスの有効範囲を学びます。
「列の射影とエイリアスの落とし穴」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
射影:列を選ぶ
クエリが返す列を選ぶことを射影と呼びます。SELECTを書くたびに行っている処理です。実際のコードでは列を明示し、SELECT *は簡単な探索にだけ使いましょう。
SELECT id, first_name, email
FROM employees;面接官がSELECT *を嫌う理由
面接官がアプリケーションコードでSELECT *を嫌うのはなぜでしょうか。壊れやすく(列の順番が変わる可能性があります)、帯域幅を無駄にし、インデックスの利用を妨げ、本当に必要なものを分かりにくくするからです。列名を明示しましょう。👍
ASで列にエイリアスを付ける
エイリアスは、出力上の列名を変更するものです。明確さのためにASを使いましょう。特に計算列で効果を発揮し、salary * 12のような複雑な式に、読みやすく分かりやすい見出しを付けられます。
SELECT first_name AS name,
salary * 12 AS annual_salary
FROM employees;スペースを含むエイリアスを引用する
エイリアスにスペースや予約語が含まれる場合は、引用符で囲む必要があります。移植性の高い標準的な方法はダブルクォートです。ただし、snake_caseの名前に統一し、引用自体を避けるのがおすすめです。
SELECT salary AS "Annual Pay"
FROM employees;大きな落とし穴:WHEREでのエイリアスのスコープ
最もよく出題される落とし穴は、SELECTでエイリアスを定義し、それをWHEREで絞り込みに使うと失敗することです。WHEREはSELECTより前に実行されるため、その時点ではエイリアスがまだ存在しません。
-- This raises an error
SELECT salary * 12 AS annual_salary
FROM employees
WHERE annual_salary > 100000;理由:論理的な実行順序
解決策は、論理的な句の順序を理解することです。FROM、WHERE、GROUP BY、HAVING、SELECT、そしてORDER BYの順です。SELECTは後ろのほうで実行されるため、それより前の句からはSELECTのエイリアスを参照できません。
修正方法1:式を繰り返す
最も移植性の高い修正方法は単純です。WHEREではエイリアスの代わりに式を繰り返し記述します。少し冗長ですが、どのデータベースでも確実に動作します。
SELECT salary * 12 AS annual_salary
FROM employees
WHERE salary * 12 > 100000;修正方法2:サブクエリまたはCTEで包む
長い式を繰り返すのが見苦しい場合は、まずサブクエリまたはCTEで計算します。そこではエイリアスが実際の列になるため、外側のWHEREでそのエイリアスを使って絞り込めます。
SELECT *
FROM (
SELECT first_name, salary * 12 AS annual_salary
FROM employees
) t
WHERE annual_salary > 100000;エイリアスを使用できる場所:ORDER BY
朗報です。ORDER BYはSELECTの後に実行されるため、SELECTのエイリアスを使用できます。つまり、WHERE、GROUP BY、HAVINGからはエイリアスを参照できませんが、ORDER BYからは参照できます。
SELECT first_name, salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC;方言の違いを押さえる
ここで名前を挙げておくと、MySQLではGROUP BYやHAVINGでエイリアスを比較的柔軟に使用できますが、PostgresとSQL Serverは標準に従います。まず論理的な実行順序から考え、そのうえで例外に触れてください。
テーブルエイリアスと列エイリアス
混同しないでください。テーブルエイリアスはテーブル名を短くするもので、WHEREを含むあらゆる場所で参照できます。一方、列エイリアスは出力列の名前を変更するもので、どこからでも参照できるわけではありません。まったく逆です。
SELECT e.first_name, e.salary AS pay
FROM employees AS e
WHERE e.salary > 50000;確認問題
この基本的な落とし穴を確認しましょう。
まとめ
まとめると、SELECT *よりも明示的に列を指定し、ASでエイリアスを付けます。SELECTのエイリアスはWHERE、GROUP BY、HAVINGからは参照できませんが、ORDER BYでは使用できます。式を繰り返すか、CTEを使って解決します。
よくある質問
「列の射影とエイリアスの落とし穴」レッスンは無料ですか?
はい。「列の射影とエイリアスの落とし穴」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「列の射影とエイリアスの落とし穴」で何を学びますか?
WHEREでSELECTのエイリアスを参照できない理由と、面接で問われるエイリアスの有効範囲を学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「列の射影とエイリアスの落とし穴」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 列の射影とエイリアスの落とし穴
- 計算列と式の優先順位
- 一意性におけるDISTINCTとGROUP BYの違い
- SELECT内のCASE式