Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@yukibe

【MySQL】エイリアスを使える句について

More than 1 year has passed since last update.

MySQL Advent Calendar 2019の20日目エントリです。

枠が空いていたので、遅ばせながら参加させていただきました。

記事に特別感は全くありません。
エイリアスの動作について、最近の気づきをまとめました。

テスト用テーブルの準備

テーブルを用意します。

CREATE TABLE sales(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    sales_date DATETIME,
    price INT
);

適当にレコードをセットします。

mysql> SELECT * FROM sales;
+----+---------------------+-------+
| id | sales_date          | price |
+----+---------------------+-------+
|  1 | 2019-10-01 00:00:00 |   100 |
|  2 | 2019-10-05 00:00:00 |   300 |
|  3 | 2019-11-01 00:00:00 |   200 |
|  4 | 2019-11-20 00:00:00 |   100 |
|  5 | 2019-12-01 00:00:00 |   500 |
+----+---------------------+-------+
5 rows in set (0.00 sec)

句の中でエイリアスを使う

試しにGROUP BY句の中でエイリアスを使ってみます。

SELECT
    DATE_FORMAT(sales_date, '%Y%m') AS sales_month,
    COUNT(id) AS sales_count
FROM
    sales
GROUP BY
    sales_month

グループ化がされ、正しく反映されました。

+-------------+-------------+
| sales_month | sales_count |
+-------------+-------------+
| 201910      |           2 |
| 201911      |           2 |
| 201912      |           1 |
+-------------+-------------+

カラム名との重複に注意

エイリアスとカラム名(sales_date)が重複していると、GROUP BY句の中ではsales_dateカラムの方が優先されてしまいます。

SELECT
    DATE_FORMAT(sales_date, '%Y%m') AS sales_date,
    COUNT(id) AS sales_count
FROM
    sales
GROUP BY
    sales_date

エイリアスではなくsales_dateとしてグループ化されてしまい、期待する結果が得られませんでした。

+------------+-------------+
| sales_date | sales_count |
+------------+-------------+
| 201910     |           1 |
| 201910     |           1 |
| 201911     |           1 |
| 201911     |           1 |
| 201912     |           1 |
+------------+-------------+

エイリアスが使える句

はじめ、評価順はSELECTの方がGROUP BYより後なので、句の中でエイリアスは使えないと思っていました。
SELECT文の評価順序の話

他には、ORDER BY句HAVING句の中でエイリアスが使えます。
B.5.5.4 カラムエイリアスに関する問題

SELECT
    DATE_FORMAT(sales_date, '%Y%m') AS sales_month,
    COUNT(id) AS sales_count,
    SUM(price) AS sales_price
FROM
    sales
GROUP BY
    sales_month
HAVING
    sales_month > '201910'
ORDER BY
    sales_month
DESC
+-------------+-------------+-------------+
| sales_month | sales_count | sales_price |
+-------------+-------------+-------------+
| 201912      |           1 |         500 |
| 201911      |           2 |         300 |
+-------------+-------------+-------------+

この動作はMySQLの拡張機能だそうです。
他のDBMSにおける挙動は、各リファレンスを参照しなければ分かりません。
ORDER BY句で別名が使えてGROUP BY句では別名が使えない理由

ただし、標準SQLによるとWHERE句ではエイリアスを使えないとのことです。

お読みいただきありがとうございました。
良いクリスマスを!

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
yukibe
2018年8月よりWebエンジニア。主にPHP。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?