バックエンド メモ

# MYSQL
## 作法
|作法|解説|
|-|-|
|テーブル名は複数形に||
|文の最後には;をつける||
|コマンドは全て大文字で書く||
|テーブル名,カラム名はアッパーキャメルケース|
|フィールドがNULLか確認する際には必ずIS NULLを使う||
|UPDATE, DELETEを使用する際には必ずWHERE句があるか確認する|WHERE句がない場合すべてのレコードが更新、削除されてしまう。|
|シングルクォーテーションを使う||
| ===== 命名規則 ===== ||
| ===== 技術的作法 ===== ||
|インデックスを使用してテーブルを更新する場合は、インデックスを使用せずにテーブルを更新するよりも時間がかかります（インデックスも更新する必要があるため）。したがって、頻繁に検索される列にのみインデックスを作成します。|
|クエリをシンプルで保守しやすいものにするために、必要な場合を除いて、日付に時間コンポーネントを使用しないでください。|

## Tips
* MySQL safe updateモード(Where句が必要になる)
* 


## コマンド一覧
|コマンド|概要|例|
|-|-|-|
|SQL||
|UPDATE|データの更新に使用する|UPDATE table_name SET column1 = value1, column2 = value2,... WHERE condition;|
|DELETE|データの削除に使用|DELETE FROM table_name WHERE condition;|
|SELECT LIMIT|特定の条件にマッチする最初のN行を取得する。例えばページネーションとかで最初の数個しかデータが入らないのに何千行読んでからその上から一部を撮るのは無駄だから。|
|MIN|最小のデータを取得||
|MAX|最大のデータを取得||
|COUNT|カウント=個数を求める||
|AVG|アベレージ=平均を求める||
|SUM|サム=合計を求める||
|LIKE|パターンを使ってフィルターをかけるときに使う|
|IN|Orの短縮形。 (A or B or C or D)　を　IN (A, B, C, D)というふうに書ける|
|BETWEEN|指定した範囲内のレコードと取得。数字、文字列、日付が条件に使える|
|AS|エイリアス。使い所 : 複数のテーブルに対するクエリを作成する時、関数が使われている時、カラム名が長いもしくは可読性に欠ける時、いくつかのカラムをまとめて出力する時|
|(INNER/RIGHT/LEFT/CROSS) JOIN|２つのテーブルを特定の条件でバインディングした結果を出力。CROSSは結果が大きくなるので注意。|
|UNION|複数のテーブルの出力を合成することができる。重複要素は削除される|
|UNION ALL|UNIONと同じだが重複要素は削除されない。|
|GROUP BY|出力をグループ化する。集計関数と一緒に使って書く属性とそれに属するデータの合計などを調べられる。例えば都道府県ごとのサービスの利用者とか(北海道X人、青森Y人,,,)|
|HAVING|フィルター。WHEREは集計関数が使えないが、HAVINGは使える。いつ使うかというとGROUP BYと併用して<各都道府県の利用者の合計(COUNT)がX人以上>などの条件を作成できる|
|EXIST|引数の値があるかを確認できるWHEHEの条件で使ったりする。引数にはクエリを指定できる|
|ANY|WHERE、条件演算子とクエリを利用して条件を満たす組み合わせが1つ以上あればTRUEそうでないならFALSEのものを探す|
|ALL|ANYは１つ以上だったがこちらは全てが条件を満たしているときにRRUE、そうでないならFALSEになる|
|INSERT SELECT|tableAからtableBにCopyができる|
|CASE|スイッチ文がかける|
|IFNULL|オプション列のフィールドがからのときIFNULL(table_value,default)の形式でnullだったときのデフォルト値を設定できる|
|コメント||
|-- comment|一行|
|/* paragraph */|複数行|
|DATABASE|
|CREATE DATABASE|データベース作成|
|DROP DATABASE|データベース削除|
|CREATE TABLE|テーブル作成|
|DROP TABLE|テーブル削除|
|TRUNCATE TABLE|テーブル内の全レコード削除|
|ALTER TABLE|カラムの追加、修正(名前、データ型)、削除、　ルール(重複不可やNULL不可など)の追加、を行う|
|使用できるルール|
|UNIQUE|要素の重複を禁止する|
|NOT NULL|NULL値を列に設定できなくする。|
|PRIMARY KEY|要素の重複を禁止して、値に一意性を持たせる。これが設定できるのは１つのテーブルにつき１種類まで(カラムAとカラムBの２つを合わせてValueとすることもできる。)|
|FOREIGN KEY|外部キー。他のデータとのテーブル間のリンクを破壊するアクションを防ぐために使用する。また無効なデータが親テーブルに含まれる値の1つである必要があるため、そのような外部キーが列に挿入されるのを防ぎます。|
|CHECK|値に条件を設定できる。例えば18年以上しか登録できないとか|
|DEFAULT|デフォルト値を設定|
|INDEX|インデックスを作成|
|AUTO INCREMENT|自動インクリメントを使用すると、新しいレコードがテーブルに挿入されたときに一意の番号が自動的に生成されます。 多くの場合、これは、新しいレコードが挿入されるたびに自動的に作成される主キーフィールドです。|
|VIEW|雑にいうとクエリを保存する機能。使えば毎回簡単に最新のデータが取れるそうな|

### ワイルドカード
|記号|意味|
|-|-|
|%|0字以上の任意の文字列|
|_|任意の１文字|

##ヒント
AS

## チートシート
```SQL:テーブルから全てのデータを取得
SELECT * FROM MyTable;
```

```SQL:テーブルから特定の列のデータを取得
SELECT ColumnName FROM MyTable;
```

``` SQL:テーブルから複数の列のデータを取得
SELECT Column1, Column2 FROM MyTable;
```

```SQL:検索結果から重複要素の削除
SELECT DISTINCT ColumnName FROM MyTable;
```

```SQL:検索結果の件数を取得
SELECT COUNT(ColumnName) FROM MyTable;
```

```SQL:検索結果の合計を取得
SELECT SUM(ColumnName) FROM MyTable;
```

```SQL:検索結果の平均を取得
SELECT AVG(ColumnName) FROM MyTable;
```

```SQL:検索結果の中から最大の値を取得
SELECT MAX(ColumnName) FROM MyTable;
```

```SQL:検索結果の中から最小の値を取得
SELECT MIN(ColumnName) FROM MyTable;
```

```SQL:条件を追加して検索
SELECT Column1 FROM MyTable
WHERE Column2 = 'Value';
```



## 逆引きチートシート
|やりたいこと|どうすればいいか|
|-|-|
|テーブル内の全データ削除|DELETE FROM Table;|

## 専門用語
|用語|説明|
|-|-|
|SQL||
|データベース|
|テーブル||
|カラム(列)||
|ロウ(行)||
|フィールド||
|NULL|何もないことを表す値。0でもなく空欄（0文字)でもない。レコードの作成時にNULLが許容されているなら値なしでレコードが作成、更新ができる。オプション的なデータに使われる。またNULLであるかの確認には=, <,や <>　などの演算子は使えず,IS NULL もしくは IS NOT NULL を用いる。|

## セキュリティ

## パフォーマンス

## ツール・プラグイン
Percona toolkit

https://qiita.com/hakuro/items/9b3b0452d10def71801a

MySQL Workbench

https://www.mysql.com/jp/products/workbench/

##　情報源
https://www.w3schools.com/mysql/default.asp

https://dev.mysql.com/doc/

https://gihyo.jp/dev/serial/01/mysql-road-construction-news?start=0

https://atmarkit.itmedia.co.jp/ait/subtop/db/

https://www.itmedia.co.jp/keywords/mysql.html

https://thinkit.co.jp/category/4511

https://qiita.com/RyutaKojima/items/019d1186def39be380df

https://qiita.com/shuyann/items/34f58ea5fd9e1237639b

https://qiita.com/taigamikami/items/4adc074bd35caec05b64

# 仮想化ソフト(VirtualBox)
自分はVirtualBoxを使用

https://qiita.com/Pentas/items/5f558deeddcfef814b3e

インストール方法

https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

### 公式doc

https://download.virtualbox.org/virtualbox/6.1.14/SDKRef.pdf

### 公式サイト
https://www.virtualbox.org/

# Vagrant(仮想化ソフトのCUIクライアントツール)
### 公式サイト

https://www.vagrantup.com/

* 補完機能のインストール

```zsh:補完機能インストール
$ vagrant autocomplete install --zsh
$ autoload -Uz compinit && compinit
```

## CLI

```zsh:ボックスの追加
$ vagrant box add ADDRESS
```

補足: ADDRESSは３つ[カタログ](https://app.vagrantup.com/boxes/search)にあるボックス名(ex,"hashicorp/bionic64")を使う

## Vagrantでできること
1. 仮想マシンの構築
1. 仮想マシンの管理

## Vagrantを使うことによる利益
* 使いやすい
* 自動化
* 開発環境のセットアップ時間を短縮
* 本番環境の同等化



# 自動サーバ構築ツール(Ansible)
候補 : Chef, Ansible, Puppet
自分はAnsibelを使う。

# これからやること(バックエンド)
GraphQL
NoSQL

Linux
Docker
HTTP Server
Git周り(CI)
Jenkins

クラウド

Editor
mac
cui iterm
package manager

# webアプリフレームワーク
## Ruby
## Python
## Node
### Express
### Nest


正規表現
テスト

#更新情報
|title|summry|date|
|-|-|-|
|初公開|W3schools-sql終了|2021/12/26|