第4回 データの登録と参照を覚えよう - MySQL講座
サカイ先生の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を書くことはできないので、テーブル名や列名、その列にどんな値が入っているか(数字とか文字とか)は、必ず念頭においておくかあるいはすぐに参照できる状態にしておきましょう。
その他の記事も見る
- 第1回 データベースの世界へ足を踏み入れよう
- 第2回 MySQLをインストールしよう
- 第3回 テーブルとデータ操作のガイドツアー
- 第4回 データの登録と参照を覚えよう
- 第5回 データの更新と削除を覚えよう
- 第6回 この連載で学んだことって!?
- 第7回 ローカル環境を作ろう
- 第8回 データを登録しよう
- 第9回 サンプルテーブルのレイアウトを把握しよう(1)
- 第10回 実践的検索操作を学ぼう(1)
- 第11回 実践的検索操作を学ぼう(2)
- 第12回 実践的検索操作を学ぼう(3)
- 第13回 実践的検索操作を学ぼう(4)
- 第14回 実践的検索操作の総まとめ
- 第15回 更新処理を覚えよう
- 第16回 テーブル定義の変更と応用練習
- 第17回 その他のちょっとしたテクニック
- >>「サカイ先生のMySQL講座」一覧ページに戻る
- サカイ先生
本名:坂井 恵(さかいけい)
有限会社アートライ 代表取締役
日本MySQLユーザ会(MyNA; http://www.mysql.gr.jp/) 副代表
システム開発で一番楽しいのは要件を決めて設計をするフェーズ。ここを楽しむために諸分野の基礎固めが重要だと考えている。
近著に『MySQL辞典』『MySQL徹底入門』(翔泳社) など。




ページのトップへ


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