第4回 データの登録と参照を覚えよう - MySQL講座

PHP基礎編

サカイ先生のMySQL講座

Lecutures on PHP

第4回 データの登録と参照を覚えよう (その4)

 このエントリーをはてなブックマークに追加

答えは順に以下のようになります。

mysql> SELECT * FROM kohaku WHERE year=2006;
+----+------+----------+------------+--------+
| no | year | aka_tori | shiro_tori | winner |
+----+------+----------+------------+--------+
| 57 | 2006 | 川中美幸 | 北島三郎   | 白     |
+----+------+----------+------------+--------+
1 row in set (0.00 sec)

mysql> SELECT * FROM kohaku WHERE no <= 54;
+----+------+------------+------------+--------+
| no | year | aka_tori   | shiro_tori | winner |
+----+------+------------+------------+--------+
| 52 | 2001 | 和田アキ子 | 北島三郎   | 白     |
| 53 | 2002 | 石川さゆり | 五木ひろし | 紅     |
| 54 | 2003 | 天童よしみ | SMAP       | 白     |
+----+------+------------+------------+--------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM kohaku WHERE winner IS NULL;
+----+------+----------+------------+--------+
| no | year | aka_tori | shiro_tori | winner |
+----+------+----------+------------+--------+
| 59 | 2008 | NULL     | NULL       | NULL   |
+----+------+----------+------------+--------+
1 row in set (0.02 sec)

 DISTINCTを指定すると、指定した列の重複なしの値を表示します。白組のトリを務めた人を重複なしで表示してみましょう。

mysql> SELECT DISTINCT shiro_tori FROM kohaku;
+------------+
| shiro_tori |
+------------+
| 北島三郎   |
| 五木ひろし |
| SMAP       |
| NULL       |
+------------+
4 rows in set (0.00 sec)

 おや。この数年間でたったの3人(組)しかいないことがわかりましたね(NULLは除く)。

 ここまで見てきた中で、「no」列がある場合は必ず no列の値順(あるいはyear列の値順)に並んで取り出してきたように見えますが、これは「偶然」だと思ってください。取り出す順序を指定していないのですから、順序は不定、わかりやすく言うと「順不同」であるのが保証された動作です。ややこしかったらとにかく「順序を指定しない時は順不同」だということを覚えておいてください。

 順序を指定するには ORDER BY 節を指定します。列名に続いて ASC は昇順、DESC は降順になります。また LIMIT を指定することで、指定した件数だけの表示を行うこともできます。LIMITに続いて数字を1つだけ指定した場合は先頭からその件数分だけを、2つ指定した場合は1つめで指定した位置から2つめで指定した件数分を表示します(位置は 0 から始まることに注意)。

 では、以下の条件で抽出をしてみましょう。

  • 年が新しいものから順に全データを表示する
  • 年が新しいもの順にならべた最初2件のデータを表示する
  • 年が新しいもの順にならべた5件目から3件のデータを表示する
mysql> SELECT * FROM kohaku ORDER BY year DESC;
+----+------+------------+------------+--------+
| no | year | aka_tori   | shiro_tori | winner |
+----+------+------------+------------+--------+
| 59 | 2008 | NULL       | NULL       | NULL   |
| 58 | 2007 | 石川さゆり | 五木ひろし | 白     |
| 57 | 2006 | 川中美幸   | 北島三郎   | 白     |
| 56 | 2005 | 天童よしみ | SMAP       | 白     |
| 55 | 2004 | 小林幸子   | 五木ひろし | 紅     |
| 54 | 2003 | 天童よしみ | SMAP       | 白     |
| 53 | 2002 | 石川さゆり | 五木ひろし | 紅     |
| 52 | 2001 | 和田アキ子 | 北島三郎   | 白     |
+----+------+------------+------------+--------+
8 rows in set (0.02 sec)

mysql> SELECT * FROM kohaku ORDER BY year DESC LIMIT 2;
+----+------+------------+------------+--------+
| no | year | aka_tori   | shiro_tori | winner |
+----+------+------------+------------+--------+
| 59 | 2008 | NULL       | NULL       | NULL   |
| 58 | 2007 | 石川さゆり | 五木ひろし | 白     |
+----+------+------------+------------+--------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM kohaku ORDER BY year DESC LIMIT 4,3;
+----+------+------------+------------+--------+
| no | year | aka_tori   | shiro_tori | winner |
+----+------+------------+------------+--------+
| 55 | 2004 | 小林幸子   | 五木ひろし | 紅     |
| 54 | 2003 | 天童よしみ | SMAP       | 白     |
| 53 | 2002 | 石川さゆり | 五木ひろし | 紅     |
+----+------+------------+------------+--------+
3 rows in set (0.00 sec)

 GROUP BY と HAVING についてはまた別の機会に紹介することにします。

おわりに

サカイ先生

 今回は最初にマニュアルの見方を覚えてから、INSERTとSELECTについて学びました。どうでしたか。SELECTについてはとても全部は紹介しきれませんでしたが、みなさんが実際のお仕事でSQLを使う場合も「いかにして抽出/集計するか」がデータベースを使いこなせるかどうかのキモとなるかと思います。別の機会に抽出/集計についてじっくり解説できたらいいなと思っていますので、そちらもお楽しみに。

 次回はすでに登録されているデータの更新と、削除について解説します。

 データ操作をするには、操作するテーブルの情報~たとえばテーブル名とかカラム名とか~をSQL文中に指定する必要があります。どんなテーブルかを知らないままSQLを書くことはできないので、テーブル名や列名、その列にどんな値が入っているか(数字とか文字とか)は、必ず念頭においておくかあるいはすぐに参照できる状態にしておきましょう。





  • サカイ先生

本名:坂井 恵(さかいけい)

有限会社アートライ 代表取締役

日本MySQLユーザ会(MyNA; http://www.mysql.gr.jp/) 副代表

システム開発で一番楽しいのは要件を決めて設計をするフェーズ。ここを楽しむために諸分野の基礎固めが重要だと考えている。
近著に『MySQL辞典』『MySQL徹底入門』(翔泳社) など。

ご意見・感想フォーム

今回の「サカイ先生のMySQL講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

  



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)