0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-05-08

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);
*/
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?