バックエンド

【MySQL】SQL文のつくり方のコツ〜ちょっとずつ組み立てる〜【初心者向け】

インターネットに繋いで使えるサービスは山ほどありますが、

  • ToDoリスト
  • 家計簿
  • 予約システム
  • タスク管理システム
  • 勤怠管理システム
  • 在庫管理システム
  • ブログ
  • マッチングサイト
  • ランキングサイト
  • ショッピングサイト
  • レビューサイト(口コミサイト)
  • 画像投稿(共有)サイト
  • 動画投稿(共有)サイト
  • 会員専用サイト

どのサービスにおいても必須と言える仕組みが『データベース』です。

その名の通り、『データ』を集めておく箱というか倉庫みたいな役割です。

もし『エクセル』でデータ管理しようとすると、
よくて数万件くらいがやっとだと思いますが、

『データベース』を使うと、
それこそ何百万件、何千万件というデータをさくっと扱う事ができます。

また、
『データベース』につないでデータを取り出したり保存したりする方法を、
『SQL(エスキューエル)』といいます。

  • SQL・・Structured Query Language 構造化された問い合わせ言語
アオキ
この『SQL(エスキューエル)』。仕組みはシンプルなんですがちょっと独特なので慣れるまでは扱いづらい・・

という事で今回は、

『データベース』の中でもWeb系なら一番メジャーと思われる
『mysql( マイエスキューエル)』のSQL文をちょっとずつ作ってみました。

※環境は、初心者対象という事で、
WIndowsならXAMPP(ザンプ)、MacならMAMP(マンプ)でいいと思います。

Sponsored link

mysql文のつくり方 テーブル構成

今回は3つのテーブルを使うことにしました。

  • hotelsテーブル
  • roomsテーブル
  • room_stocksテーブル

『mysql』は『リレーショナルデータベース(RDB)』と呼ばれ、
複数のテーブルを紐付けすることで、データを整理したり取り出したりできるようになっています。

  • hotelsテーブルにはホテル名の情報
  • roomsテーブルには、各ホテルが持っている部屋の名前
  • room_stocksテーブルは、各部屋の在庫状況

を表しています。

アオキ
まずは簡単なSQL文からつくってみます。

SQL文のつくり方 その1 ホテル番号を絞り込む

SQL文としてはこんな感じ。

SELECT * FROM `hotels` WHERE `hotel_id` = 'N00001';

取得できるデータはこう。

意味としては、

  • SELECT・・表示する行を決める (*だと全て)
  • FROM・・テーブルを選択する
  • WHERE・・検索条件

です。

アオキ
英語の単語ばかりなので慣れると読みやすいかなとは思います。

書き方のコツがあって、

いきなりSELECTから書くよりも、

  1. まずはFROMなんちゃらを書いて、
  2. WHEREで条件を書いて、
  3. 最後にSELECT文を書く

ようにした方がいいようです。

また、本当は 『SELECT * 』とすると必要ない情報も表示させてしまうので、

できるだけSELECT文は表示させる行だけを特定するようにした方がいいです。

SELECT `hotel_id` FROM `hotels` WHERE `hotel_id` = 'N00001';

アオキ
こうですね。
Sponsored link

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 という書き方をするんですが、

アオキ
hotelsやroomsがなんども出てきて見づらい・・

ということで、テーブルをくっつけるあたりから『as』を使った方がいいかなと思います。

Sponsored link

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`;

出力はこう。

アオキ
あえて 『SELECT *』で全部表示させています。(あとで絞っていきます。)

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を紐づけています。

アオキ
最初はややこしいですがちょっとずつ慣れていくはず・・
Sponsored link

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文と考え方は同じですね^^

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)

出力はこうなります。

Sponsored link

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文みたらなにがなんだか・・と思っちゃうと思いますが、

最初のSQL文

SELECT `hotel_id` FROM `hotels` WHERE `hotel_id` = 'N00001';

からちょっとずつ発展させて、ちょっとずつくっつけていくことで、
SQLの独特の動き方がちょっとずつわかってくるんじゃないかなと思います。

他にも『サブクエリ』という方法もあるのですが、それはまた違う機会に・・

  • サブクエリ・・表示した結果をもとに、再度SQL文をかける方法
アオキ
SQL文しっかりかけるようになると、
アオキ
いろんなWebシステムを自分で作れるようになるので、
アオキ
興味あればぜひやってみてください〜

『mysql』関係ではこんな記事も読まれています。

1. 【mysql】SQL文のつくり方のコツ〜ちょっとずつ組み立てる〜【初心者向け】

2. 【mysql】2つの条件でまとめて数値を合計したい【初心者向け】

3. 検索システムのデータベースの作り方や考え方を8ステップで書き連ねてみる

アオキ
ツイッターでも記事ネタ含めちょろちょろ書いていくので、よろしければぜひフォローお願いしますm(_ _ )m

アオキのツイッターアカウント


関連記事一覧 (一部広告あり)

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


最近の記事

アーカイブ

  1. オンライン教材

    【React】初心者向け講座をリリースしました【MUI】【Udemy】
  2. データベース

    MySQLの講座をリリースしました
  3. オンライン教材

    ChatGPTをビジネス活用する講座をリリースしました【Udemy】
  4. バックエンド

    【Laravel第4弾】Vue.js3(CompositionAPI+Scrip…
  5. オンライン教材

    【ChatGPT】エンジニア編をリリースしました
PAGE TOP
Ads Blocker Image Powered by Code Help Pro

広告ブロックを摘出しました!!

ブラウザ拡張を使用して広告をブロックしていることが摘出されました。

ブラウザの広告ブロッカーの機能を無効にするか、
当サイトのドメインをホワイトリストに追加し、「更新」をクリックして下さい。

あなたが広告をブロックする権利があるように、
当方も広告をブロックしている人にコンテンツを提供しない権利と自由があります。

Powered By
100% Free SEO Tools - Tool Kits PRO