ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

MySQL入門 - レコードの抽出方法

前回、レコードを挿入する方法を確認した。

azuuun-memorandum.hatenablog.com

今回は、SELECT文を使います。

余談だけど、基本情報の出題範囲でSQLの勉強をしたことがあったんだけどいまいちパットしなかった。でも、実際にMySQLを使ってレコードを抽出したりする中で、あぁ~なるほどな~と思うことも少しあったので、やっぱ実際にいじれる環境を作れるのなら、いじってみるのがいいと再確認しました。(基本情報勉強してた時は思いつきもしなかったけど…)

例えば午前問題のこの問題は今やってるレコードの抽出に関するところです。

問30 SQL文の結果 平成24年春期|基本情報技術者試験.com

RDBMSは、データを格納するだけでなく大量のデータから欲しい情報を検索して抽出するのが得意。

ではさっそく、そのデータを検索し抽出する方法を確認する。

レコードを抽出する

新しくusersテーブルを作ります。(既にusersテーブルがある場合は削除するか名称を変更)

create table users (
    id int not null auto_increment primary key,
    name varchar(255),
    email varchar(255) unique,
    team enum('Rilakkuma', 'Pooh', 'Kumamon'),
    score double,
    created datetime
);

前回の記事のテーブルから若干の簡易なものに変更しました。

レコードの挿入は、insert into [レコード名]です。

insert into users (name,email,team,score,created) values
('azuuun', 'azuuun@hatena.hoge.com','Rilakkuma',6.2,'2015-05-04 15:25:00'),
('tuna', 'tuna@hatena.hoge.com','Pooh',4.6,'2015-02-06 15:25:00'),
('salmon', 'salmon@hatena.hoge.jp','Rilakkuma',10.0,'2015-04-04 12:25:00'),
('shrimp', 'shrimp@hatena.hoge.com','Kumamon',2.3,'2014-01-04 12:23:00'),
('arkshell', '','Pooh',7.3,'2015-05-04 22:21:00'),
('omelet', 'omelet@hatena.hoge.jp','Kumamon',0.2,'2015-03-04 11:25:00');

6つのレコードを挿入しました。レコードを複数挿入する際は',(カンマ)'で区切って最後に';(セミコロン)'で。

usersテーブルのレコードを全て抽出してみます。

mysql> select * from users;
命令 意味
select 抽出しなさい
* 全てのフィールド
from users userテーブルから

つまり、usersテーブルからすべてのフィールドを抽出しなさいという命令。これもレコードの抽出です。

+----+----------+------------------------+-----------+-------+---------------------+
| id | name     | email                  | team      | score | created             |
+----+----------+------------------------+-----------+-------+---------------------+
|  1 | azuuun   | azuuun@hatena.hoge.com | Rilakkuma |   6.2 | 2015-05-04 15:25:00 |
|  2 | tuna     | tuna@hatena.hoge.com   | Pooh      |   4.6 | 2015-02-06 15:25:00 |
|  3 | salmon   | salmon@hatena.hoge.jp  | Rilakkuma |    10 | 2015-04-04 12:25:00 |
|  4 | shrimp   | shrimp@hatena.hoge.com | Kumamon   |   2.3 | 2014-01-04 12:23:00 |
|  5 | arkshell |                        | Pooh      |   7.3 | 2015-05-04 22:21:00 |
|  6 | omelet   | omelet@hatena.hoge.jp  | Kumamon   |   0.2 | 2015-03-04 11:25:00 |
+----+----------+------------------------+-----------+-------+---------------------+

無事挿入したレコードが全て抽出できているのが確認できる。

名前が寿司のネタでチーム名がクマ関連でカオス感がすごい。

全てのフィールドを一気に抽出してしまうとフィールド数が多い場合に横に長い表組みになってしまう場合がある。そいった場合は、

mysql> select * from users \G

(この場合セミコロンは不要)

こう実行すると

*************************** 1. row ***************************
     id: 1
   name: azuuun
  email: azuuun@hatena.hoge.com
   team: Rilakkuma
  score: 6.2
created: 2015-05-04 15:25:00
*************************** 2. row ***************************
     id: 2
   name: tuna
  email: tuna@hatena.hoge.com
   team: Pooh
  score: 4.6
created: 2015-02-06 15:25:00
*************************** 3. row ***************************
     id: 3
   name: salmon
  email: salmon@hatena.hoge.jp
   team: Rilakkuma
  score: 10
created: 2015-04-04 12:25:00

(※4.row以降省略)

このように、フィールドを縦に表示してくれるので見やすく表示できます。

レコードを抽出する

usersテーブルから名前とemailのフィールドのみ抽出する

mysql> select name,email from users;

すべての場合はアスタリスクだったのに対して、今回はname,emailを指定している。

+----------+------------------------+
| name     | email                  |
+----------+------------------------+
| azuuun   | azuuun@hatena.hoge.com |
| tuna     | tuna@hatena.hoge.com   |
| salmon   | salmon@hatena.hoge.jp  |
| shrimp   | shrimp@hatena.hoge.com |
| arkshell |                        |
| omelet   | omelet@hatena.hoge.jp  |
+----------+------------------------+

うまく抽出できている。

usersテーブルから全てのフィールドを"スコアが3以上"という条件に合致するレコードを抽出する

select * from users where score >= 3;
+----+----------+------------------------+-----------+-------+---------------------+
| id | name     | email                  | team      | score | created             |
+----+----------+------------------------+-----------+-------+---------------------+
|  1 | azuuun   | azuuun@hatena.hoge.com | Rilakkuma |   6.2 | 2015-05-04 15:25:00 |
|  2 | tuna     | tuna@hatena.hoge.com   | Pooh      |   4.6 | 2015-02-06 15:25:00 |
|  3 | salmon   | salmon@hatena.hoge.jp  | Rilakkuma |    10 | 2015-04-04 12:25:00 |
|  5 | arkshell |                        | Pooh      |   7.3 | 2015-05-04 22:21:00 |
+----+----------+------------------------+-----------+-------+---------------------+

usersテーブルからname, teamフィールドのみ "teamがKumamon"という条件に合致するレコードを抽出する

mysql> select name,team from users where team = 'Kumamon';
+--------+---------+
| name   | team    |
+--------+---------+
| shrimp | Kumamon |
| omelet | Kumamon |
+--------+---------+

usersテーブルからname,emailフィールドのみ "emailに'@hatena.hoge.com'含まれる"という条件に合致するレコードを抽出する

あいまいな検索をするときは like を使う。

likeには、'%'と'_'の2つの記号がある。いわゆるワイルドカードです。

  • %:任意の0文字以上の文字列

  • _:任意の一文字

mysql> select name,email from users where email like '%@hatena.hoge.com';
+--------+------------------------+
| name   | email                  |
+--------+------------------------+
| azuuun | azuuun@hatena.hoge.com |
| tuna   | tuna@hatena.hoge.com   |
| shrimp | shrimp@hatena.hoge.com |
+--------+------------------------+

usersテーブルからid,emailフィールドのみ "emailに'@hatena.hoge.[任意の2文字]'が含まれる"という条件に合致するレコードを抽出する

mysql> select id,email from users where email like '%@hatena.hoge.__';
+----+-----------------------+
| id | email                 |
+----+-----------------------+
|  6 | omelet@hatena.hoge.jp |
|  3 | salmon@hatena.hoge.jp |
+----+-----------------------+

usersテーブルから全てのフィールドを "スコアが5以上8以下"という条件に合致するレコードを抽出する

betweenは範囲を指定する際に使う。

mysql> select * from users where score between 5.0 and 8.0;
+----+----------+------------------------+-----------+-------+---------------------+
| id | name     | email                  | team      | score | created             |
+----+----------+------------------------+-----------+-------+---------------------+
|  1 | azuuun   | azuuun@hatena.hoge.com | Rilakkuma |   6.2 | 2015-05-04 15:25:00 |
|  5 | arkshell |                        | Pooh      |   7.3 | 2015-05-04 22:21:00 |
+----+----------+------------------------+-----------+-------+---------------------+

usersテーブルから全てのフィールドを "teamが'Pooh'か'Kumamon'"という条件に合致するレコードを抽出する

inはあらかじめ設定された値の中でどれか一つにあてはまるかどうかを調べる時に使う。

mysql> select * from users where team in ('Pooh', 'Kumamon');
+----+----------+------------------------+---------+-------+---------------------+
| id | name     | email                  | team    | score | created             |
+----+----------+------------------------+---------+-------+---------------------+
|  2 | tuna     | tuna@hatena.hoge.com   | Pooh    |   4.6 | 2015-02-06 15:25:00 |
|  4 | shrimp   | shrimp@hatena.hoge.com | Kumamon |   2.3 | 2014-01-04 12:23:00 |
|  5 | arkshell |                        | Pooh    |   7.3 | 2015-05-04 22:21:00 |
|  6 | omelet   | omelet@hatena.hoge.jp  | Kumamon |   0.2 | 2015-03-04 11:25:00 |
+----+----------+------------------------+---------+-------+---------------------+

これまで使ってきた検索手法を and や or を使って組み合わせて条件式を作る

例えば 「usersテーブルから全てのフィールドを "スコアが4以上 かつ チームが’Rilakkuma'」という条件に合致するレコ^ドを抽出する」

かつの部分で2つの条件を合わせて抽出しています

mysql> select * from users where score >= 4.0 and team = 'Rilakkuma';
+----+--------+------------------------+-----------+-------+---------------------+
| id | name   | email                  | team      | score | created             |
+----+--------+------------------------+-----------+-------+---------------------+
|  1 | azuuun | azuuun@hatena.hoge.com | Rilakkuma |   6.2 | 2015-05-04 15:25:00 |
|  3 | salmon | salmon@hatena.hoge.jp  | Rilakkuma |    10 | 2015-04-04 12:25:00 |
+----+--------+------------------------+-----------+-------+---------------------+


だいたいの検索は上記で確認した条件句を and や or で組み合わせることで実現することができ、自在にデータを引っ張ってくることが可能。

今回はここまで。