Categories: sql

INの使い方 – わかりやすい実務で使えるSQL

実践で使えるSQL講座です
20年の実務経験を元に、机上でなく実践で役立つ知識を紹介します

要点 INの使い方

複数条件を検索できます

抽出項目 IN(抽出語句1,抽出語句2,抽出語句3)

これは次のSQLと同じ意味です

  抽出項目 = 抽出語句1
OR 抽出項目 = 抽出語句2
OR 抽出項目 = 抽出語句3

解説

ORがあるのになぜINがあるのでしょうか?
それはシンプルにわかりやすく書けるからです。
わかりやすく書くのはプログラムで一番重要です。

  • 間違いが減る
  • 短い時間で理解できる

というメリットがあります。
あなたや他の人は何十回もプログラムを見ることになります。
見返すときにこのINのところがたった1秒の違いでも、
1,000行のコードですと
 1,000行×10回×1秒 = 167分
と167分の違いがでます。
この計算は大げさですが、重要なことです。

INを使って書ける時はORでなくINを使いましょう。

注意点 実務でのあるある

ORはプログラムが読みにくくなります

‘XYZ会社’の2,000円以上の受注金額のデータを出すSQLがあります。

SELECT
*
FROM 受注
WHERE 顧客名 = 'XYZ会社'
  AND 受注金額 >= 2,000

あなたは’YYY会社’も追加してと修正依頼をうけて、
このように変更しました

SELECT
*
FROM 受注
WHERE 顧客名 = 'XYZ会社' OR 顧客名 = 'YYY会社'
  AND 受注金額 >= 2,000

一見よさそうに見えますが、やってしまいました。
改行をかえればわかるとすぐわかると思いますが、
この意味となります。

   顧客名 = 'XYZ会社'
OR 顧客名 = 'YYY会社' AND 受注金額 = 2,000

というのもANDはORより優先されるからです。
ANDはORより優先というのは私も初めて知りました。
というのも間違いやすいSQLは書かないようにするからです。

ORを使って正しく書くとこうなります。

    (顧客名 = 'XYZ会社' OR 顧客名 = 'YYY会社')
  AND 受注金額 >= 2,000

ですが、ORは使わないと自分に制約をかけるのが一番です。
最終的にはこのように書けます

      顧客名 IN('XYZ会社','YYY会社')
  AND 受注金額 >= 2,000

INの応用的な使い方

INは固定の語句を入れるだけでなく、
SQL文も使えます。
専門用語でサブクエリと呼びます。
これは特別な場合にしか使わないので推奨しません。
ですが、どういった時に使えるかを書きましたので、
参考にしてください。

顧客の国が日本の受注データだけ抽出するとします。

サブクエリを使わない方法

Step1 顧客テーブルから日本のデータを抽出

SELECT
  顧客名
FROM 顧客マスタ
WHERE 国 = '日本'
顧客名
ABC会社日本
XYZ会社アメリカ
YYY会社日本
ZZZ会社アメリカ

Step2 受注テーブルから顧客名で抽出

 Step1の結果を手でIN句に追加する

SELECT
*
FROM 受注
WHERE 顧客名 IN('ABC会社','YYY会社')

サブクエリを使う方法

Step1のSQLをそのままINの中に書けます。
このSQLは上記と同じ結果となります。

SELECT
*
FROM 受注
WHERE 顧客名 IN(
 SELECT
  顧客名
 FROM 顧客マスタ
 WHERE 国 = '日本'
)

推奨の書き方

LEFT JOINを使用してください

SELECT
*
FROM 受注
LEFT JOIN 顧客マスタ
  ON 受注.顧客名 = 顧客マスタ.顧客名
WHERE 顧客マスタ.国 = '日本'

INのサブクエリを使う例

ではLEFT句で書くのを推奨するのに、
なぜINのサブクエリを紹介したのでしょうか?

使う理由はこちらです

  • FROM句を変更するとリスクが大きい
    • DB設計が信用できない。
      顧客名が顧客マスタに2件存在したら、
      データが2重に出てしまいます。
    • FROM句が複雑すぎで変更したくない場合
  • 利用者が権限上WHERE句しか変更できない
    • FROMの変更は危険性が高いので、
      変更の許可をしないことは実用上よくあります。
  • パフォーマンス劣化の心配
  • プログラムが読みにくくなる
    • 上記の2つですが、
      レポートの場合抽出条件の追加依頼が多いです。
      使用頻度が低い抽出条件のために
      FROM句を変えたくない場合に使います。
よくあるトラブル

一番多いのはユーザが開発者に、
ユーザが指定できる抽出条件の追加を依頼した時です。

その抽出条件を使った時に間違った情報が出る分には、
大きなトラブルにならないです。
というのも新しく追加した抽出条件と知って使っているからです。

ですが新しい抽出条件を使っていないのに、
データが2重に出てしまったとします。
すると間違ったデータに気が付かなくてトラブルになりやすいです。

SQLを知っているあなたでしたら、
なぜそういったことが起きるのかを理解できます。
ですが抽出条件を追加したのに、
データが増えたという事はユーザは理解できないです。
いったい何を変更したんだ?
といった不信感が発生してしまいます。
ですのでFROM句の変更には注意が必要です

まとめ

複数条件の抽出条件はこのように書けます

抽出項目 IN(抽出語句1,抽出語句2,抽出語句3)

Katahira

Share
Published by
Katahira

Recent Posts

トランザクションテーブルの特徴を知ろう

この記事で解決できる疑問 トラ…

2年 ago

マスタテーブルの設計で注意すべき3点を紹介

この記事で解決できる疑問 マス…

2年 ago

Power BI道場 コンテンツ紹介

ここでは筆者が提供しているPo…

2年 ago

Power BI道場 ヒストグラムの作成。知っていれば簡単!!

この記事で解決できる疑問 ヒス…

2年 ago
Close Bitnami banner
Bitnami