教材ライブラリ
授業で使うスライド、触って動かせる図解、レッスンの導入スライドをまとめています。 左のリストで絞り込むか、キーワードで検索してください。
17 件(合計 78 枚)
Linux入門
ping で遅延を測る
Linux入門 - ping で遅延を測る
ping で遅延を測る
ping は相手に小さなデータを送って、返ってくるまでの時間を測るコマンドです。返ってきた時間 (RTT) は、相手のおおまかな遠さの目安になります。
この time= の数字が何で決まるのかを、このあとの2つの図解で自分で確かめます。
ping を打つと、1 往復ごとにこの 1 行が返ってきます。
64 bytes from 10.0.0.1: time=1.2 ms1 / 5
Linux入門 - ping で遅延を測る
近いところを測る
3か所を順に押して、往復時間の伸び方を見てください。
- 同じ建物の中でも 0 にはならない。機器を通るぶんの時間が必ず乗る
- 距離が10倍でも時間は10倍にならない。固定の下駄があるぶん、伸び方はゆるい
2 / 5
考えてみよう外しても進めます
アメリカ西海岸までの往復は何 ms くらいだと思いますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
3 / 5
Linux入門 - ping で遅延を測る
遠いところを測る
2か所を押して、近いところとの桁の違いを見てください。
- 国内が 1〜10 ms なのに対し、海をまたぐと 100 ms 台に跳ねる
- 光が海底ケーブルを往復する時間そのものなので、機材を替えても縮まない
4 / 5
Linux入門 - ping で遅延を測る
測った結果
5か所の往復時間を並べると、距離が伸びるほど往復時間も伸びるのが分かります。近いところでも 0 にならないのは、機器を通るぶんの固定の下駄があるからです。
サイトが遅いときは、相手が遠いか経路が混んでいるかを疑います。
| 距離 | 往復時間 |
|---|---|
| 同じ建物 (約 50 m) | 0.38 ms |
| 東京 (約 40 km) | 1.2 ms |
| 大阪 (約 400 km) | 9.0 ms |
| アメリカ西海岸 (約 8,000 km) | 105 ms |
| 地球の裏側 (約 20,000 km) | 242 ms |
5 / 5
SQL入門
ファイルではなくデータベースを使う理由
SQL入門 - ファイルではなくデータベースを使う理由
保存するだけならファイルでもできる
在庫数をテキストファイルに書いておけば、たしかに保存はできます。それでも業務システムがデータベースを使うのは、保存できるかどうかとは別の理由があるからです。
1人で使っているうちは、この方法で何の問題も起きません。問題が出るのは2人目からです。
在庫数を書いたファイルを開くと、中身はこれだけです。
$ cat stock.txt
1001 / 3
SQL入門 - ファイルではなくデータベースを使う理由
2人が同時に直すとどうなるか
手順を最後まで送って、ファイルと DBMS の結果を見比べてください。
- 2人とも古い 100 を読んでから書くので、あとに書いたほうで上書きされる
- エラーは出ない。消えたことに誰も気づかないまま話が進む
- DBMS は読んだ行に鍵をかけて、片方を待たせることでこれを防ぐ
2 / 3
SQL入門 - ファイルではなくデータベースを使う理由
DBMS が肩代わりしていること
同時に触られたときの整理は、その一部にすぎません。自分で書くと大変なものを、DBMS があらかじめ引き受けてくれています。
この表の右側を扱う言葉が SQL です。次のレッスンから、その書き方に入ります。
| ファイルだと自分でやること | DBMS がやってくれること |
|---|---|
| 同時に書かれたときの順番付け | 行に鍵をかけて待たせる |
| 途中で落ちたときの巻き戻し | トランザクション |
| 変な値が入らないようにする | 型と制約 |
| 大量の行から目的の行を探す | インデックス |
| 誰がどこまで見てよいか | 権限 |
3 / 3
SQL入門
なぜ表を分けて持つのか
SQL入門 - なぜ表を分けて持つのか
1つの表に全部書いてみる
注文を記録する表に、ついでに顧客名とメールも書いておけば、その表を見るだけで済みます。実際に書いてみると、同じ人が2回目の注文をした時点で困りごとが出てきます。
同じメールが2行に書かれています。3回目、4回目と注文が増えたらどうなるかを、次の枚で見てください。
田中さんが 2 回注文すると、表はこうなります。
注文ID 顧客名 メール 金額
1001 田中 tanaka@x.com 2500
1003 田中 tanaka@x.com 13001 / 4
SQL入門 - なぜ表を分けて持つのか
1つの表に詰め込むと何が起きるか
トグルを入れて、同じメールが何か所に出るかを数えてください。
- 混ぜたままだと、メールを直すのに注文の行数だけ直すことになる
- 1行でも直し忘れると、同じ人なのに違うメールが記録として残る
- 分けておけば直す場所は1か所。注文の側には顧客IDだけが残る
2 / 4
考えてみよう外しても進めます
顧客の表と注文の表を分けたあと、注文の 顧客ID に customers に存在しない番号を書いたらどうなると思いますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
3 / 4
SQL入門 - なぜ表を分けて持つのか
分けた表をつなぐ2つの列
表を分けると、行どうしのつながりを列で表すことになります。そのために決まった役割を持つ列が2つあります。
customers.顧客ID が主キー、orders.顧客ID が外部キーです。この2つをたどって表をつなぎ直すのが、あとで出てくる JOIN です。
| 呼び方 | 役割 |
|---|---|
| 主キー | その表の中で1行を一意に指す列 |
| 外部キー | 別の表の主キーを指す列 |
4 / 4
SQL入門
テーブル・行・列の基本
データベースの仕組み
データベースは、こういう表の形でデータを持っています。この表そのものをテーブルと呼び、縦の列をカラム、横の行をレコードと呼びます。
products
| 商品ID | 商品名 | 価格 |
|---|---|---|
| 10001 | 商品A | 2500 |
| 10002 | 商品B | 1000 |
| 10003 | 商品C | 1300 |
縦に見れば商品IDだけが並び、横に見れば商品1件ぶんがまとまっています。
データベースが持つ表は1枚だけではありません。顧客の表、注文の表と、用途ごとに何枚も抱えています。
1 / 5
SQL入門 - テーブル・行・列の基本
表のどこを何と呼ぶか
ボタンを押して、表のどこを指す言葉なのかを見てください。
- 縦の並びが列。商品ID なら商品ID だけ、価格なら価格だけが入る
- 横の並びが行。商品1件ぶんの情報がここにまとまっている
- この表そのものがテーブル。データベースは表を何枚も持っている
2 / 5
SQL入門 - テーブル・行・列の基本
同じものに呼び方が2つある
現場では日本語と英語が混ざって飛んできます。指しているものは同じなので、対応だけ先に押さえておくと、あとの話が全部読めるようになります。
SQL は結局、この表から行を選び、列を選ぶだけの言葉です。
| 現場で聞く言い方 | 同じものを指す言葉 |
|---|---|
| テーブル | 表 / relation |
| 列 | カラム / column / 項目 |
| 行 | レコード / row / 1件 |
| セル | 1行1列が交わったところの値 |
3 / 5
列には型が決まっている
表を作るときに、列ごとに「ここには何が入るか」を先に宣言します。決めておくと、価格の列に文字を入れようとした時点で DBMS が断ってくれます。
products
| id | name | price |
|---|---|---|
| 10001 | 商品A | 2500 |
| 10002 | 商品B | 1000 |
| 10003 | 商品C | 1300 |
宣言した3つの列に沿って、行が積み上がっていきます。
囲った1行が1レコード。商品C という1件ぶんの情報が横一列に並んでいます。
4 / 5
考えてみよう外しても進めます
products の表から「価格が 2000 円以上の商品」を出したいとき、選んでいるのは行と列のどちらですか。
当ててから次の枚で確かめると、答えが記憶に残ります。
5 / 5
SQL入門
SQL とクエリ
SQL入門 - SQL とクエリ
クエリを送ると何が起きるか
1手ずつ送って、行きに何が動き、帰りに何が動くのかを見てください。
- 行きに運ぶのは文だけ。データはまだ1件も動いていない
- 探すのはデータベース側。どう探すかは書かなくてよい
- 帰りに返ってくるのも表。だから行と列の話がこの先も続く
1 / 4
SQL はデータベースに話しかける言葉
この「持ってこい」と伝える1行をクエリと呼びます。SQL は、そのクエリを書くための言葉です。
purchases
| name |
|---|
| 商品A |
| 商品B |
| 商品C |
欲しいと書いた name の列だけが、表の形で返ってきます。
手順ではなく、欲しい結果だけを書きます。探し方を考えるのはデータベースの仕事です。
2 / 4
SQL入門 - SQL とクエリ
SELECT の最小の形
SELECT と FROM の2つが揃えば、それだけでクエリになります。まずはこの2行を手が覚えるところからです。
SELECT が列を選び、WHERE が行を選びます。表のどちら向きを選ぶ話なのかで見分けられます。
| 書く場所 | そこに書くこと |
|---|---|
| SELECT | 欲しい列の名前。全部なら * |
| FROM | 取ってくる表の名前 |
| 行末の ; | クエリの終わり。1文ずつ区切る |
| WHERE | 行を絞る条件。次のレッスンで扱う |
3 / 4
考えてみよう外しても進めます
SELECT * FROM purchases; と書いたとき、返ってくるのはどれですか。
当ててから次の枚で確かめると、答えが記憶に残ります。
4 / 4
SQL入門
WHERE で行を選ぶ
SQL入門 - WHERE で行を選ぶ
表は行と列でできている
ボタンを押して、表のどこを何と呼ぶのかを見てください。
- 縦の並びが列 (カラム)。同じ種類の値が入る
- 横の並びが行 (レコード)。商品1件ぶんの情報がまとまっている
1 / 6
WHERE で行を選ぶ
SELECT が列を選ぶのに対して、WHERE は行を選びます。条件が真になった行だけが結果に残り、偽だった行は捨てられます。
結果
| name | age |
|---|---|
| 佐藤 | 28 |
| 鈴木 | 9 |
| 田中 | 35 |
| 高橋 | 22 |
| 伊藤 | 41 |
取り消し線の2行は条件が偽なので、結果には出てきません。
この >= 25 を動かすと結果が何行になるのかを、次の枚で自分で確かめます。
2 / 6
SQL入門 - WHERE で行を選ぶ
しきい値で行が減る
n を左右に動かして、残る行の数を見てください。
- n を上げるほど残る行は減る。増えることはない
- n = 0 なら全員が残る。条件が常に真になるから
- n = 42 なら 0 行。空の結果もエラーではなく正しい答え
3 / 6
考えてみよう外しても進めます
age が数値ではなく文字列で入っていたら、age >= '25' に 9 歳は残ると思いますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
4 / 6
SQL入門 - WHERE で行を選ぶ
文字列として比べると壊れる
トグルを入れて、混ざってくる行を見てください。
- 9 歳が 25 歳以上の側に入る。"9" の先頭が "2" より大きいから
- エラーは出ない。だから気づかないまま本番に出る
- 列の型を数値にしておけば、この事故は起きない
5 / 6
SQL入門 - WHERE で行を選ぶ
比較演算子の早見
WHERE に書ける条件は等号だけではありません。よく使うものを先に覚えると、あとのレッスンが楽になります。
NULL だけは = で比べられません。NULL は「不明」なので、等しいかどうかも不明になるからです。
| やりたいこと | 書き方 |
|---|---|
| 等しい | = |
| 等しくない | <> または != |
| 大小 | < <= > >= |
| 範囲 | BETWEEN a AND b |
| 集合 | IN (1, 2, 3) |
| NULL 判定 | IS NULL |
6 / 6
SQL入門
INNER JOIN で表をつなぐ
JOIN で2つの表を噛み合わせる
users には注文が入っておらず、orders には名前が入っていません。両方を1つの結果で見るために、どの行とどの行が同じものを指すのかを ON で書きます。
結果
| name | item |
|---|---|
| 佐藤 | 本 |
| 佐藤 | ペン |
| 鈴木 | ノート |
| 鈴木 | 付箋 |
| 田中 | — |
田中 は注文が1件も無いので、結果から消えます。
消えた 田中 を残したいときに LEFT JOIN を使います。このあとの図解で切り替えます。
1 / 4
考えてみよう外しても進めます
users と orders をカンマで並べて FROM に書くと、3行と4行で何行になると思いますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
2 / 4
SQL入門 - INNER JOIN で表をつなぐ
つなぎ方で結果が変わる
つなぎ方を切り替えて、結果が何行になるか数えてください。
- INNER は相手のいない 田中 が消える
- LEFT は 田中 が残り、item に NULL が入る
- カンマでつなぐと 3 × 4 で 12 行。線が全部と全部に引かれる
3 / 4
SQL入門 - INNER JOIN で表をつなぐ
つなぎ方の早見
JOIN の種類は「相手がいない行をどうするか」の違いだけです。先に対応を覚えておくと、あとのレッスンで迷いません。
表をカンマで並べると CROSS JOIN と同じ結果になります。JOIN の ON を書き忘れた場合はエラーで止まりますが、カンマはエラーが出ないので、行数が急に増えたら真っ先に疑う場所です。
| やりたいこと | 書き方 |
|---|---|
| 両方にある行だけ | INNER JOIN |
| 左を全部残す | LEFT JOIN |
| 右を全部残す | RIGHT JOIN |
| そろえる条件 | ON a.x = b.y |
| 同じ列名でつなぐ | USING (id) |
| 総当たり | CROSS JOIN |
4 / 4
SQL入門
GROUP BY で束ねて数える
GROUP BY で行を束ねる
WHERE が行を捨てるのに対して、GROUP BY は行を束ねます。同じ値を持つ行がひとかたまりになり、そのかたまりごとに1行が出ます。
結果
| dept | COUNT(*) |
|---|---|
| 営業 | 2 |
| 開発 | 3 |
5行が2行になります。dept の値ごとに1行です。
行が捨てられたのではありません。営業の2行が1行に束ねられただけです。
1 / 4
考えてみよう外しても進めます
GROUP BY dept のあと、SELECT に name を足すとどうなると思いますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
2 / 4
SQL入門 - GROUP BY で束ねて数える
束ねると値が1つに決まる
集計を切り替えたあと、SELECT に name を足してみてください。
- 営業は 30 と 40 の2行が束ねられて1行になる
- AVG に変えると営業は 35。COUNT の 2 とは別の計算
- name を足すと、束ねた行に書ける値が無いのでエラーになる
3 / 4
SQL入門 - GROUP BY で束ねて数える
集計の早見
束ねたかたまりに対して何を計算するかを決めるのが集計関数です。よく使うものと、絞り込みの書き分けを先に押さえます。
WHERE は束ねる前、HAVING は束ねたあとに効きます。「平均が 40 以上の部署だけ」は WHERE では書けません。
| やりたいこと | 書き方 |
|---|---|
| 行数 | COUNT(*) |
| 合計 | SUM(salary) |
| 平均 | AVG(salary) |
| 最大 / 最小 | MAX(salary) / MIN(salary) |
| 束ねる前の絞り込み | WHERE |
| 束ねたあとの絞り込み | HAVING |
4 / 4
SQL入門
NULL の扱い
NULL は値が無いのではなく不明
NULL は空文字でも 0 でもありません。「分からない」という状態です。分からない値と何かを比べても、答えはやはり分かりません。
結果
| name | |
|---|---|
| 佐藤 | a@example.com |
| 鈴木 | NULL |
| 田中 | b@example.com |
| 加藤 | NULL |
1行も返りません。エラーも出ません。
= NULL は必ず 0 行になります。NULL の行すら返らないのが、いちばん引っかかる点です。
1 / 4
考えてみよう外しても進めます
WHERE email != 'a@example.com' は、この4行のうち何行を返すと思いますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
2 / 4
SQL入門 - NULL の扱い
真でも偽でもない
条件を切り替えて、返る行数がどう変わるか見てください。
- = NULL は 0 行。IS NULL なら 鈴木 と 加藤 の2行
- != でも NULL の行は返らない。「違う」も判定できない
- 真・偽のほかに「不明」がある、と考えると筋が通る
3 / 4
SQL入門 - NULL の扱い
NULL の扱い早見
比較演算子は NULL に効きません。NULL を相手にするときは、専用の書き方に切り替えます。
この4行なら COUNT(*) は 4、COUNT(email) は 2 になります。COUNT が2種類あるのではなく、集計関数が NULL を数えないからです。
| やりたいこと | 書き方 |
|---|---|
| NULL かどうか | IS NULL |
| NULL でないか | IS NOT NULL |
| NULL を別の値に | COALESCE(email, '未登録') |
| NULL を数えない | COUNT(email) |
| 全行を数える | COUNT(*) |
4 / 4
SQL入門
INSERT で行を追加する
SQL入門 - INSERT で行を追加する
列と値は前から順に対応する
3つの場合を切り替えて、どこで対応が崩れるか見てください。
- INSERT で書くのは、表の名前と、列の並びと、値の並びの3つ
- 列と値は前から順に1対1で結ばれる
- 数が合わない文は、実行される前に弾かれる
1 / 5
SQL入門 - INSERT で行を追加する
作成ボタンの先で動いているもの
画面から見ると「作成する」を押しただけですが、その裏では3つの場所を順番に通っています。SQL が出てくるのは3番目です。
このレッスンで書くのは3行目です。画面もサーバーも、最後はこの1文にたどり着きます。
| どこで起きること | そこで何をしているか |
|---|---|
| フロントエンド | 入力された値をサーバーへ送る |
| サーバーサイド | 受け取った値で INSERT 文を組み立てる |
| データベース | 表に行を1本増やす |
| フロントエンド | 返ってきた一覧を描き直す |
2 / 5
どの表のどの列に、何を入れるか
INSERT は3つの部品でできています。表の名前、値を入れる列の名前、そして入れる値です。
memos
| id | name |
|---|---|
| 1 | じゃがいも |
| 2 | にんじん |
| 3 | たまねぎ |
| 4 | とまと |
囲った行が増えた1本です。id は自動で採番されるので、書いていません。
列の並びと値の並びは前から順に対応します。数が合わないとエラーになります。
3 / 5
SQL入門 - INSERT で行を追加する
ここでつまずく
INSERT は形が単純なぶん、間違いもいつも同じところに出ます。
エラーで止まるのはむしろ助かる側です。黙って入ってしまう間違いのほうが、あとで探すのに苦労します。
| 書いたこと | どうなるか |
|---|---|
| 列名をまるごと省く | 全部の列に値を並べる約束になる |
| 文字列を裸で書く | 列の名前だと解釈されてエラー |
| 値の数が列より多い | 実行されずにエラー |
| id を自分で書く | 自動採番とぶつかることがある |
4 / 5
考えてみよう外しても進めます
memos の表に3行入っている状態で、同じ INSERT 文を2回実行するとどうなりますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
5 / 5
SQL入門
UPDATE で行を書き換える
SQL入門 - UPDATE で行を書き換える
WHERE が決めるのは範囲
WHERE の行を外して、書き換わる行がどこまで広がるか見てください。
- UPDATE は、何に書き換えるかの SET と、どれを書き換えるかの WHERE でできている
- WHERE を省いた文はエラーにならない。表の全行が同じ値になって正常に終わる
- 書く前に同じ条件で SELECT を流し、返ってきた行数を見るのが現場の手順
1 / 5
SQL入門 - UPDATE で行を書き換える
作成との違いは、どの行かを送ること
編集画面で直して送ったあとに通る場所は、作成のときと同じ3つです。違うのは、送るものと、データベースでやることの2点だけです。
「どの行か」を送っている点が作成との差です。これが文の中では WHERE になります。
| INSERT のとき | UPDATE のとき |
|---|---|
| 値だけを送る | 値と、どの行かを一緒に送る |
| 表に行が1本増える | 既にある行の値が書き換わる |
| 対象は新しい行 | 対象は WHERE で選んだ行 |
2 / 5
SET が新しい値、WHERE が対象の行
UPDATE は2つの役割に分かれています。何に書き換えるかが SET、どれを書き換えるかが WHERE です。
memos
| id | name |
|---|---|
| 1 | じゃがいも |
| 2 | にんじん |
| 3 | とまと |
3行目だけが書き換わりました。他の行には触れていません。
SET は列ごとにカンマで並べられます。触れなかった列の値はそのまま残ります。
3 / 5
WHERE を書き忘れると全行が変わる
UPDATE の WHERE は省略できます。省略した文はエラーになりません。表の全行が同じ値に書き換わったうえで、正常終了します。
memos
| id | name |
|---|---|
| 1 | とまと |
| 2 | とまと |
| 3 | とまと |
3行とも同じ値になりました。元の値はもう表のどこにも残っていません。
書く前に同じ条件で SELECT を流し、返ってきた行数を見てから UPDATE に直すのが、現場で使われている手順です。
4 / 5
考えてみよう外しても進めます
UPDATE memos SET name = 'とまと' WHERE id = 99; を、id が 99 の行が無い表に実行するとどうなりますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
5 / 5
SQL入門
DELETE で行を消す
SQL入門 - DELETE で行を消す
消える単位は文で変わる
3つの文を切り替えて、消える単位がどう変わるか見てください。
- DELETE が消すのは行。WHERE で選んだぶんだけ表から無くなる
- WHERE を省くと全行が消える。それでもエラーにはならない
- DROP TABLE が消すのは表そのもの。列の名前も一緒に消える
1 / 5
SQL入門 - DELETE で行を消す
更新との違いは、戻せないこと
通る場所は作成や更新と同じです。違うのは、送るものが減ることと、やり直しが効かないことの2点です。
消えた行は SELECT で探しても出てきません。だから消す前に、本当に消すのかを決めておきます。
| UPDATE のとき | DELETE のとき |
|---|---|
| 新しい値を送る | 値は要らない。どの行かだけを送る |
| 行は表に残る | 行が表から取り除かれる |
| 書き戻せば元に戻る | 戻せるのはバックアップからだけ |
2 / 5
DELETE には SET が無い
消すのに新しい値は要らないので、DELETE にあるのは「どの表か」と「どの行か」の2つだけです。
memos
| id | name |
|---|---|
| 1 | じゃがいも |
| 2 | にんじん |
3行目が表から消えました。id の 3 が空くだけで、下の行が繰り上がることはありません。
列を消すのは DELETE ではありません。あれは表の形を変える話なので ALTER TABLE の仕事です。
3 / 5
SQL入門 - DELETE で行を消す
消す前に決めておくこと
業務のデータは、消すと困るものが混ざっています。本当に取り除くのか、消えたことにするだけなのかを先に決めます。
削除フラグのやり方を論理削除と呼びます。表からは消えないので、以降の SELECT では毎回そのフラグで絞ることになります。
| やり方 | 向いている場面 |
|---|---|
| DELETE で本当に消す | 作業中の下書きなど、残す価値が無いもの |
| 削除フラグを立てる | 注文履歴など、あとから見返すもの |
| WHERE を省く | 無い。全行が消える |
| TRUNCATE を使う | 表を空にすると決めているとき |
4 / 5
考えてみよう外しても進めます
注文履歴の表から、退会した人の注文を DELETE で消しました。困るのはどれですか。
当ててから次の枚で確かめると、答えが記憶に残ります。
5 / 5
SQL入門
第1正規形
SQL入門 - 第1正規形
第1正規形とは
トグルを入れて、空いていたセルに何が入るか見てください。
- 第1正規形とは、1つのセルに1つの値だけを持たせるというルール
- 変わるのは3行目だけ。空いていた注文日が埋まる
- 埋めたあとは、どの行も単体で何の注文か分かる
1 / 5
空欄は「上と同じ」ではない
1/13 の注文は商品が2つあるので、注文日の欄を空けたまま商品名だけを下に足しています。ここが後で効いてきます。
注文(非正規形)
| 注文日 | 注文元 | 商品名 |
|---|---|---|
| 2025/1/12 | XXX | 商品A |
| 2025/1/13 | YYY | 商品A |
| YYY | 商品B | |
| 2025/1/15 | ZZZ | 商品C |
囲った行には注文日がありません。人は上の続きだと読めますが、DBMS は読めません。
空欄は「上と同じ」という意味を持ちません。ただ値が無い行として扱われます。
2 / 5
行に分けて、どのセルにも値を入れる
第1正規形とは、1つのセルに1つの値だけを持たせるというルールです。まとめて書いていたところを行に分けて、空いていた欄を埋めます。
注文(第1正規形)
| 注文日 | 注文元 | 商品名 |
|---|---|---|
| 2025/1/12 | XXX | 商品A |
| 2025/1/13 | YYY | 商品A |
| 2025/1/13 | YYY | 商品B |
| 2025/1/15 | ZZZ | 商品C |
空いていた注文日と注文元が埋まりました。1行だけを見て、それが何の注文なのか分かります。
同じ日付が2回出てくるのは、この段階では正しい姿です。重複そのものを減らすのは第2正規形から先の話になります。
3 / 5
SQL入門 - 第1正規形
分けると何ができるようになるか
1行が1件として独立すると、SQL の基本的な操作がそのまま効くようになります。
どれも SQL が苦手なのではなく、表の持ち方が SQL の前提から外れているだけです。
| やりたいこと | 非正規形だとどうなるか |
|---|---|
| 1/13 の注文を全部出す | 空欄の行が条件に当たらず、取りこぼす |
| 注文の件数を数える | 行の数と件数が一致しない |
| 商品Bを買った人を出す | 注文元は取れるが注文日が取れない |
| 注文日で並べ替える | 空欄の行が離れた場所へ飛ぶ |
4 / 5
考えてみよう外しても進めます
商品名の欄に「商品A、商品B」とカンマ区切りで書いた表は、第1正規形ですか。
当ててから次の枚で確かめると、答えが記憶に残ります。
5 / 5
SQL入門
索引 (インデックス) はなぜ速いのか
索引は全部めくらずに飛ぶ
索引が無いと、データベースは先頭から順に読み、最悪は全行を読みます。索引は本の巻末の索引と同じで、読む場所へ直接飛べるようにする仕組みです。
調べる回数
| 行数 | 索引なし | 索引あり |
|---|---|---|
| 100 | 100 | 7 |
| 10,000 | 10,000 | 14 |
| 1,000,000 | 1,000,000 | 20 |
行数が1万倍になっても、索引ありは3倍にしかなりません。
この差は行数が増えるほど開きます。100行では体感できないので、小さい表で試すと効果が分かりません。
1 / 4
考えてみよう外しても進めます
索引を増やすと、書き込みの速さはどうなると思いますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
2 / 4
SQL入門 - 索引 (インデックス) はなぜ速いのか
検索は速く、書き込みは遅く
行数を増やしたあと、書き込みに切り替えてみてください。
- 検索は行数を増やすほど差が開く。索引ありの棒はほとんど伸びない
- 書き込みに切り替えると逆転する。索引ありのほうが遅い
- だから「とりあえず全部の列に張る」は間違い
3 / 4
SQL入門 - 索引 (インデックス) はなぜ速いのか
張る列・張らない列
索引は速くする道具ではなく、検索と書き込みを取り引きする道具です。どちらが多い表なのかで判断します。
値の種類が少ない列に張っても効きません。男女2種類しか無い列の索引は、結局半分の行を読むことになるからです。
| どんな列・表か | 索引 |
|---|---|
| WHERE で毎回使う列 | 張る |
| JOIN の ON に出る列 | 張る |
| ORDER BY で並べる列 | 張る |
| 値の種類が少ない列 | 張らない |
| 書き込みが多い表 | 張らない |
| 行数が少ない表 | 張らない |
4 / 4
HTML/CSS入門
HTML の基本構造
HTML/CSS入門 - HTML の基本構造
タグは飾りではなく意味付け
タグを外して、同じ文字がブラウザにどう届くか見てください。
1 / 5
1つの要素は3つの部品でできている
開始タグ、中身、終了タグの3つです。終了タグの / を書き忘れると、その先の文まで見出しの中身として読まれます。
属性は開始タグの中にだけ書きます。終了タグには書けません。
2 / 5
HTML/CSS入門 - HTML の基本構造
ページの外枠は毎回同じ
どのページもこの形から始まります。head は設定を書く場所で画面には出ません。目に見えるものは全部 body の中です。
「書いたのに画面に出ない」の多くは、body ではなく head に置いてしまった間違いです。まず自分の書いた行がどちらにあるか見てください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>はじめてのページ</title>
</head>
<body>
<h1>プログラミングの世界へ</h1>
</body>
</html>3 / 5
HTML/CSS入門 - HTML の基本構造
ここでつまずく
HTML のエラーは赤い文字で止まってくれません。黙って別の意味に読まれます。
文字を大きくしたいだけなら CSS の仕事です。見出しかどうかで h1 を選びます。
| 書いたこと | どう読まれるか |
|---|---|
| 終了タグを書き忘れる | 後ろの文まで同じ要素の中身になる |
| 見た目のために h1 を選ぶ | 大きいだけの見出しが増える |
| 改行しただけで段落を分ける | 1つの段落として続けて表示される |
| 全角の < を書く | タグではなく文字として出る |
4 / 5
考えてみよう外しても進めます
文字を大きく太くしたいという理由だけで、段落を h1 タグで囲みました。何が起きますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
5 / 5
HTML/CSS入門
CSS の書き方
HTML/CSS入門 - CSS の書き方
CSS が変えるのは並びと見た目
CSS を外して、同じ中身がどう積み上がるか見てください。
1 / 5
どれに・何を・どうする
CSS の1つの決まりは、当てる相手のセレクタと、変える項目のプロパティと、値の3つでできています。
1つの決まりの終わりには必ずセミコロンを打ちます。最後の1行だけ抜けても、次の行が読まれなくなります。
2 / 5
同じ相手に2回当てたら、後ろが勝つ
CSS は上から順に読まれ、あとから来た決まりが前の決まりを上書きします。効かないと思ったスタイルは、たいてい下の行に負けています。
画面に出る色
| 書いた順 | color の値 | 結果 |
|---|---|---|
| 1つめ | #05b45b | 負ける |
| 2つめ | #333333 | こちらが出る |
消えたのではなく、後ろの行に上書きされただけです。
タグの style 属性に書くと、この順番でいつも勝ってしまいます。CSS は別ファイルに書いて link で読み込みます。
3 / 5
HTML/CSS入門 - CSS の書き方
ここでつまずく
書いたはずのスタイルが効かないとき、原因はだいたいこの4つのどれかです。
保存し直しても変わらないときは、読み込み直しをキャッシュ無しでやってみます。
| 起きること | 何を見るか |
|---|---|
| 全部当たらない | link のパスとファイル名 |
| 1つだけ当たらない | セレクタの綴りと、class の . の付け忘れ |
| 上書きされる | 同じ相手に当てた別の決まりが後ろにないか |
| 直したのに変わらない | ブラウザが古い CSS を持っている |
4 / 5
考えてみよう外しても進めます
CSS ファイルを読み込む link の行を消すと、ページはどうなりますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
5 / 5
HTML/CSS入門
要素の取得と変更
HTML/CSS入門 - 要素の取得と変更
書き換わるのは画面だけ
1手ずつ進めて、右の画面と下のファイルのどちらが変わるか見てください。
1 / 5
取ってから変える
要素を変えるには、先にどれを変えるのかを取ってきます。取れていないものは変えられません。
id が見つからないと null が返ります。その次の行で「null の textContent は読めない」と止まります。
2 / 5
触った1か所だけが入れ替わる
textContent に代入すると、その要素の中の文字だけが入れ替わります。まわりの要素も、もとの HTML ファイルもそのままです。
書き換えたあと
| どこ | 前 | 後 |
|---|---|---|
| 画面の h1 | はじめてのページ | はじめてのページ |
| 画面の p(id は msg) | こんにちは | ようこそ |
| index.html の中身 | こんにちは | こんにちは |
動いたのは1行だけです。ファイルの行は最後まで変わりません。
見た目は style を1つずつ書かず、classList.add で class を付け外しします。CSS とどちらが本当かが分からなくなります。
3 / 5
HTML/CSS入門 - 要素の取得と変更
ここでつまずく
取得できていない、という一点が形を変えて出てきます。
script は body の終わり近くに置くか、読み込み完了を待ってから動かします。
| 起きること | 原因 |
|---|---|
| null になる | id の綴り違い、または要素より先に script が動いた |
| 何も起きない | 取った要素と、画面で見ている要素が別物 |
| 読み込むと元に戻る | 変えたのは画面だけで、保存はしていない |
| 1つしか変わらない | getElementById は1つしか返さない |
4 / 5
考えてみよう外しても進めます
ボタンで画面の文字を書き換えたあと、ページを読み込み直すとどうなりますか。
当ててから次の枚で確かめると、答えが記憶に残ります。
5 / 5