SQL 入門講座　1

# はじめに
SQLの書き方を忘れてしまったときの備忘録の役割をしてくれたら幸いです。


# SQL共通の基本ルール
構文の解説を行う前に、SQL文を書くための基本的なルールをまとめます。


### 共通する基本ルール１
`・文の途中に改行を入れることができる。`
`・行の先頭や行の途中に半角の空白を入れることができる`

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


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



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

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


# データー型とリテラル
INSERT文で使われていたシングルクォーテーション「'」はデータの種類を示す為の記法です。
`リテラル`とはSQLの文の中に書き込まれたデータそのもののことです。

```
INSERT INTO 家計簿
VALUES ('2013-02-25', '居住値', '３月の家賃', 0 , 85000) 
```
最後の２つ(0、85000)のリテラルだけがシングルクォーテーションで囲われていないのは
リテラルの記述に関するルールによるものです。





### リテラルの記述に関するルール
`・で囲わずに記述されたリテラルは数値情報として扱われる。`
`・'で囲われたリテラルは基本的には文字列情報として扱われる。`
`・'で囲われる '2021-12-20'のような形式で記述されたリテラルは日付情報として扱われる。`


### 列とデータ型
では、数値のデータとすべき箇所を誤って文字列情報として指定してしまったらどうなるでしょうか。

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

上のSQLを実行すると、DBMSは、入金額や出金額が数値ではないとして処理を中断するか、受け取った文字列を強制的に数値に変換して格納しようとします。

※テーブル作成の前提条件として、入金額と出金額は「数値」しか入らないように列ごとに格納できるデータの種類を`データ型`で定めている為です。

### データ型

データベースの中には複数のテーブルがあり、テーブルは行と列から成り立っています。
列ごとに格納できるデータの種類を表すデータ型を定めることになっています。

代表的なデータ型は下記となります。

|データ種別|区分|代表的なデータ型名前|
|:--|:--|:--|
|文字列|固定長|CHAR型|
|文字列|可変長|VARCHAR型|
|数値|整数値|INTEGER型|
|数値|小数|DEMICAL型,REAL型|
|日付と時刻|--|DATETIME型,DATE型,TIME型|

利用可能なデータ型、型の名称や取扱可能な桁数の範囲、フォーマット形式などは製品により異なるので注意が必要です。


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

###固定長（CHAR型）
固定長とは、一言で言うと、「__入るデータの長さが決まっている__」、という意味です。
また、CHAR型というのは、固定長の文字列データを扱うデータ型のことです。

例えば、CHAR（10）とかかれていたら、
「10バイトまで文字をきちんと入れる」
ということになります。
そして、もし、格納しようとしている文字列が10バイトではなく8バイトだとします。

8バイトだと10バイトに満たないため、その場合だと文字列の右側に__空白__が2バイト追加されます。
そして、10バイトぴったりに調整された後、格納されます。

CHAR型は社員番号や郵便番号といった、格納するデータの桁数が決まっているものに対して使われるデータ型です。

###可変長(VARCHAR型）
可変長（VARCHAR型）とは、一言で言うと、「__中に入るデータの長さが決まっていない__」という意味です。
また、VARCHAR型というのは、可変長の文字列データを扱うデータ型のことです。

VARCHAR型では、もし格納する文字列の長さが足りていなくても、右側に空白を追加する、といった調整はありません。

例えば、VARCHAR（10)とかかれていたら、

「10バイトまで8バイトでも3バイトでも入力可能」
ということになります。

格納しようとしている文字列が8バイトでも3バイトでも、そのままの長さで格納することが可能です。

そのため、
VARCHAR型は氏名や書籍名といった、格納するデータの桁数が変動するものに対して使われるデータ型です


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

さらに、４つの命令にさまざまな修飾語を付加することで複雑なデータ操作ができるのはSQLの特徴です。


## 4大命令をスッキリ学ぶコツ
###SELECT文（データ検索）の基本構文

SELECT文：テーブルから目的のデータを指定して取得する。

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

SELECTの後ろには、取得したい列の名前をカンマで区切って記述する。
アスタリスクを記述すれば、すべての列を指定するのと同じ効果が得られます。
FROM区はデータを取得するテーブルを指定する為に必ず指定します。
3行目以降、WHEREによる修飾やそのほかの修飾が必要であれば記述します。


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

SELECT文における列名やテーブル名の指定では、それぞれの記述の後ろに「AS+任意のキーワード」をつけることで別名を定義することが出来ます。

```
SELECT 費目 AS ITEM, 入金額 AS RECEIVE, 出金額 AS PAY
  FROM 家計簿 AS NONEYBOOK
WHERE 費目 ＝ '給料'
```

※注意※
Oracle DBやSQL Server、Db2など多くの製品では「AS」の記述を省略することが出来ます。
また、Oracle DBではテーブルの別名をつける場合には「AS」を記述してはならないルールとなっています。

#### 別名をつけるメリット
`・結果表における別のタイトルを任意のものに変更できる。`
`・わかりにくい列名や長い列名でも、わかりやすく短い別名を付けて利用することが出来る。`
※テーブル名に別名を付けるメリットもほぼ同様ですが、詳細は後日記事を記載します。


###UPDATE文の基本構文

UPDATE分はすでにあるテーブルに存在するデータを書き換えるための命令。

```
UPDATE テーブル名 ←このテーブル情報を更新しなさい
   SET 列名1= 値１， 列名2=値２・・ ←このデータで
（WHERE） 修飾の部分
※ 修飾の部分はなくてもよい
```
2行目はSET句と言い、更新したい列名と、その列に書き込むデータを記述します。

`WHEREでどの行を書き変えるべきか指定する`
`指定せず書くと全ての行を書き換えてしまうため注意すること`


###DELETE文の基本構文

DELETE分は、すでにテーブルに存在する行を削除するための命令。
既存のデータに対する操作という点ではSELECT文やUPDATE文と同じだが、行を丸ごと削除する機能である。
特定の列だけを指定するようなことは出来ない。

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

`WHEREでどの行を削除するか指定する`
`逆に指定せず記載するとすべての行が削除対象となる`
　⇒WHEREのない DELETE命令は全件削除


### INSERT文の基本構文

INSERT文は、テーブルに新しいデータを追加するための命令。
これまでに紹介した3つの命令とは異なり、テーブルの行を指定する仕組み（WHERE）はありません。
その代わり、どこに、どういったデータを追加するのかを指定することが出来ます。

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

1行目のINSERTには、INTOのキーワードに続けてデータを追加するテーブル名を記述します。
さらにテーブル名の後ろに括弧でくくってデータを追加する列名を指定します。
2行目の (列名1,列名2,列名3)を省略した場合、全列に追加となります。
3行目はVALUES句といい、2行目に記述した列名に対応するデータの値を指定します。
列名を省略した場合、テーブルのすべての列について指定する必要があります。


### SQL書き方まとめ
```
①命令文（SELECTやINSERTやUPDATEやDELETE）を記述する。
②次にテーブル指示の部分を記述する。
③テーブル指定より後ろの部分を記述する。
④テーブル指定より前の部分を記述する（SELECT文のみ）。
```