PH2 トップ / W1
W1|データベースと SELECT
PH2 で育てていく POSSE大学の時間割アプリは、最初は授業の一覧が HTML に直接書かれたページです。授業が1つ増えたり教室が変わったりするたびに、HTML を書き換えなければなりません。授業が何百もある大学では、とても続けられない作り方です。
そこで、授業のデータはデータベースにまとめて入れておき、画面に出すときに「月曜の授業だけ」「必修の授業だけ」と必要な分だけ取り出すようにします。この「取り出し方」を書く言葉が SQL です。今週は、その中でいちばんよく使う SELECT を使えるようにします。W3 で Laravel に入ると、今週書いた SQL が、そのまま時間割ページを表示する部品になります。
今週の全体像
| 学ぶこと | データベース・テーブル・カラム・レコード、SELECT / FROM / WHERE / AND / OR / IS NULL / LIKE / ORDER BY / LIMIT |
| 作るもの | 時間割ページの6つの区画と同じ結果を返す SQL(sql/w01.sql) |
| できるようになること | 条件を組み合わせた SELECT を書き、欲しいデータだけを取り出せる |
| 時間の目安 | インプット 1.5時間、ミニドリル 1〜1.5時間、POSSE課題 4時間、Docker の準備 30〜45分 |
インプットとミニドリルでは AI を使わないでください。
インプット
スライドを順番に読みます。スマホでも読めます。
- データベースってなに?:データベースが何のためにあるのか、テーブル・カラム・レコードとは何か
- SELECTでデータを取り出す:
SELECTの書き方と、条件での絞り込み・並べ替え
スライドに出てくる SQL は、スライドと同じデータの練習場 で実際に動かせます。読むだけで終わらせず、1つずつ書き写して実行し、結果がスライドと同じになることを確かめてください。
ミニドリル:SQL事件簿 第1章
POSSE大学で、期末試験の問題が流出しました。教員室の入退室記録を SQL で調べて、事件の夜に教員室にいた人を突き止めます。
問は3つあります。問ごとに SQL を書いて「エディタの SQL で答える」を押すと、その SQL を実行した結果で正解かどうかを判定します。目で数えた答えではなく、書いた SQL そのものが判定の対象です。
SQL を書き始める前に、問ごとに次の2つをノートに書き出してください。
- どのカラムを、どんな条件で絞るか(例:
buildingがJ棟) - 条件が2つ以上あるとき、
ANDでつなぐのかORでつなぐのか
事件の続きは W2・W3・W4 で解いていきます。
POSSE課題:直書きの時間割ページを、SQL で再現する
やること
テンプレートの index.html は、POSSE大学の学務ポータルにある時間割ページです。「月曜日の授業」「必修科目」など6つの区画があり、どの区画も授業が HTML に直接書かれています。
同じ授業のデータが、データベースの courses テーブルに入っています。各区画に表示されているのと同じ結果を返す SELECT 文を書いてください。答えは画面に見えているので、「この表を出すには、どの条件で絞って、どの順番に並べればいいか」を考えるのが今週の課題です。
手順
-
テンプレートを fork する
posse-ap/template-ph2-timetable を開き、右上の「Fork」を押します。「Owner」が自分のアカウントになっていることを確かめて「Create fork」を押すと、自分のアカウントにリポジトリの複製ができます。このリポジトリは PH2 の16週を通して使います。
-
自分の PC に clone する
fork した自分のリポジトリ(
自分のアカウント名/template-ph2-timetable)の「Code」ボタンから SSH の URL をコピーし、ターミナルで clone します。git clone git@github.com:自分のアカウント名/template-ph2-timetable.git cd template-ph2-timetable -
作業用のブランチを作る
git switch -c w01 -
時間割ページを開いて、6つの区画を見る
VSCode でフォルダを開き、
index.htmlを Live Server で表示します。区画ごとに、表示されている授業と並び順を確かめておきます。 -
SQL練習場で、区画ごとに SQL を書いて確かめる
SQL練習場(授業データ) を開きます。ここには
index.htmlと同じ授業データが入っています。区画1から順にSELECTを書いて実行し、結果が区画の表と同じ行・同じ順番になるまで直します。 -
sql/w01.sqlに書き写す確かめた SQL を、
sql/w01.sqlの各区画のコメントの下に書きます。 -
commit して push する
git add sql/w01.sql git commit -m "W1: 時間割ページの各区画を SELECT で再現" git push -u origin w01 -
自分のリポジトリの main に向けて PR を作る
GitHub で自分のリポジトリを開き、「Compare & pull request」を押します。本文には、下の「PR本文に書くこと」をコピーして埋めてください。
PR の送り先に注意fork したリポジトリで PR を作ると、送り先(base repository)が最初は
posse-ap/template-ph2-timetableになっています。これは全員が共有している元のリポジトリです。必ず「base repository」を自分の自分のアカウント名/template-ph2-timetableに変え、main←w01になっていることを確かめてから PR を作ってください。 -
PR の URL を提出する
気をつけること
- 曜日(
day)は、データでは 1(月)〜 5(金)の数字です。画面では「月」「火」と表示していますが、SQL の結果は数字のままでかまいません - 区画1の「同じ時限の授業」のように、並べ替えのキーが同じ行どうしの順番は問いません
- 区画ごとに、画面に出ている列だけを取り出してください(
SELECT *ではなく、列名を書く)
PR本文に書くこと
## 確認結果
SQL練習場で実行したときの行数(区画の表と同じになったか):
- 区画1: 行
- 区画2: 行
- 区画3: 行
- 区画4: 行
- 区画5: 行
- 区画6: 行
## 判断の記録
条件の書き方で迷った場面を1つ書く:
- 選択肢A(例: room = 'J101' OR room = 'J201' … と並べる):
- 選択肢B(例: room LIKE 'J%' と書く):
- 採用した理由:
- 確認方法:
## AI利用
AIを使った場合は記入(使わなかった場合は「不使用」):
- 使ったAIツール:
- 何を依頼したか:
- 自分で修正した箇所:
### AIとの比較(必須)
区画3〜区画6のどれか1つを AI にも書かせ、SQL練習場で実行して自分の結果と比べる:
- AI が書いた SQL:
- 区画の表と一致したか:
- 違った場合、どこが違ったか、その理由:
発展(任意)
- 区画にない条件で、自分が来学期に取りたい授業を探す SQL を2つ考え、
sql/w01.sqlの最後に問いの文と一緒に書く
Docker Desktop の準備(W2 までに)
W2 から Docker を使います。入れるのに時間がかかったり、つまずいたりする人が出やすいので、今週のうちに入れて、動くことを確かめておいてください。
チェックポイント
- スライド2つを読み、スライドの SQL を練習場で実行した
- SQL事件簿 第1章の問1〜問3を解いた
- テンプレートを fork・clone し、
w01ブランチで作業した -
sql/w01.sqlの区画1〜6に SQL を書き、それぞれ区画の表と一致することを確かめた - 自分のリポジトリの
mainに向けて PR を作り、本文の確認結果・判断の記録・AIとの比較を書いた - Docker Desktop を入れ、
docker run hello-worldが成功した
参考資料
教材を読み終えてから、必要に応じて参照してください。