SQL基礎知識

#基本文法と四大命令

##SQLに共通する基本的なルール
- 文の途中に改行を入れることができる
- 行の先頭や行の途中に半角の空白を入れることができる
- セミコロン（；）で文の終了を表す

##コメント

- ハイフ２つ（--）から行末まではコメントとなり、実行が無視される
- /* から */ まではコメントとなり、実行は無視される。

##予約語について

- SELECTやWHEREなどの命令に使う単語は、SQLとして特別な意味を持つ「予約語」である
- 予約後を記述する際は、大文字と小文字を区別しない
 
```
SELECT * FROM products；

select * from products；
```
上記はどちらでも問題なく作動する

- テーブル名や列名に予約語を利用することはできない

#四大命令について

ほとんどのデータ操作は、INSERT、SELECT、UPDATE、DELETEで可能。


| 命　令 | 各命令で固有の部分 　　　　　　　　　　| 対象行の絞り込み|検索結果の加工|
|:-----------|------------:|:------------:|:------------:|
| SELECT  | 列名 ... FROM テーブル名　　　　　　　　　| WHERE|その他修飾|
| UPDATE     | テーブル名 SET 列名 = 値 ...　　　　　　　　| WHERE|なし|
| DELETE     | FROM テーブル名 　　　　　　　　　　　　| WHERE         |なし|
| INSERT     |INTO テーブル名（列名１, ２...） VALUES （値１, ２...）| なし           |なし|




##それぞれの構文と解説

###SELECT
データベースとのやりとりをするにあたって、最も頻繁に使われるSQLがSELECT文です。
テーブルから目的のデータを指定して取得し、条件に応じて結果の出力を変更することができます。


```
SELECT 列名１, 列名２・・・
FROM テーブル名
WHERE 条件
その他の修飾;
```
- SELECTの後ろには取得したい「列」の名前をカンマで区切って記述
- 2行目位はFROM句と呼ばれ、データを取得する「テーブル」を指定するために必ず指定します
- ３行目はWHERE句と呼ばれ、「条件」を絞り込むためにつけます（なくても大丈夫です）

####ASによる別名の定義

```
SELECT 列名１ AS 〇〇, 列名２ AS □□・・・
FROM テーブル名
WHERE 条件
その他の修飾;
```
上記のようにすることで出力結果に対して任意の名前をつけることができる。



###UPDATE

UPDATE文は、すでにテーブルに存在しているデータを書き換えるためのSQLです。

```
UPDATE テーブル名
SET 列名１ ＝ 値１, 列名２ ＝ 値２・・・
WHERE 条件;
```

- UPDATEの後には更新したいデータの存在するテーブル名を記述します
- ２行目はSET句と呼ばれ、更新したい列名と、その列に書き込むデータを記述します
- WHERE句は強制ではないが、なければ対象のデータがまるごと更新されてしまう。


###DELETE

DELETE文は、テーブルにすでに存在している行を削除するためのSQLです。
「行」をまるごと削除する機能であるため、特定の「列」だけを指定することはできない。

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

- WHEREは強制ではないが、つけないと該当する全てのデータを消してしまう可能性があるため注意する


###INSERT

INSERT文は、テーブルに新しいデータを追加するためのSQLです。

```
INSERT INTO テーブル名
（列名１, 列名２, 列名３・・・）
VALUES (値1, 値2, 値3・・・);
```

- １行目のINSERTにはINTOのキーワードに続けてデータを追加するテーブルを記述します。
- ２行目にはデータを追加する列名を指定する。ただし、そのテーブル全ての列に値を追加する場合は、２行目を丸ごと省略できる。
- ３行目はVALUES句と呼ばれ、２行目に指定した列に対応するデータの値を指定する。


##四大命令を覚えるための三つのコツ

①四大命令の構造と修飾語の全体像をしっかり把握する
②四大命令の２通りの分類方法を理解する
③四大命令に共通するテーブルの指定を先に記述する


###①四大命令の構造と修飾語の全体像をしっかり把握する

| 命　令 | 各命令で固有の部分 　　　　　　　　　　| 対象行の絞り込み|検索結果の加工|
|:-----------|------------:|:------------:|:------------:|
| SELECT  | 列名 ... FROM テーブル名　　　　　　　　　| WHERE|その他修飾|
| UPDATE     | テーブル名 SET 列名 = 値 ...　　　　　　　　| WHERE|なし|
| DELETE     | FROM テーブル名 　　　　　　　　　　　　| WHERE         |なし|
| INSERT     |INTO テーブル名（列名１, ２...） VALUES （値１, ２...）| なし           |なし|

この図を見て、全体像を俯瞰する。

###②四大命令の２通りの分類方法を理解する

####四大命令の分類法１　検索系と更新系

検索系：SELECT
更新系：DELETE、UPDATE、INSERT

検索系の命令はデータベースを書き換えることはありません。また、SQLの実行結果は表の形になります。
一方、更新系の命令は、データベースのデータを書き換えることが仕事です。実行結果は基本的に「成功か失敗か」であり、表などが出力されることはありません。

上記の図を見ると、「検索結果の加工」に関する欄は、SELECTだけに当てはまっています。
ここでいう「その他の修飾」というのは、「ORDER BY = 検索結果表の行を並び替えることができる」など、検索結果表を加工する効果を持つ修飾語のことを指します。
検索結果に対する処理を指示するものなので、実行結果が表ではないUPDATE、DELETE、INSERTには指示ができないということになります。

####四大命令の分類法２　既存系と新規系

新規系：INSERT
既存系：DELETE、UPDATE、SELECT

既存系の命令は、すでにデータベースに存在するデータに対して何らかの処理を行うためのものです。
一方、新規系の命令は、まだデータベースに存在しないデータについての措定をします。

上記の図を見ると、「対象行の絞り込み」（WHERE句）は、INSERTには対応していません。
これはWHERE句が、「既存のデータの絞り込み」という効果を持つからであり、SELECT、UPDATE、DELETEはそれぞれ既存のデータに対して命令を実行するため、WHERE句が利用可能となります。
一方、既存のデータに対する処理ではないINSERT文は対応しないということになります。

###③四大命令に共通するテーブルの指定を先に記述する

四大命令に共通することとして、「処理対象となるテーブル名」を必ず指定する必要があります。

| 命　令 | 各命令で固有の部分 　　　　　　　　　　| 
|:-----------|------------:|:------------:|
| SELECT  | 列名 ... FROM テーブル名　　　　　　　　　|
| UPDATE     | テーブル名 SET 列名 = 値 ...　　　　　　　　| 
| DELETE     | FROM テーブル名 　　　　　　　　　　　　| 
| INSERT     |INTO テーブル名（列名...） VALUES （値...）| 

そのため、以下の順番を意識することで、SQL文がスッキリ書けます。

①命令文（SELECTやINSERTなど）を記述する
②テーブル指定の部分を記述する
③テーブル指定より後ろの部分を記述する
④テーブル指定より前の部分を記述する（SELECTのみ）

特に①〜②を考え込まずにできるように訓練しておくと、どの命令にどのキーワードを書けばよいかが自然と身に付くため、スムーズにSQLが書けるようになるはずです。