【MySQL】基本SQL構文まとめ

# はじめに
MySQLを勉強していますが、構文が多くてなかなか覚えられないので、チートシートとして本記事を書きました。

# 環境
以下のバージョンを使用していることが前提となります。
MySQLバージョン：Ver 8.0.27

# 基本SQL構文
## データベース操作
### データベース一覧の確認
```:mysql
SHOW DATABASES;
```

### 使用するデータベースの選択
```:mysql
USE データベース名;
```

### データベース作成
```mysql
CREATE DATABASE データベース名;
```

### データベース削除
```mysql
DELETE DATABASE データベース名;
```

## テーブル操作
### テーブル一覧の確認
```mysql
SHOW TABLES;
```

### テーブルの作成
```:mysql
CREATE TABLE テーブル名 (
  カラム名1 データ型1 (オプション1), 
  カラム名2 データ型2 (オプション2),
　　　　・
　　　　・
  カラム名n データ型n
);
```

データ型の例：数値型(INT, DECIMALなど)、文字列型(CHAR, VARCHARなど)、時間型(DATE, TIMEなど)など
詳しいデータ型については下記MySQLホームページが参考になります。
https://dev.mysql.com/doc/refman/8.0/en/data-types.html

オプションの例
UNSIGNED：0を含む自然数のみ扱うようにする。例としてINTにUNSIGNEDオプションをつけると0〜4294967295まで扱えるようになる

CREATE TABLEはいろいろと細かく設定できるので、詳しい内容は下記MySQLホームページが参考になります。
https://dev.mysql.com/doc/refman/8.0/en/create-table.html

### レコード追加
```:mysql
INSERT INTO テーブル名 (カラム名1, カラム名2) VALUES (値1, 値2);
```

```:mysql
INSERT INTO テーブル名 (カラム名1, カラム名2) VALUES (値1, 値2), (値3, 値4), ・・・;
```
上記のように複数のレコードを一度に入れることも可能。

### テーブルの削除
```:mysql
DROP TABLE テーブル名;
```

### データ取得
```:mysql
SELECT カラム名1, カラム名2 FROM テーブル名;
```

```:mysql
SELECT * FROM テーブル名;
```
全てのカラムのデータ取得する

#### 条件を指定してデータ取得
```:mysql
SELECT * FROM テーブル WHERE カラム名1 >= 10;
```
上記例ではカラム名1が10以上のレコード(WHERE カラム名 >= 10)の全てのカラムデータ(*)を取得する。

WHEREで使える比較演算子

| 比較演算子 | 意味 |
| --- | --- |
| > | ~より大きい |
| >= | ~以上 |
| < | ~より小さい |
| <= | ~以下 |
| = | ~と等しい |
| !=または<> | ~と等しくない |

#### 条件の組み合わせ(AND：かつ)
```:mysql
SELECT * FROM テーブル WHERE カラム名1 >= 10 AND カラム名1 <= 20;
```

カラム名1が10以上かつ20以下のレコードの全てのカラムのデータを取得する。以下のようにも書くことができる。

```:mysql
SELECT * FROM table1 WHERE カラム名1 BETWEEN 10 AND 20;
```

#### 条件の組み合わせ(OR：または)
```:mysql
SELECT * FROM テーブル名 WHERE カラム名1 = 5 OR カラム名1 = 10;
```

カラム名1が5または10であるレコードの全てのカラムのデータを取得。以下のようにも書くことができる。

```:mysql
SELECT * FROM テーブル名 WHERE カラム名1 IN (5, 10);
```

#### 特定の文字列を持つデータ抽出
```:mysql
SELECT * FROM テーブル名 WHERE カラム名 LIKE 'UTSUBO';
```

カラム内に'UTSUBO'という文字列を**持つ**レコードの全てのカラムデータを取得する。
※'UTSUBO'の大文字・小文字を区別しない

```:mysql
SELECT * FROM テーブル名 WHERE カラム名 NOT LIKE 'UTSUBO';
```

カラム内に'UTSUBO'という文字列を**持たない**レコードの全てのカラムデータを取得する。
※'UTSUBO'の大文字・小文字を区別しない

上記だと大文字、大文字・小文字の区別ができないので、

```:mysql
SELECT * FROM テーブル名 WHERE カラム名 LIKE BINARY 'utsubo';
```

とすると、小文字の'utsubo'を持つレコードの全てのカラムデータを取得する。

また%や_のワイルドカードを使うことができる。

%や_自体の抽出をしたいときは\%や\\_のようにバックスラッシュをつける。

NULLの抽出にはISを使う。条件反転はIS NOT

```:mysql
SELECT * FROM テーブル名 WHERE カラム名 IS NULL;
```

#### 抽出したデータの並び替え
```:mysql
SELECT * FROM テーブル名 ORDER BY カラム名;
```

カラム名を小さい順で並べる(アルファベットの場合Aから並べる)

```:mysql
SELECT * FROM テーブル名 ORDER BY カラム名 DESC;
```

カラム名を大きい順で並べる(アルファベットの場合Zから並べる)

#### 上位のレコードの抽出
```:mysql
SELECT * FROM テーブル名 LIMIT 3;
```

上位3つのレコードを抽出する

```:mysql
SELECT * FROM テーブル名 ORDER BY カラム名 DESC LIMIT 3;
```

上記のように大きい順に並べ替えた後に上位3つを抽出することもできる。

また、OFFSETをつけることもできる。

```:mysql
SELECT * FROM テーブル名 ORDER BY カラム名 DESC LIMIT 3 OFFSET 2;
```
上記を実行すると上から2つのレコードを無視して、大きい順に並び替えた後、上位から3, 4, 5つ目のレコードを抽出する。

### レコードの更新
```:mysql
UPDATE テーブル名 SET カラム名1 = カラム名1 + 5 WHERE カラム名1 >= 10;
```
上記ではカラム名1内で値が10以下のデータ(WHERE カラム名1 >=10)に5を加えている(カラム名1 =カラム名1 + 5)。
※カラム名1 += 5のように書くとエラーになるので注意

### レコードの削除
```:mysql
DELETE FROM テーブル名 WHERE カラム名 < 10;
```

カラム名内のデータが10未満のレコードを削除する

### 全てのレコードの削除
```:mysql
TRUNCATE TABLE テーブル名;
```

### カラムの追加
```:mysql
ALTER TABLE テーブル名 ADD カラム名 データ型;
```

```:mysql
ALTER TABLE テーブル名 ADD カラム名2 データ型 AFTER カラム名1;
```
上記のように追加したいカラムの列を指定できる。上記ではカラム1の次にカラム名2を追加している。

```:mysql
ALTER TABLE テーブル名 ADD カラム名2 データ型 FIRST;
```
上記を実行すると元のテーブルの初めの列にカラム名1があるとして、カラム名1の前の列にカラム名2を追加できる。

## カラムの削除
```:mysql
ALTER TABLE テーブル名 DROP カラム名;
```

## カラムの変更
```:mysql
ALTER TABLE カラム名1 CHANGE カラム名2 データ型2;
```

カラム名1からカラム名2、データ型2へ変更する

## カラム名の変更
```:mysql
ALTER TABLE カラム名1 RENAME カラム名2;
```
カラム名1をカラム名2に変更する。

# 参考記事
以下の記事を参考にさせていただきました。

- [【これだけ覚えてたらOK！】SQL構文まとめ](https://qiita.com/tatsuya4150/items/69c2c9d318e5b93e6ccd)