SQL文のカスタマイズで押さえておきたいポイント、及びSQLの小技集

新卒1、2年目又はIT業界1、2年目向けに投稿。


・目次
・はじめに
・SQLとは
・カスタマイズ時に抑えたいポイント
・まとめ


# はじめに 
PGをする際、SQL文のカスタマイズする事があると思うが、その際に押さえておきたいポイントが
幾つかあるので、ここにその内容を記載していきます。

# SQLとは  （初学者以外の方はスキップ推奨）
SQLとは「Structured Query Language（ストラクチャード・クエリ・ランゲージ）」の略で
データベースを操作するための言語です。データベースにデータを挿入したり、検索したりする際に
使用します。データベースのなかには、数万・数百万件ものデータが保存されているが、
このSQLを使うことで効率的に操作をすることが可能になります。

※DBって何？という方は下記のURLを参照
https://www.sejuku.net/blog/8763

SQLの種類は基本的には下記4種類あり、今回はこのSQL文をカスタマイズする際の
ポイントの話です。

■検索（SELECT）

```sql:
select 項目1, 項目2 from テーブル1 where 項目3='条件1';
```

■登録（INSERT）

```sql:
insert into テーブル1 (項目1, 項目2) values('値1', '値2');
```

■更新（UPDATE）

```sql:
update テーブル1 set 項目1 = '値1', 項目2 = '値2' where 項目3='条件1';
```

■削除（DELETE）

```sql:
delete from テーブル1 where 項目3='条件1';
```

# カスタマイズ時に抑えたいポイント、及びSQLの小技

##①インデントを正しく効果的に使う
インデントとは、行の先頭にTabキーやスペースキーで空白を挿入して「字下げ」を行うことです。
これを行うことで読みやすいし、メンテもしやすくなります。

悪い例

```sql:
select
item.id, item.name, itemprice.price
from
item
left outer join itemprice on  item.id = itemprice.item_id
where
(itemprice.price > 100
or
itemprice.price < 200)
order by item.id
```

上記のSQL、一発で解読できるでしょうか?
できるのであれば、この部分は省略して大丈夫です。

### 問題点 

####SQLの構造がわからない
　　1.SELECT句, FROM句, WHERE句
　　2.FROM句内のテーブル構造
　　3.AND,ORの条件
　　
インデントを行い、SQLを見やすくします。

良い例

```sql:
select
    item.id, item.name, itemprice.price
from
    item
    left outer join itemprice 
    on item.id = itemprice.item_id
where
    (itemprice.price > 100 or itemprice.price < 200)
order by 
    item.id
```
いかがでしょうか？好みによって多少変わるでしょうが、先程と比べると随分と見やすくなった
と思います。

##②WHERE句の検索項目の値の位置を統一する
①と似た話にはなりますが、WHERE句の項目名の値の位置も統一するに越したことはありません。

悪い例

```sql:
select
    id,
    name,
    category_id
from
    item
where
    id = '1'
    name = 'テスト商品'
    category_id = 'カテゴリ1'
```
いかがでしょうか？ 項目名の値の位置がズレているので見づらくはないでしょうか？
細かい所ではありますがこの辺りも統一した方が良いです。

良い例

```sql:
select
    id,
    name,
    category_id
from
    item
where
    id          = '1'
    name        = 'テスト商品'
    category_id = 'カテゴリ1'
```

上記①、②については「こんなこと」、と思うかもしれません。
しかし、正常な動作を実現する為、正確にレビューを受ける為
他の人に引き継ぐときに困らない為には必要な事だと思います。

##③SELECT句の,を入れる場所は、項目の前に入れる
SELECTのカンマを入れる時には項目の前に入れますでしょうか？
それとも項目の後に入れますでしょうか？
これは人それぞれ意見が分かれる所があると思うのですが**カンマは項目の前に入れた方が良いです。**

**後ろにカンマを入れた場合**

```sql:
select
   id
  ,name
from
```

**前にカンマを入れた場合**

```sql:
select
   id
  ,name
from
```

カスタマイズで以下のような変更をする時に影響します

・新しい項目の追加
・項目の削除
・コメントアウト
上記の修正は、カスタマイズ時に項目の最後を変更することが多いです。
カンマを前に入れると一行のみの変更ですみます。
カンマを後にすると２行の修正が必要です。

そういった理由で、カンマは前に入れた方が良いです。

**価格を追加する場合**

```sql:
select
   id
  ,name
  ,price
from
```

```sql:
select
   id,
   name,
   price
from
```

**名前を削除する場合**


select
    id
    ~~,name~~
from




select
   id~~,~~
   ~~,name~~
from


**コメントアウトする場合**

```sql:
select
   id
  --,name
from
```

```sql:
select
   id--,
   --name
from
```

##④特定の項目を前に表示したいときの小技
極稀ではあるが、エラーの調査などをする時に**後ろの方にある項目を前に表示したい**
という事があると思います。
例えば、商品(ITEM)テーブルの情報を出して、それぞれの価格のデータを調査していたとします。

```sql:
select
   *
from item it
```
商品名の項目は左にあり、価格がずっと右にあったとします。
これは調べにくいですよね。
どの商品が何円なのかを見るのに横にスクロールしないとみれなくってしまいます。

通常このようにSQLを書き直します。

```sql:
select
   it.name
  ,it.price
from item it
```

これで２つの項目を見比べることができます。
ですが、このような方法を使わずとも、テーブル名.*を使う事で、すべての項目を出したまま、項目を追加できます。

```sql:
select
   it.price
  ,it.*
from item it
```

エラーの調査等をする時にぜひお使いください。

##⑤WHERE句には 1=1を追加した方が良い
SQLをカスタマイズしている時、WHERE句に**1=1**と入っていることがあります。
経歴が浅い方は**これは何で入っているのだろう**と思った事があると思います。
「WHERE 1=1」とは**必ず正である**という意味です。
何があっても通りますので、正直1=1自体に意味はないのですが、
大事なのは、この記述でWHERE句を確定させられることにあります。

カスタマイズで抽出条件を変える時に便利です。

```sql:
where 1 = 1
    and 名前 = 'テスト商品'
    and 価格 = '1000'
```

というSQLで、商品名の検索条件を外すカスタマイズの場合
このようにコメントアウトを追加するだけでOKになります。

```sql:
where 1 = 1
    --and 名前 = 'テスト商品'
    and 価格 = '1000'
```

ですのでカスタマイズの時、下のように書くより簡単にできます。

```sql:
where 名前 = 'テスト商品'
    and 価格 = '1000'
```

## まとめ、次回予告
・SQLとはデータベースにデータを挿入したり、検索したりする際に使用します。
・インデントは正しく、カンマの位置にも気をつけてカスタマイズをしよう。
・次回はPostgresqlを使用する時に押さえておきたいポイントを紹介します。