SQL プログラミング

【豆知識】別名はどういうときに付けるの?別名が使えないってどういうこと?

スポンサーリンク

SQLXec02

頼れる人
テーブル名が長いといちいち書くのがめんどくさい
違うテーブルで同じカラム名があるときは?
どういうときに付けるといいの?
こんなときにどうすればいいのかを教えるよ

もうすでに、別名の付け方は知ってるよ!という人は、ここは読まなくていいですよ
こけさん

別名って何?

 テーブル名やカラム名を指定すれば、欲しい情報が取得できます。
 そして、関数を使ってカラムの値を編集できます。
 この編集したカラムをソートしたいときに、そのままだと非常に長くなってしまうので、書くのがすごく大変になってしまいます!
 また、違うテーブルなのに同じカラム名があったとき、どちらのテーブルのカラムを使うのかを指定するのにも、長いテーブル名だとSQL自体がわかりにくいものになってしまいます。

 そこで、テーブル名やカラム名に違うわかりやすい名前を付けることができるのです。

 テーブル名 または カラム名 AS [ 別名 ]

 別名はこのようにして、テーブル名やカラム名の後に、AS句を付けて別名を指定します。ASは省略してもOKです。
 どんな英数字・記号の半角文字でも日本語を含む全角文字でも別名として使うことができます。

・数字や記号から始まる別名は付けることができません
・空白文字を含めた別名を指定することもできません
・予約されている単語(SELECTやWHEREなど)は指定することはできません

 シングルコーテーション(’ )やダブルコーテーション(” )で囲むことで、上記のできない別名を付けることができます。しかし、この別名を再利用するときに、SQLエラーとなってしまうケースがありますのでおすすめはしません。
 日本語名を別名として付けるときには、ダブルコーテーションで囲む必要はありません。
 MySQLを利用するときには、バッククォート(` )で囲みます。

別名はどこに付けられるの?

 別名を指定できるのは、テーブル名を指定するところとカラムを指定するところのみです。

 テーブル名は個々のテーブルだけではなく、副問い合わせにも使うことができます。
 カラム名は個々のカラム名だけではなく、関数を利用したときや、SELECT句に副問い合わせを指定したときにも使えます。

 別名を付けたテーブルもあれば、付けないテーブルがあっても問題はありません。またカラムについても同じです。
 別名を付けるのであれば統一させたほうがよいです。

別名はどうやって使うの?

使い方は?

// テーブル名とカラム名に別名を付けないとき
SELECT baseball_players.players_id
      ,baseball_players.players_name
      ,baseball_teams.team_name
FROM baseball_players
INNER JOIN baseball_teams
ON  baseball_teams.players_teamid = baseball_players.players_teamid
WHERE baseball_players.players_teamid = 'A100'
ORDER BY baseball_players.players_id;
// テーブル名とカラム名に別名を付けたとき
SELECT bp.players_id AS id
      ,bp.players_name AS name
      ,bt.team_name AS team
FROM baseball_players bp
INNER JOIN baseball_teams bt
ON  bt.players_teamid = bp.players_teamid
WHERE bp.players_teamid = 'A100'
ORDER BY id;

 このように、テーブル baseball_players には [ bp ]・baseball_teams には [ bt ] を、カラム playersid には [ id ]・playersname には [ name ] をそれぞれ指定します。

 テーブル baseball_players を利用するときには、[ baseball_players ]ではなく、別名の[ bp ]を用います。SELECT句やWHERE句などではテーブル baseball_players ではなく、別名が利用されています。
 カラム playersid を利用するときには、[ playersid ]ではなく、別名の [ id ]を用います。ORDER BY句でカラム playersid ではなく、別名が利用されています。

どこで使えるの?

 テーブル名(副問い合わせも)に付けた別名は、どこでも使うことができます。
 SELECT句、FROM句、WHERE句、ORDER BY、GROUP BY、HAVING句で使えます。

// テーブル名の別名はどこでも使える
SELECT bp.players_teamid
      ,count(bp.players_id)
FROM baseball_players bp
WHERE bp.players_age >= 20
GROUP BY bp.players_teamid
HAVING count(bp.players_id) >= 10
ORDER BY bp.players_teamid;

 カラム名に付けた別名は、ORDER BYで使えます。
 しかし、副問い合わせ内でカラム名に付けた別名は、どこでも使うことができます。

// カラム名の別名はORDER BYのみ使える
SELECT bp.players_teamid id
      ,count(bp.players_id) cnt
FROM baseball_players bp
WHERE bp.players_age >= 20
GROUP BY bp.players_teamid
HAVING count(bp.players_id) >= 10
ORDER BY id;
// 副問い合わせの中の別名は、どこでも使える
SELECT bt1.teamid
      ,count(bp.players_id)
FROM (
  SELECT bt.players_teamid teamid
        ,count(bt.players_teamid)
  FROM   baseball_teams bt
  GROUP BY bt.players_teamid
  HAVING count(bt.players_teamid) > 100
) bt1
INNER JOIN baseball_players bp
ON  bp.players_teamid = bt1.teamid
GROUP BY bt1.teamid
ORDER BY bt1.teamid;

 副問い合わせの中の bt.players_teamid に別名 [ teamid ]を付けました。※5行目
 このteamidという別名は、外側のSELECT句やGROUP BY、ORDER BYでも利用することができます。

 SELECT文だけに使えると解釈しがちですけど、テーブル名を指定するところに使えますと書いているとこがポイントです。
 テーブル名を指定するのはSELECT文だけではなく、UPDATE文、DELETE文そしてMERGE文なのでも利用できます。
 ※MERGE文とは、INSERT文とUPDATE文を1つに合わせたものです。
 INSERT文でも利用できますが、INSERT-SELECT以外のケースでは使うことはないと思います。

// UPDATE文でも別名が使える
UPDATE baseball_players bp
SET bp.players_name = '山下 太一'
WHERE bp.players_teamid = 20;
// DELETE文でも別名が使える
DELETE baseball_players bp
WHERE bp.players_teamid = 20;
// MERGE文でも別名が使える
MERGE INTO baseball_players bp
USING employee emp
ON (bp.emp_id = bp.emp_id)
-- 条件に一致
WHEN MATCHED THEN
  UPDATE
  SET bp.players_teamid = 999
-- 条件に不一致
WHEN NOT MATCHED THEN
  INSERT (
     players_id
    ,players_name
    ,players_teamid
  ) VALUES (
     emp.emp_id
    ,emp.emp_name
    ,0
  );

別名はどういうときに付けるといいの?

 別名はこのようなときに使うことが多いです。

  • 長いテーブル名を使うするとき
  • 関数を利用したカラム編集を行ったとき
  • 違うテーブルの同じカラム名を使うとき
  • 副問い合わせを使うとき

さらに詳しく

別名を使うとSQLの実行速度が上がるということを聞きますが、現在はほとんど影響はありません。しかし、単純なSQLを使うことは少ないので、必然的に別名を利用したSQLを作成することとなります。

別名が使えないってどういうこと?

 別名がどこでも使えるわけではありません。実は付けた別名が使えないとこがあるんです
 これはSQLの解釈順序に関係してくるのですが、この順序を知っていると確かにと納得することでできます。

 SQLは、SELECT句・FROM句・WHERE句などにわかれていますが、先頭のSELECT句から順番に解釈されていくのではありません。
 実は、解釈する順番が決まっているんです。これはどのデータベースでも同じです。

  1. FROM句 … どのテーブルか
  2. WHERE句 … どのような条件で
  3. GROUP BY句 … どのような集計単位で
  4. HAVING句 … どのような集計条件で
  5. SELECT句 … どのカラムか
  6. ORDER BY句 … どのような並び順か

 なので、1番目のFROM句で付けた別名はどこでも使えます。しかし、5番目のSELECT句で付けた別名はORDER BY句でしか使えないのです。

ココがポイント

テーブルに付けた別名は、INNER JOINやOUTER JOINでも使うことはできますが、カラムに付けた別名は、同じSELECT句の中で使うことはできません。

 では、副問い合わせのときはどうでしょうか?

 FROM句に書かれた副問い合わせのときには、1番目に解釈されます。この副問い合わせの中で付けたカラムの別名は、WHERE句やGROUP BY、SELECT句などで使うことができます。

 WHERE句に書かれた副問い合わせのときには、2番目に解釈されます。1番目で指定されたテーブルの別名はこの副問い合わせの中で使うことができます。
 しかし、この副問い合わせの中で付けたカラムの別名は、他で使うことはできません。

 SELECT句に書かれた副問い合わせのときには、5番目に解釈されます。ここでも1番目で指定されたテーブルの別名はこの副問い合わせの中で使うことができますが、この副問い合わせの中で付けたカラムの別名は、他で使うことはできません。この副問い合わせ自体につけた別名は、ORDER BYで使うことができます。

まとめ

 テーブル名とカラム名のみに別名を付けることができます。
 英数字や一部の記号、日本語も含めた全角文字も別名として使うことができます。
 別名が使えるところと使えないところがあることに注意しましょう。
 別名を付けることで、テーブルやカラムがより判別しやすくなりますので、複数テーブルを結合するときには別名を使うようにしましょう。

▶ 一覧に戻る

スポンサーリンク

-SQL, プログラミング
-

PAGE TOP

© 2021 ちょこぱいぶろぐ Powered by AFFINGER5