LoginSignup
2
3

More than 3 years have passed since last update.

【MySQL】基本的な文法やデータ型についてまとめてみた

Last updated at Posted at 2021-03-20

はじめに

MySQLについて学習していて基礎的なことを忘れないように備忘録がてら投稿します。

どなたかのお役に立てれば幸いです。

データベースの用語

MySQLで登場する用語などについて紹介します。

TABLE

データベースにデータを格納するわけですが、
データを格納する表のことをTABLEといいます。

下記のTABLEはTwitterの投稿文といいね数を集計したTABLEです。
スクリーンショット 2021-03-20 16.21.39.jpg

RECORD

データが入っている一行一行のことをRECORDといいます。
スクリーンショット 2021-03-20 16.21.45.jpg

CULUMN

逆に列のことをCULUMNといいます。
スクリーンショット 2021-03-20 16.21.50.jpg

データ型

よく使用するデータ型について記載します。

下記のデータを使った例は下で説明していますので
ぜひそちらをご覧ください。

整数

整数にはTINYINTINTBIGINTの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京

実数

実数にはDECIMALFLOATDOUBLEの3つがあります。

各型については下記のようになります。

説明
DECIMAL 固定小数点
FLOAT 浮動小数点
DOUBLE 浮動小数点(高精度)

FLOATDOUBLEは浮動小数点なので細かいところで誤差が出てきます。
なので、DECIMALを使用してもいいかと思います。

文字列

文字列にはCHARVARCHARTEXTENUMSETの5つがあります。

各型については下記のようになります。

説明
CHAR 0 〜 255文字
VARCHAR 0 〜 65535文字
TEXT それ以上
ENUM 特定の文字列から一つ
SET 特定の文字列から複数

商品コードなどの固定長のデータにはCHARを使い、
文字数がバラバラになるようなデータの場合はVARCHARを使い、
それよりも長くなる文字列にはTEXTを使用するようなイメージでいいと思います。

ENUMは、出身の都道府県を一つ選択する時のような場合に、
SETは、アンケートの解答などで複数選択する場合に使ったりします。

真偽値

真偽値はBOOLのみになります。

BOOLはTRUEFALSEを保持することが出来ます。

しかし、内部的にはTRUEが1、FALSEが0と管理されています。
なので、一桁のTINYINTと同じ型だったりします。

日時

日時にはDATETIMEDATETIMEの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テーブルは、messagelikesという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 |
+--------------+-------+

各データ型の使い方

INTVARCHARは先ほどから使用していたので、
それ以外について軽く説明していきます。

数値・文字列

先ほどまでの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乗になります。
Gameは2の1乗にBusinessは2の2乗です。
(ここら辺がわからない型は少し数学を復習してください・・・。)

GadgetGameを選ぶ場合は、
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の基本的な文法

以上、最後までご覧いただきありがとうございました。

2
3
0

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
2
3