中学生でもわかる！MariaDB入門 #2

##あいさつ
初めての人は初めまして！知っている人はこんにちは！
今回もMariaDB入門ということで入門編を書いていきます！
[前回 中学生でもできるMariaDB入門](https://qiita.com/Atie_web/items/722299975393afee21c2)
では！

##真偽値、日時を扱う
ではまず真偽値を使ってみます
下書きかどうかid_draftfで扱ってみます！

真偽値の型はBOOLなのでBOOL型でカラムを作ります

```main.sql
CREATE TABLE posts (
    messages VARCHAR(140),
    likes INT,
    id_draft BOOL
);

INSERT INTO posts (messages, likes, id_draft) VALUES
    ('Thanks', 4, false),
    ('Hello!', 6, true),
    ('Good!', 3, 1);
```

BOOL型はfalse,true,0,1どれでも内部的には0か1で判断しているので0,1でも大丈夫です

つぎに日時を扱います
レコードを挿入したときに日時を記録します

```main.sql
CREATE TABLE posts (
    messages VARCHAR(140),
    likes INT,
    id_draft BOOL,
    created DATETIME
);

INSERT INTO posts (messages, likes, id_draft, created) VALUES
    ('Thanks', 4, false, '2020-12-11 06:35:23'),
    ('Hello!', 6, true, '2020-12-11 04:22:22'),
    ('Good!', 3, 1, NOW());
```
時間と日時は現在の時刻を入れたいならNOW()とすることで現在の日時を入れることができます

##NULL
NULLとはプログラミングをしていた人は多分聞いたことがありますNUMとかという名前かもしれませんが

値がないときに表示されます

レコードを挿入する際に一つだけ値を入れてないとその値はNULLになります

```main.sql
CREATE TABLE posts (
    messages VARCHAR(140),
    likes INT,
);

INSERT INTO posts (messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!');
```
こうすることで最後のレコードのlikesにはNULLが入ります

もしNULLだとエラーにしたい場合はNOT NULLとつけます

```main.sql
CREATE TABLE posts (
    messages VARCHAR(140),
    likes INT NOT NULL,
);

INSERT INTO posts (messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!');
```

これでエラーになります

もし値がなければ自動的に値をセットするにはDEFAULTとしますそうすることで値がなかった時のデフォルトの値を入れることができます

```main.sql
CREATE TABLE posts (
    messages VARCHAR(140),
    likes INT DEFAULT 0,
);

INSERT INTO posts (messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!');
```

これでもし値がなければ0がレコードに入ります

##値に範囲をつける
つぎは値に範囲をつけていきます
値に範囲をつけるにはCHECKとすることで値の範囲を決めることができます

```main.sql
CREATE TABLE posts (
    messages VARCHAR(140),
    likes INT CHECK (likes >= 0 AND likes<= 200),
);

INSERT INTO posts (messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!');
```
こうすることで値の範囲を設定できます

次は値を重複しないようにします
値を重複したときにエラーを出すにはUNIQUEとカラムにつけることで値が重複したときにエラーを出せます


```mian.sql
CREATE TABLE posts (
    messages VARCHAR(140) UNIQUE,
    likes INT CHECK (likes >= 0 AND likes<= 200),
);

INSERT INTO posts (messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!');
```

##主キーの設定
では次に主キーの設定をしていきます
主キーとはレコードを操作するためのidでそれを設定することでレコードの処理ができます
まずはidというカラムを作っていきます

```main.sql
CREATE TABLE posts (
    messages VARCHAR(140) UNIQUE,
    likes INT CHECK (likes >= 0 AND likes<= 200),
    id INT NOT NULL
);

INSERT INTO posts (id,messages, likes) VALUES
    (1, 'Thanks', 4),
    (2, 'Hello!', 6),
    (3, 'Good!', 7);
```
NOT NULLでidがNULLの場合はエラーを出させるようにしています

レコードの挿入では一番最初に1からなる連番を代入していきます

では次にidをこのレコードの主キーにしていきます

PRIMARY KEY(カラム名)

でそのレコードの主キーに設定できます
主キーを設定することで主キーでレコードを呼び寄せたりなどができます

```main.sql
CREATE TABLE posts (
    id INT NOT NULL,
    messages VARCHAR(140) UNIQUE,
    likes INT CHECK (likes >= 0 AND likes<= 200),
    PRIMARY KEY(id)
);

INSERT INTO posts (id,messages, likes) VALUES
    (1, 'Thanks', 4),
    (2, 'Hello!', 6),
    (3, 'Good!', 7);
```
これでidを主キーに設定することができました
しかしこのままでは自分でレコードを挿入するたびに番号を振っていかないといけないのでミスが起きると大変なことになります
なのでレコードを挿入してくれると自動で1からの連番を振ってもらえるようにします
NOT NULLの後にAUTO_INCREMENTとすることで自動的に連番を振っていってくれます

```main.sql
CREATE TABLE posts (
    id INT NOT NULL AUTO_INCREMENT,
    messages VARCHAR(140) UNIQUE,
    likes INT CHECK (likes >= 0 AND likes<= 200),
    PRIMARY KEY(id)
);

INSERT INTO posts (id,messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!', 7);
```
これで主キーの設定ができました

##SELECTでデータを抽出する
次はSELECTを使ってデータを抽出します
SELECT * FROM posts とするとすべてのレコードが抽出されます
*はすべてという意味です(CSSでも全体に適用するときは*{}で書きます)

もし特定のカラムだけを抽出したいなら*ではなくカンマ区切りでカラムを指定します

```main.sql
CREATE TABLE posts (
    id INT NOT NULL AUTO_INCREMENT,
    messages VARCHAR(140) UNIQUE,
    likes INT CHECK (likes >= 0 AND likes<= 200),
    PRIMARY KEY(id)
);

INSERT INTO posts (messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!', 7);

SELECT message, likes FROM posts;
```
これでmessageとlikesだけが抽出されます

抽出する条件を付けることもできます

条件を付けるにはWHEREを使います

```main.sql
CREATE TABLE posts (
    id INT NOT NULL AUTO_INCREMENT,
    messages VARCHAR(140) UNIQUE,
    likes INT CHECK (likes >= 0 AND likes<= 200),
    PRIMARY KEY(id)
);

INSERT INTO posts (messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!', 7);

SELECT message FROM posts WHERE message = 'Good!';
SELECT likes FROM posts WHERE likes => 6;
```
この場合はmessageがGood!だったときのみ出力する条件でlikesは6以上としています

##条件を組み合わせる
条件を組み合わせていきます
条件を組み合わせるにはANDかORを使います

###AND
ANDは「かつ」という意味です

```main.sql
CREATE TABLE posts (
    id INT NOT NULL AUTO_INCREMENT,
    messages VARCHAR(140) UNIQUE,
    likes INT CHECK (likes >= 0 AND likes<= 200),
    PRIMARY KEY(id)
);

INSERT INTO posts (messages, likes) VALUES
    ('Thanks', 4),
    ('Hello!', 6),
    ('Good!', 7);

SELECT message FROM posts WHERE messages = 'Good' AND messages = 7;
```
これでmessagesがGood!でなおかつlikesが7の条件に合ったもののみ抽出します

###OR
ORは「または」という意味です
なのでどちらかの条件が一致していれば抽出されます

```main.sql
SELECT likes FROM posts WHERE likes => 6 OR likes = 7;
```
この場合はlikesが6以上またはlikesが7の場合は抽出されます

##LIKEと%で文字列抽出
今までは完全一致で抽出していましたが「あるキーワードが含まれていたら抽出したい」などがあると思います

LIKEキーワードを使うことで特殊なキーワードを使うことができ、%で0文字以上の任意な文字_で任意の一文字を表現することができます

```main.sql
DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
  id INT NOT NULL AUTO_INCREMENT,
  message VARCHAR(140),
  likes INT,
  PRIMARY KEY (id)
);

INSERT INTO posts (message, likes) VALUES
  ('Thank you!', 12),
  ('thanks 100%', 4),
  ('Gracias', 4),
  ('Arigato_gozaimasu', 15),
  ('Arigato! desu', 23);

SELECT * FROM posts WHERE message LIKE 't%';
```
この場合はtから始まる文字列を抽出します
%を使うことで前方一致後方一致の処理ができます

例えばuの後方一致は

```main.sql
SELECT * FROM posts WHERE message LIKE '%u';
```
このように書きiを含む場合を書きたい場合は

```main.sql
SELECT * FROM posts WHERE message LIKE '%i%';
```
このように書きます

_を使うことで「〇文字目が一致」のようなことができます

例えば3文字目がaという条件を立てるには

```main.sql
SELECT * FROM posts WHERE message LIKE '__a';
```
このようにします
最初の二文字は何でもいいですが三番目の文字はaの場合抽出です
もしLIKEを反転するにはNOTを付けます

```main.sql
SELECT * FROM posts WHERE message NOT LIKE '__a';
```
もし条件の中に%や_が含まれる場合は記号の前に\を付けます

```main.sql
SELECT * FROM posts WHERE message LIKE '%/%%';
```
これで文字の中に%が含まれていたらという条件を作れました
_も同様です

##NULLのレコードだけを抽出
次にNULLのレコードだけを抽出していきます
この場合ISを使う必要があります

```main.sql
SELECT * FROM posts WHERE likes IS NOT NULL;
```
これでlikesがNULLのレコードを抽出してくれます

##さいごに
最後まで読んでいただきありがとうございました！
このMariaDB入門はあと一記事あるのでそちらもよろしくお願いします！
Twitterしています→[AtieのTwitter](https://twitter.com/Atie_BackendPG)
それでは！また次回の記事で！