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演算子は指定方法によって、優先順位があるので、記載違いにより
まったく条件が変わってくるので、注意してください。