教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習

MySQL (2)

MySQL (条件検索)

1. データの検索

テーブルに保存されたデータを表示したり、検索する場合には、以下 のようなSELECTコマンドを利用する。

mysql> select 検索したい項目 from 検索対象であるテーブル名;

たとえば、以下のfruitテーブルに格納されているすべてのデータを 取り出して表示してみよう。

fruitテーブル

no nameprice
1apple100
2grape130
3banana90
4peach150
5meron600

そのためには、以下のようなSELECTコマンドを実行することが必要となる。 その実行結果については、次のようになる。

mysql> select * from fruit;
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    1 | apple  |   100 |
|    2 | grape  |   130 |
|    3 | banana |    90 |
|    4 | peach  |   150 |
+------+--------+-------+
4 rows in set (0.00 sec)

mysql>

たとえば、noフィールドとnameフィールドのような 特定のフィールドの情報を取り出したい場合には、 取り出したいフィールドを、 ,(カンマ)で区切り、 さらに続けて、FROM後に検索対象となるテーブルを 指定する。この場合のコマンドと実行結果は、 以下のようになる。

mysql> select no, name from fruit;
+------+--------+
| no   | name   |
+------+--------+
|    1 | apple  |
|    2 | grape  |
|    3 | banana |
|    4 | peach  |
|    5 | meron  |
+------+--------+
5 rows in set (0.00 sec)

2. 検索条件の指定

SELECTコマンドには、条件式を指定して、検索することが可能 である。この場合には、FROMの後ろにWHERE節で条件を付加する。

mysql> select * from テーブル名 where 条件式;

1) WHERE節

WHERE以降の条件式の記述は以下のようになる。 ここでは、検索対象となるフィールド名とデータを 比較演算子で結んで記述する。

フィールド名 比較演算子 データ

比較演算子の意味は、以下の表のとおりである。

式  内容 
フィールド名 = 検索キー(データ) 検索キーと一致する
フィールド名 < 検索キー(データ) 検索キーより小さい
フィールド名 > 検索キー(データ) 検索キーより大きい
フィールド名 >= 検索キー(データ) 検索キー以上
フィールド名 <= 検索キー(データ) 検索キー以下
フィールド名 <> 検索キー(データ) 検索キーと一致しない

実際に、fruitテーブルから条件式を指定して、レコードを取り出してみる。 まず、noフィールドの値が3のレコードを抽出する。その結果は 以下のようになる。

mysql> select * from fruit where no = 3;
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    3 | banana |    90 |
+------+--------+-------+
1 row in set (0.00 sec)

mysql>

priceフィールドの値が100以上のレコードを検索すると以下のようになる。

mysql> select * from fruit where price >= 100;
+------+-------+-------+
| no   | name  | price |
+------+-------+-------+
|    1 | apple |   100 |
|    2 | grape |   130 |
|    4 | peach |   150 |
|    5 | meron |   200 |
+------+-------+-------+
4 rows in set (0.05 sec)

mysql>
さらに、文字列を対象に検索する。その場合には、 文字列の部分はシングルコーテーション(')で囲むことが 必要になる。 具体的には、nameフィールドの値が'banana'であるレコード を抽出している。

mysql> select * from fruit where name = 'banana';
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    3 | banana |    90 |
+------+--------+-------+
1 row in set (0.00 sec)

mysql>

2) 複数の条件を組み合わせる

2つ以上の条件を論理演算子を組み合わせることで、 複数の条件を満足するレコードを取り出すことができる。 なお、論理演算子には、and, or, notの3種類がある。

a. and演算子による検索

2つ以上の条件を満足するレコードを検索するために用いる。 たとえば、noが4以上で、かつ、nameがmeronであるレコードを 検索してみる。 必要なコマンドと実行結果は以下のようになる。

mysql> select * from fruit where no >= 4 and name = 'meron';
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    5 | meron  |   600 |
+------+--------+-------+
1 row in set (0.00 sec)

mysql>

b. or演算子による検索

2つ以上の条件のうちどれかいづれかの 条件が成り立つレコードを検索するために用いる。 たとえば、noフィールドの値が4、または、nameフィールドの値が meronであるレコードを検索するためのコマンドとその実行結果は 以下のようになる。

mysql> select * from fruit where no >= 4 or name = 'meron';
+------+-------+-------+
| no   | name  | price |
+------+-------+-------+
|    4 | peach |   150 |
|    5 | meron |   600 |
+------+-------+-------+
2 rows in set (0.03 sec)

mysql>

c. not演算子による検索

not演算子に続く検索条件が成立しないレコードを検索する ために利用する。たとえば、noが2または5でないレコードを 検索するために必要なコマンドとその実行結果は、次のようになる。

mysql> select * from fruit where not(no = 2 or no = 5);
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    1 | apple  |   100 |
|    3 | banana |    90 |
|    4 | peach  |   150 |
+------+--------+-------+
3 rows in set (0.00 sec)

mysql>

3) パターン検索

LIKE演算子を用いた検索では、比較演算子を用いた検索と異なり パターンの照合をおこなうことができる。 その場合には、SELECTコマンドには、以下に示すように演算子を加えて 検索することが可能である。

mysql> select * from テーブル名 where 条件式 like パターン;

LIKE演算子では、以下のようなワイルドカード文字が指定できる。 なお、これらの文字は半角で使用する。

文字 意味
%任意のn文字(nは0文字以上)に一致
_任意の1文字に一致

パターン検索として、まず、priceが100代のレコードを検索してみよう。 必要となるコマンドとその実行結果を以下に示す。

mysql> select * from fruit where price like '1__';
+------+-------+-------+
| no   | name  | price |
+------+-------+-------+
|    1 | apple |   100 |
|    2 | grape |   130 |
|    4 | peach |   150 |
+------+-------+-------+
3 rows in set (0.01 sec)

mysql>

次に、%を使って上記の検索をおこなう。そのために必要となるコマンド と実行結果を以下に示される。

mysql> select * from fruit where price like '1%';
+------+-------+-------+
| no   | name  | price |
+------+-------+-------+
|    1 | apple |   100 |
|    2 | grape |   130 |
|    4 | peach |   150 |
+------+-------+-------+
3 rows in set (0.01 sec)

mysql>

さらに、LIKE演算子とnot演算子を使って、 nameの文字列のなかにaが含まれていないレコードを検索してみよう。 必要となるコマンドとその実行結果を以下に示す。

mysql> select * from fruit where name not like '%a%';
+------+-------+-------+
| no   | name  | price |
+------+-------+-------+
|    5 | meron |   600 |
+------+-------+-------+
1 row in set (0.00 sec)

mysql>

4) 検索結果の表示件数の制限 

検索結果の表示件数を制限するためには、limitを利用する。 その場合の書式を以下に示す。

mysql> select 表示するフィールド名 from テーブル名 limit 表示件数;

mysql> select 表示するフィールド名 from テーブル名 limit 表示開始位置, 取り出したい件数;

最初の書式に従って、表示件数を指定すると、検索の最初の行から指定された件数 分だけ表示される。以下では、3件のデータを順番に表示するための コマンドとその実行結果が示される。

mysql> select * from fruit limit 3;
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    1 | apple  |   100 |
|    2 | grape  |   130 |
|    3 | banana |    90 |
+------+--------+-------+
3 rows in set (0.00 sec)

mysql>

2番目の書式に従って、2件目から3件のデータを表示させてみよう。 ただし、表示開始位置は始点を0として数える。 必要なコマンドとその実行結果は、次のようになる。

mysql> select * from fruit limit 1,3;
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    2 | grape  |   130 |
|    3 | banana |    90 |
|    4 | peach  |   150 |
+------+--------+-------+
3 rows in set (0.00 sec)

mysql>

5) 昇順・降順での並び替え

番号やIDなどキーにして小さい順に並べることを昇順に並べるという。 また、大きい順に並べることを降順に並べるという。

その場合の書式を以下に示す。

mysql> select 表示するフィールド名 from テーブル名 order by 並び替え対象のフィールド名;

mysql> select 表示するフィールド名 from テーブル名 order by 並び替え対象のフィールド名 desc;

まず、前者の書式に従い、fruitテーブルをpriceフィールドで昇順に 並び替えてみよう。 必要なコマンドと実行結果は以下のようになる。

mysql> select * from fruit order by price;
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    3 | banana |    90 |
|    1 | apple  |   100 |
|    2 | grape  |   130 |
|    4 | peach  |   150 |
|    5 | meron  |   600 |
+------+--------+-------+
5 rows in set (0.03 sec)

mysql>

次に、後者の書式に従い、fruitテーブルをpriceフィールドで 降順に並び替えてみよう。 必要なコマンドと実行結果は以下のようになる。

mysql> select * from fruit order by price desc;
+------+--------+-------+
| no   | name   | price |
+------+--------+-------+
|    5 | meron  |   600 |
|    4 | peach  |   150 |
|    2 | grape  |   130 |
|    1 | apple  |   100 |
|    3 | banana |    90 |
+------+--------+-------+
5 rows in set (0.00 sec)

mysql>

6) 範囲を指定した検索

数値や文字列の範囲を指定し、そこに含まれるデータを検索する ためには、BETWEEN ... AND ....コマンドを利用する。 その場合の書式を以下に示す。

mysql> select 表示するフィールド名 from テーブル名 
            where 範囲指定対象のフィールド名 between 条件1 and 条件2;

ここでは、priceが100から200までのレコードを検索してみよう。 必要となるコマンドと実行結果を以下に示す。

mysql> select * from fruit where price between 100 and 200;
+------+-------+-------+
| no   | name  | price |
+------+-------+-------+
|    1 | apple |   100 |
|    2 | grape |   130 |
|    4 | peach |   150 |
+------+-------+-------+
3 rows in set (0.03 sec)

mysql>
なお、範囲に文字列を指定する場合には、'(シングルクオーテーション)で 文字列を囲むことが必要である。

また、BETWEEN ... AND ... と同じような範囲指定をINを使っておこなう ことができる。INを利用する場合には、連続しない数値や文字列を指定 できる。コマンドの形式は以下のようになる。

mysql> select 表示するフィールド名 from テーブル名 
          where 範囲指定対象のフィールド名 in (条件1, 条件2, ...);

次の例では, priceフィールドの値が100か、200か、300のいづれかの場合に 検索をおこなってみよう。そのために必要となるコマンドとその実行結果を 以下に示す。

mysql> select * from fruit where price in(100, 200, 300);
+------+-------+-------+
| no   | name  | price |
+------+-------+-------+
|    1 | apple |   100 |
+------+-------+-------+
1 row in set (0.06 sec)

mysql>

問題-0

上記で説明したコマンドをすべて実行し、結果を表示せよ。
問題-1
fruitテーブルからnameフィールドの値とpriceフィールド の値を取得し、表示せよ。その際に用いたコマンドを示すこと。

問題-2

fruitテーブルからpriceフィールドの値が90以上の レコードを検索し、表示せよ。その際に用いたコマンドを示すこと。

問題-3

fruitテーブルからnameフィールドの値がpeachと等しいレコードを 検索し、表示せよ。その際に用いたコマンドを示すこと。

問題-4

fruitテーブルから、noフィールドの値が3以上で、かつ、nameがpeachで あるレコードを検索し、表示せよ。 その際に用いたコマンドを示すこと。

問題-5

fruitテーブルから、noフィールドの値が1または3でないレコードを 検索、表示せよ。その際に用いたコマンドを示すこと。

問題-6

fruitテーブルから、パターン検索をおこない、nameフィールドの 値の文字列のなかに'p'が含まないレコードを検索、表示してみよ。 その際に用いたコマンドを示すこと。

問題-7

fruitテーブルから、検索の最初から2件のデータを順番に表示 せよ。また、その際に用いたコマンドを示すこと。

問題-8

fruitテーブルから、priceフィールドの値が50から190までのレコードを検索してみし、表示せよ。また、その際に用いたコマンドを示すこと。

問題-9

fruit1テーブルに対して、問題-1から問題-8を実行せよ。 ただし、問題-3および問題-4では、nameフィールドの 値の文字列を'cherry'のかわりに'mango'に置き換えて レコードを検索、表示すること。 また、問題-6では、nameフィールドの値の文字列のなかに'n'を 含まないレコードを検索、表示すること。

fruit1テーブル

no nameprice
1watermeron2000
2pineapple500
3strawberry500
4cherry1500
5peach400

システムプログラミング演習


Yasuo NAGAI