データベース初心者必見!入門編その5〜複数の条件を指定して検索する〜

2015/07/22

はじめに

今回は、入門編その1入門編その2入門編その3入門編その4の続きです。

今回は複数の条件を指定して検索する方法を紹介いたします。

複数の条件を指定して検索する

これまではWHERE句で単一の条件のみを指定してきました。しかし、場合によっては「◯◯列の値が7で、かつ✕✕列の値が10である行を取得したい」といったケースもあります。 このような場合、SQL文では論理演算子を使って複数の条件を指定します。

論理演算子 使い方 意味
AND

条件1 AND 条件2

条件1と条件2がともに真(TRUE)であった

場合には真となる。

OR

条件1 OR 条件2

条件1と条件2のどちらかが真(TRUE)であった

場合には真となる。

NOT

NOT 条件

条件の値を逆転する。

 

では実際にSQLを発行してみましょう。

SELECT * FROM goods WHERE ctg_id =5 AND mkr_id= 4 

実行結果

hyou1

論理演算子「AND」を用いて「条件1:ctg_id列の値が5」でかつ「条件2:mkr_id列の値が4である」行を取得していました。OR演算子もAND演算子も同様に使用することができます。

続いてNOT演算子をつかってみましょう。

SELECT * FROM goods WHERE NOT ctg_id =5

実行結果

hyou1

NOT演算子を使って[ctg_id列の値が5である」という条件の逆、つまり「ctg_id列の値が5ではない」という条件で問い合わせを行いました。今回のSQL文は、次のSQL分を使っても同じ結果を取得することができます。

SELECT * FROM goods WHERE ctg_id !=5
SELECT * FROM goods WHERE ctg_id <>5

実行結果

hyou1

全く同じ結果を取得することができました。

このように、同じ結果を取得するものでも異なったSQL文を記述することができます。

では、更に複雑な条件で問い合わせてみましょう。

「条件1:gds_price列の値が1000以上10000以下の範囲内」

「条件2:gds_stock列の値が10以上」

「条件3:ctg_id列の値が1か3か5か7」

3つのこの条件をAND演算子を使って問い合わせを行います。

SELECT * FROM goods WHERE gds_price BETWEEN 1000 AND 10000 AND gds_stock >= 10 AND ctg_id IN (1,3,5,7)

実行結果

hyou1

3つの条件を組み合わせた問い合わせを実行することができました。条件の数に制限はなく、任意の数の条件を組み合わせて問い合わせすることが可能です。

ただし、入力例のSQL文は少し長いものなので、1行で記述すると見づらいものになってしまいました。このような場合には、次のような改行とインデントを入れて記述すると視認性を高めることができます。

SELECT 
      * 
FROM 
      goods 
WHERE 
      gds_price BETWEEN 1000 AND 10000 
      AND gds_stock >= 10 
      AND ctg_id IN (1,3,5,7)

論理演算子には優先順があります。 例として以下の条件で問い合わせを行う場合を考えます。

「条件1:ctg_id列の値が2または5」

「条件2:mkr_id列の値が2または5」

そして、条件1が真でかつ条件2が真である行を取得します。

SELECT * FROM goods WHERE ctg_id =2 OR ctg_id =5 AND mkr_id =2 OR mkr_id =4

実行結果

hyou3

今回のSQL文では意図した結果が得られていません。ctg_id列の値が8の行も表示されてしまっています。AND演算子の優先順位がOR演算子よりも高いためこのよううになってしましました。

これを回避するためには「()」を使って意図的に優先順位を高める方法があります。

SELECT * FROM goods WHERE (ctg_id =2 OR ctg_id =5 ) AND (mkr_id =2 OR mkr_id =4)

実行結果

hyou1

今回は、一つの条件で指定した問い合せ方法を紹介しました。次回は、複数の条件を組み合わせて、さらに高度な問い合せを行う方法を紹介したいと思います。

各条件を「()」で括り、それをAND演算子で連結することで思い通りの結果を取得する事が出来ました。SQLでは、論理演算子に限らず演算子には優先順位があります。注意して記述することにしましょう。

表「MySQLにおける演算子の優先順位

演算子(優先順位の高い方から)
()
!
*, /,%
-,+
=,>=,>,<,<>,!=,IS,LIKE,IN
BETWEEN
NOT
AND
OR
:=

※同じ行にあるものは同じ優先順位です。RDBMSによって優先順位にちがいがあります。

さいごに

今回複数の条件を指定した問い合わせ方法の紹介でした。だんだん高度な問い合わせができるようになってきました。 次回は、複数のテーブルからデータを取得する方法について紹介いたします。

投稿者情報

パンダマン

パンダマン

パンダマンです。

主にWebシステム開発等を担当しております。
設計・プログラミング。サーバー管理なんでもやります。

今、担当しているプロジェクトではJavaの今まで触れたことのないフレームワークを使うことになり勉強中です。
学生にC言語のプログラミングの基礎を教えたりもしています。
最近「キングダム」にはまっています。

>> パンダマンが執筆した他の記事を読む

法人向け人気レンタルサーバー
法人向け人気専用サーバー
個人向け人気レンタルサーバー