データベースの基礎知識(SQL, CRUD)

#はじめに
プログラミングを学習していると、「データベース」という言葉や「SQL」といった言葉が頻繁に出てくる。
私は、なんとなくデータベースはデータの保管場所(そのままやないか)というざっくりしたイメージしかありませんでした。
ざっくりしたイメージだけだと。CRADって？ SQLがわからない。といったことがあったので、データベースに関して、きちんと理解を深めたいので、この記事を書きます。

#データベースってなに？

・WEBアプリにおけるデータベース(DB)はデータを整理して格納する保存先の役割を持つものです。
・データを整理して失われない形で格納する場所のことをデータベース(DB)という。
・また、格納されたデータを効率的に取得、更新、削除するための手段を提供してくれるシステムのことを**データベース・マネジメントシステム(DBMS)**と呼ぶ。

っと、言っていますが、要はWEBアプリで必要なデータを保管するためのBOXのようなイメージですかね。(違っていたらご指摘ください)
ログインパスワードや、投稿した記事、ECサイトの商品など、すべてデータベースに保存されています。
このQiitaの記事が見れるのも、色んな記事がデータベースに保存されているからだと思います。
データベースが無いと、WEBアプリケーションとして、機能しなくなります。

#CRADってなに？
簡単に言ってしまうと
**登録・変更・削除・参照機能のこと**です。
具体的には、上記で記述したデータベースを操作する際に必要な最低限の機能である、
**・登録機能（***C***reate）
・参照機能（***R***ead）
・更新機能（***U***pdate）
・削除機能（***D***elete）**
の４つの機能をあわせた表現を「CRUD」と言います。意外と簡単ですね。

#SQLってなに？
データベースとやり取りするときに使う言語です。
上記に記述したCRUDによる、登録機能や、参照機能、更新機能、削除機能を操作するための**言語**ということです。

#####それではデータベースを作成し、登録（Create）、参照（Read）、更新（Update）する流れを簡単にコードを書いて説明します。

#データベースの作成コマンド

```:データベースの作成
$ sqlite3 db/sandbox.sqlite3
```

このコマンドを実行すると「sqlite>」というプロンプトが表示され、入力待ちの状態になる。


#テーブルの作成

```:データベース内でのテーブル
$ sqlite> create table users(id integer, name text);　#文末には;(セミコロン)をつける
```

この場合は、id(数字)とname(文字)をカラムに持つ、usersテーブルを作成する。
コマンドを実行すると、db/sandbox.sqlite3ファイルが作成される。
テーブルを作成するにはこのように
**create table テーブル名(カラム名A 型, カラム名B 型・・・);**
という構文を使用する。（Rubyは基本的にセミコロンをつけないが、SQL文では文末にセミコロンが必要なので気をつける）

###⚠操作ミスでテーブルを削除したい時は？
usersテーブルを作りたかったのにスペルミスをしたり、何らかのミスをしたままテーブルを作成してしまうこともあるかもしれません。
その場合は、一度、テーブルを削除してから新しいテーブルを再作成しましょう。
テーブルを削除するには
**drop table テーブル名;**
というコマンドでテーブルの削除ができます。尚、テーブルにデータがあるときは、中のデータも含めて削除されるので注意が必要です。

#SQL文の種類と概要
基本的なデータベースレコードを操作するためのSQL文を紹介します。（ほんとにざっくりしていると思います）

####1 : insert文(テーブルにレコードを作成) [Create]
***insert into テーブル名(カラム名１, カラム名２,...) values(値１, 値２,...);***
概要：指定したテーブルにレコードを１つ格納する。指定したカラムと値の順序が一致している必要がある。値をセットしないときはnullと書きます。
※例

```:insert文
$ sqlite> insert into users(id, name) values(1, '山田太郎');
$ sqlite> insert into users(id, name) values(2, '鈴木一郎');
$ sqlite> insert into users(id, name) values(3, 'タイロン・ウッズ');
```

これで、**usersテーブル**に**id:1 山田太郎、id:2 鈴木一郎、id:3 タイロン・ウッズ**　というレコードが作成されました。

####２ : select文(テーブルに格納されたレコードを参照) [Read]
**select カラム名１, カラム名２, ...from テーブル名 where 条件式;**
概要：指定したテーブルに格納されているレコードのうち条件式にマッチするものを指定したカラム分取り出す。すべてのカラムを取り出す場合には*(アスタリスク)を指定します。
※例

```:select文
$ sqlite> select name from users;
山田太郎
鈴木一郎
タイロン・ウッズ
```

これは**usersテーブル**の**nameカラム**を取り出しています。
先程、usersテーブルにidとnameカラムを追加しましたので、nameカラムを指定すると、nameカラムのすべての値を取り出す事ができます。
####3 : update文(テーブルに格納されたレコードを更新) [Update]
**update テーブル名 set カラム名1 = 値1, カラム名2 = 値2, ... where条件式;**
概要：指定したテーブルに格納されているレコードのうちｍ条件式にマッチするものを指定した値で更新する。ただし、条件式は省略可能です。複数のレコードが一致した場合には、全ての値を書き換えてしまうので注意が必要です。
※例

```:update文
$ sqlite> update users set name = '山田太郎' where id = 1; #レコードの更新
$ sqlite> select * from users where id = 1;　#更新したレコードの参照
$ 1|山田太郎
```

####4 : delete文（テーブルに格納されたレコードを削除） [Delete]
**delete from テーブル名 where 条件式;**
概要：指定したテーブルに格納されているレコードのうち、条件式にマッチするものを削除する。ただし条件式は省略可能。複数のレコードが一致した場合は、全てのレコードを削除してしまうので注意が必要です。
※例

```:delete文
$ sqlite> delete from users where id = 1;   #usersテーブルのidが１のデータを削除
$ sqlite> select * from users;　　　#usersテーブルの全てのデータを参照
↓　id１が削除されていることがわかる
2|鈴木一郎
3|タイロン・ウッズ
```

#最後に
データベースの基本的な理解はできたと思います。これからアプリケーションを開発する上で、データベースは重要なものになると思うので、きちんと理解し、DB設計などができるように勉強していきます。

#参考記事
[SQLとは　「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word2217.html)
[CRUDとは 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word223.html)
[たった1日で基本が身に付く！ Ruby on Rails 超入門 たった1 日で基本が身に付く！](https://www.amazon.co.jp/%E3%81%9F%E3%81%A3%E3%81%9F1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E4%BB%98%E3%81%8F%EF%BC%81-Ruby-Rails-%E3%81%9F%E3%81%A3%E3%81%9F1-%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E4%BB%98%E3%81%8F%EF%BC%81-ebook/dp/B07BBHBPQ5)