教材ライブラリ

授業で使うスライド、触って動かせる図解、レッスンの導入スライドをまとめています。 左のリストで絞り込むか、キーワードで検索してください。

6 件

5 枚
1 / 5

ping で遅延を測る

ping は相手に小さなデータを送って、返ってくるまでの時間を測るコマンドです。返ってきた時間 (RTT) は、そのまま相手との遠さを表します。

この time= の数字が何で決まるのかを、次の2枚で自分で確かめます。

64 bytes from 10.0.0.1: time=1.2 ms
2 / 5

近いところを測る

3か所を順に押して、往復時間を埋めてください。

3 / 5

腕試し (外しても進めます)

アメリカ西海岸までの往復は何 ms くらいだと思いますか。

当ててから次の枚で確かめると、答えが記憶に残ります。

4 / 5

遠いところを測る

2か所を押して、近いところとの桁の違いを見てください。

5 / 5

測った結果

5か所の往復時間を並べると、距離とほぼ比例しているのが分かります。

サイトが遅いときは、相手が遠いか経路が混んでいるかを疑います。

距離往復時間
同じ建物 (約 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 枚
1 / 5

WHERE で行を選ぶ

SELECT が列を選ぶのに対して、WHERE は行を選びます。条件が真になった行だけが結果に残り、偽だった行は捨てられます。

SELECT *
列は全部
FROM users
どの表から
WHERE age >= 25
どの行を残すか

結果

nameage
佐藤28
鈴木9
田中35
高橋22
伊藤41

取り消し線の2行は条件が偽なので、結果には出てきません。

この >= 25 を動かすと結果が何行になるのかを、次の枚で自分で確かめます。

2 / 5

しきい値で行が減る

n を左右に動かして、残る行の数を見てください。

  • n を上げるほど残る行は減る。増えることはない
  • n = 0 なら全員が残る。条件が常に真になるから
  • n = 46 なら 0 行。空の結果もエラーではなく正しい答え
3 / 5

腕試し (外しても進めます)

age が数値ではなく文字列で入っていたら、age >= '25' に 9 歳は残ると思いますか。

当ててから次の枚で確かめると、答えが記憶に残ります。

4 / 5

文字列として比べると壊れる

トグルを入れて、混ざってくる行を見てください。

  • 9 歳が 25 歳以上の側に入る。"9" の先頭が "2" より大きいから
  • エラーは出ない。だから気づかないまま本番に出る
  • 列の型を数値にしておけば、この事故は起きない
5 / 5

比較演算子の早見

WHERE に書ける条件は等号だけではありません。よく使うものを先に覚えると、あとのレッスンが楽になります。

NULL だけは = で比べられません。NULL は「不明」なので、等しいかどうかも不明になるからです。

やりたいこと書き方
等しい=
等しくない<>
大小< <= > >=
範囲BETWEEN a AND b
集合IN (1, 2, 3)
NULL 判定IS NULL
1 / 4

JOIN で2つの表を噛み合わせる

users には注文が入っておらず、orders には名前が入っていません。両方を1つの結果で見るために、どの行とどの行が同じものを指すのかを ON で書きます。

SELECT u.name, o.item
FROM users u
左の表
JOIN orders o
右の表
ON u.id = o.user_id
何をそろえるか

結果

nameitem
佐藤
佐藤ペン
鈴木ノート
鈴木付箋
田中

田中 は注文が1件も無いので、結果から消えます。

消えた 田中 を残したいときに LEFT JOIN を使います。次の枚で切り替えます。

2 / 4

腕試し (外しても進めます)

ON を書き忘れると、3行の users と 4行の orders は何行になると思いますか。

当ててから次の枚で確かめると、答えが記憶に残ります。

3 / 4

つなぎ方で結果が変わる

つなぎ方を切り替えて、結果が何行になるか数えてください。

  • INNER は相手のいない 田中 が消える
  • LEFT は 田中 が残り、item に NULL が入る
  • ON を外すと 3 × 4 で 12 行。線が全部と全部に引かれる
4 / 4

つなぎ方の早見

JOIN の種類は「相手がいない行をどうするか」の違いだけです。先に対応を覚えておくと、あとのレッスンで迷いません。

ON を書き忘れた JOIN は CROSS JOIN と同じ結果になります。エラーが出ないので、行数が急に増えたら真っ先に疑う場所です。

やりたいこと書き方
両方にある行だけINNER JOIN
左を全部残すLEFT JOIN
右を全部残すRIGHT JOIN
そろえる条件ON a.x = b.y
同じ列名でつなぐUSING (id)
総当たりCROSS JOIN
1 / 4

GROUP BY で行を束ねる

WHERE が行を捨てるのに対して、GROUP BY は行を束ねます。同じ値を持つ行がひとかたまりになり、そのかたまりごとに1行が出ます。

SELECT dept, COUNT(*)
束ねる列
束ねたあとの計算
FROM emp
どの表から
GROUP BY dept

結果

deptCOUNT(*)
営業2
開発3

5行が2行になります。dept の値ごとに1行です。

行が捨てられたのではありません。営業の2行が1行に束ねられただけです。

2 / 4

腕試し (外しても進めます)

GROUP BY dept のあと、SELECT に name を足すとどうなると思いますか。

当ててから次の枚で確かめると、答えが記憶に残ります。

3 / 4

束ねると値が1つに決まる

集計を切り替えたあと、SELECT に name を足してみてください。

  • 営業は 30 と 40 の2行が束ねられて1行になる
  • AVG に変えると営業は 35。COUNT の 2 とは別の計算
  • name を足すと、束ねた行に書ける値が無いのでエラーになる
4 / 4

集計の早見

束ねたかたまりに対して何を計算するかを決めるのが集計関数です。よく使うものと、絞り込みの書き分けを先に押さえます。

WHERE は束ねる前、HAVING は束ねたあとに効きます。「平均が 40 以上の部署だけ」は HAVING でしか書けません。

やりたいこと書き方
行数COUNT(*)
合計SUM(salary)
平均AVG(salary)
最大 / 最小MAX() / MIN()
束ねる前の絞り込みWHERE
束ねたあとの絞り込みHAVING
4 枚
1 / 4

NULL は値が無いのではなく不明

NULL は空文字でも 0 でもありません。「分からない」という状態です。分からない値と何かを比べても、答えはやはり分かりません。

SELECT name, email
FROM users
どの表から
WHERE email = NULL
ここが罠

結果

nameemail
satoa@example.com
suzukiNULL
tanakab@example.com
katoNULL

1行も返りません。エラーも出ません。

= NULL は必ず 0 行になります。NULL の行すら返らないのが、いちばん引っかかる点です。

2 / 4

腕試し (外しても進めます)

WHERE email != 'a@example.com' は、この4行のうち何行を返すと思いますか。

当ててから次の枚で確かめると、答えが記憶に残ります。

3 / 4

真でも偽でもない

条件を切り替えて、返る行数がどう変わるか見てください。

  • = NULL は 0 行。IS NULL なら suzuki と kato の2行
  • != でも NULL の行は返らない。「違う」も判定できない
  • 真・偽のほかに「不明」がある、と考えると筋が通る
4 / 4

NULL の扱い早見

比較演算子は NULL に効きません。NULL を相手にするときは、専用の書き方に切り替えます。

この4行なら COUNT(*) は 4、COUNT(email) は 2 になります。数え方が違うのではなく、集計関数が NULL を数えないからです。

やりたいこと書き方
NULL かどうかIS NULL
NULL でないかIS NOT NULL
NULL を別の値にCOALESCE(email, '未登録')
NULL を数えないCOUNT(email)
全行を数えるCOUNT(*)
= や != NULL には効かない
1 / 4

インデックスは全部めくらずに飛ぶ

索引が無いと、データベースは目的の行を見つけるまで先頭から全部を読みます。索引は本の巻末の索引と同じで、読む場所へ直接飛べるようにする仕組みです。

SELECT * FROM users
WHERE email = 'a@example.com'
この列に索引を張る
1件を狙い撃つ

調べる回数

行数索引なし索引あり
1001007
10,00010,00014
1,000,0001,000,00020

行数が1万倍になっても、索引ありは3倍しか増えません。

この差は行数が増えるほど開きます。100行では体感できないので、小さい表で試すと効果が分かりません。

2 / 4

腕試し (外しても進めます)

インデックスを増やすと、書き込みの速さはどうなると思いますか。

当ててから次の枚で確かめると、答えが記憶に残ります。

3 / 4

検索は速く、書き込みは遅く

行数を増やしたあと、書き込みに切り替えてみてください。

  • 検索は行数を増やすほど差が開く。索引ありの棒はほとんど伸びない
  • 書き込みに切り替えると逆転する。索引ありのほうが遅い
  • だから「とりあえず全部の列に張る」は間違い
4 / 4

張る列・張らない列

索引は速くする道具ではなく、検索と書き込みを取り引きする道具です。どちらが多い表なのかで判断します。

値の種類が少ない列に張っても効きません。男女2種類しか無い列の索引は、結局半分の行を読むことになるからです。

どんな列・表か索引
WHERE で毎回使う列張る
JOIN の ON に出る列張る
ORDER BY で並べる列張る
値の種類が少ない列張らない
書き込みが多い表張らない
行数が少ない表張らない