インターネットに繋いで使えるサービスは山ほどありますが、
- ToDoリスト
- 家計簿
- 予約システム
- タスク管理システム
- 勤怠管理システム
- 在庫管理システム
- ブログ
- マッチングサイト
- ランキングサイト
- ショッピングサイト
- レビューサイト(口コミサイト)
- 画像投稿(共有)サイト
- 動画投稿(共有)サイト
- 会員専用サイト
どのサービスにおいても必須と言える仕組みが『データベース』です。
その名の通り、『データ』を集めておく箱というか倉庫みたいな役割です。
もし『エクセル』でデータ管理しようとすると、
よくて数万件くらいがやっとだと思いますが、
『データベース』を使うと、
それこそ何百万件、何千万件というデータをさくっと扱う事ができます。
また、
『データベース』につないでデータを取り出したり保存したりする方法を、
『SQL(エスキューエル)』といいます。
- SQL・・Structured Query Language 構造化された問い合わせ言語
という事で今回は、
『データベース』の中でもWeb系なら一番メジャーと思われる
『mysql( マイエスキューエル)』のSQL文をちょっとずつ作ってみました。
※環境は、初心者対象という事で、
WIndowsならXAMPP(ザンプ)、MacならMAMP(マンプ)でいいと思います。
mysql文のつくり方 テーブル構成
今回は3つのテーブルを使うことにしました。
- hotelsテーブル
- roomsテーブル
- room_stocksテーブル
『mysql』は『リレーショナルデータベース(RDB)』と呼ばれ、
複数のテーブルを紐付けすることで、データを整理したり取り出したりできるようになっています。
- hotelsテーブルにはホテル名の情報
- roomsテーブルには、各ホテルが持っている部屋の名前
- room_stocksテーブルは、各部屋の在庫状況
を表しています。
SQL文のつくり方 その1 ホテル番号を絞り込む
SQL文としてはこんな感じ。
SELECT * FROM `hotels` WHERE `hotel_id` = 'N00001';
取得できるデータはこう。
意味としては、
- SELECT・・表示する行を決める (*だと全て)
- FROM・・テーブルを選択する
- WHERE・・検索条件
です。
書き方のコツがあって、
いきなりSELECTから書くよりも、
- まずはFROMなんちゃらを書いて、
- WHEREで条件を書いて、
- 最後にSELECT文を書く
ようにした方がいいようです。
また、本当は 『SELECT * 』とすると必要ない情報も表示させてしまうので、
できるだけSELECT文は表示させる行だけを特定するようにした方がいいです。
SELECT `hotel_id` FROM `hotels` WHERE `hotel_id` = 'N00001';
SQL文のつくり方 その2 ホテルに紐づく部屋を取り出す
続いては『リレーショナルデータベース(RDB)』の真骨頂、テーブルの紐付け。
イメージとしてはこんな感じです。
カツ丼ホテルにはシングルルームとダブルルームとトリプルルームがあると。
出力はこうなります。
SQL文はこう。
SELECT h.`hotel_id`, r.`room_id`, r.`name` FROM `hotels` as h, `rooms` as r WHERE h.`hotel_id` = r.`hotel_id` AND h.`hotel_id` = 'N00001';
ちょっとずつ分解してみます。
SELECTは置いておいて、まずはFROM。
FROM `hotels` as h, `rooms` as r
FROMはデータを取り出すテーブルを指定するので、
今回はhotelsテーブルとroomsテーブルの2つになります。
『as』という単語をつけることで、
- hotelsテーブルを h
- rooms テーブルをr
と短く書き換えられるようにしています。
続いて、検索条件のWHERE。
WHERE h.`hotel_id` = r.`hotel_id`
先ほど『as』を使って、
hotelsテーブルの事を h と書き換えたので、
WHERE句の意味は
hotelsテーブルのhotel_id と、roomsテーブルのhotel_idが同じ
という条件になります。
これを書く事で、2つのテーブルが紐づいて、一度に表示できるようになるんですね。
よくよく見ると、
今回のWHEREにはANDという条件もついています。
WHERE h.`hotel_id` = r.`hotel_id` AND h.`hotel_id` = 'N00001';
hotelsテーブルのhotel_idと、roomsテーブルのhotel_idが同じで、
さらに hotelsテーブルのhotel_idが N00001
という条件になってます。
で、最後にSELECTで表示させる行を決めます。
SELECT h.`hotel_id`, r.`room_id`, r.`name`
出力結果はこうなります。
ちなみに、『as』を使わないで書くこともできるんですが、
『as』を使わないと今回のSQL文はこうなります。
SELECT hotels.`hotel_id`, rooms.`room_id`, rooms.`name` FROM `hotels` , `rooms` WHERE hotels.`hotel_id` = rooms.`hotel_id` AND hotels.`hotel_id` = 'N00001';
FROMで2つ以上のテーブルを指定する場合、
例えばhotel_idはどちらのテーブルにも存在するので、
どっちのテーブルのhotel_idか というのを特定するために、
hotels.hotel_id や rooms.hotel_id という書き方をするんですが、
ということで、テーブルをくっつけるあたりから『as』を使った方がいいかなと思います。
SQL文のつくり方 その3 大人3名で予約できる部屋を表示する
ちょっとおまけ的ですが、SQL文では いろんな計算もできます。
SQL文としてはこんな感じ。
SELECT h.`hotel_id`, r.`room_id`, r.`name`, r.`min`, r.`max` FROM `hotels` as h, `rooms` as r WHERE h.`hotel_id` = r.`hotel_id` AND h.`hotel_id` = 'N00001' AND r.`min` <= 3 AND r.`max` >= 3
出力はこう。
検索条件は、見ればわかると思います。
WHERE h.`hotel_id` = r.`hotel_id` AND h.`hotel_id` = 'N00001' AND r.`min` <= 3 AND r.`max` >= 3
合計4つの検索条件ですが、後半2つで、
- AND r.
min
<= 3 ・・min(最小定員数)が3以下で - AND r.
max
>= 3 ・・max(最大定員数)が3以上
という条件で表示させています。
もちろん + や – なども扱えます。
SQL文のつくり方 その4 3つのテーブルを紐づける
イメージはこんな感じ。
SQL文はこう。
SELECT * FROM `hotels` as h INNER JOIN `rooms` as r ON h.`hotel_id` = r.`hotel_id` INNER JOIN `room_stocks` as rs ON r.`room_id` = rs.`room_id`;
出力はこう。
SQL文の説明ですが、
複数のテーブルを紐づけるには、JOINという命令を使う必要があり、
今回は『INNER JOIN(内部結合)』を使っています。
※他にも外部結合がありますが今回は説明省きます。
FROM hotels
as h で一つ目のテーブルを指定して、
INNER JOIN `rooms` as r ON h.`hotel_id` = r.`hotel_id`
という書き方で、 hotelsテーブルのhotel_idとroomsテーブルのhotel_idを紐づけます。
次に、
INNER JOIN `room_stocks` as rs ON r.`room_id` = rs.`room_id`;
という書き方で、roomsテーブルのroom_idと、room_stocksテーブルのroom_idを紐づけています。
SQL文のつくり方 その5 3つのテーブルを紐づけて、selectを絞ってホテルも指定
SQL文はこう。
SELECT h.`hotel_id`, r.`room_id`, rs.`date`, rs.`stock` FROM `hotels` as h INNER JOIN `rooms` as r ON h.`hotel_id` = r.`hotel_id` INNER JOIN `room_stocks` as rs ON r.`room_id` = rs.`room_id` WHERE h.`hotel_id` = 'N00001';
出力結果はこう。
SELECT文で表示させる行を決めて、WHEREでホテルIDを絞ってます。
SQL文のつくり方 その6 3つのテーブル紐付けて、selectもホテルも部屋も絞り日付でソート
SQL文はこう。
SELECT h.`hotel_id`, r.`room_id`, rs.`date`, rs.`stock` FROM `hotels` as h INNER JOIN `rooms` as r ON h.`hotel_id` = r.`hotel_id` INNER JOIN `room_stocks` as rs ON r.`room_id` = rs.`room_id` WHERE h.`hotel_id` = 'N00001' AND r.`room_id` = 'R001' ORDER BY `date`;
新しいのは、『ORDER BY(オーダーバイ)』くらいでしょうか。
昇順、または逆順で順番通りに並び替えてくれます。(逆順は ORDER BY date
ASC)
出力はこうなります。
SQL文のつくり方 その7 3つのテーブル紐付けて、いろいろ絞って期間指定
SQL文はこう。
SELECT h.`hotel_id`, r.`room_id`, rs.`date`, rs.`stock` FROM `hotels` as h INNER JOIN `rooms` as r ON h.`hotel_id` = r.`hotel_id` INNER JOIN `room_stocks` as rs ON r.`room_id` = rs.`room_id` WHERE h.`hotel_id` = 'N00001' AND r.`room_id` = 'R001' AND rs.`date` BETWEEN '2019-03-01' AND '2019-03-02' ORDER BY `date`;
出力結果はこう。
新しいSQL文は、『BETWEEN 〜 AND 〜』 くらい。
英語と同じで AとBの間という意味になります。
最初のSQL文
SELECT `hotel_id` FROM `hotels` WHERE `hotel_id` = 'N00001';
からちょっとずつ発展させて、ちょっとずつくっつけていくことで、
SQLの独特の動き方がちょっとずつわかってくるんじゃないかなと思います。
他にも『サブクエリ』という方法もあるのですが、それはまた違う機会に・・
- サブクエリ・・表示した結果をもとに、再度SQL文をかける方法
『mysql』関係ではこんな記事も読まれています。
1. 【mysql】SQL文のつくり方のコツ〜ちょっとずつ組み立てる〜【初心者向け】2. 【mysql】2つの条件でまとめて数値を合計したい【初心者向け】
3. 検索システムのデータベースの作り方や考え方を8ステップで書き連ねてみる
アオキのツイッターアカウント。
この記事へのコメントはありません。