集計をする上で必要となるgroup byですが,
今回はMySQLの拡張されたgroup byについて説明していきたいと思います。
検証環境
今回は第125回 phpMyAdminでDockerで建てたMySQLにアクセスするで記載したdocker-composeを利用して作成します。手元で簡単に試せるように,
group byのMySQL拡張
今回の検証はMySQLの独自拡張を利用することになるため,
まずは今回紹介したいgroup by拡張ですが,
select * from zipcode group by zip_code;
SQLモードを設定せずに上記のSQLを現行のMySQLで実行すると,
mysql> select * from zipcode group by zip_code; ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'zipcode.zipcode.code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
SELECTのリストの中でGROUP BYの中に含まれていないカラムと集約関数を通してないカラムが含まれているためエラーになっていて,
では,
SQLモードを指定する方法は,
手元で試してみたい場合は,
docker-composeでmy.cnfを設定する
まずはじめに,
mysql> select @@sql_mode; +-----------------------------------------------------------------------------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +-----------------------------------------------------------------------------------------------------------------------+
以下のように,
$ tree . ├── Dockerfile ├── README.md ├── docker-compose.yml ├── docker-entrypoint-initdb.d │ ├── 1_ddl.sql │ ├── 2_load_data_infile.sql │ └── KEN_ALL_UTF8.CSV └── mycnf └── my.cnf
今回のmy.
[mysqld] sql_mode=""
docker-compose.
version: '3' services: mysql: build: . volumes: - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d - ./mycnf/my.cnf:/etc/mysql/my.cnf # my.cnfをマウントする environment: MYSQL_ROOT_PASSWORD: password command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --secure-file-priv="/docker-entrypoint-initdb.d"
docker-composeを再起動して,
mysql> select @@sql_mode; +------------+ | @@sql_mode | +------------+ | | +------------+
ということで,