0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-13

新卒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)

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

■登録(INSERT)

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

■更新(UPDATE)

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

■削除(DELETE)

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

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

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

悪い例

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を見やすくします。

良い例

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句の項目名の値の位置も統一するに越したことはありません。

悪い例

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

いかがでしょうか? 項目名の値の位置がズレているので見づらくはないでしょうか?
細かい所ではありますがこの辺りも統一した方が良いです。

良い例

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

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

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

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

select
   id
  ,name
from

前にカンマを入れた場合

select
   id
  ,name
from

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

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

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

価格を追加する場合

select
   id
  ,name
  ,price
from
select
   id,
   name,
   price
from

名前を削除する場合

select
id
,name
from

select
id~~,~~
,name
from

コメントアウトする場合

select
   id
  --,name
from
select
   id--,
   --name
from

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

select
   *
from item it

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

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

select
   it.name
  ,it.price
from item it

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

select
   it.price
  ,it.*
from item it

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

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

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

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

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

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

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

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

まとめ、次回予告

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?