2013年4月1日月曜日

◆WHERE 句で利用できる演算子

比較演算子: =、<、>、<=、>=、<>

WHERE 句の条件式では、次の 6 つの比較演算子を利用することができます。

image

Let's Try
  1. まずは、「<」を利用して、“給与が 50 万円よりも少ない社員” を検索してみましょう。
    image
  2. 次に、「>=」を利用して、“給与が 50 万円以上の社員” を検索してみましょう。
    image
論理演算子: AND、OR、NOT

WHERE 句では、複数の条件式を利用する場合には、「AND」や「OR」、「NOT」などの論理演算
子を利用する必要があります。

image

Let's Try
  1. まずは、次のように「AND」を利用して、“給与が 50 万円以上で" かつ "入社日が
    1997/04/01 以降” の社員を検索してみましょう。
    image
    両方の条件を満たしているデータのみを取得できたことを確認できます。

    次に、「OR」を利用して、“給与が 50 万円以上” または ”入社日が 1997/04/01 以降” の
    社員を検索してみましょう。
    image
    今度はどちらかの条件を満たしているデータのみを取得できたことを確認できます。このように、WHERE 句では、「AND」や「OR」を利用して複数の条件を指定できるようになります。

Note: AND と OR の優先順位
AND と OR が両方使われた場合は、どちらが優先されると思いますか? 次の結果を見てみましょう。
image

”入社日が 1997/04/01 以降、かつ社員番号が 1 “ の条件(AND)が先に処理され、その後に “または、給与
が50 万以上” の条件(OR)が処理されていることを確認できます。このように、AND と OR がある場合は、
AND が優先されます。
■ OR を優先させたい場合
AND と OR がある場合に、OR を優先させたい場合は、次のように、その条件をカッコで囲むようにします。

image

このように OR を含む条件をカッコで囲むことで、その条件を先に処理できるようになります。また、カッコは、OR だけでなく、先に処理させたい条件を囲むために利用できるので、覚えておくと役立ちます。

BETWEEN 演算子による範囲検索

SQL では、BETWEEN 演算子を利用すると、“~以上 ~以下” という条件を簡単に記述できるよ
うになります。構文は、次のとおりです。

SELECT 列名1, 列名2, …
FROM テーブル名
WHERE 列名 BETWEEN 値1 AND 値2

Let's Try
  1. 次のように入力して、“給与が 50 万円以上~ 70 万円以下の社員” を検索してみましょう。
    image
    給与が 50 万円以上で、かつ 70 万円以下の社員を取得できたことを確認できます。
    この BETWEEN 演算子と同じ結果は、次のように論理演算子「AND」を利用して、取得す
    ることもできます。
    image
IN 演算子による複数値の検索

SQL では、IN 演算子を利用すると、“A または B または C” というように、"複数の値を指定し
た条件" を簡単に記述できるようになります。構文は、次のとおりです。

SELECT 列名1, 列名2, …
FROM テーブル名
WHERE 列名 IN (値1, 値2, 値3, …)

Let's Try
  1. 次のように入力して、“給与が 30 万円または 70 万円” の社員を検索してみましょう。
    image
    給与が 30 万円または 70 万円の社員を取得できたことを確認できます。
    この IN 演算子と同じ結果は、論理演算子「OR」を利用して、次のように取得することもで
    きます。
    image
  2. 次に、IN 演算子を利用して、"山田 一郎" さんと "鈴木 太郎" さんを検索してみましょう。
    image
IS NULL 演算子による NULL 値の検索

NULL 値は、Step 4 で説明しますが、”0” でもスペース(空白)でもない特殊な値なので、比較
演算子やの「=」や「>」などを利用して検索することはできません。NULL 値を検索したい場合
には、「IS NULL」演算子を使用する必要があります。

Let's Try
  1. 次のように入力して、“給与が NULL 値の社員” を検索してみましょう。
    image
    このように、NULL 値を検索したい場合は、IS NULL 演算子を利用するようにします。

    Note: 複数条件指定時の NULL の検索
    NULL 値は、前述の「IN」演算子の中では利用することができません。「IN」演算子を利用する場合は、別途条件
    式を記述する必要があります。たとえば、“給与が30 万円または70 万円または NULL” のデータを検索したい場
    合は、次のように記述しなければなりません。
    image
LIKE 演算子による文字列検索

SQL では、LIKE 演算子を利用すると、文字データをワイルドカード検索できるようになります。
ワイルドカードには、「%」と「_」があり、それぞれ次のように利用できます。

  •  % は、“0 文字以上の任意の文字列”
  •  _ は、”任意の1 文字”
Let's Try
  1. まずは、LIKE 演算子で % を利用して、「氏名」が「田」で始まる社員を検索してみましょ
    う。
    image
    このように、“田%” のように最後に「%」をつければ、先頭が ”田” で始まる社員を検索する
    ことができます。
  2. 次に、氏名に「田」というキーワード(文字)を含んだ社員を検索してみましょう。
    image
    このように、最後の「%」に加えて、先頭にも「%」を指定すれば、特定のキーワードを含
    んだ文字データを検索できるようになります。
  3. 次に、"氏名に「田」または「郎」を含む社員" を検索してみましょう。
    image
    このように、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)は「逃げる、避ける」という意味の英単語なので、エスケープ文字は「ワイルドカードになるのを避ける(例外にする)」という意味です。

_(任意の 1 文字)の利用
  1. 次に、ワイルド カードの「_」を利用して、"氏名の 2 番目の文字が「田」の社員" を検索し
    てみましょう。
    image
    このように、_ は、任意の1 文字のワイルド カードとして利用することができます。

0 件のコメント:

コメントを投稿