- 更新日: 2017年3月23日
- 公開日: 2015年12月8日
ゼロから始めるPHP講座Vol23 データの条件指定
ゼロから始めるPHP講座データの条件指定
条件指定(WHERE)
SELECTや次回レッスンの「データの変更・削除」で学ぶデータ変更などの命令の際、WHEREで条件を設定することにより、特定のレコードのみ選んで実行することができます。
例えばgoods_tableで「priceカラムの値が200以上」というときは、「price>=200」とします。
実際にpriceが200以上のレコードのみをphpMyAdminで表示してみましょう。
goods_id | goods_name | price |
---|---|---|
1 | コーラ | 100 |
2 | USB | 2000 |
3 | 傘 | 500 |
4 | お茶 | 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_id | goods_name | price |
---|---|---|
1 | コーラ | 100 |
2 | USB | 2000 |
3 | 傘 | 500 |
4 | お茶 | 100 |
SELECT goods_id, goods_name, price FROM goods_table WHERE price 100;
goods_id | goods_name | price |
---|---|---|
1 | コーラ | 100 |
2 | USB | 2000 |
3 | 傘 | 500 |
4 | お茶 | 100 |
SELECT goods_id, goods_name, price FROM goods_table WHERE price BETWEEN 100 AND 500;
goods_id | goods_name | price |
---|---|---|
1 | コーラ | 100 |
2 | USB | 2000 |
3 | 傘 | 500 |
4 | お茶 | 100 |
SELECT goods_id, goods_name, price FROM goods_table WHERE price in (100, 2000);
goods_id | goods_name | price |
---|---|---|
1 | コーラ | 100 |
2 | USB | 2000 |
3 | 傘 | 500 |
4 | お茶 | 100 |
文字列検索
「LIKE」を利用することで、文字列で検索が行えます。LIKEは部分的な文字列の一致を検索することができるのが特徴です。
部分的な一致を検索する場合、「%」や「_」を使い、これをワイルドカードと呼びます。
ワイルドカード | 説明 |
---|---|
% | 任意の0文字以上の文字 |
_(アンダースコア) | 任意の1文字 |
例えばemp_tableで「カラムemp_nameが山田で始まる任意の長さの文字列」というときは、「emp_name LIKE '山田%'」とします。
実際にemp_nameが「山田」で始まるレコードのみを表示してみましょう。
emp_id | emp_name | job | age |
---|---|---|---|
1 | 山田太郎 | manager | 50 |
2 | 伊藤静香 | manager | 45 |
3 | 鈴木三郎 | analyst | 30 |
4 | 山田花子 | clerk | 24 |
このようにワイルドカードを使うことで、キーワードによる検索などが行えます。
実際にワイルドカードを使ったLIKEの例を紹介しますので、phpMyAdminから実行し、同じ結果となるか確認してください。
SELECT goods_id, goods_name, price FROM goods_table WHERE goods_name LIKE '_';
emp_tableでカラムemp_nameが「郎」で終わる
SELECT emp_id,emp_name, job, age FROM emp_table WHERE emp_name LIKE '%郎';
goods_id
goods_name
price
1
コーラ
100
2
USB
2000
3
傘
500
4
お茶
100
emp_table
character_tableでカラムprefが県で終わる3文字
SELECT character_id, character_name, pref FROM character_table WHERE pref LIKE '県';
emp_id
emp_name
job
age
1
山田太郎
manager
50
2
伊藤静香
manager
45
3
鈴木三郎
analyst
30
4
山田花子
clerk
24
character_id | character_name | pref |
---|---|---|
1 | ふなっしー | 千葉県 |
2 | ひこにゃん | 滋賀県 |
3 | まりもっこり | 北海道 |
emp_id | emp_name | job | age |
---|---|---|---|
1 | 山田太郎 | manager | 50 |
2 | 伊藤静香 | manager | 45 |
3 | 鈴木三郎 | analyst | 30 |
4 | 山田花子 | clerk | 24 |
前方一致 WHERE column LIKE ‘abc%’ 後方一致 WHERE column LIKE ‘%abc’ 部分一致 or 中間一致 WHERE column LIKE ‘%abc%’
またこれらと合わせ、部分的でない文字列検索を完全一致と呼びます。
完全一致 WHERE column = ‘abc’
補足として、文字列の検索で後方一致や部分一致は、レコード数が多いテーブルでは実行速度が明らかに遅くなるため、使わないようにしましょう。詳細については後の章で説明します。
論理演算子
WHEREで条件を指定しデータを検索する方法を紹介してきました。これまでは条件が1つでしたが、論理演算子「AND」や「OR」を使うことで、複数の条件を指定することも可能です。
例えばemp_tableで「カラムjobがmanager」かつ「カラムageが50以上」というときは、「job=‘manager’ANDage>=50」となります。
実際に条件のレコードを表示してみましょう。
emp_id | emp_name | job | age |
---|---|---|---|
1 | 山田太郎 | manager | 50 |
2 | 伊藤静香 | manager | 45 |
3 | 鈴木三郎 | analyst | 30 |
4 | 山田花子 | clerk | 24 |
条件を指定することで、職種がマネージャーかつ年齢が50以上のレコードのみが表示されました。
3つ以上の条件や、ANDとORを組み合わせて使うことも可能で、検索したいデータに合わせて、うまく組み合わせて利用します。
注意事項として、PHPと同じく演算子には優先順位があります。
例えばgoods_tableで「カラムpriceが100又は2000」かつ「カラムgoods_nameが任意の3文字」という検索を行いたい場合、
上記のようなSQLを実行するとどのような結果になるか確認してみましょう。
goods_id | goods_name | price |
---|---|---|
1 | コーラ | 100 |
2 | USB | 2000 |
3 | 傘 | 500 |
4 | お茶 | 100 |
「カラムpriceが100」又は「カラムpriceが2000かつカラムgoods_nameが任意の3文字」という結果になります。
ANDとORは、ANDのほうが優先順位が高いため、このような結果となります。
よって、ANDよりORの処理を先に行いたいときは、条件を括弧でくくります。
phpMyadminより実行し、結果を確認しましょう。
goods_id | goods_name | price |
---|---|---|
1 | コーラ | 100 |
2 | USB | 2000 |
3 | 傘 | 500 |
4 | お茶 | 100 |
このようにすることで、優先度を上げることができます。
なお優先順位にかかわらず、条件が複雑になった場合、意図に合わせて括弧をつけSQLを書くことを推奨します。
別な章でも何度か述べているのと同じく、SQLも人が見て分かりやすいようにしたほうが、複数人で行うときはもちろん、後々の自分のためにもなります。
課題
goods_tableで、priceが500以下のデータを表示してください。
goods_id | goods_name | price |
---|---|---|
1 | コーラ | 100 |
2 | USB | 2000 |
3 | 傘 | 500 |
4 | お茶 | 100 |
character_tableで、 prefが「県」で終わるデータのcharacter_idとcharacter_nameを表示してください。
character_id | character_name | pref |
---|---|---|
1 | ふなっしー | 千葉県 |
2 | ひこにゃん | 滋賀県 |
3 | まりもっこり | 北海道 |
emp_id | emp_name | job | age |
---|---|---|---|
1 | 山田太郎 | manager | 50 |
2 | 伊藤静香 | manager | 45 |
3 | 鈴木三郎 | analyst | 30 |
4 | 山田花子 | clerk | 24 |
emp_id | emp_name | job | age |
---|---|---|---|
1 | 山田太郎 | manager | 50 |
2 | 伊藤静香 | manager | 45 |
3 | 鈴木三郎 | analyst | 30 |
4 | 山田花子 | clerk | 24 |
NEXT LESSON ☛ データの変更・削除
PREV LESSON ☛ phpMyAdminの基礎と使い方②
- この記事を書いた人
- CodeCampus編集部