実践で使える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句が複雑すぎで変更したくない場合
- DB設計が信用できない。
- 利用者が権限上WHERE句しか変更できない
- FROMの変更は危険性が高いので、
変更の許可をしないことは実用上よくあります。
- FROMの変更は危険性が高いので、
- パフォーマンス劣化の心配
- プログラムが読みにくくなる
- 上記の2つですが、
レポートの場合抽出条件の追加依頼が多いです。
使用頻度が低い抽出条件のために
FROM句を変えたくない場合に使います。
- 上記の2つですが、
まとめ
複数条件の抽出条件はこのように書けます
抽出項目 IN(抽出語句1,抽出語句2,抽出語句3)