クエリ初心者向けSQLメモ

# メモ内容
このメモには、以下の内容についてまとめておきます。現状は本当にメモ程度になりますが、これから都度修正や変更を加えより分かりやすくまとめていく予定なので、「そういうもんなんだな～」程度でまずは読んでいただければと思います。
* SQLについて
* SQLの書き方

# SQLについて 
<dl>
<dt>SQLって何？</dt>
<dd>SQL(Structured Query Language)とはデータベースを操作したりデータの定義を行ったりする時に使用するデータベース言語です。組織によって多少異なるものの、データベース内には数十万・数百万のデータが入っていることが多いので、その中から自分が今見たいデータを検索したり新たにデータを挿入して保管したりしたい時に使用されます。

ちなみにプログラミング言語とは違うの？と思う方もいるかもしれませんが、データベース言語はデータベースを操作するために使用するのに対して、プログラミング言語はコンピュータにさせたい処理を要求するものなので、処理を実行させる対象が異なります。

SQLを使用する対象はリレーショナルデータベース(RDB)といわれるもので、RDBは以下の表のような形式（以下：テーブル）で管理するものを指しています。
| ID | name | age |
|:---|-----:|:---:|
|137|Yamada|22|
|236|Takahashi|34|
|367|Ueda|28|
|445|Matsumoto|39|
|892|Oikawa|67|
|647|Watanabe|20|

また、このRDBを管理するシステムはリレーショナルデータベース管理システム(RDBMS)と呼ばれ、ユーザーやアプリケーションがデータを利用するための機能を提供しています。主な機能としてはデータベース言語(SQL)の提供、データに矛盾が生じないようにする「トランザクション処理」、障害が起きた場合のデータ保障などが挙げられます。</dd>

# SQLの書き方
<dl>
では、ここからよく使われる基礎的なSQLの書き方についてまとめていきたいと思います。先ほどRDBの例として示したテーブルを参考に、DDLとDMLの2つを説明します。
<dl>
<dt>DDLの書き方</dt>
<dd>DDL(Data Definition Language)はデータ定義言語と呼ばれ、テーブルや索引などのオブジェクトを定義づける言語になります。主に、テーブルを新規作成(CREATE文)する場面や変更(ALTER文)、削除(DROP文)する際に使用されます。
<dl>
例として先ほどのテーブルを「member」という名前で作成しようとすると以下のようになります。

```SQL:テーブルの大枠の作成
CREATE TABLE member
(
    ID int not null,      --カラム名とデータ型を指定する
    name varchar not null,  
    age int null
);
```
これでデータを格納するための枠組みが作れました。「；」までが1つのSQL文になります。(実際にクエリを書くときは必要ありません。)
```SQL:データの格納
INSERT INTO member (ID,name,age) VALUES (137,'Yamada',22);
INSERT INTO member (ID,name,age) VALUES (236,'Takahashi',34);
INSERT INTO member (ID,name,age) VALUES (367,'Ueda',28);
INSERT INTO member (ID,name,age) VALUES (445,'Matsumoto',39);
INSERT INTO member (ID,name,age) VALUES (892,'Oikawa',67);
INSERT INTO member (ID,name,age) VALUES (647,'Watanabe',20);
```
こちらはDMLの分類になりますが、INSERT文を使用してID、name、ageカラムにそれぞれデータを格納しました。テーブル名を指定した後カラム名を書き、同じ順番で格納したいデータを書いていきます。
この2つを実行すると先ほどのテーブルを作成できます。

**member**
| ID | name | age |
|:---|-----:|:---:|
|137|Yamada|22|
|236|Takahashi|34|
|367|Ueda|28|
|445|Matsumoto|39|
|892|Oikawa|67|
|647|Watanabe|20|

ちなみにカラム定義を変更したい、あるいは削除したいという場合にはALTER文・DROP文を使用します。例えばテーブルに新しく性別(sex)のカラムを追加したい時にはこう書きます。

```SQL:データの変更
ALTER TABLE member
ADD sex varchar not NULL;
```
このクエリを実行すると新しくカラムが追加されたテーブルに更新できます。あとは、先ほどのINSERT文を使用して性別を格納すれば完成です。

| ID | name | age |sex|
|:---|-----:|:---:|:----:|
|137|Yamada|22|male|
|236|Takahashi|34|female|
|367|Ueda|28|male|
|445|Matsumoto|39|male|
|892|Oikawa|67|female|
|647|Watanabe|20|female|

逆に今度は追加した性別カラムを削除してみましょう。その場合はDROPカラムを使用してカラムを指定し削除します。

```SQL:データの変更
ALTER TABLE member
DROP COLUMN sex;
```
このクエリを実行すると、指定したカラムを削除できます。基本的に作成したテーブルを後で編集する場合にはALTER TABLEで編集したいテーブルを指定し、目的に合わせてADDやDROPを使用する形となります。この他にも少し特殊な書き方をする例もあるので、そちらも順次書き加えていきたいと思います。
</dd>
<dl>
<dt>DMLの書き方</dt>
<dd>
さて、テーブルのいじり方が分かったところで、次はおそらく最も使われているであろうDMLの書き方について説明していきます。DMLは主にSELECT文やINSERT文、UPDATE文やDELETE文などが存在します。INSERTは例をすでに示しているので、残りの3つについて説明します。
<dl>
***

まずは「SELECT」です。SQLの中で最も使用頻度が高いものになります。おそらくクエリを実際に見たほうが早く理解できると思うので、さっそく例を挙げていきます。

```SQL:データの取得
SELECT
    *
from
    [データベース名].member
```
このクエリを実行すると、先ほどのmemberテーブルの全レコード(テーブルに入ったデータのこと。1行で1レコード)を取得することが出来ます。環境によってはfrom句でテーブル名の前にデータベース名を入力する必要があるので注意してください。
その他にもレコードが何件あるかを数える、カラムを別名に変更する、重複したレコードを除外して取得するなどの指定をすることが出来ますので、簡単にまとめておきます。
```SQL:いろんな書き方
SELECT
    distinct ID,   --IDカラム内の重複レコードを除外する
    count(name),   --nameカラムが何件あるかをカウントする
    age as AGE     --ageカラムをAGEカラムにラベルを変更する
from
    [データベース名].member;
```

<dl>
***

SELECTの次は「UPDATE」です。UPDATEはレコードの値を変更する場合に使用されます。例として、memberテーブルのname = 'Matsumoto'、age = 39のレコードを、name = 'Yamagishi'、age = 42に変更したい時には以下のように書きます。

```SQL:レコードの変更
UPDATE member
SET name = 'Yamagishi',
    age = 42
where
    ID = 445;
```
このクエリを実行すると、where句で指定したID = 445のレコードに対して、nameとageの値を変更できます。また、SELECTやDELETEにも共通していますが、where句を使用することで手を加えたいレコードを自由に指定することが出来ます。
| ID | name | age |sex|
|:---|-----:|:---:|:----:|
|137|Yamada|22|male|
|236|Takahashi|34|female|
|367|Ueda|28|male|
|445|**Yamagishi**|**42**|male|
|892|Oikawa|67|female|
|647|Watanabe|20|female|

<dl>
***

最後は「DELETE」です。DELETEは文字通りレコードを削除する際に使用します。試しに先ほど変更したID = 445のレコードを削除してみましょうか。
```SQL:レコードの削除
DELETE
FROM member
WHERE
    ID = 445;
```
このクエリを実行すると、ID = 445のレコードをカラム関係なく削除します。1行まるごと消えるイメージですね。
| ID | name | age |sex|
|:---|-----:|:---:|:----:|
|137|Yamada|22|male|
|236|Takahashi|34|female|
|367|Ueda|28|male|
|892|Oikawa|67|female|
|647|Watanabe|20|female|
</dd>

<dt>where句の使い方</dt>
<dd>
結構重要なので、ここでwhere句の使い方について少し触れようと思います。where句はレコードを抽出したり変更したりする際に、対象を絞り込むために使用されます。ID = 445のように数値が一致するレコードを指定したり、逆に ID <> 445と書いて445以外のIDを持つレコードを抽出することもできます。簡単ですが条件の種類を一覧にしたのでぜひ目を通してみてください。

```SQL:where句の種類
SELECT
    *
from
    member
where
    ID = 445   --一致するレコード
    ID <> 445  --非一致のレコード
    age >= 30  --以上,以下,未満の指定
    sex = 'male' and age >= 20  --AかつB
    (name = 'Oikawa' or name = 'Takahashi')  --AもしくはB
    name like 'Taka%'  --%で部分一致検索(この場合はnameがTakaから始まるレコード)
    name in ('Oikawa','Takahashi')  --いずれかの値に一致
    name not in ('Oikawa','Takahashi')  --いずれかに一致しない
    age between 25 and 35  --AからBのレコード
    ID is not null  --null以外に一致するレコード
    AND age is null  --nullに一致するレコード
```
:::note warn
注意
where句で複数の条件を指定する場合には、2つ目の条件以降は最初に**AND**が必要になります。（is nullの項目のような書き方です）SELECTやUPDATEのような「,」で区切ることはできないので注意してください。
:::
</dd>

# あとがき
とりあえず基礎的なSQLの知識と書き方について説明してきました。ですがまだこのメモは作成途中なので、今後より高度なSQLの書き方であったり実際に私が業務の中で使用したSQLについてもまとめて共有できればと思っています。