初学者向け-MySQLの学習記録-

# MySQLの学習記録<br>

#目次
[テーブルの作成](#1-テーブルの作成)
[テーブルの削除](#2-テーブルの削除)
[テーブルの構造の確認](#4-テーブルの構造の確認)
[テーブル一覧の確認](#5-テーブル一覧の確認)
[テーブル内のデータの確認](#6-テーブル内のデータの確認)
[主に使用するデータ型](#7-主に使用するデータ型)
[デフォルト値とnull](#8-デフォルト値とnull)
[値の制限](#9-値の制限)
[primarykeyについて](#10-primarykeyについて)
[selectについて](#11-selectについて)
[andやorについて](#12-andやorについて)
[部分一致や前方一致などの検索方法](#13-部分一致や前方一致などの検索方法)
[nullのレコードが表示されない](#14-nullのレコードが表示されない)
[レコードの整列や取り出し](#15-レコードの整列や取り出し)
[関数(数値)](#16-数値の関数について)
[関数(文字列)](#17-文字列の関数について)
[日付の関数](#18-日付の関数について)
[レコードの更新について](#19-レコードの更新について)
[レコードの削除について](#20-レコードの削除)
[作成日時、更新日時の設定](#21-作成日時と更新日時の設定)
[テーブルの操作](#22-テーブルの操作)
[コメントアウト](#23-コメントアウト)



##1 テーブルの作成<br>
テーブル名posts
※テーブル名は複数形にすることが多い
ex)

```
CREATE TABLE posts (title VARCHAR(30),body VARCHAR(140), likes INT);
```
 <br>
テーブル名を指定し、カラム名とともにデータの型を指定する

##2 テーブルの削除<br>
テーブル名posts

```
DROP TABALE posts
```
あるかどうかの有無の条件分岐する場合

```
DROP TABLE IF EXISTS posts
```

##3 データの挿入<br>
title.body,likesへの挿入

```
INSERT INTO posts (title , body , likes) VALUES('タイトル','本文',4),('タイトル2','本文2',5);
```

##4 テーブルの構造の確認

```
DESC posts;
```
実行結果

```+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| message | varchar(140) | YES  |     | NULL    |       |
| likes   | int(11)      | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
```

##5 テーブル一覧の確認

```
SHOW TABLES
```

実行結果

```
+-----------------+
| Tables_in_myapp |
+-----------------+
| posts           |
+-----------------+
```
##6 テーブル内のデータの確認

```
SELECT * FROM posts
```

実行結果

```
+---------------+---------+-------+
| title         | body    | likes |
+---------------+---------+-------+
| タイトル      | 本文    |     4 |
| タイトル2     | 本文2   |     5 |
+---------------+---------+-------+
```

##7 主に使用するデータ型
文字型
固定長のときはCHARみたいなことらしいが、よくわからなかったので調べた。
参考:https://www.ibm.com/docs/ja/informix-servers/12.10?topic=types-fixed-varying-length-character-data

データの大きさに関わらず、格納域は一定に占有されるようです。

```
CHAR 0~255文字
VARCHAR 0~6553文字
TEXT それ以上

ENUM 特定の文字列から1つを格納できる
SET　特定の文字列から複数を格納
※ENUM->インデックス番号でも指定できる。(0からでなはく、1からのことに注意)
※SET->左から順に2の0乗、1乗、２乗...と割り当てられており、インデックスで指定するときは足した数にする。

-- 書き方一例 --
CREATE TABLE posts (
category ENUM('sports','science','math') 
);
上のようにテーブルにセットして

INSERT INTO posts (category) VALUES ('sports');
すると

+----------+
| category |
+----------+
| math     |
+----------+

別の値を挿入しようとすると

ERROR 1265 (01000) at line 8: Data truncated for column 'category' at row 1
```

整数
※UNSINGEDをつけることで正の値の制限することができ、正の扱える数を増やすことが可能

```
TINYINT -128~127
INT -21億~21億
BIGINT -922京~922億
```

実数

```
DECIMAL 固定小数点
FLOAT　浮動小数点
DOUBLE 浮動小数点（精度が高い）

書き方一例
hogehoge DECIMAL(5, 2) UNSIGNED
(全体で5桁、小数点以下は2桁)
```



真偽値,日時

```
BOOL 真か疑か（true[1] or false[0]）

DATE 日付
TIME 時間
DATETIME 日時

一例
CREATE TABLE posts (
  trueorfalse BOOL,
  created_time DATETIME
);

INSERT INTO posts (trueorfalse,created_time) VALUES 
  (FALSE,NOW()),
  (0,NOW()),
  (1,'2025-02-03 16:02:41');

SELECT * FROM posts;

結果
+-------------+---------------------+
| trueorfalse | created_time        |
+-------------+---------------------+
|           0 | 2021-05-09 01:00:57 |
|           0 | 2021-05-09 01:00:57 |
|           1 | 2025-02-03 16:02:41 |
+-------------+---------------------+
```

##8 デフォルト値とnull
カラム指定時に、NULLを認めるか認めないか指定をできる。
デフォルト値を設定しておくと、データの挿入がない場合NULLではなくその値が挿入される。

```
CREATE TABLE posts (
  title VARCHAR(20) NOT NULL,
  body VARCHAR(30) DEFAULT 'デフォルトぶん',
  likes INT DEFAULT 0,
  nullok CHAR(2));

INSERT INTO posts (title,body) VALUES 
 ('テスト','本文');
INSERT INTO posts(title) VALUES('テスト');

SELECT * FROM posts;

実行結果
+-----------+-----------------------+-------+--------+
| title     | body                  | likes | nullok |
+-----------+-----------------------+-------+--------+
| テスト    | 本文                  |     0 | NULL   |
| テスト    | デフォルトぶん        |     0 | NULL   |
+-----------+-----------------------+-------+--------+
```

##9　値の制限
値の範囲に制限をつける場合-ANDなど
ex)

```
CREATE TABLE students (
  number INT CHECK(number >= 0 AND number <=150)
);

INSERT INTO students (number) VALUES (170);

SELECT * FROM students;

実行結果
ERROR 4025 (23000) at line 6: CONSTRAINT `students.number` failed for `myapp`.`students`
```

重複をチェックする場合-UNIQUEで対処
ex)

```
CREATE TABLE students (
  name VARCHAR(20) UNIQUE,
  number INT CHECK(number >= 0 AND number <=150)
);

INSERT INTO students (name, number) VALUES 
('hogehoge',136),
('hogehoge',135);
ERROR 1062 (23000) at line 7: Duplicate entry 'hogehoge' for key 'name'
```

##10 primarykeyについて
レコードを一意に識別できるようにするカラムを設定することが一般的
(要するにユニークなidを当てることが多い。社員番号とかユニークな番号なはず。)

PRIMARY KEYは重複は許されない
AUTO_INCREMENTを設定することで自動で連番で番号を振ってくれる
ex)

```
CREATE TABLE posts (
  id INT NOT NULL AUTO_INCREMENT,
  title VARCHAR(40), 
  body VARCHAR(200), 
  PRIMARY KEY (id)
);

INSERT INTO posts (title,body) VALUES 
  ('テスト', 'テスト本文'),
  ('taitoru', 'テスト本文'),
  ('タイトル', 'テスト本文');
INSERT INTO posts (title,body) VALUES 
  ('テスト4', 'テスト本文4');

SELECT * FROM posts;

実行結果
+----+--------------+------------------+
| id | title        | body             |
+----+--------------+------------------+
|  1 | テスト       | テスト本文       |
|  2 | taitoru      | テスト本文       |
|  3 | タイトル     | テスト本文       |
|  4 | テスト4      | テスト本文4      |
+----+--------------+------------------+

```
こんな感じで勝手に連番で入れてくれる

##11 selectについて

postsテーブルから全て(*)のレコードを取り出す
```
SELECT * FROM posts;
```

条件を付けくわえるのには「WHERE」を使う
主に使うのは下記

```
=
!=(<>)
<
>
<=
>=
```

ex)

```
SELECT id ,likes FROM posts
WHERE number >=10;

SELECT * FROM posts
WHERE title ="タイトル" ;

SELECT * FROM posts
WHERE title != "タイトル" ;

SELECT * FROM posts
WHERE title <> "タイトル" ;
```

##12 andやorについて

AND　なおかつ
OR または

ex)

```
SELECT * FROM posts WHERE number >=5 AND likes <=14 ;
SELECT * FROM posts WHERE number BETWEEN 5 AND 14 ; #上の書き換え
SELECT * FROM posts WHERE number  NOT BETWEEN 5 AND 14 ;#反転

SELECT * FROM posts WHERE number = 6 OR number = 15 ;
SELECT * FROM posts WHERE number IN (6,15) ; #上の書き換え
SELECT * FROM posts WHERE number NOT IN (6,15) ; #反転
```

##13 部分一致や前方一致などの検索方法

%: 0文字以上の任意の文字を表現できる
_: 任意の1文字を表現できる

ex)

```
CREATE TABLE posts (
  id INT NOT NULL AUTO_INCREMENT,
  body VARCHAR(200), 
  PRIMARY KEY (id)
);

INSERT INTO posts (body) VALUES 
  ('本や本文'),
  ('今日本屋'),
  ('今日は本屋'),
  ('本日のタスク'),
  ('Thankyou'),
  ('thankyou'),
  ('Goodbye');

SELECT * FROM posts WHERE body like '__本%';  #3文字目に"本"が入っているレコード
SELECT * FROM posts WHERE body NOT like '__本%';　#3文字目に"本"が入っていないレコード 
SELECT * FROM posts WHERE body LIKE 't%'; #前方一致
SELECT * FROM posts WHERE body LIKE BINARY 't%'; #前方一致(大文字/小文字区別ver)
SELECT * FROM posts WHERE body LIKE '%e'; #後方一致
SELECT * FROM posts WHERE body like '%タスク%'; #部分一致

実行結果
+----+--------------+
| id | body         |
+----+--------------+
|  1 | 本ほ本文     |
|  2 | 今日本屋     |
+----+--------------+
+----+--------------------+
| id | body               |
+----+--------------------+
|  3 | 今日は本屋         |
|  4 | 本日のタスク       |
|  5 | Thankyou           |
|  6 | thankyou           |
|  7 | Goodbye            |
+----+--------------------+
+----+----------+
| id | body     |
+----+----------+
|  5 | Thankyou |
|  6 | thankyou |
+----+----------+
+----+----------+
| id | body     |
+----+----------+
|  6 | thankyou |
+----+----------+
+----+---------+
| id | body    |
+----+---------+
|  7 | Goodbye |
+----+---------+
+----+--------------------+
| id | body               |
+----+--------------------+
|  4 | 本日のタスク       |
+----+--------------------+
```
##14 nullのレコードが表示されない

下の状態

```
+----+--------------+------------------+
| id | title        | body             |
+----+--------------+------------------+
|  1 | テストnl     | テスト本文       |
|  2 | テスト2nl    | テスト本文2      |
|  3 | NULL         | テスト本文3      |
|  4 | NULL         | テスト本文4      |
|  5 | NULL         | テスト本文5      |
+----+--------------+------------------+
```

```
SELECT * FROM posts WHERE title like 'テ%';
SELECT * FROM posts WHERE title NOT like 'テ%';

実行結果
+----+--------------+------------------+
| id | title        | body             |
+----+--------------+------------------+
|  1 | テストnl     | テスト本文       |
|  2 | テスト2nl    | テスト本文2      |
+----+--------------+------------------+
```
二行目の結果NULLのレコードが表示されない
そんなときは　```or hoge IS NULL```を使う

```
SELECT * FROM posts WHERE title NOT like 'テ%' OR title IS NULL;

実行結果
+----+-------+------------------+
| id | title | body             |
+----+-------+------------------+
|  3 | NULL  | テスト本文3      |
|  4 | NULL  | テスト本文4      |
|  5 | NULL  | テスト本文5      |
+----+-------+------------------+

```
##15 レコードの整列や取り出し

```ORDER BY;``` 整列するために使う
```DESC;``` 整列の順序を逆にする
```LIMIT 4;``` 上から4つ取り出す(数字は任意)
```LIMIT 3 OFFSET 1;```上から0,1と数え1番目から３つ取り出す(数字は任意)
```LIMIT 1,3;```

テーブル内はこんな感じ

```
+----+----------+---------+
| id | name     | numbers |
+----+----------+---------+
|  1 | Numao    |       5 |
|  2 | Ishikawa |       1 |
|  3 | Katoh    |       2 |
|  4 | Sakurai  |       3 |
|  5 | Yokoya   |       7 |
+----+----------+---------+
```

やってみます

```
SElECT * FROM students ORDER BY numbers;
SElECT * FROM students ORDER BY numbers DESC;
SElECT * FROM students ORDER BY name;
SElECT * FROM students ORDER BY name DESC;
SElECT * FROM students ORDER BY name DESC LIMIT 3;
SElECT * FROM students ORDER BY name DESC LIMIT 3 OFFSET 2;
SElECT * FROM students ORDER BY name DESC LIMIT 2,3;
SElECT * FROM students ORDER BY name DESC LIMIT 1,4;

```
上記の実行結果

```
SElECT * FROM students ORDER BY numbers;
+----+----------+---------+
| id | name     | numbers |
+----+----------+---------+
|  5 | Yokoya   |       7 |
|  1 | Numao    |       5 |
|  4 | Sakurai  |       3 |
|  3 | Katoh    |       2 |
|  2 | Ishikawa |       1 |
+----+----------+---------+

SElECT * FROM students ORDER BY numbers DESC;
+----+----------+---------+
| id | name     | numbers |
+----+----------+---------+
|  2 | Ishikawa |       1 |
|  3 | Katoh    |       2 |
|  1 | Numao    |       5 |
|  4 | Sakurai  |       3 |
|  5 | Yokoya   |       7 |
+----+----------+---------+

SElECT * FROM students ORDER BY name;
+----+----------+---------+
| id | name     | numbers |
+----+----------+---------+
|  5 | Yokoya   |       7 |
|  4 | Sakurai  |       3 |
|  1 | Numao    |       5 |
|  3 | Katoh    |       2 |
|  2 | Ishikawa |       1 |
+----+----------+---------+

SElECT * FROM students ORDER BY name DESC;
+----+----------+---------+
| id | name     | numbers |
+----+----------+---------+
|  5 | Yokoya   |       7 |
|  4 | Sakurai  |       3 |
|  1 | Numao    |       5 |
|  3 | Katoh    |       2 |
|  2 | Ishikawa |       1 |
+----+----------+---------+

SElECT * FROM students ORDER BY name DESC LIMIT 3;
+----+---------+---------+
| id | name    | numbers |
+----+---------+---------+
|  5 | Yokoya  |       7 |
|  4 | Sakurai |       3 |
|  1 | Numao   |       5 |
+----+---------+---------+

SElECT * FROM students ORDER BY name DESC LIMIT 3 OFFSET 2;
+----+----------+---------+
| id | name     | numbers |
+----+----------+---------+
|  1 | Numao    |       5 |
|  3 | Katoh    |       2 |
|  2 | Ishikawa |       1 |
+----+----------+---------+

SElECT * FROM students ORDER BY name DESC LIMIT 2,3;
+----+----------+---------+
| id | name     | numbers |
+----+----------+---------+
|  1 | Numao    |       5 |
|  3 | Katoh    |       2 |
|  2 | Ishikawa |       1 |
+----+----------+---------+

SElECT * FROM students ORDER BY name DESC LIMIT 1,4;
+----+----------+---------+
| id | name     | numbers |
+----+----------+---------+
|  4 | Sakurai  |       3 |
|  1 | Numao    |       5 |
|  3 | Katoh    |       2 |
|  2 | Ishikawa |       1 |
+----+----------+---------+
```

##16 数値の関数について

```FLOOR()``` 端数を切り捨て
```CEIL()``` 端数を切り上げ
```ROUND()``` 四捨五入（桁数の指定もできる）

以下のようなテーブル

```
+----+-----------------------+-------+
| id | body                  | likes |
+----+-----------------------+-------+
|  1 | 自己紹介              |    12 |
|  2 | 意見                  |     4 |
|  3 | 感謝                  |     4 |
|  4 | めっちゃ嬉しい        |    15 |
|  5 | 案件                  |     8 |
+----+-----------------------+-------+
```

以下のようなものを実行

```
SELECT 
  likes * 20 /2 ,
  likes * 20 /2 AS bonus,
  FLOOR(likes * 350 /5) AS floor,
  CEIL(likes * 350 /5) AS ceil,
  likes * 350.4 /5 AS noround,
  ROUND(likes * 350.4 /5) AS round,
  ROUND(likes * 350.4 /5 ,2) AS round 
-- これが桁数指定
FROM posts;
```

実行結果

```
+---------------+----------+-------+------+------------+-------+---------+
| likes * 20 /2 | bonus    | floor | ceil | noround    | round | round   |
+---------------+----------+-------+------+------------+-------+---------+
|      120.0000 | 120.0000 |   840 |  840 |  840.96000 |   841 |  840.96 |
|       40.0000 |  40.0000 |   280 |  280 |  280.32000 |   280 |  280.32 |
|       40.0000 |  40.0000 |   280 |  280 |  280.32000 |   280 |  280.32 |
|      150.0000 | 150.0000 |  1050 | 1050 | 1051.20000 |  1051 | 1051.20 |
|       80.0000 |  80.0000 |   560 |  560 |  560.64000 |   561 |  560.64 |
+---------------+----------+-------+------+------------+-------+---------+
```

##17 文字列の関数について

```
SUBSTRING() -- 文字以降の文字列を取り出す(-の指定も可能)
CONCAT() -- 文字を連結させる
LENGTH() -- 文字数のカウント(日本語の場合は以下のCHAR_LENGTHを使用)
CHAR_LENGTH() --日本語文字数対応によく使う
```


テーブル内容

```
+----+-----------------+-------+
| id | body            | likes |
+----+-----------------+-------+
|  1 | Thanks          |     5 |
|  2 | Goodbye         |     4 |
|  3 | Arigato         |    56 |
|  4 | Hello           |    32 |
|  5 | こんにちは      |    11 |
|  6 | Hi!             |   312 |
+----+-----------------+-------+
```

以下を実行

```
SELECT
-- 3文字目以降
body, SUBSTRING(body,3) AS three, 

-- 末尾から3文字分以降
body, SUBSTRING(body,-3) AS anti_three
FROM posts;

-- 2文字目から4文字分
SELECT
body, SUBSTRING(body,2,4) AS two_four
FROM posts;

SELECT 
  CONCAT(body,likes) AS 連結文字なし,
  CONCAT(body,'-',likes) AS 連結文字あり
FROM posts;

SELECT 
  body,
  LENGTH(body) AS len,
  CHAR_LENGTH(body) AS char_len
FROM posts;
```

実行結果

```
+-----------------+-----------+-----------------+------------+
| body            | three     | body            | anti_three |
+-----------------+-----------+-----------------+------------+
| Thanks          | anks      | Thanks          | nks        |
| Goodbye         | odbye     | Goodbye         | bye        |
| Arigato         | igato     | Arigato         | ato        |
| Hello           | llo       | Hello           | llo        |
| こんにちは      | にちは    | こんにちは      | にちは     |
| Hi!             | !         | Hi!             | Hi!        |
+-----------------+-----------+-----------------+------------+
+-----------------+--------------+
| body            | two_four     |
+-----------------+--------------+
| Thanks          | hank         |
| Goodbye         | oodb         |
| Arigato         | riga         |
| Hello           | ello         |
| こんにちは      | んにちは     |
| Hi!             | i!           |
+-----------------+--------------+
+--------------------+--------------------+
| 連結文字なし       | 連結文字あり       |
+--------------------+--------------------+
| Thanks5            | Thanks-5           |
| Goodbye4           | Goodbye-4          |
| Arigato56          | Arigato-56         |
| Hello32            | Hello-32           |
| こんにちは11       | こんにちは-11      |
| Hi!312             | Hi!-312            |
+--------------------+--------------------+
+-----------------+------+----------+
| body            | len  | char_len |
+-----------------+------+----------+
| Thanks          |    6 |        6 |
| Goodbye         |    7 |        7 |
| Arigato         |    7 |        7 |
| Hello           |    5 |        5 |
| こんにちは      |   15 |        5 |
| Hi!             |    3 |        3 |
+-----------------+------+----------+
~ $ 
```

##18 日付の関数について

公式にはたくさん書かれているが、簡単なものを今回はやりました

https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html

テーブルは以下のような感じ

```
+----+-----------+---------------------+
| id | body      | created             |
+----+-----------+---------------------+
|  1 | Thanks    | 2019-05-01 00:00:00 |
|  2 | Hello     | 2021-05-03 00:00:00 |
|  3 | Arigato   | 2021-03-14 00:00:00 |
|  4 | Konithiwa | 2020-04-24 00:00:00 |
|  5 | Hi        | 2012-11-09 00:00:00 |
+----+-----------+---------------------+
```


```
-- 年月日について
 SELECT created,
 YEAR(created),
 MONTH(created),
 DAY(created)
 from posts;
 
-- フォーマットを指定する
 SELECT
 created,
 DATE_FORMAT(created,'%M %D %Y,%W ') AS date
 FROM posts;
 
-- 日付を任意の日数たす
 SELECT
 created,
 DATE_ADD(created,INTERVAL 7 DAY) AS date_l
 FROM posts;
 
-- 差分を出す
 SELECT
 created,
 now(),
 DATEDIFF(created,NOW()) AS diff
 FROM posts;
```

結果

```
+---------------------+---------------+----------------+--------------+
| created             | YEAR(created) | MONTH(created) | DAY(created) |
+---------------------+---------------+----------------+--------------+
| 2019-05-01 00:00:00 |          2019 |              5 |            1 |
| 2021-05-03 00:00:00 |          2021 |              5 |            3 |
| 2021-03-14 00:00:00 |          2021 |              3 |           14 |
| 2020-04-24 00:00:00 |          2020 |              4 |           24 |
| 2012-11-09 00:00:00 |          2012 |             11 |            9 |
+---------------------+---------------+----------------+--------------+
+---------------------+---------------------------+
| created             | date                      |
+---------------------+---------------------------+
| 2019-05-01 00:00:00 | May 1st 2019,Wednesday    |
| 2021-05-03 00:00:00 | May 3rd 2021,Monday       |
| 2021-03-14 00:00:00 | March 14th 2021,Sunday    |
| 2020-04-24 00:00:00 | April 24th 2020,Friday    |
| 2012-11-09 00:00:00 | November 9th 2012,Friday  |
+---------------------+---------------------------+
+---------------------+---------------------+
| created             | date_l              |
+---------------------+---------------------+
| 2019-05-01 00:00:00 | 2019-05-08 00:00:00 |
| 2021-05-03 00:00:00 | 2021-05-10 00:00:00 |
| 2021-03-14 00:00:00 | 2021-03-21 00:00:00 |
| 2020-04-24 00:00:00 | 2020-05-01 00:00:00 |
| 2012-11-09 00:00:00 | 2012-11-16 00:00:00 |
+---------------------+---------------------+
+---------------------+---------------------+-------+
| created             | now()               | diff  |
+---------------------+---------------------+-------+
| 2019-05-01 00:00:00 | 2021-05-09 15:35:01 |  -739 |
| 2021-05-03 00:00:00 | 2021-05-09 15:35:01 |    -6 |
| 2021-03-14 00:00:00 | 2021-05-09 15:35:01 |   -56 |
| 2020-04-24 00:00:00 | 2021-05-09 15:35:01 |  -380 |
| 2012-11-09 00:00:00 | 2021-05-09 15:35:01 | -3103 |
+---------------------+---------------------+-------+
```

##19 レコードの更新について

書き方

```
UPDATE テーブル名　
SET　カラム名=値,カラム名=値
WHERE 条件;
```

ex)
テーブル内

```
+----+---------+-------+
| id | body    | score |
+----+---------+-------+
|  1 | Sports  |    43 |
|  2 | Science |    65 |
|  3 | Math    |    23 |
|  4 | Social  |    28 |
+----+---------+-------+
```

以下を実行

```
UPDATE posts
SET score = score + 20,
    body = UPPER(body)
WHERE score <= 30;
```

```
+----+---------+-------+
| id | body    | score |
+----+---------+-------+
|  1 | Sports  |    43 |
|  2 | Science |    65 |
|  3 | MATH    |    43 |
|  4 | SOCIAL  |    48 |
+----+---------+-------+
```

##20 レコードの削除

```
-- 全削除
DELETE FROM posts; 
-- 基本は条件をつけることが多い
DELETE FROM posts WHERE 条件;
```

・idでPRIMARY KEYなどを設定している場合、
削除のちのデータの挿入は使われていた次の番号が当てられる

もし番号を振り直したかったり、テーブルを初期化する場合は

```
TRUNCATE TABLE テーブル名;
```

ex)

```
+----+---------+-------+
| id | body    | score |
+----+---------+-------+
|  1 | Sports  |    43 |
|  2 | Science |    65 |
|  3 | Math    |    23 |
|  4 | Social  |    28 |
+----+---------+-------+
```
下記を実行

```
DELETE FROM posts WHERE score <=50;
  
SELECT * from posts;

TRUNCATE TABLE posts;

INSERT INTO posts (body, score) VALUES 
  ('Sports', 67),
  ('Science', 83),
  ('Math', 76),
  ('Social', 79);

SELECT * FROM posts;
```

実行結果

```
+----+---------+-------+
| id | body    | score |
+----+---------+-------+
|  2 | Science |    65 |
+----+---------+-------+

+----+---------+-------+
| id | body    | score |
+----+---------+-------+
|  1 | Sports  |    67 |
|  2 | Science |    83 |
|  3 | Math    |    76 |
|  4 | Social  |    79 |
+----+---------+-------+
```

##21 作成日時と更新日時の設定

```
NOW() 現在時刻を設定する
ON UPDATE NOW() アップデート時、その時刻を設定する
```

テーブル作成時以下のようにしておく

```
CREATE TABLE posts (
  id INT NOT NULL AUTO_INCREMENT,
  likes INT,
  created DATETIME DEFAULT NOW(),
  updated DATETIME DEFAULT NOW() ON UPDATE NOW(),
  PRIMARY KEY (id)
);
```

以下を実行し

```
SELECT id, likes,created,updated FROM posts;
SELECT SLEEP(5);
UPDATE posts SET likes =99 WHERE  id =1;
SELECT id, likes,created,updated FROM posts;
```

実行結果を確認する

```
+----+-------+---------------------+---------------------+
| id | likes | created             | updated             |
+----+-------+---------------------+---------------------+
|  1 |    12 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
|  2 |     4 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
|  3 |     4 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
|  4 |    15 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
|  5 |     8 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
+----+-------+---------------------+---------------------+
+----------+
| SLEEP(5) |
+----------+
|        0 |
+----------+
+----+-------+---------------------+---------------------+
| id | likes | created             | updated             |
+----+-------+---------------------+---------------------+
|  1 |    99 | 2021-05-09 16:27:14 | 2021-05-09 16:27:19 |
|  2 |     4 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
|  3 |     4 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
|  4 |    15 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
|  5 |     8 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 |
+----+-------+---------------------+---------------------+
```
現在時刻と
しっかりと更新された日時が設定されている

##22 テーブルの操作
主な操作

```
ALTER TABLE ... ADD ... カラムを追加
ALTER TABLE ... DROP ... カラムを消去
ALTER TABLE ... CHANGE ... カラム名の変更
ALTER TABLE ... RENAME ...　テーブル名の変更
```

以下一例と結果
テーブル名はposts

```
+----+-----------+-------+
| id | subject   | score |
+----+-----------+-------+
|  1 | Math      |    76 |
|  2 | Science   |    79 |
|  3 | History   |    35 |
|  4 | Listening |    12 |
|  5 | Dance     |    89 |
+----+-----------+-------+

```

カラムを追加 (SQL文と実行結果をセットで記載)

```
ALTER TABLE posts ADD name VARCHAR(20);

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| subject | varchar(140) | YES  |     | NULL    |                |
| score   | int(11)      | YES  |     | NULL    |                |
| name    | varchar(20)  | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

ALTER TABLE posts ADD name VARCHAR(20) AFTER id;

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20)  | YES  |     | NULL    |                |
| subject | varchar(140) | YES  |     | NULL    |                |
| score   | int(11)      | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

ALTER TABLE posts ADD name VARCHAR(20) FIRST;

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| name    | varchar(20)  | YES  |     | NULL    |                |
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| subject | varchar(140) | YES  |     | NULL    |                |
| score   | int(11)      | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

```

カラムを消去する

```
ALTER TABLE posts DROP subject ;

+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| score | int(11) | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
```

カラム名の変更

```
ALTER TABLE posts CHANGE score points INT;

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| subject | varchar(140) | YES  |     | NULL    |                |
| points  | int(11)      | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

```

テーブル名の変更

```
ALTER TABLE posts RENAME tests;

+-----------------+
| Tables_in_myapp |
+-----------------+
| tests           |
+-----------------+
```


##23 コメントアウト
1行なら「--」で

```
-- SELECT * FROM posts
```
複数行なら「/* hogehoge */」

```
/*
INSERT INTO posts (title , body , likes) VALUES
('タイトル','本文',4),
('タイトル2','本文2',5);
*/
```