0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLのエイリアス完全入門|テーブル・カラム・サブクエリ・CTEの別名を分かりやすく解説

0
Posted at

はじめに

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 が省略されているだけでした。

つまり、

  • u
  • o
  • p
  • m1
  • s2

などはテーブル名ではなく、エイリアスとして使われているケースが多いです。

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の構造を理解しやすくなると思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?