データベースを使用する最大のメリットは大量のデータから目的のデータをすばやく検索できることになります。今回見ていくSELECT文はSQL構文の中で最も利用する機会が多いものであり、使いこなすのが最も難しいものと言えるでしょう。
テーブルの全データを表示する
通常、データベースからデータを取り出す際、何らかの条件を指定して取り出すことになりますが、条件を指定せず、全データを取り出すこともできます。
> SELECT * FROM stuff; +------+-------------+ | name | description | +------+-------------+ | 大崎 | 会長 | | 岡本 | 社長 | | 松本 | 浜田の相方 | | 加藤 | スッキリ | +------+-------------+
当該テーブルから全ての列のデータを表示するには、SELECT句の後に、アスタリスク(*)を指定します。このアスタリスクは全ての列を示す特別な記号です。
続いて、FROM句では取得したテーブルを指定します。上記例では「stuff」テーブルを指定します。
このように「SELECT * FROM <テーブル名>;」を実行することで、指定したテーブルから全てのデータを無条件で取得して、表示するということになります。
SELECT句による列の指定
指定した列のみのデータを表示するには、SELECT句に列名を指定することで行えます。
> SELECT name FROM stuff; +------+ | name | +------+ | 大崎 | | 岡本 | | 松本 | | 加藤 | +------+
上記例では、name列のみを表示しています。なお、複数の列を指定したい場合はカンマ(,)で区切ります。
このように指定した列のデータだけを取り出すことを「射影」と言います。
WHERE句による行の選択
条件に一致した行のみを取得したい場合は、WHERE句を使用します。
> SELECT * FROM stuff WHERE description = '社長'; +------+-------------+ | name | description | +------+-------------+ | 岡本 | 社長 | +------+-------------+
上記例では、「description」列の値が「社長」となっている行のみを取得して、表示しています。
このように指定した条件に一致する行のデータだけを取り出すことを「選択」と言います。
LIKE演算子
上記例のように何かの文字列と完全一致した行を取り出す場合は「=」演算子を使用すれば良いのですが、何かの文字が含まれている場合など、曖昧な検索をしたい場合もあります。そのような場合には、LIKE演算子を使用します。
> SELECT * FROM stuff WHERE description LIKE '%長'; +------+-------------+ | name | description | +------+-------------+ | 大崎 | 会長 | | 岡本 | 社長 | +------+-------------+
「%」記号は「0文字以上の任意の文字」という意味になります。上記例のようにLIKE演算子に「%長」と指定することで、「会長」と「社長」がヒットすることになります。
他に「任意の一文字」を表したい場合は、「_」(アンダーバー)を使います。
LIKEは条件に一致する行を選択しますが、その反対に、条件に一致しない行を取得したい場合はNOT LIKE演算子を使用します。
> SELECT * FROM stuff WHERE description NOT LIKE '%長'; +------+-------------+ | name | description | +------+-------------+ | 松本 | 浜田の相方 | | 加藤 | スッキリ | +------+-------------+
このようにLIKEとNOT LIKE演算子を組み合わせればいろいろなパターンの検索が可能になります。
REGEXP演算子
LIKE演算子では「%」や「_」記号を用いることで、曖昧な検索ができるようになるわけですが、それだけではなく、正規表現を使用してもっと細かな曖昧検索をしたい場合もあります。そのような場合は、REGEXP演算子を使用します。(正規表現についての詳細は割愛しますが、ここではREGEXP演算子によりどのような検索ができるのか、そのイメージを掴んでください。)
REGEXP演算子についての具体的な説明の前に、まず以下のテーブルを新規作成します。
> CREATE TABLE sample01(name text);
> INSERT INTO sample01(name) VALUES('poppo111');
> INSERT INTO sample01(name) VALUES('fire');
> INSERT INTO sample01(name) VALUES('mu02');
> SELECT * FROM sample01;
+----------+
| name |
+----------+
| poppo111 |
| fire |
| mu02 |
+----------+
このテーブルから、name列が「アルファベット1つ以上とそれに続けて数字1つ以上の組み合わせになっているデータ」を検索したい場合、以下のように記述します。
> SELECT * FROM sample01 WHERE name REGEXP '^[a-z]+[0-9]+$'; +----------+ | name | +----------+ | poppo111 | | mu02 | +----------+
次は、name列が「アルファベット2文字とそれに続けて数字が2文字の組み合わせになっているデータ」を検索したい場合の例です。
> SELECT * FROM sample01 WHERE name REGEXP '^[a-z]{2}[0-9]{2}$';
+------+
| name |
+------+
| mu02 |
+------+
REGXPの前にNOTをつけることで、正規表現に一致しないという条件で検索できます。
> SELECT * FROM sample01 WHERE name NOT REGEXP '^[a-z]{2}[0-9]{2}$';
+----------+
| name |
+----------+
| poppo111 |
| fire |
+----------+
