---
# System prepended metadata

title: '今週何知った？ week:31'

---

# 今週何知った？ week:31

## 各自発表

> [name=ken3ypa]

## 標準SQLと、標準SQLを拡張したMySQLの仕様について
### きっかけ
- MySQL5.7を利用し、アプリの環境構築を行なっていた際、docker_compose.ymlの記述から特定のmy.cnfの設定を反映させるための行が抜け漏れていた
- その結果、アプリを立ち上げた際にMySQL側で下記のようなエラー
    - `ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hoge.hoge.fuga' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by`
- my.cnf の設定を適切に読み込ませることで解決したが、今回はこれにまつわるお話をしたい

### `ERROR 1055 (42000)` のエラーについて
- SELECTしている対象の中で、GROUP BYの中に含まれていないカラムと集約関数を通していないカラムが含まれているためエラーになっており、これは `sql_mode=only_full_group_by`と非互換であるとのこと

たとえば下記のようなクエリでこのエラーが出る
```sql
SELECT column1, SUM(column2)
FROM table1
GROUP BY column1
```

### 対応方法
- SELECTにて、集約関数を利用しているカラムだけSELECTする
- sql_mode のオプションを変更し、5.6以前の「あいまいなgroup_by」を許容するようにしている
    - 今回はこちらが採用されていた
    - ONLY_FULL_GROUP_BY を設定する必要があり([ref](https://dev.mysql.com/doc/refman/8.0/ja/group-by-handling.html))

### あいまいな group_by について
- MySQL5.6までは「あいまいな group_by」と呼ばれる上記のようなクエリを許容していた
- これは、標準SQLからの拡張機能としてMySQLが実装していたもの
- しかし5.7からは、この挙動はデフォルトで許容せずSELECT文を発行したときにエラーになる
    - group化したときに複数候補がある場合、どれがSELECTされるか不安定なため

## そもそも標準SQLって？
SQLの標準規格。国際標準化機構(ISO)と国際電気標準会議(IEC)が共同で策定しており、数年に一度改訂される。最新の改訂はSQL標準規格は「ISO/IEC 9075:2016（通称SQL:2016）」で、直近だと、2016年、2011年、2008年に改訂されている。
https://en.wikipedia.org/wiki/ISO/IEC_9075

## 追加された機能について
- 2016年では
  - 新しいデータ型として「JSON」が追加された
