SQL 超初心者向け スッキリわかるSQL ２章（基本文法と４大命令）

# はじめに
さて今回もやってきます！スッキリわかるSQL２章です！
本記事もこのテーブルを題材としています。
![スクリーンショット 2021-07-22 18.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183228/d3564be4-9ab3-b2af-e443-bbbb598524e7.png)

# SQLに共通する基本ルール
どうやらSQLは書き方のルールがあるらしいぞ！
しっかり学んでいかないと！
### 共通する基本ルール１
`・文の途中に改行を入れることができる。`
`・行の先頭や行の途中に半角の空白を入れることができる`

備考
`・末尾のセミコロン（；）で、文の終了を表すこともある`

わかりやすいSQL文を書くために文中の改行は必須とのこと。

```
SELECT 費目, 出金額 
  FROM 家計簿 ←改行したほうがわかりやすい
WHERE 出金額 > 3000 
```
### 共通する基本ルール2 コメントアウトできる
`・ハイフン２つ(--)から行末までコメントになり、無視される`
`・/*から＊/まではコメントになり、無視される`

これはコメントアウトのやり方みたいですね。

```
/* コメントアウト部分  */
SELECT 費目, 出金額 
  FROM 家計簿
WHERE 出金額 > 3000 
```

### 共通する基本ルール3 予約語のルール 
`・SELECT や WHERE などの命令に使う単語は、SQLとして特別な意味をもつ「予約語」である。`
`・予約語を記述する際は、大文字と小文字の区別はない。`
`・テーブル名や列名に予約語を利用することはできない。`

小文字で書いても処理できます。


# データー型のリテラル
記述ルールといえば INSERT文で使われていたシングルクォーテーションが気になった。
➩これはデータの種類を示す為の記法です。

てかそもそも`リテラル`とは？
➩SQLの文の中に書き込まれたデータそのもののことです。


```
INSERT INTO 家計簿
VALUES ('2013-02-25', '居住値', '３月の家賃', 0 , 85000)  ←リテラル

0と85000の部分はシングルクォーテーションで囲われていない！
```
最後の２つのリテラルだけがシングルクォーテーションで囲われていないのは
リテラルの記述に関するルールがある。

### リテラルの記述に関するルール
`・で囲わない記述は、数値として扱われる。`
`・逆に'で囲うと基本的には文字列として扱われる`
`・基本的にはというからには、例外もある。'で囲われる '2013-02-25'のような形式では日付として扱われる。`

じゃぁ誤って数字をシングルクォーテーションで囲って文字列情報のSQL文で送ったらどうなんの？？
➩大丈夫です。データベースには安全装置が備わっています！

では、安全装置説明します。

```
INSERT INTO 家計簿
VALUES ('2013-02-25', '居住値', '３月の家賃', '0' , '85000')
数字（0と85000）をシングルクォーテーションで囲って誤ってSQL文を発行しちゃったああ！？
```

`上のSQLを実行すると、DBMSは、入金額や出金額は、数値じゃないじゃん！ってことで
処理を中断するか、うけとった文字列を強制的に数値に変換して格納しようとします！`
なぬ！！すごいな！SQL 

でもここでさらに疑問が・・・。
え？入金額と出金額が数値じゃないとだめってどうしてわかるんだよ！
`➩これは そもそも「数値」しか入らないように設定されているから。`

列ごとに格納できるデータの種類を`データ型`で定めることになっている。

### データ型
あー！Railsでテーブル設計した時にデータ型決めたわ〜！ なるほど〜〜！
ではデータ型を説明。

データ型とは？
'列ごとに格納できるデータの種類を表すもの'

代表的なデータ型は下記記事がよかったのではっときます！
[代表的なデータ型](https://qiita.com/hayabusa3703/items/d3ebf2dcd6257cb5cf1e)

意外とわかっているようでわかっていなかった・・・。
復習大事！！
### データ型
`・テーブルの各列には、データ型が指定されている`
`・列には、データ型で指定された種類の情報しか格納することはできない`
`・利用可能なデータ型は、DBMS製品によって異なる`

製品によって異なるとこは注意していきたいとこですね！


## SQLの命令体系
###４つの重要なSQL文
ほとんどの命令文は、1章で学習したSELECT,UPDATE,DELETE,INSERTの４つの命令文で実現可能。 これらは４つの命令は`DML`という。 または`4大命令`という。

なんだ！4大命令さえ覚えておけば楽勝じゃん！！と思った私。
違うんです。４つの命令にさまざまな修飾語を付加することで複雑なデータ操作ができるのは
SQLの特徴らしいです。

えええええ！！パニック！！
「FROMっていろんな命令で書けた気がするけど、どれに使えるん？」
「WHEREって、どの命令にもつけていいんだっけ？」
などなど。頭混乱しますよね。

でも大丈夫。４つの命令文法をスッキリとマスターするコツがある！

## 4大命令をスッキリ学ぶコツ
###データ抽出SELECT文の基本構文

```
SELECT 列名  ←この列のデータを取得しなさい
  FROM テーブル名 ←このテーブルから
（WHERE） 修飾の部分
※ 修飾の部分はなくてもよい
```

### AS + 任意のキーワードをつけることで、別名を定義できる

```
SELECT 費目 AS ITEM, 入金額 AS RECEIVE, 出金額 AS PAY
  FROM 家計簿 AS NONEYBOOK
WHERE 費目 ＝ '給料'
```
抽出した時の名前をASで変えられるみたいです。

| ITEM |   RECEIVE |    PAY    |
|---:|-------------|------------|
| 給料  |   28000   |     0       |

###データの書き換えUPDATE文の基本構文

```
UPDATE テーブル名 ←このテーブル情報を更新しなさい
   SET 列名1= 値１， 列名2=値２・・ ←このデータを
（WHERE） 修飾の部分
※ 修飾の部分はなくてもよい
```

`WHEREでどの行を書き変えるべきか指定する`
`逆に指定せず、書くと全ての行を書き換えてしまう！！`
全部のデータを書き換えって・・・注意が必要ですね。

###データの削除DELETE文の基本構文

```
DELETE ←削除しなさい
   FROM テーブル名 ←このテーブルを
（WHERE） 修飾の部分
※ DELETE文はWHERE基本つけよう！理由は下記
```

`WHEREでどの行を削除するか指定する`
`逆に指定せず、書くと・・・すべての行が削除対象となる`
### WHEREのない DELETE命令は全件削除！！！！
怖すぎる・・・。書籍には・・・本能的に「実行をためらうこと」を身につけて下さい・・って書いてある・・

### データ追加INSERT文の基本構文

```
INSERT INTO テーブル名 ←このテーブルに追加しなさい
            (列名1,列名2,列名3) ←この列に
       VALUES (値1, 値2, 値３・・・) ←このデータを
```

２行目の (列名1,列名2,列名3)を省略した場合、全列に追加できる！！

```
INSERT INTO テーブル名 ←このテーブルに追加しなさい
       VALUES (値1, 値2, 値３・・・) ←このデータを
```
`気をつけるべきは、 VALUESの並びはテーブルの列と同じじゃないといかんよ。`

###４大命令のすべてに共通すること
ここまで基礎文法学習したけど、WHEREの前の部分がどれも似ているのに、微妙違ってて
混乱しないか？
➩大丈夫です！ちゃんとルールがある

`処理対処となるテーブル名を必ず指定する必要がある`

### SQL書き方まとめ
```
①まず、命令文（SELECTやINSERTやUPDATEやDELETE）を書く
②次にテーブル指示
③テーブル指定より後ろの部分を記述する。
④テーブル指定より前の部分を記述する（SELECT文のみ）
```
この流れを覚えておけば、混乱しなくてすむと思います！

# 参考記事
- スッキリわかるSQL入門ドリル