---
# System prepended metadata

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

---

# 今週何知った？ week:12

## 各自発表


> [name=ken3ypa]

# MySQL についてよもやま

## おさらいMySQL

### シェア・人気
DB-ENGINES では全体2位・OSSでは1位
https://db-engines.com/en/ranking_osvsc



## バージョンについて
2022/04/02最新版（GA）は`MySQL 8.0.28`。

### バージョニング

||ファーストリリース|GA|GAバージョン|最終バージョン|EOL|
| --- | --- | --- | --- | --- | --- |
| 5.0 |2004/10 |2005/10  | 5.0.15 | 5.0.96 | 2011/12 |
| 5.1 |2005/03| 2008/12|5.1.30|5.1.73|2013/12|
| 6.0 | 2007/09|-|GAされず|-|-|
| 5.4 | 2009/04 |-|GAされず|-|-|
| 5.5 | 2009/12 |2010/12|5.5.8|5.5.62|2015/12|
| 5.6 | 2011/04 |2013/02|5.6.10|-|2018/02|
| 5.7 | 2013/04 |2015/10|5.7.9|-|2020/10|
| 8.0 | 2016/09 |2018/04| 8.0.11|-|2023/04|

※ GA = General Acceptance  
※ 6系はGAされず5.5としてリリース  
※ 7系はMySQL Cluster など関連プロダクトとバージョニングをあわせるためスキップ

## 最近の傾向(8.0以降)
- 3ヶ月に1回のアップグレード
- 既存機能改善よりも新機能追加
    - 8.0系列ではバージョン番号の進行によって新機能が追加されるため、その機能や周辺にバグが存在する可能性がある
    - それ以前は、バージョン番号の進行に伴って一番バグ修正が進んでいるであろうことが期待できた
    - なので選定する際には、バージョンが高いものを入れればよいという話でもない

## あの機能いつから？
- JSON型の格納…5.7から
- M1対応…5.7から
- パスワードポリシーの厳格化…5.7から[ref](https://qiita.com/keisukeYamagishi/items/d897e5c52fe9fd8d9273)
- Window関数…8.0から

### M1 対応・非対応バージョン
- 5.6 はM1非対応
https://doesitarm.com/formula/mysql@5.6/
- なのでM1では5.7を利用する必要がある
https://doesitarm.com/formula/mysql@5.7/

※ Does it ARM…アプリ名からApple Siliconへの対応状況を検索できるサイト

## 機能について

### RETURNING句
[RETURNING](https://www.postgresql.jp/document/13/html/dml-returning.html) 句が利用できない

なので Railsにおける [insert_all! のreturning オプション](https://edgeapi.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#:~:text=insert_all(attributes%2C%20returning%3A%20nil%2C%20unique_by%3A%20nil%2C%20record_timestamps%3A%20nil))は MySQL では利用不可

### DUAL表
一列しか持たないダミーテーブルのこと。特定の表に特にアクセスしなくてもよい場合などに用いられる。FROM句を省略した際には、DUAL表が暗黙的に用いられる

```
mysql> SELECT curdate();
+------------+
| curdate()  |
+------------+
| 2022-04-02 |
+------------+
1 row in set (0.00 sec)

mysql> SELECT curdate() FROM dual;
+------------+
| curdate()  |
+------------+
| 2022-04-02 |
+------------+
1 row in set (0.00 sec)
```


> [name=makicamel]

## 関数式と関数宣言

### 関数宣言（関数文、function 文）

関数宣言は同時にその関数名と同じ名前の変数を作成する
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions#相違点

```javascript
function functionStatement(n) {
  return `functionStatement: ${n}`
}
functionStatement.name
// => functionStatement
```

### 関数式（function 演算子）

`function` キーワードで開始せず、関数を含んでいる文が関数式

```javascript
// 無名関数
const functionOperatorWithoutName = function (n) {
  return `functionOperatorWithoutName: ${n}`
}
functionOperatorWithoutName.name
// => 'functionOperatorWithoutName'
// ES2015+ では代入時に関数名が設定される

// 名前付き関数
const functionOperatorWithName = function withName (n) {
  return `functionOperatorWithName: ${n}`
}
functionOperatorWithName.name
// => withName

// 即時実行関数式
(function () {
  return 'IIFE'
})()
// => IIFE

// ソース要素（source element）ではないとき
// // 「ソース要素」はスクリプトや関数本体の中で入れ子にされていない文のこと
if (x === 0) {           // ソース要素
  x = 10;               // ソース要素ではない
  function boo() {}     // ソース要素ではない
}

function a() { // 関数宣言
  function b() {} // 関数式
  if (0) {
    function c() {} // 関数式
  }
}
// ※ ブロックレベル関数はブラウザにより挙動が異なるので非推奨
```

### 関数宣言と関数式の違い
関数宣言は巻き上げられ、関数式は巻き上げられない

```javascript
// 関数宣言は巻き上げられる
hoisted();
// => 'foo'
function hlisted() {
  console.log('foo');
}

// 関数式は巻き上げられない
notHoisted();
// => Uncaught ReferenceError: notHoisted is not defined
const notHoisted = function () {
  console.log('foo')
}
```

## 関数とメソッドの違い
> オブジェクトのプロパティである関数をメソッドと呼びます。 JavaScriptにおいて、関数とメソッドの機能的な違いはありません。 しかし、呼び方を区別したほうがわかりやすいため、ここではオブジェクトのプロパティである関数をメソッドと呼びます。
[関数と宣言 · JavaScript Primer #jsprimer](https://jsprimer.net/basic/function-declaration/)

```javascript
const obj = {
  method1: function() { // メソッド
    // ...
  }
};
const obj = {};
obj.method = function() { // メソッド
  // ...
};
// ES2015+ ではオブジェクトリテラルの中で記載する短縮記法がある
const obj = {
  method() {
    // ...
  }
};
```

## メモ欄
