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句
ではエイリアスを使えないとのことです。
お読みいただきありがとうございました。
良いクリスマスを!