はじめに
MySQLについて学習していて基礎的なことを忘れないように備忘録がてら投稿します。
どなたかのお役に立てれば幸いです。
データベースの用語
MySQLで登場する用語などについて紹介します。
TABLE
データベースにデータを格納するわけですが、
データを格納する表のことをTABLEといいます。
下記のTABLEはTwitterの投稿文といいね数を集計したTABLEです。

RECORD
CULUMN
データ型
よく使用するデータ型について記載します。
下記のデータを使った例は下で説明していますので
ぜひそちらをご覧ください。
整数
整数にはTINYINT、INT、BIGINTの3つがあります。
各型には扱える範囲があります。
| 型 | min | max |
|---|---|---|
| TINYINT | -128 | +127 |
| INT | -21億 | +21億 |
| BIGINT | -922京 | +922京 |
京なんと単位みたことないですが、
通常はINTで大丈夫だと思います!
今回はマイナスからプラスの範囲で表を作成しましたが、
Twitterのいいねのようにマイナスが存在しない場合は、
データ型にUNSIGNEDを付けることで扱える範囲の幅を広げることが出来ます。
| 型 | min | max |
|---|---|---|
| TINYINT UNSIGNED | 0 | 255 |
| INT UNSIGNED | 0 | +42億 |
| BIGINT UNSIGNED | 0 | +1844京 |
実数
実数にはDECIMAL、FLOAT、DOUBLEの3つがあります。
各型については下記のようになります。
| 型 | 説明 |
|---|---|
| DECIMAL | 固定小数点 |
| FLOAT | 浮動小数点 |
| DOUBLE | 浮動小数点(高精度) |
FLOATとDOUBLEは浮動小数点なので細かいところで誤差が出てきます。
なので、DECIMALを使用してもいいかと思います。
文字列
文字列にはCHAR、VARCHAR、TEXT、ENUM、SETの5つがあります。
各型については下記のようになります。
| 型 | 説明 |
|---|---|
| CHAR | 0 〜 255文字 |
| VARCHAR | 0 〜 65535文字 |
| TEXT | それ以上 |
| ENUM | 特定の文字列から一つ |
| SET | 特定の文字列から複数 |
商品コードなどの固定長のデータにはCHARを使い、
文字数がバラバラになるようなデータの場合はVARCHARを使い、
それよりも長くなる文字列にはTEXTを使用するようなイメージでいいと思います。
ENUMは、出身の都道府県を一つ選択する時のような場合に、
SETは、アンケートの解答などで複数選択する場合に使ったりします。
真偽値
真偽値はBOOLのみになります。
BOOLはTRUEかFALSEを保持することが出来ます。
しかし、内部的にはTRUEが1、FALSEが0と管理されています。
なので、一桁のTINYINTと同じ型だったりします。
日時
日時にはDATE、TIME、DATETIMEの3つがあります。
| 型 | 説明 |
|---|---|
| DATE | 日付 |
| TIME | 時間 |
| DATETIME | 日時 |
日にちだけならDATE、時間だけならTIME、
両方使いたい場合ならDATETIMEを使用します。
コマンド
TABLEの作成
TABLEを作るにはCREATE TABLEコマンドで作成します。
<テーブル名>には任意の名前を入れてください。
また、コマンドの最後に;(セミコロン)を忘れないようにしてください。
CREATE TABLE <テーブル名>();
また、<テーブル名>()の()には列見出しにあたるCULUMNの名前を定義します。
名前の定義と同時に方の宣言も行います。
messageというCULUMNに入る値は可変長のCHAR(140文字以下)
likesというCULUMNに入る値はINT型(整数)
CREATE TABLE posts(message: VARCHAR(140), likes INT);
コマンドが長くなりそうな場合は行を分けることも可能です。
CREATE TABLE posts(
message: VARCHAR(140),
likes INT
);
これでデータがからのTABLEが作成されます。
TABLEの構成確認
TABLEがどのような構成かを確認するにはDESCコマンドを使用します。
<テーブル名>には任意のテーブル名が入ります。
DESC <テーブル名>;
先ほど作成したTABLEを確認すると下記のようになります。
DESC posts;
実行結果
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| message | varchar(140) | YES | | NULL | |
| likes | int(11) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
###存在するテーブルの確認
存在するTABLEの一覧を確認するにはSHOWコマンドを使用します。
現在はpostsテーブルのみが存在することになります。
SHOW TABLES;
実行結果
+-----------------+
| Tables_in_myapp |
+-----------------+
| posts |
+-----------------+
TABLEの削除方法
TABLEを削除するにはDROP TABLEコマンドを使用します。
<テーブル名>には任意の値が入ります。
DROP TABLE <テーブル名>;
なと、先ほどのコマンドではテーブルが作成されていない時に実行すると、
**テーブルがありません!!!**というエラーが出てしまうので、
テーブルが存在する時のみ削除を行いたい!という場合は下記のように行います。
DROP TABLE(テーブルを削除してね) IF(もし) EXISTS(存在したら)と言ったような具合です。
DROP TABLE IF EXISTS <テーブル名>;
レコードの挿入
作成したテーブルにレコードを挿入する場合はINSERT INTOコマンドを使用します。
テーブル名の後の( )の中にはCULUMNを記述し、
そのCULUMN名に入れる値をVALUESの後の( )に記述します。
INSERT INTO <テーブル名>(CULUMN名) VALUES (値);
先程のpostsテーブルを使用すると下記のようになります。
postsテーブルは、messageとlikesというCULUMN(列)があります。
posts(message,likes)-> postsのmessageとlikesに対して、
VALUES ('Thanks', 12)-> 'Thanks'と12を格納します。という感じです。
なぜ'Thanks'は''(シングルクォーテーション)を使用しているかというと、
テーブル作成の時にVARCHAR(140)と宣言しているからです。
ここら辺の''を付けるか付けないかの判断は調べてみてください。
なお、テーブルの作成同様に改行しながら記述することが可能になります。
-- テーブル作成
CREATE TABLE posts (
message VARCHAR(140),
likes INT
);
-- テーブルにデータを格納
INSERT INTO posts(message,likes) VALUES ('Thanks', 12);
INSERT INTO posts(message,likes) VALUES ('Hello', 4);
INSERT INTO posts(message,likes) VALUES
('Sorry!!', 114),
('Good morning', 222);
データの取得
テーブルに格納されているデータを取得する場合はSELECTコマンドを使用します。
SELECT <CULUMN名> FROM <テーブル名>;
先程のpostsテーブルを例にすると下記のようになります。
下記の場合はmessageのCULUMNに該当する値を取得します。
SELECT message FROM posts;
実行結果
+--------------+
| message |
+--------------+
| Thanks |
| Hello |
| Sorry!! |
| Good morning |
+--------------+
複数指定する場合は下記のようになります。
message, likesのように,で区切って指定します。
SELECT message, likes FROM posts;
実行結果
+--------------+-------+
| message | likes |
+--------------+-------+
| Thanks | 12 |
| Hello | 4 |
| Sorry!! | 114 |
| Good morning | 222 |
+--------------+-------+
全ての値を取得する場合下記のようになります。
SELECT * FROM posts;
実行結果
+--------------+-------+
| message | likes |
+--------------+-------+
| Thanks | 12 |
| Hello | 4 |
| Sorry!! | 114 |
| Good morning | 222 |
+--------------+-------+
各データ型の使い方
INTとVARCHARは先ほどから使用していたので、
それ以外について軽く説明していきます。
数値・文字列
先ほどまでのpostsを少しいじってみました。
likes INT UNSIGNEDですが、
Twitterのいいねはマイナスが存在しないので、UNSIGNEDを付けました。
これにより、0以上の値しか格納出来なくなります。
mood DECIMAL(4, 2) UNSIGNEDは、実数の中の固定小数点でしたね!
DECIMAL(4, 2)という部分ですが、4桁の実数で小数点2桁まで表示という意味になります。
つまり、12.34なら全て表示されますが、1.234なら1.23までしか表示されません。
lang CHAR(2)ですが、二文字の文字列しか入れることが出来ません。
言語などを選択する時は2桁だったりするので、そう言った場合に使うことが出来ます。
DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
message VARCHAR(140),
likes INT UNSIGNED,
mood DECIMAL(4, 2) UNSIGNED,
lang CHAR(2)
);
INSERT INTO posts (message, likes, mood, lang) VALUES
('Thanks', 12, 7.453, 'JP'),
('Arigato', 4, 3.439, 'EN');
SELECT * FROM posts;
実行結果
+---------+-------+------+------+
| message | likes | mood | lang |
+---------+-------+------+------+
| Thanks | 12 | 7.45 | JP |
| Arigato | 4 | 3.44 | EN |
+---------+-------+------+------+
ENUM
先程のpostsは一旦元に戻してENUMについて説明します。
ENUM型は複数の値の中から一つを選ぶ型でした。
テーブルを作成する際に
category ENUM('Gadget', 'Game', 'Business')のように
複数の選択肢を用意します。
そのテーブルにデータを格納する場合は、
ENUMの中から一つを選択しなければなりません。
つまり、('Thanks', 12, 'Game'),のようになります。
なお、ここでENUMで定義されているもの以外を格納しようとするとエラーが発生します。
DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
message VARCHAR(140),
likes INT,
category ENUM('Gadget', 'Game', 'Business')
);
INSERT INTO posts (message, likes, category) VALUES
('Thanks', 12, 'Game'),
('Arigato', 4, 'Gadget'),
('Arigato', 4, 'Business');
SELECT * FROM posts;
実行結果
+---------+-------+----------+
| message | likes | category |
+---------+-------+----------+
| Thanks | 12 | Game |
| Arigato | 4 | Gadget |
| Arigato | 4 | Business |
+---------+-------+----------+
ついでですが、データを格納する時は下記のように記述することも可能です。
ENUM('Gadget', 'Game', 'Business')に対して、
1番目の値、2番目の値、3番目の値と指定することが出来ます。
つまり、('Thanks', 12, '2')は2番目のGameが格納されます。
DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
message VARCHAR(140),
likes INT,
category ENUM('Gadget', 'Game', 'Business')
);
INSERT INTO posts (message, likes, category) VALUES
('Thanks', 12, '2'),
('Arigato', 4, '1'),
('Arigato', 4, '3');
SELECT * FROM posts;
実行結果
+---------+-------+----------+
| message | likes | category |
+---------+-------+----------+
| Thanks | 12 | Game |
| Arigato | 4 | Gadget |
| Arigato | 4 | Business |
+---------+-------+----------+
SET
SET型は複数の値の中から複数を選択することができる型でした。
つまり下記のようになります。
SET('Gadget', 'Game', 'Business')は
ENUMだった箇所をSETに変更するだけで大丈夫です。
データを格納する際に('Thanks', 12, 'Gadget,Game')のように
複数の値を指定することが出来ます。
DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
message VARCHAR(140),
likes INT,
categories SET('Gadget', 'Game', 'Business')
);
INSERT INTO posts (message, likes, categories) VALUES
('Thanks', 12, 'Gadget,Game'),
('Arigato', 4, 'Business'),
('Merci', 4, 'Business,Gadget');
SELECT * FROM posts;
実行結果
+---------+-------+---------------+
| message | likes | categories |
+---------+-------+---------------+
| Thanks | 12 | Gadget,Game |
| Arigato | 4 | Business |
| Merci | 4 | Game,Business |
+---------+-------+---------------+
また、SET型もENUM型と同様に数字で格納することが出来ます。
数字の場合は次のようになります。
('Merci', 4, 6)って、6はどこから出たんだ!と思いますが、
SET型は複数選ぶことができるので、選びたい項目の合計を記載します。
そして、各項目の値は次のようになります。
| 1番目(Gadget) | 2番目(Game) | 3番目(Business) | ・・・ | n番目 |
|---|---|---|---|---|
| 2^0 | 2^1 | 2^2 | ・・・ | 2^n |
なので、Gadgetは2の0乗で1になります。
Gameは2の1乗で2にBusinessは2の2乗で4です。
(ここら辺がわからない型は少し数学を復習してください・・・。)
GadgetとGameを選ぶ場合は、
1つ目と2つ目なので、1+2=3つまり3を記述します。
DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
message VARCHAR(140),
likes INT,
categories SET('Gadget', 'Game', 'Business')
);
INSERT INTO posts (message, likes, categories) VALUES
('Thanks', 12, 3),
('Arigato', 4, 4),
('Merci', 4, 6);
SELECT * FROM posts;
実行結果
+---------+-------+---------------+
| message | likes | categories |
+---------+-------+---------------+
| Thanks | 12 | Gadget,Game |
| Arigato | 4 | Business |
| Merci | 4 | Game,Business |
+---------+-------+---------------+
真偽値・日時
次にBOOL(真偽値)とDATETIME(日時)です。
BOOLは**真(TRUEもしくは1)か偽(FALSEもしくは0)**を格納すればOKです。
DATETIMEは、'2020-10-11 15:33:22'のように
日にちと時間を指定しても構いませんし、
'2020-10-21'のように時間を指定せず日にちのみでも構いません。
ただ、時間を記述しない場合は00:00:00が格納されます。
また、NOW()と記述すると現在の日時が格納されます。
DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
message VARCHAR(140),
likes INT,
is_draft BOOL,
created DATETIME
);
INSERT INTO posts (message, likes, is_draft, created) VALUES
('Tnanks', 12, TRUE, '2020-10-11 15:33:22'),
('Arigato', 4, FALSE, '2020-10-21'),
('Merci', 4, 0, NOW());
SELECT * FROM posts;
実行結果
+---------+-------+----------+---------------------+
| message | likes | is_draft | created |
+---------+-------+----------+---------------------+
| Tnanks | 12 | 1 | 2020-10-11 15:33:22 |
| Arigato | 4 | 0 | 2020-10-21 00:00:00 |
| Merci | 4 | 0 | 2021-03-20 17:55:21 |
+---------+-------+----------+---------------------+
さいごに
基本的な文法やデータ型については以上になります。
もう少し踏み込んだ内容についても乗せていますのでぜひご覧ください。
・【MySQL】少し踏み込んだMySQLの基本的な文法
以上、最後までご覧いただきありがとうございました。

