15
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MySQLAdvent Calendar 2019

Day 20

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

Last updated at Posted at 2019-12-22

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句ではエイリアスを使えないとのことです。

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

15
7
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
15
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?