[初学者]SQLについて学習する①

# はじめに

普段はRailsを扱っているのですがテーブルの更新がされる際にどの様なクエリが走っているかを普段意識していなかったのでSQLの勉強を始めることにしました。

またログを見ても何となくこんなことが書いてある、というのは分かるのですがそれを自分で書く事は出来ず、本質的に理解ができていませんでした。

それだけActiveRecordが優秀であるってことだと思うのですが、他の言語を学ぶ際や基礎知識として習得しておいた方が良いと思ったので学習したことをアウトプットします。

例えばこの様な**employee**テーブルがあるとします。

|id|first_name|last_name|age|hire_at|
|----|----|----|----|----|
|1|田中|太郎|19|2022-06-25|
|2|鈴木|一郎|42|2000-05-26|
|3|加藤|清子|29|2015-12-02|
|4|近藤|武|25|2002-09-05|
|5|工藤|明子|35|2005-01-25|

idがあって、姓名、年齢、入社日を表すテーブルです。

# 4つの命令文を理解する

## SELECTを使う
テーブルから目的のデータを指定して取得することが出来ます。

```sql
SELECT id, first_name
FROM employee
```

ここでは**employee**テーブルの**id**と**first_name**を検索しています。
実行結果は以下の通りです。

|id|first_name|
|----|----|
|1|田中|
|2|鈴木|
|3|加藤|
|4|近藤|
|5|工藤|

employeeテーブルのidとfirst_nameの列を全て抽出する事ができました。

## WHEREで修飾する
SELECTではテーブルから目的のデータを指定して取得することが出来ました。
WHEREではSELECTで取得したデータに対して条件をつけることが出来ます。

```sql
SELECT id, first_name
FROM employee
WHERE age > 30
```
上記ではWHERE句によってageが30より上のidとfirst_nameを取得します。
実行結果は以下の通りです。
|id|first_name|
|----|----|
|2|鈴木|
|3|加藤|

```sql
SELECT 列名
FROM テーブル名
WHERE 条件
```
の様に記載することが出来ます。

## UPDATEを使う
既にテーブルにあるデータを書き換えることが出来て**set**句と併用されます。

例えば下記の通り使います。
```sql
UPDATE employee
SET age = 18
WHERE id = 1
```
上記は**id**が**1**の**age**を**18**に更新しています。
|id|first_name|last_name|age|hire_at|
|----|----|----|----|----|
|1|田中|太郎|18|2022-06-25|


```sql
UPDATE テーブル名
SET 列名A = 値A, 列名B = 値B
WHERE　条件
```
の様に記載することが出来ます。

ここで注意が必要なのは**WHERE句**で修飾せずに
```sql
UPDATE employee
SET age = 18
```
の様に記載してしまうと、全ての**age**が**18**に更新されてしまうので条件が必要であれば**WHERE句**での修飾を忘れない様にしなくてはいけません。

## INSERTを使う
新しいデータを作成する為の命令です。
```sql
INSERT INTO employee
VALUES(6, '山田', '卓', 59, '2022-07-22')
```
この様に使います。

|id|first_name|last_name|age|hire_at|
|----|----|----|----|----|
|1|田中|太郎|19|2022-06-25|
|2|鈴木|一郎|42|2000-05-26|
|3|加藤|清子|29|2015-12-02|
|4|近藤|武|25|2002-09-05|
|5|工藤|明子|35|2005-01-25|
|6|山田|卓|59|2022-07-22|

新しくデータが作成出来ているのがわかると思います。

```sql
INSERT INTO テーブル名
VALUES(値A, 値B, 値C, 値D, 値E)
```
の様に使います。

また例えばあり得ませんがageが不明な社員が入って来たと仮定します。
その際は下記の通り書く事が出来ます。

```sql
INSERT INTO employee
(id, first_name, last_name, hire_at)
VALUES(7, '木村', '幸助', '2022-07-25')
```

|id|first_name|last_name|age|hire_at|
|----|----|----|----|----|
|1|田中|太郎|19|2022-06-25|
|2|鈴木|一郎|42|2000-05-26|
|3|加藤|清子|29|2015-12-02|
|4|近藤|武|25|2002-09-05|
|5|工藤|明子|35|2005-01-25|
|6|山田|卓|59|2022-07-22|
|7|木村|幸助||2022-07-25|

使い方としては
```sql
INSERT INTO テーブル名
(値A, 値B, 値C, 値E)
VALUES(値A, 値B, 値C, 値E)
```
この様に記述します。
注意点としては２行目の値と3行目の値は連動していなくてはいけません。

## DELETEを使う
既にあるデータを削除する為の命令です。

```sql
DELETE
FROM employee
WHERE id = 6
```
この様に記述します。

以下の通り**id**が**６**であるデータが削除出来ております。

|id|first_name|last_name|age|hire_at|
|----|----|----|----|----|
|1|田中|太郎|19|2022-06-25|
|2|鈴木|一郎|42|2000-05-26|
|3|加藤|清子|29|2015-12-02|
|4|近藤|武|25|2002-09-05|
|5|工藤|明子|35|2005-01-25|
|7|木村|幸助||2022-07-25|

```sql
DELETE
FROM テーブル名
WHERE 条件
```
の様に使います。

またここでも注意が必要なのは
```sql
DELETE
FROM employee
```
としてしまうと**employee**テーブルの**全件削除**を意味します。

# まとめ

ここでは主に
**SELECT**, **UPDATE**, **DELETE**, **INSERT**
といった**４大命令**を学習しました。

実際に手を動かしてSQLを走らせることでRAILSのログを見てその中でどんなSQLが走っているのか見通しが良くなればさらにレベルアップ出来るのではないかなと思ってます。

またこの４つを定着させるだけでSQLの見通しは良くなった実感があります。
普段自分で使わないだけに意識することは大事なのだと感じます。

引き続き学習を続けてアウトプットしていきます。

ここまで読んで頂きありがとうございました。