MySQLの学習記録
#目次
テーブルの作成
テーブルの削除
テーブルの構造の確認
テーブル一覧の確認
テーブル内のデータの確認
主に使用するデータ型
デフォルト値とnull
値の制限
primarykeyについて
selectについて
andやorについて
部分一致や前方一致などの検索方法
nullのレコードが表示されない
レコードの整列や取り出し
関数(数値)
関数(文字列)
日付の関数
レコードの更新について
レコードの削除について
作成日時、更新日時の設定
テーブルの操作
コメントアウト
##1 テーブルの作成
テーブル名posts
※テーブル名は複数形にすることが多い
ex)
CREATE TABLE posts (title VARCHAR(30),body VARCHAR(140), likes INT);
テーブル名を指定し、カラム名とともにデータの型を指定する
##2 テーブルの削除
テーブル名posts
DROP TABALE posts
あるかどうかの有無の条件分岐する場合
DROP TABLE IF EXISTS posts
##3 データの挿入
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乗、2乗...と割り当てられており、インデックスで指定するときは足した数にする。
-- 書き方一例 --
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番目から3つ取り出す(数字は任意)
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 日付の関数について
公式にはたくさん書かれているが、簡単なものを今回はやりました
テーブルは以下のような感じ
+----+-----------+---------------------+
| 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);
*/