『IT未経験者が押さえておきたいSQL』(postgre編)

# はじめに
タグにおあるようにこれからIT業界を目指す人や、SQLを初めて使うような初心者向けの内容も含まれておりますので、上記内容を納得し時間のある方または少しでも情報を入手したい方は是非ご一読いただけたらなと思います。

今回の題材はIT未経験者がデータベース関連の会社に挑戦する際
覚えておくと良いSQLについてお話ししたいと思います。
私自身IT未経験でこの業界に参入したため、
右も左もわからないまま毎日が新しいことを学ぶ場となっておりました。

しかし会社に所属しお客様を相手にした時点で、プロの意識をもって働かなければならないと思いますし、自分自身も世間に出て恥ずかしい思いをしたくはないとも考えていました。
そのため案件でSQL開発を行うと知った後は毎日SQLの参考書を読んだり
Ping-tを活用し学習をしておりました。

前置きが長くなりましたが、この後案件にアサインされSQLの開発を進めていくなかで
感じたとりあえず押さえておきたいSQLについてお話していきたいと思います。



## そもそもSQLとは
webで検索すると色々な意味が出てきますが、私自身納得したというかわかりやすかったなーと思った記事が下記リンクにあります。
その記事でSQLは、

:::note 
SQLという言語を使った、データベースさんに対する「おい！これやれよ」な命令文のことです。
:::
と記載があり簡潔で分かりやすい説明だと思いました。
下記リンクは【「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典】というサイトで、よくお世話になっています:smile:


https://wa3.i-3-i.info/index.html


## 早速押さえておきたいSQLについて紹介します
:::note warn
下記で使用するデータは全てテストデータです。
:::
下記のデータテーブルを【給与詳細テーブル】とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528749/8da82700-ae95-c05f-9b70-52e03394cd9d.png)

### create table 文(DDL)
まず抑えたいのはデータを入れるための箱(テーブル)を作成します。
テーブルを作成するQueryがこちら↓
```sql
CREATE TABLE IF NOT EXISTS A
(
 "社員番号" VARCHAR (20) NOT NULL
,"氏名" VARCHAR (30) NULL
,"支給総額" numeric NULL
)
```
↓Aテーブルの完成です。
※この時まだデータは入っておりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528749/58605901-a0eb-665f-efaa-8aa6a0ad7a2f.png)

		

create table 文の基本は複数の列を作成することができ、必要な分だけ記載します。
列指定の基本は列名と型の2つです。その他テーブルに制約を設定することができます。
今回はNOT NULL制約について取り上げます。
上記テーブルはAという名前で、
社員番号,氏名,支給総額という3つの列が作成されます。
そしてNULLとNOT NULLが出てきますが、ここがNOT NULL制約の設定になります。なにも記載がない場合(省略した場合は)NULLを許す設定になります。

※上記制約に違反したデータは受け入れられなくなるため制約の設定には注意が必要です。
上記のQuery(create table 文)はデータ定義命令(DDL)といい、データベース内のオブジェクトの作成、その他には削除、更新するQueryも存在します。
今回はcreate table 文の説明のみにします。

:::note alert
一列ごとに,(カンマ)を忘れないように注意しましょう。
またSQLは書く人によって書き方が全く異なります。
私はエラーが出た際見やすくするために上記の通り先頭にカンマを置きます。
:::
少し話がずれますが、カンマの位置を先頭に置くにも理由があります。
それは当時私が膨大な量のSQLをやっとの思いで作り上げいざ実行したら、次のようなエラーが出てきました。
```sql
syntax error at or near
```
上記は構文エラーの際に出てきます。
短いSQLでエラーを見つけることは慣れてくればすぐに対応できると思います。
しかし500行または1000行を超えるQueryを作成して上記のようにエラーが出たらこの世の終わりを意味します:scream:www
大げさに言いましたが本当に苦労するので、予防策を自分自身の中でいくつも作っておくと良いでしょう。
このような単純な構文エラーを防ぐための1予防策としてカンマを先頭に置くということ皆様も覚えておくとこの先役に立つかと思います！


次にselect句を紹介します。
### select句 
今度はデータテーブルから格納データを抽出する際に用いられるQueryの紹介です。
それがselect句です。
例えば↓
```sql
select
 "社員番号"
,"氏名"
,"給料"
,"ボーナス"
from "給与詳細テーブル"
```
:::note alert
create 文同様、一列ごとに,(カンマ)を忘れないように注意しましょう。
※最後の一列には不要です。
:::

上記で抽出できるデータは以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528749/a04bb009-b97c-434e-7c81-a2a55c086d51.png)

もう一例です。
今回上記で作成したAというテーブルを抽出先にした際、必要になるデータを出すselect句を作成します。↓

```sql
select
"社員番号",
"氏名",
"給料" + "ボーナス" as "支給総額"
from 給与詳細テーブル
```
上記で抽出できるデータは以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528749/a3c3580b-d855-bb3f-3a7d-47de6ab9f656.png)



ここでは社員の総支給額を抽出したいので
給与の列とボーナスの列を加算します。

その他の計算記号は下記になります。
また計算順序は基本一般的な順序のもと行われますが、
正確に分割して計算をする場合は()カッコで囲んで行うことを推奨します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528749/5aa35755-91c6-0fab-b7ea-8d6dc178f851.png)

※補足
列別名を付ける as(省略可)
```sql
"給料" + "ボーナス" as "支給総額"
```



次にwhere句の紹介です。

### where句
義務教育を受けてきた皆様なら英語のwhere(どこ)を一度でも耳にしたことはあると思います。
SQLで使用する際は行の条件を記入することで、その条件に合致した行のみを抽出することができます。

```sql
select
 "社員番号"
,"氏名"
,"給料"
,"ボーナス"
from 給与詳細テーブル
where "給料" = 300000
```

上記で抽出できるデータは以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528749/270937cf-869e-a1c0-f3a9-0bf3819bc3f4.png)

上記where句では項目"給料"が300000のデータのみ抽出するという条件になります。

他にも< , <= , > , >=などがあり下記は
```sql
select
 "社員番号"
,"氏名"
,"給料"
,"ボーナス"
from 給与詳細テーブル
where "給料" < 300000
```
項目"給料"が300000以下データのみ抽出するという条件になります。

次に上記で作成したテーブルAに、総支給額を作成したデータを追加します。
その際に活用するのがinsert文です。

### insert

insert文にも作成方法は沢山ありますが、私がよく利用する一例をご紹介します。
```sql
insert into A
(
select
"社員番号",
"氏名",
"給料" + "ボーナス" as "支給総額"
from "給与詳細テーブル"
);
```
上記で抽出できるデータは以下になり、空っぽだったAテーブルに追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528749/73464502-39f6-327e-8632-a9f5a049b406.png)

上記で作成したinsert文は、selectで得た結果をそのままテーブルに追加ができるためとてもよくつかわれる手法となります。

:::note alert
insertするテーブルとselectの列数が同じである必要があります。
:::
これで必要な総支給額を含む社員情報テーブル"A"の完成です:ok_hand:
今回はPostgre環境でのSQL開発を説明させていただきました。
SQLを開発していく中で注意しておくべきことは、利用するツールごとに多少ルールが異なり利用できる関数、できない関数があるということです。
詳しい情報はツールごとに使える使えないが記載されている、Pocket Reference SQLという教材にこれらの情報が記載されていますのでオススメです。

https://gihyo.jp/book/2017/978-4-7741-8732-7


## 最後に

これまでテーブルの作成、データの抽出(限定)、テーブルへデータの追加について話しましたがとりあえずこの3点を抑えておけば簡単な定義のデータ作成は十分作成可能かと思います。
文系だからとかタイピングは苦手だからなどという障壁を壊しぜひ未経験の方々もIT業界への参入を目指してみてはいかがでしょうか。
誰しも最初から完璧な作業ができるわけではありません。予習、練習、実践、復習を連続して行うことで知識の定着、自信をつけていくことができると私は思います。

今回記載した情報は初歩の初歩のものになりますが、この記事を見てSQLやデータベース関連にご興味を持った方は是非チャレンジしてみてください:hugging:


## 参考

https://wa3.i-3-i.info/word15078.html

https://gihyo.jp/book/2017/978-4-7741-8732-7

-------------------------------------------------
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area