SQLを書いていると、AS
を使って列やテーブルにわかりやすい名前(エイリアス)をつける機会が多くあります。
例えば SELECT name AS customer_name
のように、元の列名を読みやすくするだけでも、クエリの見通しがぐっと良くなりますよね。
ところが、PostgreSQLでは「エイリアスを定義したのに使えない!」という場面に出くわすことがあります。
特に、WHERE句やHAVING句で「さっきつけたエイリアスが効かないのはなぜ?」と疑問に感じた方も多いのではないでしょうか。
本記事では、PostgreSQLにおけるエイリアスが使える場所・使えない場所をわかりやすく整理し、
それぞれの理由や回避方法についても丁寧に解説していきます。
SQL初心者の方や、実務で「エイリアスまわりでエラーになったことがある」という方にも、
「そういうことだったのか!」と腑に落ちる内容をお届けします。
それでは、エイリアスの基本から順に見ていきましょう。
エイリアスの基本:使い方のおさらい
まずは、エイリアス(別名)の基本的な使い方についておさらいしておきましょう。
エイリアスとは、列名やテーブル名に一時的な名前を付ける機能のことです。SQLを読みやすくしたり、後続の処理で名前を簡略化したりする際に、とても役立ちます。
列に対するエイリアス
たとえば、次のようなSQLをご覧ください。
SELECT name AS customer_name
FROM customers;
このように、name
列に「customer_name」という別名をつけています。
実行結果の列名も「customer_name」になるため、データの意味がより明確になりますね。
なお、AS
キーワードは省略可能です。つまり、以下のように書いても構文上は問題ありません。
SELECT name customer_name
FROM customers;
ですが、可読性や意図の明示という観点から、AS
を付ける書き方をおすすめいたします。
テーブルに対するエイリアス
続いて、テーブルにもエイリアスを付けることができます。こちらはテーブル名を省略して記述できるというメリットがあります。
SELECT c.name
FROM customers AS c;
この例では、customers
テーブルに「c」というエイリアスを与えています。
以降のSQL文では「c.name」のように短く書けるため、JOINなど複数のテーブルを扱う場面でもコードがすっきりします。
もちろん、こちらも AS
の省略は可能です。
FROM customers c
このように、列にもテーブルにもエイリアスは自由につけることができるというのが基本です。
ただし、実際には「どの場所でそのエイリアスが有効か?」という点が、SQLの書き方に大きく影響してきます。
PostgreSQLでエイリアスが使える場所
ここからは、PostgreSQLでエイリアスを活用できる具体的な場所について見てまいりましょう。
正しく使えば、SQLの可読性や保守性をぐっと高めることができます。順を追って確認していきましょう。
SELECT句
最も基本的かつ一般的なエイリアスの使用箇所です。
列名に別名を付けることで、出力結果の見やすさが向上します。
SELECT name AS customer_name
FROM customers;
このように記述すれば、出力結果の列名は「customer_name」となります。
データの意味が明確になるため、レポートや画面表示向けのSQLでも多用されます。
ORDER BY句
PostgreSQLでは、SELECT句で定義した列のエイリアスをORDER BY句内で使用することができます。
SELECT name AS customer_name
FROM customers
ORDER BY customer_name;
このように、customer_name
というエイリアスを用いて並び順を指定できます。
元の列名を再度記述する必要がないため、意図が明確でスマートな記述になります。
GROUP BY句
GROUP BY句でも、SELECT句で定義したエイリアスを使用することが可能です。
SELECT category AS cat, COUNT(*) AS total
FROM products
GROUP BY cat;
ここでは、category
列にcat
というエイリアスを与え、それをGROUP BYで利用しています。
このように、集計処理とエイリアスの組み合わせは非常に相性が良く、実務でもよく用いられます。
HAVING句(集計関数の直接利用)
HAVING句では、集計関数の結果を直接条件として記述することができます。
SELECT category, COUNT(*) AS total
FROM products
GROUP BY category
HAVING COUNT(*) > 10;
このように、COUNT(*)
をそのままHAVING句内に記述することで、件数が一定以上のグループのみを抽出できます。
なお、エイリアス(ここではtotal
)の使用については次章で詳しく触れます。
JOIN句でのテーブルエイリアス
JOINを使う場合、テーブル名が複雑になりやすいため、エイリアスを活用することでSQLの見通しが良くなります。
SELECT o.id, c.name
FROM orders AS o
JOIN customers AS c ON o.customer_id = c.id;
この例では、orders
テーブルにo
、customers
テーブルにc
というエイリアスを与え、以降はそれを使って簡潔に記述しています。
複数のテーブルを扱うJOIN構文では、エイリアスの使用が事実上の必須と言えるでしょう。
以上のように、PostgreSQLでは多くの句においてエイリアスの使用が認められており、SQLの記述を柔軟に、そして明快にしてくれるという利点があります。
PostgreSQLでエイリアスが使えない場所
前章では、エイリアスが有効に使える場所について確認いたしましたが、
実はすべての場所で自由に使えるわけではございません。
この章では、PostgreSQLにおいてエイリアスが“使えない”代表的なケースをご紹介し、その理由も併せて解説いたします。
WHERE句では列エイリアスが使えない
最も注意が必要なのが、WHERE句における列エイリアスの使用です。以下のようなSQLはエラーとなります。
SELECT price * quantity AS total
FROM sales
WHERE total > 1000; -- ❌ エラー
一見すると正しく見えるこの記述ですが、PostgreSQLではこのような列エイリアスをWHERE句で使うことはできません。
なぜ使えないのか?
これはSQLの評価順序に起因する問題です。
SQL文は実際には、次のような順序で処理されます。
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
ご覧の通り、SELECT句でエイリアスが定義されるのはWHERE句の後なのです。
つまり、total
というエイリアスが定義される前にWHERE句が評価されてしまうため、参照できないというわけです。
HABING句で列エイリアスを使うのは非推奨
HAVING句においても、列エイリアスの使用は注意が必要です。
PostgreSQLは一見、以下のような記述を許容することがあります。
SELECT category, COUNT(*) AS total
FROM products
GROUP BY category
HAVING total > 10; -- ⭕ 実行できることもあるが、非推奨
一部のケースではこれで動作することもありますが、仕様としては保証されておらず、他のDBMSではエラーとなることもあります。
対策:サブクエリやWITH句を活用する
どうしてもWHERE句などでエイリアスを使いたい場合には、サブクエリやWITH句を使って一段処理を分けるのがよいでしょう。
SELECT *
FROM (
SELECT price * quantity AS total
FROM sales
) AS sub
WHERE total > 1000;
あるいは、以下のように共通テーブル式(WITH句)を用いることもできます。
WITH sales_with_total AS (
SELECT price * quantity AS total
FROM sales
)
SELECT *
FROM sales_with_total
WHERE total > 1000;
このように工夫することで、エイリアスのスコープ(有効範囲)を明確にしつつ、安全で読みやすいSQLを書くことが可能となります。
まとめ
今回は、PostgreSQLにおけるエイリアスの使える場所・使えない場所について、実例とともに詳しく見てまいりました。
エイリアスは、SQL文の可読性を高め、構造を整理する上で非常に便利な機能です。
しかしながら、使いどころを誤るとエラーの原因にもなりかねません。
特に重要なポイントは、以下のとおりです。
SQLの評価順序を意識して、「どのタイミングで何が使えるか」を理解しておくことが、スマートなクエリを書くうえでの第一歩です。
もしこの内容を通して、PostgreSQLについてさらに理解を深めたいと感じられたなら、信頼できる講座や書籍を紹介した別記事をご覧いただくのも良いかと思います。ご自身の学びに、きっとお役立ていただけるはずです。
コメント