Chapter12 レコードの抽出

概要と目標 欲しいレコードを、
抽出できるようになる。

レコードを抽出するSELECTの使い方を学習し、
欲しいレコードが抽出できるようになりましょう。

今回のゴール

コマンドプロンプト

mysql> select name, email from users;
+--------+---------------------+
| name   | email               |
+--------+---------------------+
| 前田   | maeda@dummy.com     |
| 大島   | oshima@dummy.com    |
| 高橋   | takahashi@dummy.com |
| 指原   | sashihara@dummy.jp  |
| 山本   | yamamoto@dummy.net  |
+--------+---------------------+
5 rows in set (0.00 sec)

mysql>
mysql> select name, created, modified from users where created < '2017-05-01' and modified >= '2017-05-01';
+--------+---------------------+---------------------+
| name   | created             | modified            |
+--------+---------------------+---------------------+
| 前田   | 2017-04-03 10:00:00 | 2017-07-15 10:00:00 |
| 高橋   | 2017-04-07 10:00:00 | 2017-05-10 10:00:00 |
+--------+---------------------+---------------------+
2 rows in set (0.01 sec)

mysql>
mysql> select * from users where modified between '2017-07-01' and '2017-07-31: 23:59:59';
+----+--------+--------------------+------------+---------------------+---------------------+
| id | name   | email              | password   | created             | modified            |
+----+--------+--------------------+------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com    | maemae     | 2017-04-03 10:00:00 | 2017-07-15 10:00:00 |
|  4 | 指原   | sashihara@dummy.jp | sashisashi | 2017-07-14 10:00:00 | 2017-07-20 10:00:00 |
+----+--------+--------------------+------------+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql>
mysql> select * from users where email like '%.___';
+----+--------+---------------------+----------+---------------------+---------------------+
| id | name   | email               | password | created             | modified            |
+----+--------+---------------------+----------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae   | 2017-04-03 10:00:00 | 2017-07-15 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takataka | 2017-04-07 10:00:00 | 2017-05-10 10:00:00 |
|  5 | 山本   | yamamoto@dummy.net  | yamayama | 2017-07-14 10:00:00 | 2017-08-10 10:00:00 |
+----+--------+---------------------+----------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql>
mysql> select title, content, created
    ->   from posts
    ->   where content like '%こんにちは%'
    ->   order by created desc
    ->   limit 3;
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+
| title                             | content                                                                                                   | created             |
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+
| 限界です                          | こんにちは、もうブログを続けるのは限界です。                                                              | 2017-07-18 10:00:00 |
| また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 |
| おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 |
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+
3 rows in set (0.00 sec)

mysql> 

全レコードの抽出 レコードの抽出は、
SELECT構文。

レコードを抽出するには、SELECT構文を用いる。

基本的なSELECT構文
SELECT 表示するフィールド名 FROM テーブル名;

表示するフィールド名: 「,(半角カンマ)」区切りで複数指定できる。
                    「*(アスタリスク)」 を指定すると全てフィールドが表示される。

詳細は13.2.9 SELECT 構文を参照

テーブル内の全レコードを抽出してみよう。

  1. MySQLモニタを起動
  2. 「chapter12」 › 「settings」 › 「該当文字コード」フォルダ内の「setting.sql」を
    sourceコマンド、またはファイルの内容をコピー&ペーストし、
    今回のレッスンに必要なデータベースとテーブル、レコードを作成する
source /php-lessons/chapter12/settings/Shift-JIS/settings.sql;

ファイルパスは変更(コマンドラインツールにドラッグ&ドロップ)して下さい

実行例

コマンドプロンプト

mysql> source /php-lessons/chapter12/settings/Shift-JIS/settings.sql
Query OK, 2 rows affected (0.01 sec)

Query OK, 1 row affected (0.00 sec)

Database changed
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.02 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 10 rows affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0

Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

Query OK, 0 rows affected (0.00 sec)

+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                        | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました                  | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                      | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  2 |       1 | 2回目の投稿!                     | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                        | 2017-04-08 10:00:00 | 2017-04-08 10:00:00 |
|  3 |       3 | そろそろ・・・                    | こんにちは、そろそろネタが尽きてきました。                                        | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  4 |       3 | まだやってます                    | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                                       | 2017-04-11 10:00:00 | 2017-04-11 10:00:00 |
|  5 |       3 | 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                                        | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
|  6 |       3 | また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                                        | 2017-05-31 10:00:00 | 2017-05-31 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                        | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  8 |       5 | 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                                        | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
| 10 |       3 | 限界です                          | こんにちは、もうブログを続けるのは限界です。                                        | 2017-07-18 10:00:00 | 2017-07-18 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
10 rows in set (0.00 sec)

+----+--------+---------------------+------------+---------------------+---------------------+
| id | name   | email               | password   | created             | modified            |
+----+--------+---------------------+------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae     | 2017-04-03 10:00:00 | 2017-07-15 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi   | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takataka   | 2017-04-07 10:00:00 | 2017-05-10 10:00:00 |
|  4 | 指原   | sashihara@dummy.jp  | sashisashi | 2017-07-14 10:00:00 | 2017-07-20 10:00:00 |
|  5 | 山本   | yamamoto@dummy.net  | yamayama   | 2017-07-14 10:00:00 | 2017-08-10 10:00:00 |
+----+--------+---------------------+------------+---------------------+---------------------+
5 rows in set (0.00 sec)

mysql>  
  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. posts」テーブルの全レコードを抽出するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- レコードの抽出
-- 「posts」テーブルの全レコードを全フィールド抽出
select * from posts;
実行例

コマンドプロンプト

mysql> select * from posts;
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                                   | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました                  | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                      | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  2 |       1 | 2回目の投稿!                     | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                                   | 2017-04-08 10:00:00 | 2017-04-08 10:00:00 |
|  3 |       3 | そろそろ・・・                    | こんにちは、そろそろネタが尽きてきました。                                                                | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  4 |       3 | まだやってます                    | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                                       | 2017-04-11 10:00:00 | 2017-04-11 10:00:00 |
|  5 |       3 | 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                                                        | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
|  6 |       3 | また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                                                        | 2017-05-31 10:00:00 | 2017-05-31 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  8 |       5 | 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                                                        | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
| 10 |       3 | 限界です                          | こんにちは、もうブログを続けるのは限界です。                                                              | 2017-07-18 10:00:00 | 2017-07-18 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
10 rows in set (0.00 sec)

mysql> 

特定のフィールドのみ取得

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. posts」テーブルの「titleフィールドと、
    content」フィールドの全レコードを抽出するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- 「posts」テーブルの全レコードを「title」と「content」フィールドのみ抽出
select title, content from posts;
実行例

コマンドプロンプト

mysql> select title, content from posts;
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+
| title                             | content                         |
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+
| ブログ始めました                  | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                         |
| 2回目の投稿!                     | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                         |
| そろそろ・・・                    | こんにちは、そろそろネタが尽きてきました。                         |
| まだやってます                    | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                         |
| 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                         |
| また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                         |
| おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                         |
| 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                         |
| また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                         |
| 限界です                          | こんにちは、もうブログを続けるのは限界です。                         |
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)

mysql>  
射影
データベースでは、特定の列のみを抽出することを射影という。

比較演算子を使った抽出 条件に一致したレコードのみ抽出する。

SELECT構文にWHERE句を用いれば、抽出するレコードに条件を指定できる。

WHEREを用いたSELECT構文
SELECT 表示するフィールド名 FROM テーブル名 [WHERE 条件式];

[〜]: 省略可能
表示するフィールド名: 「,(半角カンマ)」区切りで複数指定できる。
                    「*(アスタリスク)」 を指定すると全てフィールドが表示される。

詳細は13.2.9 SELECT 構文を参照

比較演算子
演算子 説明
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 <> B A は B は異なる

比較演算子を使って、
特定のレコードのみ抽出してみよう。

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. posts」テーブルの「created」フィールドが、
    2017年5月以降」のレコードを全フィールド抽出するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- 比較演算子を使った抽出
-- 「posts」テーブルの「created」が 2017年5月以降 のレコードを全フィールド抽出
select * from posts where created >= '2017-05-01';
実行例

コマンドプロンプト

mysql> select * from posts where created >= '2017-05-01';
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                                   | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  5 |       3 | 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                                                        | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
|  6 |       3 | また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                                                        | 2017-05-31 10:00:00 | 2017-05-31 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  8 |       5 | 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                                                        | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
| 10 |       3 | 限界です                          | こんにちは、もうブログを続けるのは限界です。                                                              | 2017-07-18 10:00:00 | 2017-07-18 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
6 rows in set (0.00 sec)

mysql> 

プチ問題

「posts」テーブルの「user_id」が「3」のレコードを「title」フィールドのみ抽出

chapter12/select.sql
-- 「posts」テーブルの「user_id」が「3」のレコードを「title」フィールドのみ抽出
select title from posts where user_id = 3;

答えを見る

実行例

コマンドプロンプト

mysql> [posts テーブルの user_id が 3 のレコードを title フィールドのみ抽出]
+-----------------------------------+
| title                             |
+-----------------------------------+
| そろそろ・・・                    |
| まだやってます                    |
| 久しぶりの投稿                    |
| また、空いちゃいました            |
| 限界です                          |
+-----------------------------------+
5 rows in set (0.00 sec)

mysql> 
選択
データベースでは、特定の行のみを抽出することを選択という。

論理演算子を使った抽出 複数の条件に一致した、
レコードを抽出。

論理演算子を使えば、複数の条件を指定することが出来る。

論理演算子
演算子 説明
Aの式 AND Bの式 A と B どちらの式も満たすものを抽出
Aの式 OR Bの式 A または B の式を満たすものを抽出
NOT Aの式 A の式 を満たさないものを抽出
  • 論理演算子は組み合わせて使用することができる。
  • 組み合わせた場合の優先順位は、「NOT」> 「AND」 > 「OR」の順になる。
  • 優先順位を変える場合は、「()」で囲む。

論理演算子を使って使って、
複数の条件を指定してみよう。

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. posts」テーブルの「created」フィールドが、
    2017年5月未満」 か 「2017年7月以降」のレコードを
    全フィールド抽出するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- 論理演算子を使った抽出
-- 「posts」テーブルの「created」が 2017年5月未満 か 2017年7月以降 のレコードを全フィールド抽出
select * from posts where created < '2017-05-01' or created >= '2017-07-01';
実行例

コマンドプロンプト

mysql> select * from posts where created < '2017-05-01' or created >= '2017-07-01';
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                                   | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました                  | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                      | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  2 |       1 | 2回目の投稿!                     | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                                   | 2017-04-08 10:00:00 | 2017-04-08 10:00:00 |
|  3 |       3 | そろそろ・・・                    | こんにちは、そろそろネタが尽きてきました。                                                                | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  4 |       3 | まだやってます                    | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                                       | 2017-04-11 10:00:00 | 2017-04-11 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  8 |       5 | 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                                                        | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
| 10 |       3 | 限界です                          | こんにちは、もうブログを続けるのは限界です。                                                              | 2017-07-18 10:00:00 | 2017-07-18 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
8 rows in set (0.00 sec)

mysql> 

プチ問題

「posts」テーブルの「user_id」が「3」または「4」でかつ「created」が 2017年7月以降 のレコードを全フィールド抽出

chapter12/select.sql
-- 「posts」テーブルの「user_id」が「3」または「4」でかつ「created」が 2017年7月以降 のレコードを全フィールド抽出
select * from posts where (user_id = 3 or user_id = 4) and created >= '2017-07-01';

答えを見る

実行例

コマンドプロンプト

mysql> [「posts」テーブルの「user_id」が「3」または「4」でかつ「created」が 2017年7月以降 のレコードを全フィールド抽出]
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                                   | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
| 10 |       3 | 限界です                          | こんにちは、もうブログを続けるのは限界です。                                                              | 2017-07-18 10:00:00 | 2017-07-18 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> 

その他の演算子を使った抽出 まだまだ便利な演算子がある。

先程までに紹介した演算子以外にも、範囲を指定する演算子や、
いずれかの値あいまい検索など、様々な演算子がある。

その他の演算子
演算子 説明
フィールド名 BETWEEN A AND B A 〜 B の範囲内(A以上 B以下)のものを抽出
フィールド名 IN (A, B, C...) ()内のいずれかの値が含まれているものを抽出
フィールド名 LIKE パターン

パターンと一致するものを抽出

  • % ・・・ 0文字以上の文字列
    Ex. '%パスタ%' ・・・ "パスタ"という文字列を含むレコード
  • _ ・・・ 任意の1文字
    Ex. 'H__L' ・・・ "H" と "L" の間に2文字入る文字列を含むレコード

BETWEEN
範囲を指定してみよう。

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. BETWEEN」を使って、「created」フィールドが、「2017年5月」の
    レコードを抽出するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- その他の演算子を使った抽出
-- 「posts」テーブルの「created」が 2017年5月 のレコードを全フィールド抽出
select * from posts where created between '2017-05-01' and '2017-05-31 23:59:59';
実行例

コマンドプロンプト

mysql> select * from posts where created between '2017-05-01' and '2017-05-31 23:59:59';
+----+---------+-----------------------------------+-----------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                     | created        | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------+---------------------+---------------------+
|  5 |       3 | 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                          | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
|  6 |       3 | また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                          | 2017-05-31 10:00:00 | 2017-05-31 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql> 

IN
いずれか検索をしてみよう。

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. IN」を使って、「user_id」フィールドが、「2」、「4」、「5」の
    いずれかのレコードを抽出するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- 「posts」テーブルの「user_id」が「2」または「4」または「5」のレコードを全フィールド抽出
select * from posts where user_id in (2, 4, 5);
< /figure>
実行例

コマンドプロンプト

mysql> select * from posts where user_id in (2, 4, 5);
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                                   | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました                  | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                      | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  8 |       5 | 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                                                        | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql> 

LIKE
あいまい検索をしてみよう。

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. LIKE」を使って、「content」フィールドが、「パスタ」という文字列を含む
    レコードを抽出するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- 「posts」テーブルの「content」に「パスタ」という文字列を含むレコードを全フィールド抽出
select * from posts where content like '%パスタ%';
実行例

コマンドプロンプト

mysql> select * from posts where content like '%パスタ%';
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                                   | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
2 rows in set (0.01 sec)

mysql> 

レコードの並び替え 好きなフィールドを、
好きな順番で。

フィールドを並び替えるには、ORDER BY句を使う。

ORDER BYを用いたSELECT構文
SELECT 表示するフィールド名 FROM テーブル名
  [WHERE 条件式]
  [ORDER BY フィールド名 並び順];

[〜]: 省略可能
表示するフィールド名: 「,(半角カンマ)」区切りで複数指定できる。
                    「*(アスタリスク)」 を指定すると全てフィールドが表示される。
並び順: DESC(降順)/ ASC(昇順) なお、「,(半角カンマ)」区切りで並び順を複数指定できる

詳細は13.2.9 SELECT 構文を参照

レコードを並び替えてみよう。

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. posts」テーブルの「created」フィールドが新しい順に
    レコードを抽出するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- レコードの並び替え
-- 「posts」テーブルの「created」が 新しい順 に全レコードを全フィールド抽出
select * from posts order by created desc;
実行例

コマンドプロンプト

mysql> select * from posts order by created desc;
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                                   | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| 10 |       3 | 限界です                          | こんにちは、もうブログを続けるのは限界です。                                                              | 2017-07-18 10:00:00 | 2017-07-18 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  8 |       5 | 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                                                        | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  6 |       3 | また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                                                        | 2017-05-31 10:00:00 | 2017-05-31 10:00:00 |
|  5 |       3 | 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                                                        | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
|  4 |       3 | まだやってます                    | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                                       | 2017-04-11 10:00:00 | 2017-04-11 10:00:00 |
|  3 |       3 | そろそろ・・・                    | こんにちは、そろそろネタが尽きてきました。                                                                | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  2 |       1 | 2回目の投稿!                     | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                                   | 2017-04-08 10:00:00 | 2017-04-08 10:00:00 |
|  1 |       2 | ブログ始めました                  | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                      | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
10 rows in set (0.00 sec)

mysql> 

並び順を複数指定してみよう。

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. posts」テーブルの「created」フィールドが新しい順にし、
    同じ日付のレコードは「id」フィールドが大きい順に並び替えてレコードを抽出する
    コマンドを記述し、コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- 「posts」テーブルの「created」が 新しい順 に全レコードを全フィールド抽出、なお、同じ日付の場合は、id が大きい順に抽出
select * from posts order by created desc, id desc;
実行例

コマンドプロンプト

mysql> select * from posts order by created desc, id desc;
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                | created             | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| 10 |       3 | 限界です                          | こんにちは、もうブログを続けるのは限界です。                | 2017-07-18 10:00:00 | 2017-07-18 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
|  8 |       5 | 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  6 |       3 | また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                | 2017-05-31 10:00:00 | 2017-05-31 10:00:00 |
|  5 |       3 | 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
|  4 |       3 | まだやってます                    | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                | 2017-04-11 10:00:00 | 2017-04-11 10:00:00 |
|  3 |       3 | そろそろ・・・                    | こんにちは、そろそろネタが尽きてきました。                | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  2 |       1 | 2回目の投稿!                     | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                | 2017-04-08 10:00:00 | 2017-04-08 10:00:00 |
|  1 |       2 | ブログ始めました                  | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
10 rows in set (0.01 sec)

mysql> 

レコード数の制限 あまりにもレコード数が多ければ、
レコード数に上限を決めればいい。

レコード数を制限するには、LIMIT句を使う。

LIMITを用いたSELECT構文
SELECT 表示するフィールド名 FROM テーブル名
  [WHERE 条件式]
  [ORDER BY フィールド名 並び順]
  [LIMIT [開始位置,] 上限数];

[〜]: 省略可能
表示するフィールド名: 「,(半角カンマ)」区切りで複数指定できる。
                    「*(アスタリスク)」 を指定すると全てフィールドが表示される。
並び順: DESC(降順)/ ASC(昇順) なお、「,(半角カンマ)」区切りで並び順を複数指定できる

詳細は13.2.9 SELECT 構文を参照

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. posts」テーブルの 0件目 から 5件分のレコードを抽出するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- レコード数の制限
-- 「posts」テーブルの 0件目 から 5件分のレコードを全フィールド抽出
select * from posts limit 5;
実行例

コマンドプロンプト

mysql> select * from posts limit 5;
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                    | content                                                                                                | created             | modified            |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました         | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                   | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  2 |       1 | 2回目の投稿!            | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                                | 2017-04-08 10:00:00 | 2017-04-08 10:00:00 |
|  3 |       3 | そろそろ・・・           | こんにちは、そろそろネタが尽きてきました。                                                             | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  4 |       3 | まだやってます           | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                                    | 2017-04-11 10:00:00 | 2017-04-11 10:00:00 |
|  5 |       3 | 久しぶりの投稿           | お久しぶりです。ちょっと日が空いてしまいましたね。                                                     | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
5 rows in set (0.00 sec)

mysql> 

開始位置を指定してみよう。

  1. 「chapter12」フォルダ内の「select.sql」をテキストエディタで開く
  2. posts」テーブルの 3件目 から 5件分のレコードを抽出するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter12/select.sql
-- 「posts」テーブルの 3件目 から 5件分のレコードを全フィールド抽出
select * from posts limit 2, 5;
実行例

コマンドプロンプト

mysql> select * from posts limit 2, 5;
+----+---------+-----------------------------------+------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                              | created             | modified            |
+----+---------+-----------------------------------+------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  3 |       3 | そろそろ・・・                    | こんにちは、そろそろネタが尽きてきました。                                                           | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  4 |       3 | まだやってます                    | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                                  | 2017-04-11 10:00:00 | 2017-04-11 10:00:00 |
|  5 |       3 | 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                                                   | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
|  6 |       3 | また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                                                   | 2017-05-31 10:00:00 | 2017-05-31 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                     | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
+----+---------+-----------------------------------+------------------------------------------------------------------------------------------------------+---------------------+---------------------+
5 rows in set (0.00 sec)

mysql> 

練習問題 今回の理解度をチェック。

「chapter12」フォルダ内の「training.sql」を利用し、以下の問題を解いて下さい。

実行例 (コマンド部分は省略)

コマンドプロンプト

mysql> [「users」テーブルの全レコードを「name」と「email」フィールドのみ抽出]
+--------+---------------------+
| name   | email               |
+--------+---------------------+
| 前田   | maeda@dummy.com     |
| 大島   | oshima@dummy.com    |
| 高橋   | takahashi@dummy.com |
| 指原   | sashihara@dummy.jp  |
| 山本   | yamamoto@dummy.net  |
+--------+---------------------+
5 rows in set (0.00 sec)

mysql>
mysql> [「users」テーブルの「created」が 2017年5月未満 でかつ「modified」が 2017年5月以降 のレコードを「name」と「created」と「modified」フィールドのみ抽出]
+--------+---------------------+---------------------+
| name   | created             | modified            |
+--------+---------------------+---------------------+
| 前田   | 2017-04-03 10:00:00 | 2017-07-15 10:00:00 |
| 高橋   | 2017-04-07 10:00:00 | 2017-05-10 10:00:00 |
+--------+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql>
mysql> [「users」テーブルの「modified」が 2017年7月 のレコードを全フィールド抽出]
+----+--------+--------------------+------------+---------------------+---------------------+
| id | name   | email              | password   | created             | modified            |
+----+--------+--------------------+------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com    | maemae     | 2017-04-03 10:00:00 | 2017-07-15 10:00:00 |
|  4 | 指原   | sashihara@dummy.jp | sashisashi | 2017-07-14 10:00:00 | 2017-07-20 10:00:00 |
+----+--------+--------------------+------------+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql>
mysql> [「users」テーブルの「email」の トップレベルドメインが3文字(.com や .net など)のレコードを全フィールド抽出]
+----+--------+---------------------+----------+---------------------+---------------------+
| id | name   | email               | password | created             | modified            |
+----+--------+---------------------+----------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae   | 2017-04-03 10:00:00 | 2017-07-15 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takataka | 2017-04-07 10:00:00 | 2017-05-10 10:00:00 |
|  5 | 山本   | yamamoto@dummy.net  | yamayama | 2017-07-14 10:00:00 | 2017-08-10 10:00:00 |
+----+--------+---------------------+----------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql>
mysql> [「posts」テーブルの「content」に「こんにちは」という文字列を含むレコードを、「created」が 新しい順に3件、「title」、「content」、「created」 フィールドのみ抽出]
    ->   from posts
    ->   where content like '%こんにちは%'
    ->   order by created desc
    ->   limit 3;
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+
| title                             | content                                                                                                   | created             |
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+
| 限界です                          | こんにちは、もうブログを続けるのは限界です。                                                              | 2017-07-18 10:00:00 |
| また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 |
| おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 |
+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+
3 rows in set (0.00 sec)

mysql> 
解答例
chapter12/training.sql
-- 「users」テーブルの全レコードを「name」と「email」フィールドのみ抽出
select name, email from users;

-- 「users」テーブルの「created」が 2017年5月未満 でかつ「modified」が 2017年5月以降 のレコードを「name」と「created」と「modified」フィールドのみ抽出
select name, created, modified from users where created < '2017-05-01' and modified >= '2017-05-01';

-- 「users」テーブルの「modified」が 2017年7月 のレコードを全フィールド抽出
select * from users where modified between '2017-07-01' and '2017-07-31: 23:59:59';

-- 「users」テーブルの「email」の トップレベルドメインが3文字(.com や .net など)のレコードを全フィールド抽出
select * from users where email like '%.___';

-- 「posts」テーブルの「content」に「こんにちは」という文字列を含むレコードを、「created」が 新しい順に3件、「title」、「content」、「created」 フィールドのみ抽出
select title, content, created
  from posts
  where content like '%こんにちは%'
  order by created desc
  limit 3;

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめ レコードの抽出は、
SELECT構文。

SELECT構文は、非常によく使うレコードを抽出するための構文。

  • レコードの抽出は、SELECT構文。
  • 条件は、WHERE句。
  • 並び替えは、ORDER BY句。
  • 制限は、LIMIT句。