さて、第3回まででデータを入力するテーブルが完成したので、今回は実際にデータを入力/変更/追加して第1回の表1を再現していきましょう。

データの入力(INSERT文)

まずは、1人目の佐藤一郎君のデータを挿入します。直接端末に命令を打ち込むよりも、ご利用のテキストエディタに入力してコピー&ペーストすると見通しがよくなります。

mysql> insert into first
     >(name, jpn, math, eng, created, modified) values
     >('佐藤一郎', 94, 87, 60, now(), now());
Query OK, 1 row affected (0.00 sec)

データの挿入にはINSERT文を使います。「insert into first」という命令を和訳すると、「テーブルfirstに以下の情報を挿入せよ」となります。2行目以降を見ると、テーブルfirstの各フィールドであるname, jpn, math……などを指定した上で、個別の値を入力していることがわかると思います。valuesの前後で各データが対応していないと正しく入力されませんので、エラーが生じた場合には、「nameと佐藤一郎、jpnと94、……」というように、各フィールドと各データの1対1対応をチェックしてみてください。

それでは残りのメンバーのデータも入力していきましょう。以下のように一気に入力することができます。各メンバーの情報を区切るときには「, (カンマ)」を、最後のメンバーの情報の後に「; (セミコロン)」を付けることを忘れないようにしてください。

mysql> insert into first
     >(name, jpn, math, eng, created, modified) values
     >('鈴木二郎', 62, 80, 49, now(), now()),
     >('高橋三郎', 40, 77, 90, now(), now()),
     >('田中四郎', 78, 59, 42, now(), now()),
     >('伊藤五郎', 45, 87, 56, now(), now());
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0

ここに「id」が書かれていないことに気付かれた方もいるのではないかと思います。オプションで自動連番(auto_increment)を設定したため、各フィールドが追加される度に自動でidが割り振られています。また、now()は現在時刻を入力する関数です。

データの選択(SELECT文)

果たして、無事にデータは挿入できたのでしょうか。ここではテーブルに入力されたデータを操るためのSELECT文をご紹介します。

SELECT文の基本パターン

先ほど挿入したデータの内容を確認するためには、「select * from first」を実行します。すると、入力したデータがテーブルの形で表示されます。

mysql> select * from first;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  1 | 佐藤一郎 |  94 |   87 |  60 | 2015-05-14 04:49:07 | 2015-05-14 04:49:07 |
|  2 | 鈴木二郎 |  62 |   80 |  49 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  3 | 高橋三郎 |  40 |   77 |  90 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  4 | 田中四郎 |  78 |   59 |  42 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  5 | 伊藤五郎 |  42 |   87 |  56 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
+-------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

「select * from first;」は「first という名前のテーブルからすべてのデータ(*)を表示しなさい」という意味です。この「*(アスタリスク)」の意味を理解するために、以下の命令を実行してみます。

mysql> select name from first;
+-------------+
| name     |
+-------------+
| 佐藤一郎  |
| 鈴木二郎  |  
| 高橋三郎  | 
| 田中四郎  | 
| 伊藤五郎  |
+-------------+
5 rows in set (0.00 sec)

これは、「firstという名前のテーブルから氏名のデータ(name)を表示しなさい」という意味です。また、氏名と国語の得点を表示したい場合には、以下の命令を実行します。

mysql> select name, jpn from first;
+-------------+------+
| name     | jpn  |
+-------------+------+
| 佐藤一郎  |   94 |
| 鈴木二郎  |   62 |
| 高橋三郎  |   40 |
| 田中四郎  |   78 |
| 伊藤五郎  |   42 |
+-------------+------+
5 rows in set (0.00 sec)

また、「order by」を利用することでデータを昇順(あるいは降順)に並び替えることができます。

mysql> select * from first order by jpn;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  3 | 高橋三郎 |  40 |   77 |  90 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  5 | 伊藤五郎 |  42 |   87 |  56 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  2 | 鈴木二郎 |  62 |   80 |  49 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  4 | 田中四郎 |  78 |   59 |  42 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  1 | 佐藤一郎 |  94 |   87 |  60 | 2015-05-14 04:49:07 | 2015-05-14 04:49:07 |
+-------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

この場合、「order by jpn」ですので、国語の成績を昇順(小さい値から順番に並べること)で並び替えることになります。「order by jpn desc」とすることで降順(大きい値から順番に並べること)になります。

このように、SELECT文を使うことで、テーブル内のデータを自由に取り出したり並び替えたりすることができます。

SELECT文の応用パターン(条件付き抽出)

今回は、計5名の試験結果のみをテーブルに格納してあるので気になりませんが、たとえば、10,000人の受験者を抱える試験などの場合、全員分のデータを一覧表示しても有益な情報は得られません。そこで重要になるのが、条件付き抽出を行うための「where句」の利用です。たとえば、国語で90点以上の成績を収めた人物のみを呼び出すためには、以下の命令を実行します。

mysql> select * from first where jpn >= 90;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  1 | 佐藤一郎 |  94 |   87 |  60 | 2015-05-14 04:49:07 | 2015-05-14 04:49:07 |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)

「select * from first where jpn >= 90」を和訳すると、「firstという名前のテーブルから国語で90点以上獲得した人物の全データを抽出せよ」ということになります。where以下で「90点以下の人物だけを抽出」という条件を課しているということです。90点以下の人物を呼び出す場合は、不等号を逆にすることで同様に呼び出すことができます。

また、国語でちょうど90点を獲得した学生のみを呼び出すための命令は以下のようになります。

mysql> select * from first where jpn = 90;
Empty set (0.00 sec)

該当者がいない場合には、Empty setというメッセージが表示されます。「=(イコール)」の代わりに「!=(ノットイコール)」をすると、90点ではないすべての人物を抽出できます。

文字列を呼び出す場合には、必ず「’(シングル・クオテーション)」で囲むようにしてください。たとえば、高橋三郎君の成績を呼び出す場合は、以下のような命令になります。

mysql> select * from first where name = ‘高橋三郎’;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  3 | 高橋三郎 |  40 |   77 |  90 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)

しかし、すべての学生のフルネームを覚えているとは限りません。苗字しか覚えておらず高橋一郎なのか二郎なのか三郎なのか……というように悩んだ場合には、以下のように命令すれば呼び出すことができます。

mysql> select * from first where name like ‘高橋%’;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  3 | 高橋三郎 |  40 |   77 |  90 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)

%は任意の文字列を表しているため、テーブルに高橋六郎君、高橋七郎君の情報が登録されている場合には、この二名も同時に呼び出されることになります。逆に、名前しか覚えていなくて佐藤三郎君なのか山田三郎君なのか高橋三郎君なのか…というように悩んだ場合には、上記の「高橋%」を「%三郎」にすることで呼び出すことができます。

ほかにも、さまざまな命令を使いデータを絞り込むことができます。たとえば、国語の得点が40点~70点の範囲の学生を呼び出す場合には「between」を使います。

mysql> select * from first where jpn between 40 and 70;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  2 | 鈴木二郎 |  62 |   80 |  49 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  3 | 高橋三郎 |  40 |   77 |  90 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  5 | 伊藤五郎 |  42 |   87 |  56 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
+-------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

また、「or」を使うと、国語あるいは英語の得点が90点以上の人物を呼び出したりすることもできます。

mysql> select * from first where jpn >= 90 or eng >= 90;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  1 | 佐藤一郎 |  94 |   87 |  60 | 2015-05-14 04:49:07 | 2015-05-14 04:49:07 |
|  3 | 高橋三郎 |  40 |   77 |  90 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

上記の「or」を「and」に変えれば、国語と英語の両方の得点が90点以上の人物を呼び出せます。

以上は一例ではありますが、where句を利用することで、自分の思いどおりのデータを引き出せるようになるイメージは湧いたのではないかと思います。

データの修正(UPDATE文)

データベースに修正を加える場合には、UPDATE文を利用します。たとえば、高橋三郎君の国語の得点を40点から80点に変更する場合、以下のような命令になります。

mysql> update first set jpn = 80 where id = 3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

ここで使われた命令「update first set jpn = 80 where id = 3」を和訳すると、「firstという名前のテーブルのid=3(高橋三郎君)の国語の得点を80点に更新せよ」ということになります。この場合、英語や数学の得点などほかのデータは特に変更することはありません。もし、2つ以上のデータを更新したい場合には、以下のように「, (カンマ)」でつなぐと正しく変更することができます。

国語の得点を降順で表示すると、修正事項が反映されていることがわかります。

mysql> select * from first order by jpn desc;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  1 | 佐藤一郎 |  94 |   87 |  60 | 2015-05-14 04:49:07 | 2015-05-14 04:49:07 |
|  3 | 高橋三郎 |  80 |   90 |  70 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  4 | 田中四郎 |  78 |   59 |  42 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  2 | 鈴木二郎 |  62 |   80 |  49 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  5 | 伊藤五郎 |  42 |   87 |  56 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
+-------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

データの削除(DELETE文)

データを削除する場合には、DELETE文を使います。

mysql> delete from first where id = 3;
Query OK, 1 row affected (0.00 sec)

「delete from first where id = 3」を和訳すると、「firstという名前のテーブルのid=3(高橋三郎君)のデータを削除せよ」となります。where句以下を書かないとテーブル内のすべてのデータが消えることになるので、気をつけてください。

降順で表示すると、修正事項が反映されていることがわかります。

mysql> select * from first order by jpn desc;
+-------------------------------------------------------------------------------+
| id | name    | jpn | math | eng | created             | modified       |
+-------------------------------------------------------------------------------+
|  1 | 佐藤一郎 |  94 |   87 |  60 | 2015-05-14 04:49:07 | 2015-05-14 04:49:07 |
|  4 | 田中四郎 |  78 |   59 |  42 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  2 | 鈴木二郎 |  62 |   80 |  49 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
|  5 | 伊藤五郎 |  42 |   87 |  56 | 2015-05-14 04:56:38 | 2015-05-14 04:56:38 |
+-------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

フィールドの追加(ALTER文)

最後に、新しいフィールドを追加する場合を考えます。例えば、国語、数学、英語に加えて、理科の得点を加えたい場合の命令は、以下のようになります。

mysql> alter table first add sci int after eng;
Query OK, 4 row affected (0.04 sec)
Records; 4 Duplicates: 0 Warnings: 0

「alter table first add sci int after eng」を和訳すると、「firstという名前のテーブルのフィールドengの後ろにデータ型intのフィールドsciを追加せよ」となります。テーブルの構造を「desc first」で確認してみると、たしかに追加されていることがわかります。

mysql> desc first;
+-----------------------------------------------------------------+
| Field    | Type         | Null | Key | Default | Extra          |
+-----------------------------------------------------------------+
| id       | int          | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255) | YES  |     | NULL    |                |
| jpn      | int          | YES  |     | NULL    |                |
| math     | int          | YES  |     | NULL    |                |
| eng      | int          | YES  |     | NULL    |                |
| sci      | int          | YES  |     | NULL    |                |
| created  | datetime     | YES  |     | NULL    |                |
| modified | datetime     | YES  |     | NULL    |                |
+-----------------------------------------------------------------+
7 rows in set (0.00 sec)

また、テーブル内のフィールド名やデータ型を変更したい場合には、以下のような命令を使います。

mysql> alter table first change jpn phys int;
Query OK, 0 row affected (0.01 sec)
Records; 0 Duplicates: 0 Warnings: 0

フィールド名「jpn」をデータ型intのフィールド名「phys」に変更したということです。

執筆者紹介

RShibato

ITベンチャー企業の経営者。自社のWebサービスの開発・運営に携わりつつ、科学技術に関する書評や解説記事などの執筆活動も行っている。