こんにちは!私は4月から会社に入り、SQLを学び始めました。そこで覚えて役に立った情報などをブログを通して紹介します!
今回はSQLのAS
句についてお話します。AS
はカラムやテーブルに別名(エイリアス)をつけるための便利な機能です。
1. AS句の基本的な使い方
まずは基本的な使い方から紹介します
カラムに別名をつける
別名を付けることで、元々のカラム名が長かったり分かりにくかったりする場合に、見やすい名前に変更できます。
SELECT
employee_id AS id,
first_name AS given_name,
last_name AS family_name
FROM
employees;
この例では、employee_id
がid
に、first_name
がgiven_name
に、last_name
がfamily_name
に変更されて結果に表示されます。
テーブルに別名をつける
複数のテーブルを結合(JOIN)する場合など、テーブル名を短くすることでクエリ全体をスッキリさせることができます。
SELECT
e.first_name,
d.department_name
FROM
employees AS e
LEFT JOIN
departments AS d
ON
e.id = d.id;
この例では、employees
テーブルがe
に、departments
テーブルがd
に別名がつけられています。これにより、employees.id
ではなく、e.id
と簡潔にカラムを指定することができるようになります。
2. サブクエリとAS
句
ここからは、サブクエリとAS
句の関係について解説します。
「ASをつけているのにエラーが出てしまう…」というときに役立つ知識です。
サブクエリに別名をつける
サブクエリとは 「クエリの中に書く小さなクエリ」 のことです。
一時的な表を作って、それを外側のクエリで利用できるようにします。
例:部署ごとの平均給与を出し、その結果を外側で使う場合
SELECT
a.department_id,
a.avg_salary
FROM (
SELECT
department_id,
AVG(salary) AS avg_salary
FROM
employees
GROUP BY
department_id
) AS a; -- サブクエリ全体に別名をつける
ここで AS a
と書いているので、外側のクエリからは
a.department_id
や a.avg_salary
といった形で参照できます。
サブクエリを「a という名前の表」として扱えるようになる、というイメージです。
サブクエリ内の「カラム別名」は外側でも使える
サブクエリの中で列に AS
を使うと、そのカラム名は外側からも使えます。
上の例では AVG(salary) AS avg_salary
と書いたので、
外側から a.avg_salary
と参照できるのです。
もし AS
を書かないと AVG(salary)
のままになり、外側から読むときにわかりにくくなります。
カラムの別名は必ず付けるのがおすすめです。
サブクエリ内の「テーブル別名」は外側では使えない
一方で注意したいのは、サブクエリ内で使うテーブルの別名です。
例えば次のクエリはエラーになります:
SELECT
e.first_name
FROM (
SELECT
department_id
FROM
employees AS e
) AS sub;
なぜなら employees AS e
でつけた e
という別名はサブクエリ内だけ有効だからです。
外側から e.first_name
を呼ぼうとしても、外側には e
という名前は存在しないので参照できません。
外側から見えるのは「サブクエリの結果だけ」であり、サブクエリの中でどう計算したかは外には伝わらない、とイメージすると分かりやすいです。
ポイント
- 外から見えるのは サブクエリの結果だけ
- サブクエリ全体の別名 → 外側でも参照可能
- サブクエリ内のテーブル別名 → サブクエリの中だけ有効
- カラムの別名 → 内側・外側どちらからでも参照可能
- サブクエリには必ず
AS
で別名を付けないとエラーになる
補足
もし「ASをつけたのに外側で参照できない!」とエラーになった場合は、
それが「テーブルの別名」なのか「サブクエリ全体の別名」なのか「カラムの別名」なのかを確認してみると解決につながると思います。
3. AS
句が使えない句と使える句
SELECT
句で定義したカラムの別名は、全てのSQL句で使えるわけではありません。
SQLのクエリは、
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
という順序で実行されるため、別名が定義される前の句では使うことができないのです。
AS
が使えない句:GROUP BY
、WHERE
、HAVING
これらの句は、SELECT
句で別名が定義されるより前に処理されるため、カラムの別名を使えません。
SELECT
department_id,
AVG(salary) AS avg_salary
FROM
employees
WHERE
avg_salary > 5000; -- エラー!'avg_salary'はWHERE句では使えない
この場合、WHERE
句には元のカラム名、またはサブクエリを使って条件を指定する必要があります。
SELECT *
FROM (
SELECT
department_id,
AVG(salary) AS avg_salary
FROM
employees
GROUP BY
department_id
) AS a
WHERE
a.avg_salary > 5000; -- OK!サブクエリの別名を使える
このように、サブクエリ全体に別名をつけることで、外側のクエリではWHERE
句でもa.avg_salary
を参照できます。
AS
が使える句:ORDER BY
一方、ORDER BY
句はSELECT
句が実行された後に処理されるため、AS
でつけた別名を使うことができます。
SELECT
department_id,
AVG(salary) AS avg_salary
FROM
employees
GROUP BY
department_id
ORDER BY
avg_salary DESC; -- OK!'avg_salary'でソートできる
この例では、avg_salary
という別名を使って、平均給与の高い順に結果を並べ替えています。
まとめ
今回の記事では、SQLのAS
句について基礎からサブクエリまで幅広く整理しました。
- カラムに別名をつけることで、長いカラム名やわかりにくい名前を読みやすく変更できる。
- テーブルに別名をつけることで、JOINなど複数テーブルを扱うクエリがスッキリする。
-
サブクエリには必ず
AS
で別名をつける必要がある(MySQLやPostgreSQLなど多くのDBでは省略するとエラーになる)。 - サブクエリ全体につけた別名は外側のクエリから参照できるが、サブクエリ内のテーブル別名は外側では使えない。
- カラムにつけた別名はサブクエリの内側・外側どちらからも利用できる。
- SQLは実行順序があるため、
WHERE
やGROUP BY
、HAVING
ではカラムの別名を使えない。 - 一方で、
ORDER BY
ではカラムの別名を使えるので、結果を見やすく整えるのに便利。
これらの違いを理解しておくと、SQLを書く上で不要なエラーに悩まされることがなくなります。SQLの実行順序を意識しながら、AS句を上手に活用していきましょう!