トップ > SQL入門 > 6章
6章 AND_OR演算子

第5章ではWHERE句を使用した条件式について書いていきました。

WHERE句が使用できるようになると、よりさまざまな条件でデータ取得が可能になります。
ただ、前回は条件が1つの場合の時であり、本章は複数条件での絞込みを紹介していきます。

複数条件を指定したい場合はAND、OR句を使用して複数条件を指定します。

論理演算子
AND 条件1かつ条件2
OR 条件1または条件2

それでは構文を確認していきましょう。

[構文] 複数条件式
 SELECT 列名 , 列名…
 FROM 表名
 WHERE 列名 比較演算子 値
 [ AND | OR ] 列名 比較演算子 値

WHERE句の次に2つめの条件式を指定する際、
ANDもしくはORを指定し、別の条件を指定します。

では実行例を確認してみましょう。

  SQL> SELECT first_name,salary,hire_date
    2  FROM employees
    3  WHERE salary >= 5000000
    4  AND hire_date >= '01-JAN-00';

  FIRST_NAME                         SALARY HIRE_DATE
  ------------------------------ ---------- ---------
  Kataoka                           6500000 01-OCT-00
  Harada                            6200000 01-OCT-00
  Koda                              6400000 01-OCT-00
  Saito                             6700000 01-OCT-00
  Akagi                             6400000 01-MAR-01
  Tao                               5400000 28-JUL-03
  Kaneko                            5400000 22-FEB-01
  Totsuka                           5400000 29-SEP-03
  Kato                              6500000 01-APR-09
  Sinagawa                          6500000 01-APR-09

  10 rows selected.


上記の例はWHERE句で給与が500万という1つ目の条件、2つめの条件はAND句で
入社日が2000/1/1以降となります。

演算子はAND句を使用したので、条件1かつ条件2となります。
つまり年収が500万以上でかつ、入社日が2000/1/1以降という条件となります。

ではORの実行結果も確認してみましょう。

  SQL> SELECT first_name,salary,hire_date
    2  FROM employees
    3  WHERE salary >= 5000000
    4  OR hire_date >= '01-JAN-00';

  FIRST_NAME                         SALARY HIRE_DATE
  ------------------------------ ---------- ---------
  Suzuki                           10000000 07-OCT-92
  Sato                              8000000 11-OCT-92
  Yamamoto                          5000000 11-MAR-95
  Watanabe                          6000000 01-APR-98
  Watanabe                          5500000 14-MAY-98
  Kataoka                           6500000 01-OCT-00
  Harada                            6200000 01-OCT-00
  Koda                              6400000 01-OCT-00
  Saito                             6700000 01-OCT-00
  Akagi                             6400000 01-MAR-01
  Sato                              5400000 01-APR-97
  Tao                               5400000 28-JUL-03
  Kaneko                            5400000 22-FEB-01
  Totsuka                           5400000 29-SEP-03
  Kato                              6500000 01-APR-09
  Sinagawa                          6500000 01-APR-09
  Kuroda                            4000000 01-APR-13
  Nakamura                          4000000 01-APR-13
  Kamata                            4000000 01-APR-13
  Ito                               4000000 01-APR-13

  20 rows selected.


条件は前回と同様です。ORは、又は(または)という意味となります。
なので、条件としては、年収が500万以上、または、
入社日が2000年以降という条件となります。

実行結果の件数からわかるようにORとANDでは条件が違うことが分かりますね。
今回は全従業員が条件に一致したため、全行が表示されました。

では、ここから少し難しくなります。
AND,ORで2つ目の条件を指定することができるようになりました。
それでは、3つ目の条件式を指定する場合はどうするのでしょうか。

ANDもしくはORを追加していきます。

では以下の実行例の条件式はどのような条件となるでしょうか。

  SQL> SELECT first_name,salary,hire_date
    2  FROM employees
    3  WHERE salary >= 5000000
    4  OR hire_date >= '01-JAN-00'
    5  OR first_name LIKE 'S%';

  FIRST_NAME                         SALARY HIRE_DATE
  ------------------------------ ---------- ---------
  Suzuki                           10000000 07-OCT-92
  Sato                              8000000 11-OCT-92
  Yamamoto                          5000000 11-MAR-95
  Watanabe                          6000000 01-APR-98
  Watanabe                          5500000 14-MAY-98
  Kataoka                           6500000 01-OCT-00
  Harada                            6200000 01-OCT-00
  Koda                              6400000 01-OCT-00
  Saito                             6700000 01-OCT-00
  Akagi                             6400000 01-MAR-01
  Sato                              5400000 01-APR-97
  Tao                               5400000 28-JUL-03
  Kaneko                            5400000 22-FEB-01
  Totsuka                           5400000 29-SEP-03
  Kato                              6500000 01-APR-09
  Sinagawa                          6500000 01-APR-09
  Kuroda                            4000000 01-APR-13
  Nakamura                          4000000 01-APR-13
  Kamata                            4000000 01-APR-13
  Ito                               4000000 01-APR-13

  20 rows selected.


この条件は分かりやすいですね。条件は以下の3つとなります。
・年収が500万
・入社日が2000年以降
・first_nameの先頭がSから始まる人

上記3つの条件の1つでも当てはまれば、条件に一致します。

では次の実行例はどうでしょうか。

  SQL> SELECT first_name,salary,hire_date
    2  FROM employees
    3  WHERE salary >= 5000000
    4  OR hire_date >= '01-JAN-00'
    5  AND first_name LIKE 'S%';

  FIRST_NAME                         SALARY HIRE_DATE
  ------------------------------ ---------- ---------
  Suzuki                           10000000 07-OCT-92
  Sato                              8000000 11-OCT-92
  Yamamoto                          5000000 11-MAR-95
  Watanabe                          6000000 01-APR-98
  Watanabe                          5500000 14-MAY-98
  Kataoka                           6500000 01-OCT-00
  Harada                            6200000 01-OCT-00
  Koda                              6400000 01-OCT-00
  Saito                             6700000 01-OCT-00
  Akagi                             6400000 01-MAR-01
  Sato                              5400000 01-APR-97
  Tao                               5400000 28-JUL-03
  Kaneko                            5400000 22-FEB-01
  Totsuka                           5400000 29-SEP-03
  Kato                              6500000 01-APR-09
  Sinagawa                          6500000 01-APR-09

  16 rows selected.


この条件は分かりづらくないでしょうか。条件は以下の2つとなります。
・年収が500万
・入社日が2000年以降かつ、first_nameの先頭がSから始まる人

という2つの条件になります。ANDを使用すると前の条件との組み合わせになるんですね。
ORは結構分かりやすいのですが、ANDを使用するとややこしくなりますね。

じゃあ、以下のような条件はどうするのでしょうか。

・年収が500万または入社日が2000年以降でかつ、first_nameの先頭がSから始まる人

言葉で説明するのも難しくなってきました。実行例を見ましょう。

  SQL> SELECT first_name,salary,hire_date
    2  FROM employees
    3  WHERE ( salary >= 5000000 OR hire_date >= '01-JAN-00' )
    4  AND first_name LIKE 'S%';

  FIRST_NAME                         SALARY HIRE_DATE
  ------------------------------ ---------- ---------
  Suzuki                           10000000 07-OCT-92
  Sato                              8000000 11-OCT-92
  Saito                             6700000 01-OCT-00
  Sato                              5400000 01-APR-97
  Sinagawa                          6500000 01-APR-09


今回の例では計算式の時に使用したカッコ()を使用しています。
これにより、AND、ORの優先順位を変更できます。

カッコで優先順位を変更することにより、
年収が500万または入社日が2000年以降という条件がまとまり、
その後にfirst_nameの先頭がSから始まる人という条件となるのです。

実行結果も先ほどとは違う結果となっています。

複数条件を指定する場合は、SQLの条件式も難しくなってきます。
特にAND演算子は指定方法によって、優先順位があるので、記載違いにより
まったく条件が変わってくるので、注意してください。