- 比較演算子: =、<、>、<=、>=、<>
- 論理演算子: AND、OR、NOT
- BETWEEN 演算子による範囲検索
- IN 演算子による複数値の検索
- IS NULL 演算子による NULL 値の検索
- LIKE 演算子による文字列検索
比較演算子: =、<、>、<=、>=、<>
WHERE 句の条件式では、次の 6 つの比較演算子を利用することができます。
Let's Try
論理演算子: AND、OR、NOT
WHERE 句では、複数の条件式を利用する場合には、「AND」や「OR」、「NOT」などの論理演算
子を利用する必要があります。
Let's Try
- まずは、次のように「AND」を利用して、“給与が 50 万円以上で" かつ "入社日が
1997/04/01 以降” の社員を検索してみましょう。
両方の条件を満たしているデータのみを取得できたことを確認できます。次に、「OR」を利用して、“給与が 50 万円以上” または ”入社日が 1997/04/01 以降” の
社員を検索してみましょう。
今度はどちらかの条件を満たしているデータのみを取得できたことを確認できます。このように、WHERE 句では、「AND」や「OR」を利用して複数の条件を指定できるようになります。
Note: AND と OR の優先順位
AND と OR が両方使われた場合は、どちらが優先されると思いますか? 次の結果を見てみましょう。
”入社日が 1997/04/01 以降、かつ社員番号が 1 “ の条件(AND)が先に処理され、その後に “または、給与
が50 万以上” の条件(OR)が処理されていることを確認できます。このように、AND と OR がある場合は、
AND が優先されます。
■ OR を優先させたい場合
AND と OR がある場合に、OR を優先させたい場合は、次のように、その条件をカッコで囲むようにします。
このように OR を含む条件をカッコで囲むことで、その条件を先に処理できるようになります。また、カッコは、OR だけでなく、先に処理させたい条件を囲むために利用できるので、覚えておくと役立ちます。
BETWEEN 演算子による範囲検索
SQL では、BETWEEN 演算子を利用すると、“~以上 ~以下” という条件を簡単に記述できるよ
うになります。構文は、次のとおりです。
SELECT 列名1, 列名2, … |
Let's Try
- 次のように入力して、“給与が 50 万円以上~ 70 万円以下の社員” を検索してみましょう。
給与が 50 万円以上で、かつ 70 万円以下の社員を取得できたことを確認できます。
この BETWEEN 演算子と同じ結果は、次のように論理演算子「AND」を利用して、取得す
ることもできます。
IN 演算子による複数値の検索
SQL では、IN 演算子を利用すると、“A または B または C” というように、"複数の値を指定し
た条件" を簡単に記述できるようになります。構文は、次のとおりです。
SELECT 列名1, 列名2, … |
Let's Try
- 次のように入力して、“給与が 30 万円または 70 万円” の社員を検索してみましょう。
給与が 30 万円または 70 万円の社員を取得できたことを確認できます。
この IN 演算子と同じ結果は、論理演算子「OR」を利用して、次のように取得することもで
きます。
- 次に、IN 演算子を利用して、"山田 一郎" さんと "鈴木 太郎" さんを検索してみましょう。
IS NULL 演算子による NULL 値の検索
NULL 値は、Step 4 で説明しますが、”0” でもスペース(空白)でもない特殊な値なので、比較
演算子やの「=」や「>」などを利用して検索することはできません。NULL 値を検索したい場合
には、「IS NULL」演算子を使用する必要があります。
Let's Try
- 次のように入力して、“給与が NULL 値の社員” を検索してみましょう。
このように、NULL 値を検索したい場合は、IS NULL 演算子を利用するようにします。
Note: 複数条件指定時の NULL の検索
NULL 値は、前述の「IN」演算子の中では利用することができません。「IN」演算子を利用する場合は、別途条件
式を記述する必要があります。たとえば、“給与が30 万円または70 万円または NULL” のデータを検索したい場
合は、次のように記述しなければなりません。
LIKE 演算子による文字列検索
SQL では、LIKE 演算子を利用すると、文字データをワイルドカード検索できるようになります。
ワイルドカードには、「%」と「_」があり、それぞれ次のように利用できます。
- % は、“0 文字以上の任意の文字列”
- _ は、”任意の1 文字”
Let's Try
- まずは、LIKE 演算子で % を利用して、「氏名」が「田」で始まる社員を検索してみましょ
う。
このように、“田%” のように最後に「%」をつければ、先頭が ”田” で始まる社員を検索する
ことができます。 - 次に、氏名に「田」というキーワード(文字)を含んだ社員を検索してみましょう。
このように、最後の「%」に加えて、先頭にも「%」を指定すれば、特定のキーワードを含
んだ文字データを検索できるようになります。 - 次に、"氏名に「田」または「郎」を含む社員" を検索してみましょう。
このように、OR 演算子を利用して、複数の LIKE 条件を指定すれば、複数のキーワードを
含んだデータを検索できるようになります。
Note: キーワード検索はパフォーマンスが悪いことに注意
先頭に % を指定したキーワード検索は、インデックスを利用したピンポイント検索が行われず、全件検索が実行されてしまうので、非常にパフォーマンスが悪くなります(特にデータ量が多い場合は、非常に低速になります)。
また、OR 演算子を利用して、複数のキーワードを指定した場合は、さらに低速になります(2 個のキーワードなら 2 倍、3 個なら 3 倍へと、実行時間が長くなっていきます)。
したがって、キーワード検索は、なるべく避けるようにし、複数のキーワード検索もできる限り避けるように、アプリケーションのインターフェースを工夫することをお勧めします。また、それらの検索実行には、実行時間が長くかかることをアプリケーションへ明記することにより、ユーザーに簡単に実行されないような工夫をしておくことも重要です。なお、インデックスについては、本自習書シリーズの「インデックスの基礎とメンテナンス」で詳しく説明していますので、こちらもぜひご覧いただければと思います。
Note: 「%」や「_」が入った文字を LIKE で検索するには
「果汁100%ジュース」という商品データがある場合に、これを “100%” というキーワードで検索したい場合があるとします。しかし、「%」はワイルドカード文字なので “100%” をそのまま使った場合は、”100 個”や ”1000 台” などの商品データも検索対象になってしまいます。そこで、「%」をワイルドカードとしてではなく、検索文字の一部として利用する方法があります。これは、次のように ESCAPE 句を使用します。
SELECT * FROM 商品 WHERE 商品名 LIKE '果汁100\%%' ESCAPE '\'「ESCAPE '\'」と記述すると、”\ マークがあった場合に、次の文字をワイルドカードとはみなさない” とすることができます。したがって、「100\%」と記述すれば「100%」という文字を検索キーワードにすることができます。また、「100\%%」の最後の % は、ワイルドカード文字なので、”100%ジュース” や ”100%オレンジ”などを検索できるようになります。
なお、\ マークは、「エスケープ文字」とも呼ばれます(\ マーク以外をエスケープ文字にすることもできますが、一般的には \ マークを利用します)。エスケープ(escape)は「逃げる、避ける」という意味の英単語なので、エスケープ文字は「ワイルドカードになるのを避ける(例外にする)」という意味です。
0 件のコメント:
コメントを投稿