ゼロから始めるPHP講座Vol23 データの条件指定


ゼロから始めるPHP講座Vol23 データの条件指定
目次
  1. ゼロから始めるPHP講座データの条件指定
  2. 条件指定(WHERE)
  3. 比較演算子
  4. 文字列検索
  5. 論理演算子
  6. 課題

ゼロから始めるPHP講座データの条件指定

条件指定(WHERE)

SELECTや次回レッスンの「データの変更・削除」で学ぶデータ変更などの命令の際、WHEREで条件を設定することにより、特定のレコードのみ選んで実行することができます。

phpmyadmin-data1-639

例えばgoods_tableで「priceカラムの値が200以上」というときは、「price>=200」とします。

phpmyadmin-data2-639

実際にpriceが200以上のレコードのみをphpMyAdminで表示してみましょう。

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100

条件を指定することで、価格が200円以上である、USBと傘のレコードのみ表示されました。

データベースとは、「テーマに沿ったデータの入った箱」かつ「簡単にデータを取り出し可能にした」ソフトウェアと説明しましたが、このようにWHERE句で条件をつけることで、必要なデータのみを簡単に検索・表示が行えます。

比較演算子

条件には比較演算子を使うことができ、MySQLの主な比較演算子は以下となります。

主な比較演算子
A = B AとBは等しい
A <> B AとBは等しくない
A > B AはBより多い
A >= B AはB以上
A < B AはBより少ない
A <= B AはB以下
A IN B BリストのどれかとAが等しい
A BETWEEN B AND C AはB以上C以下

PHPとの違いとして、PHPで等しいは「===」でしたが、MySQLでは「=」となります。

実際にこれらの比較演算子を使った条件指定の例を紹介しますので、phpMyAdminから実行し、同じ結果となるか確認してください。

goods_tableでカラムpriceが100に等しい

SELECT goods_id, goods_name, price FROM goods_table WHERE price = 100;

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100
goods_tableでカラムpriceが100以外

SELECT goods_id, goods_name, price FROM goods_table WHERE price 100;

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100
goods_tableでカラムpriceが100以上500以下

SELECT goods_id, goods_name, price FROM goods_table WHERE price BETWEEN 100 AND 500;

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100
goods_tableでカラムpriceが100か2000のどちらか

SELECT goods_id, goods_name, price FROM goods_table WHERE price in (100, 2000);

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100

文字列検索

「LIKE」を利用することで、文字列で検索が行えます。LIKEは部分的な文字列の一致を検索することができるのが特徴です。

部分的な一致を検索する場合、「%」や「_」を使い、これをワイルドカードと呼びます。

ワイルドカード種類
ワイルドカード 説明
% 任意の0文字以上の文字
_(アンダースコア) 任意の1文字

例えばemp_tableで「カラムemp_nameが山田で始まる任意の長さの文字列」というときは、「emp_name LIKE '山田%'」とします。

phpmyadmin-data3-639

実際にemp_nameが「山田」で始まるレコードのみを表示してみましょう。

emp_table
emp_id emp_name job age
山田太郎 manager 50
伊藤静香 manager 45
鈴木三郎 analyst 30
山田花子 clerk 24

このようにワイルドカードを使うことで、キーワードによる検索などが行えます。

実際にワイルドカードを使ったLIKEの例を紹介しますので、phpMyAdminから実行し、同じ結果となるか確認してください。

SELECT goods_id, goods_name, price FROM goods_table WHERE goods_name LIKE '_';

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100
emp_tableでカラムemp_nameが「郎」で終わる SELECT emp_id,emp_name, job, age FROM emp_table WHERE emp_name LIKE '%郎'; emp_table
emp_id emp_name job age
山田太郎 manager 50
伊藤静香 manager 45
鈴木三郎 analyst 30
山田花子 clerk 24
character_tableでカラムprefが県で終わる3文字 SELECT character_id, character_name, pref FROM character_table WHERE pref LIKE '
県';
character_table
character_id character_name pref
ふなっしー 千葉県
ひこにゃん 滋賀県
まりもっこり 北海道
emp_tableでカラムjobに「ana」が含まれる SELECT emp_id,emp_name, job, age FROM emp_table WHERE job LIKE '%ana%';
emp_table
emp_id emp_name job age
山田太郎 manager 50
伊藤静香 manager 45
鈴木三郎 analyst 30
山田花子 clerk 24
2つのワイルドカードのうち、「%」を使った検索に関しては、以下のような呼び方をしています。

前方一致 WHERE column LIKE ‘abc%’ 後方一致 WHERE column LIKE ‘%abc’ 部分一致 or 中間一致 WHERE column LIKE ‘%abc%’

またこれらと合わせ、部分的でない文字列検索を完全一致と呼びます。

完全一致 WHERE column = ‘abc’

補足として、文字列の検索で後方一致や部分一致は、レコード数が多いテーブルでは実行速度が明らかに遅くなるため、使わないようにしましょう。詳細については後の章で説明します。

論理演算子

WHEREで条件を指定しデータを検索する方法を紹介してきました。これまでは条件が1つでしたが、論理演算子「AND」や「OR」を使うことで、複数の条件を指定することも可能です。

phpmyadmin-data4-639

例えばemp_tableで「カラムjobがmanager」かつ「カラムageが50以上」というときは、「job=‘manager’ANDage>=50」となります。

phpmyadmin-data5-639

実際に条件のレコードを表示してみましょう。

emp_table
emp_id emp_name job age
山田太郎 manager 50
伊藤静香 manager 45
鈴木三郎 analyst 30
山田花子 clerk 24

条件を指定することで、職種がマネージャーかつ年齢が50以上のレコードのみが表示されました。

3つ以上の条件や、ANDとORを組み合わせて使うことも可能で、検索したいデータに合わせて、うまく組み合わせて利用します。

注意事項として、PHPと同じく演算子には優先順位があります。

例えばgoods_tableで「カラムpriceが100又は2000」かつ「カラムgoods_nameが任意の3文字」という検索を行いたい場合、

phpmyadmin-data6-639

上記のようなSQLを実行するとどのような結果になるか確認してみましょう。

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100

「カラムpriceが100」又は「カラムpriceが2000かつカラムgoods_nameが任意の3文字」という結果になります。

ANDとORは、ANDのほうが優先順位が高いため、このような結果となります。

よって、ANDよりORの処理を先に行いたいときは、条件を括弧でくくります。

phpmyadmin-data7-639

phpMyadminより実行し、結果を確認しましょう。

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100

このようにすることで、優先度を上げることができます。

なお優先順位にかかわらず、条件が複雑になった場合、意図に合わせて括弧をつけSQLを書くことを推奨します。

別な章でも何度か述べているのと同じく、SQLも人が見て分かりやすいようにしたほうが、複数人で行うときはもちろん、後々の自分のためにもなります。

課題

goods_tableで、priceが500以下のデータを表示してください。

goods_table
goods_id goods_name price
コーラ 100
USB 2000
500
お茶 100

character_tableで、 prefが「県」で終わるデータのcharacter_idとcharacter_nameを表示してください。

character_table
character_id character_name pref
ふなっしー 千葉県
ひこにゃん 滋賀県
まりもっこり 北海道
emp_tableでjobがclerkのemp_idとageを表示してください。
emp_table
emp_id emp_name job age
山田太郎 manager 50
伊藤静香 manager 45
鈴木三郎 analyst 30
山田花子 clerk 24
emp_tableでjobがanalyst または ageが20以上25以下のemp_idとemp_nameを表示してください。
emp_table
emp_id emp_name job age
山田太郎 manager 50
伊藤静香 manager 45
鈴木三郎 analyst 30
山田花子 clerk 24
 

NEXT LESSON ☛ データの変更・削除

PREV LESSON ☛ phpMyAdminの基礎と使い方②


CodeCampus編集部
この記事を書いた人
CodeCampus編集部
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp