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

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)

タイトルとURLをコピーしました
Close Bitnami banner
Bitnami