0Pricing
Coding Interview Prep · レッスン

列の射影とエイリアスの落とし穴

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フィードバックを取得できます。ローカル設定は不要です。

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

  1. 列の射影とエイリアスの落とし穴
  2. 計算列と式の優先順位
  3. 一意性におけるDISTINCTとGROUP BYの違い
  4. SELECT内のCASE式
← Coding Interview Prepに戻る