今から追いつく初心者の俺が纏めるDB＆SQLまとめ



初心者な俺が見返しても参考になるようなTopicです。（多分）

## データベースって何？

ざっくり言うと行（レコード）と列（フィールド）からなるデータの集合。

# データベースの構成要素

一番ちっちゃい要素として行と列の組み合わさったデータの集合があって、その総称をテーブルといいます。
テーブルの集合をデータベースとか、スキーマといいます。
そしてそのデータベースを管理するMySQLとかPostgreSQLをデータベースマネジメント・システム（DBMS）です。

SQLはDBMSにデータ下さい！っていう要求をするための言語ですね。

## じゃあ早速SQLを学ぼう。

まずは知識的な面でやっていきます。必要ねーよ！使用例を知りたくて見に来たんだ！って方は次の項目へ。

PCが持つ基本的な４つの機能として
・CREATE     作る
・READ         読み込む
・UPDATE     更新する
・DELETE     消す
最初の頭文字をとってCRUD（クラッド）ってのがあります。
SQLはこのCRUDが基本的な機能になります。バックアップしたいとか、データを変換したいとかはSQLと組み合わせて使う別の言語で行うことが多いはずです。


## SQLを学ぶために実際に実行しながらやってみよう。

今回MySQLを使って作業していきます。MAMP等があると一発で環境ができるので楽だと思います。
SQLを実行する時もmyAdmin使えばいいので変にエディターとかも必要ないです。
その前に実行していくためにデータベースにはデータがなきゃいけないので
・実践する際にはテーブルが2つ以上ある。
・連番じゃない数字の入ったデータがある
・2つのテーブルにレコードごとに対応したデータが有る。（１にIDがあって、２でもIDがあることで同じIDのデータは同じ人を指す事ができる）

練習に使えそうなDBがある人は前準備を飛ばして次の項目へ…。


# 前準備

まずはデータベース「fromWhere」を用意する。
次にテーブルを2つ作る。
「whereFrom」

![fromWhere_list.png](https://qiita-image-store.s3.amazonaws.com/0/42310/19940b7c-b538-b258-9f3d-d48a57b5608d.png)

「mail」

![mail_list2.png](https://qiita-image-store.s3.amazonaws.com/0/42310/61b4fd49-e3e5-4e3a-9b49-0e347f1bc8cd.png)

今回はこの2つのテーブルを作りました。
さぁーやってこう。

## SQLを実行しよう。

実際、４つの機能を見て行きましょう。
ざっくり一例を紹介していきますので、詳細を知りたい方は
世の中にはいっぱい資料があるので探してみてください。SQLはphpMyAdminを使って実行していきますね。

![SQL_Action.png](https://qiita-image-store.s3.amazonaws.com/0/42310/ee8cc4ba-2f0c-32ad-7e88-cfd8c948fcef.png)



# CREATE     作る

CREATE文とINSERT文って言うのがあります。
CREATE文はテーブルを作ったり、消したりするのに使います。
INSERT文はテーブルのデータの追加・削除・更新を行うことが出来ます。

とりあえず

```sql

/* もしsampleテーブルがあったら消します。 */
DROP TABLE IF EXISTS `sample`;

/* こんな感じの設定でテーブル作りますよ */
CREATE TABLE `sample` (
  /* フィールド「id」はint（11）まで書き込めて、且つオートで数字割り当てる。NULL禁止 */
  `id` int(11) NOT NULL AUTO_INCREMENT,
  /* フィールド「name」はvarchar（255）まで書き込める。NULL禁止 */
  `name` varchar(255) NOT NULL,
  /* 主キーの設定「id」にするよ */
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

/* データを書き込む */
INSERT INTO `sample` (`id`, `name`)
VALUES
  (1,'さんぷる'),
  (2,'サンプル'),
  (3,'sample'),
  (4,'SAMPLE'),
  (5,'Sample');

```

こんな感じなのを実行してみましょう。そしたらテーブルが選択したデータベース上に作られて、指定したデータが入っているはずです。

# UPDATE     更新する　DELETE     消す 

テーブルに入れた入れたレコードを消すにはDELETE文や、更新するならUPDATE文を使って行きましょう。


実行例としてはこんな感じです。

```sql

/* テーブル「sample」のid=2のレコードを消す */
DELETE FROM 
     `sample`
WHERE
      id = 2;

/* テーブル「sample」のid=3のレコードのnameを「さむぷる」に書き換える */
UPDATE
     sample
SET
     name="さむぷる"
WHERE
     id = 3;

```

ただ、この２つの文ですが仕事をする上でこれを素直に用いるのはあまり好ましくないようです。古いデータも残しておいてデータを溜めたいのがこちらの都合というものです。

フィールドにフラグを追加して、そのフラグが立ってる時は表示しない（あたかも消えてるように見せる）という設定しておくことでDELETEっぽくする。
古いデータを別の箇所にINSERTしてから、データを更新して、古いデータの履歴をためていく。

などなど、データの数を減らさないようにSQLを組むのが一流プログラマー何でしょうね。


# READ         読み込む

読み込むにはSELECT文を用いて、入っているデータを抜き出します。
テーブルの中から条件に合うデータを引っ張ってきたり、複数のテーブルを跨いでデータを組み合わせて表示させたり、SQLで一番使用される機能だと思います。

同じ人や会社、グループの情報等をわざわざテーブルを分けてデータを保存したりするのがDBでは当たり前になっています。一つのレコードに含まれるフィールドの量が多すぎると、SELECTした時にいちいちすべてのデータを参照してしまうので、データ量が多くなればなるほど重くなってしまいます。

それを避けるためにテーブルをある規定に則って分けるのですね。SELECTのテーブルを跨いで参照する機能は重要ですね。

さて、そんなSELECTですが、いろんな機能があります。幾つか実行例をあげるので、順々に見て行きましょう。

> テーブルから性別女性の人を表示する。

```sql

SELECT
	*
FROM
	whereFrom
WHERE
	Sex = "女性"
;
```
> 21歳より大きくて30歳未満の人を表示する

```sql

SELECT
	*
FROM
	mail
WHERE
	age > 21
    AND age < 30
    /* age < 21 21歳未満の人を出す。 */
    /* age > 21 21歳より大きいの人を出す。 */
;
```
> 20歳より大きい。データはidが同じ人同士をくっつけて表示（内部結合）

```sql

SELECT
	*
FROM
	whereFrom
    INNER JOIN mail
     ON whereFrom.id = mail.id
where
	age > 20
;

```

さて、いかがでしょうか・・・。
結構適当にSampleを上げましたが、
つまりこんな感じでデータ取り出して使うわけです。
前回のPHPでsqlを使う方法を投稿しましたが、
あのsqlの部分を変更すれば取り出せるデータが変わります。

例えば、フォームを用意して、
フォームに入力されたSQLを実行して
下部に表示する……なんてコンテンツも簡単にできるようになるわけですね。

ですが、そのまま適当にフォームを用意するとセキュリティに欠陥が出たりするので気をつけてくださいね。