実務で、SQLへの理解を急ピッチで進めるためのアウトプット記事

TECH::CAMPのカリキュラムでも読み飛ばす程度になってしまい、RailsのActive Recordにおんぶに抱っこ（笑）
卒業後もプロゲート一周しただけなのが本当に悔やまれる...。

もうほとんどの構文を忘れてしまっていたので再び定着させるためのアウトプット。
未経験からエンジニアを目指す人は、今すぐ本腰入れてマスターしておくことをお勧めします！

#そもそもSQLとは
SQL（Structured Query Language）

簡単に言えば*リレーショナルデータベース（RDB）の操作を行うための言語です。
*リレーショナルデータベースとは、データをテーブルという表形式の構造で管理するデータベースのことです。

#DDLとDML
SQL言語でできることは大きく分けて2つです。
データを定義するDDL(Data difinition langage)とデータを操作するDML(Data Manipulation langage)です。

##DDLにできること
|命令| 機能 |
|:-:|:-:|
|CREATE|データベースやテーブルの作成|
|ALTER|データベースやテーブルの更新|
|DROP|データベースやテーブルの削除|

##DMLにできること
|命令|機能|
|:-:|:-:|
|INSERT|データの挿入|
|UPDATE|データの更新|
|DELETE|データの削除|
|SELECT|データの検索|

この記事ではDDLよりもDMLに重きを置き解説していきます。（急ピッチで理解すべきはこちらのため）

#実際のSQL構文について

##データの挿入
まずはデータの挿入です。
データの挿入には「INSERT」を使用します。

```sql:sql
INSERT INTO テーブル VALUES(値, 値, 値);
```
上記では全てのカラムに、VALUESで指定した値が挿入されます。

しかし、特定のカラムのみに値を入れたいことも多いかと思います。
そういう際には下記の様に記述します。

```sql:sql
INSERT INTO テーブル(カラム名１,カラム名２,カラム名３) VALUES(値１,値2,値3);
```
カラムを指定する際には、必ずカラム名と、値の数が一致する様にしましょう。

##データの更新
次にデータの更新です
データの更新には「UPDATE」を使用します。

```sql:sql
UPDATE テーブル SET 変更後の値 WHERE 条件;
```

例えばですが、usersテーブルにおいて、idが４のユーザーが誕生日を迎えたので、年齢のデータを23から24に更新したい場合

```sql:sql
UPDATE users SET 24 WHERE id = 4;
```

この様になるわけです。

##データの削除
次にデータの削除です。
特に難しい部分はないのでサクッといきましょう。

```sql:sql
DELETE FROM テーブル名 WHERE 条件;
```

UPDATEと比較してもそんなに構文自体に際はないと思いますし、直感的に理解できますね。

##データの検索
最後にデータの検索です。
データの検索には「SELECT」を使用します。
おそらくですがSELECTが一番マスターするには奥が深いなという印象です。

```sql:sql
SELECT 表示範囲
FROM テーブル名;
```

###単純な検索

例えばですが、usersテーブルから、全てのデータを検索したい場合

```sql:sql
SELECT *
FROM users;
```
※*(アスタリスク)はワイルドカードでSELECTにおいては「全て」という意味として定義されています。
※FROMは主にテーブル名を指定しているだけです

しかしデータの検索はこれで最適化されているでしょうか？検索する際にはそのデータを確認するか、なんらかの、修正を加えたい際だと思います。その時に全てのカラムの情報が出てきてしまっていては、見にくくなってしまいます。

これを改善するためにまずは、取得するカラムを制限しましょう。
例えば先ほどの、usersテーブルの中から「名前」と「電話番号」を検索したい際

```sql:sql
SELECT
users.name,
users.phone_number
FROM users;
```

これで名前と電話番号のみが表示されることになります。

###取得するレコードを制限する検索
続いて、取得するデータを、条件によって制限する構文を書いていきます。
主に「WHERE」を使用します。

```sql:sql
WHERE 条件
```

これも少し例を。
先ほどのusersテーブルからデータを取得する、流れで、例えば25歳以上の人のみを取得する場合

```sql:sql
SELECT
users.name,
users.age
FROM users
WHERE age >= 25;
```
これでageの値が25以上のユーザーの情報を抽出することができます。

####論理演算子を使用した書き方

複数の条件を指定し検索する場合には、ANDやORといった論理演算子を使用します。

まずは**AND**からです。

例えば年齢が２５歳以上**かつ**、名前が鈴木一郎さんの場合。

```sql:sql
SELECT
users.name,
users.age
FROM users
WHERE age >= 25 AND name = "鈴木一郎";
```

この様になります。
ここで少し脱線しますが、例えば、鈴木一郎と名前が分かっていればいいですが、苗字しかわからない場合はどうしたらいいのでしょう？

その際には**あいまい検索**を使用します。

あいまい検索には「LIKE」を使用します。

すると苗字しかわからない場合でも

```sql:sql
SELECT
users.name,
users.age
FROM users
WHERE age >= 25 AND name LIKE "鈴木%";
```
※%は前方か後方、もしくは両方に置く。前に置けば後方一致で、後ろに置けば前方一致、双方に置けば、部分一致となる。
この様にすることで検索することができます。

続いては**OR**

OR演算子はその条件のうちいずれか一つでも正になれば正を返します。

例えば、年齢が25歳以下、または居住地が東京都の方を検索する場合

```sql:sql
SELECT
users.name,
users.prefecture,
users.age
FROM users
WHERE age <= 25 OR prefecture;
```
この様に検索することができます。

続いては**NOT**演算子です。

1つの条件を指定し式を作り条件が誤となるデータが取得できます。

こちらは非常に直感的に理解できるかと思います。

```sql:sql
WHERE NOT 条件
```

##便利な検索の書き方

###単一カラムの範囲検索
例えばですが、年齢が20歳以上、30歳以下のユーザーのデータを検索したいとします。
その際に、今まで学んだ中での知識でかくと

```sql:sql
SELECT *
FROM users
WHERE 20 <= age AND age <= 30;
```

しかしこの様に一つのカラムにおける条件を二回も書くのはスマートではありません。
ではどうするか。

そんな時には**BETWEEN**を使用しましょう。

```sql:sql
WHERE カラム BETWEEN 下限 AND　上限
```

先ほどのSQL文を書き直すと...

```sql:sql
SELECT *
FROM users
WHERE age BETWEEN 20 AND 30;
```

この様に非常にわかりやすく、直感的に書くことができます。

###単一カラムのリスト検索
例えば、居住都道府県が、**愛媛**、または **香川**であるユーザーを探すとします。
この様な際には、どうするでしょう？
まずは**OR**が思いつくかと思います。

```sql:sql
SELECT *
FROM users
WHERE prefecture = "愛媛" OR prefecture = "香川";
```

もう少し直感的にわかりやすく、冗長な部分をなくすのに便利なのが、
**IN**演算子です。
一つのカラムに対し、リストを作成し、カラムの値がリストの中に含まれる場合に、そのデータを抽出することができます。

```sql:sql
WHERE カラム IN (値１, 値２, 値３)
```

この様に書くことができます。
ではこのIN演算子に先ほどの条件を当てはめてみましょう。

```sql:sql
SELECT *
FROM users
WHERE prefecture IN ("愛媛", "香川");
```

非常に直感的で操作しやすいと思います。

次の記事ではデータの結合だったり、もう少し発展的な内容を書いていきます。