はじめに
SQLを読んでいると、テーブル名の後ろに見慣れない文字が書かれていることがあります。
例えば次のようなSQLです。
SELECT *
FROM users u
初めて見たとき私は、
「uって何?」
「テーブル名?」
「ASが付いていないけどエイリアスじゃないの?」
と混乱しました。
実際に調べてみると、SQLでは AS を省略してエイリアス(別名)を付けられることが分かりました。
今回は、自分と同じように混乱した方向けに、エイリアスについて整理してみます。
そもそもエイリアスとは?
エイリアス(Alias)とは、テーブルやカラムに付ける「別名」のことです。
例えば次のSQL。
SELECT *
FROM users AS u
この場合、
- 元のテーブル名:users
- エイリアス:u
になります。
人間でいうと「あだ名」のようなものです。
| 本名 | あだ名 |
|---|---|
| users | u |
SQLの中では users の代わりに u を使えるようになります。
ASは省略できる!
実はSQLでは AS は必須ではありません。
次の2つは同じ意味です。
FROM users AS u
FROM users u
データベースはどちらも同じように解釈します。
そのため実務では AS を書かないコードも多く見かけます。
シンプルな例
エイリアスを使わない場合。
SELECT users.name
FROM users
これでも問題ありません。
しかし、エイリアスを付けると次のように書けます。
SELECT u.name
FROM users u
短くなり、読みやすくなります。
実務の中でテーブル名が長いモノにはエイリアスをつけることで可読性が向上します!
JOINするとエイリアスのありがたみが分かる
テーブルが1つだけならエイリアスはなくても困りません。
しかし複数テーブルを結合すると話が変わります。
エイリアスなし
SELECT
users.name,
orders.order_date
FROM users
INNER JOIN orders
ON users.id = orders.user_id
まだ読めますが、テーブルが増えると長くなります。
エイリアスあり
SELECT
u.name,
o.order_date
FROM users u
INNER JOIN orders o
ON u.id = o.user_id
かなりスッキリします。
少し複雑な例
実務では3テーブル以上を結合することも珍しくありません。
SELECT
u.name,
o.order_date,
p.product_name
FROM users u
INNER JOIN orders o
ON u.id = o.user_id
INNER JOIN products p
ON o.product_id = p.id
もしエイリアスを使わなかった場合、
SELECT
users.name,
orders.order_date,
products.product_name
FROM users
INNER JOIN orders
ON users.id = orders.user_id
INNER JOIN products
ON orders.product_id = products.id
となります。
テーブル数が増えるほど、エイリアスの効果が大きくなります。
初学者が混乱しやすいポイント
私が混乱したのは次のようなSQLです。
FROM users u
最初は
「uというテーブルが存在するのかな?」
と思いました。
しかし実際には、
FROM users AS u
の AS が省略されているだけでした。
つまり、
uopm1s2
などはテーブル名ではなく、エイリアスとして使われているケースが多いです。
SQLを読むときは、
「テーブル名の後ろにスペースを空けて書かれている文字はエイリアスかもしれない」
と考えると理解しやすくなります。
おまけ:エイリアスには実はいくつか種類がある
ここまでテーブルエイリアスについて紹介しましたが、実はSQLで「別名」を付けられるのはテーブルだけではありません。
実務でSQLを読んでいると、テーブル・カラム・計算結果・サブクエリなど、さまざまな場所にエイリアスが登場します。
以下のSQLは、代表的なエイリアスをすべて盛り込んだサンプルです。
WITH NEW_USER AS (
SELECT
u.name AS USER_NAME,
u.salary * 12 AS YEAR_SALARY
FROM users u
)
SELECT
nu.USER_NAME,
nu.YEAR_SALARY
FROM (
SELECT *
FROM NEW_USER
) nu
それぞれのエイリアスを見てみましょう。
① テーブルエイリアス
FROM users u
ここでの
u
はテーブルエイリアスです。
| 対象 | 元の名前 | エイリアス |
|---|---|---|
| テーブル | users | u |
以降は users.name ではなく u.name と書けるようになります。
② カラムエイリアス
u.name AS USER_NAME
ここでの
USER_NAME
はカラムエイリアスです。
| 対象 | 元の名前 | エイリアス |
|---|---|---|
| カラム | name | USER_NAME |
取得した結果の列名が USER_NAME として表示されます。
③ 計算式へのエイリアス
u.salary * 12 AS YEAR_SALARY
ここでの
YEAR_SALARY
もカラムエイリアスです。
ただし今回は元々存在する列ではなく、
u.salary * 12
という計算結果に名前を付けています。
| 対象 | 計算式 | エイリアス |
|---|---|---|
| 計算結果 | salary * 12 | YEAR_SALARY |
実務では集計や金額計算などで頻繁に登場します。
④ CTE名(WITH句)
WITH NEW_USER AS (
ここでの
NEW_USER
はCTE(Common Table Expression)の名前です。
| 対象 | エイリアス |
|---|---|
| CTE | NEW_USER |
CTEは一時的な仮想テーブルのようなもので、
FROM NEW_USER
のように通常のテーブルと同じ感覚で利用できます。
⑤ サブクエリエイリアス
FROM (
SELECT *
FROM NEW_USER
) nu
ここでの
nu
はサブクエリエイリアスです。
| 対象 | エイリアス |
|---|---|
| サブクエリ | nu |
サブクエリに対しても別名を付けることができます。
そのため、
SELECT
nu.USER_NAME,
nu.YEAR_SALARY
のような書き方が可能になります。
まとめ
今回のSQLには次の5種類の「別名」が登場していました。
| 対象 | 例 | 呼び方 |
|---|---|---|
| テーブル | users u | テーブルエイリアス |
| カラム | name AS USER_NAME | カラムエイリアス |
| 計算式 | salary * 12 AS YEAR_SALARY | カラムエイリアス |
| サブクエリ | (...) nu | サブクエリエイリアス |
| CTE | WITH NEW_USER AS (...) | CTE名 |
初学者の頃は「エイリアス=テーブルの別名」だと思っていましたが、実際にはSQLではさまざまな対象に別名を付けることができます。
実務でSQLを読んでいて見慣れない名前が出てきたら、
「これはテーブルなのか?」
「カラムなのか?」
「サブクエリなのか?」
という視点で見ると、SQLの構造を理解しやすくなると思います。