SQL実践の導入スライド
JOIN で2つの表を噛み合わせる
users には注文が入っておらず、orders には名前が入っていません。両方を1つの結果で見るために、どの行とどの行が同じものを指すのかを ON で書きます。
users u左の表orders o右の表u.id = o.user_id何をそろえるか結果
| 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実践 - WHERE句のサブクエリ
内側を先に解いて、その答えで絞る
手順を進めて、内側の戻り値が外側の比較相手になるところを見てください。
戻り値が複数なら = は使えません。内側が何行返すかで演算子が決まります。
1 / 1
SQL実践 - INSERT で行を追加する
列と値は前から順に対応する
3つの場合を切り替えて、どこで対応が崩れるか見てください。
- INSERT で書くのは、表の名前と、列の並びと、値の並びの3つ
- 列と値は前から順に1対1で結ばれる
- 数が合わない文は、実行される前に弾かれる
1 / 5
作成ボタンの先で動いているもの
画面から見ると「作成する」を押しただけですが、その裏では3つの場所を順番に通っています。SQL が出てくるのは3番目です。
フロントエンド
入力された値をサーバーへ送る
サーバーサイド
受け取った値で INSERT 文を組み立てる
データベース
表に行を1本増やす
フロントエンド
返ってきた一覧を描き直す
このレッスンで書くのは3行目です。画面もサーバーも、最後はこの1文にたどり着きます。
2 / 5
どの表のどの列に、何を入れるか
INSERT は3つの部品でできています。表の名前、値を入れる列の名前、そして入れる値です。
memosどの表に足すか(name)値を入れる列'とまと'入れる値memos
| id | name |
|---|---|
| 1 | じゃがいも |
| 2 | にんじん |
| 3 | たまねぎ |
| 4 | とまと |
囲った行が増えた1本です。id は自動で採番されるので、書いていません。
列の並びと値の並びは前から順に対応します。数が合わないとエラーになります。
3 / 5
ここでつまずく
INSERT は形が単純なぶん、間違いもいつも同じところに出ます。
列名をまるごと省く
全部の列に値を並べる約束になる
文字列を裸で書く
列の名前だと解釈されてエラー
値の数が列より多い
実行されずにエラー
id を自分で書く
自動採番とぶつかることがある
エラーで止まるのはむしろ助かる側です。黙って入ってしまう間違いのほうが、あとで探すのに苦労します。
4 / 5
考えてみよう外しても進めます
memos の表に3行入っている状態で、同じ INSERT 文を2回実行するとどうなりますか。
選ぶと、この枚の中で答えと理由を確かめられます。
5 / 5
SQL実践 - UPDATE で行を書き換える
WHERE が決めるのは範囲
WHERE の行を外して、書き換わる行がどこまで広がるか見てください。
- UPDATE は、何に書き換えるかの SET と、どれを書き換えるかの WHERE でできている
- WHERE を省いた文はエラーにならない。表の全行が同じ値になって正常に終わる
- 書く前に同じ条件で SELECT を流し、返ってきた行数を見るのが現場の手順
1 / 5
作成との違いは、どの行かを送ること
編集画面で直して送ったあとに通る場所は、作成のときと同じ3つです。違うのは、送るものと、データベースでやることの2点だけです。
INSERT のとき
送るのは値だけです。表に行が1本増えて、対象はその新しい行になります。
UPDATE のとき
値と、どの行かを一緒に送ります。既にある行の値が書き換わり、対象は WHERE で選んだ行になります。
「どの行か」を送っている点が作成との差です。これが文の中では WHERE になります。
2 / 5
SET が新しい値、WHERE が対象の行
UPDATE は2つの役割に分かれています。何に書き換えるかが SET、どれを書き換えるかが WHERE です。
SET name = 'とまと'新しい値WHERE id = 3書き換える行memos
| id | name |
|---|---|
| 1 | じゃがいも |
| 2 | にんじん |
| 3 | とまと |
3行目だけが書き換わりました。他の行には触れていません。
SET は列ごとにカンマで並べられます。触れなかった列の値はそのまま残ります。
3 / 5
WHERE を書き忘れると全行が変わる
UPDATE の WHERE は省略できます。省略した文はエラーになりません。表の全行が同じ値に書き換わったうえで、正常終了します。
UPDATE memos対象は表そのものmemos
| id | name |
|---|---|
| 1 | とまと |
| 2 | とまと |
| 3 | とまと |
3行とも同じ値になりました。元の値はもう表のどこにも残っていません。
書く前に同じ条件で SELECT を流し、返ってきた行数を見てから UPDATE に直すのが、現場で使われている手順です。
4 / 5
考えてみよう外しても進めます
UPDATE memos SET name = 'とまと' WHERE id = 99; を、id が 99 の行が無い表に実行するとどうなりますか。
選ぶと、この枚の中で答えと理由を確かめられます。
5 / 5
SQL実践 - DELETE で行を消す
消える単位は文で変わる
3つの文を切り替えて、消える単位がどう変わるか見てください。
- DELETE が消すのは行。WHERE で選んだぶんだけ表から無くなる
- WHERE を省くと全行が消える。それでもエラーにはならない
- DROP TABLE が消すのは表そのもの。列の名前も一緒に消える
1 / 5
更新との違いは、戻せないこと
通る場所は作成や更新と同じです。違うのは、送るものが減ることと、やり直しが効かないことの2点です。
UPDATE のとき
新しい値を送ります。行は表に残るので、書き戻せば元に戻ります。
DELETE のとき
値は要らず、どの行かだけを送ります。行が表から取り除かれ、戻せるのはバックアップからだけです。
消えた行は SELECT で探しても出てきません。だから消す前に、本当に消すのかを決めておきます。
2 / 5
DELETE には SET が無い
消すのに新しい値は要らないので、DELETE にあるのは「どの表か」と「どの行か」の2つだけです。
memosどの表からWHERE id = 3消す行memos
| id | name |
|---|---|
| 1 | じゃがいも |
| 2 | にんじん |
3行目が表から消えました。id の 3 が空くだけで、下の行が繰り上がることはありません。
列を消すのは DELETE ではありません。あれは表の形を変える話なので ALTER TABLE の仕事です。
3 / 5
SQL実践 - DELETE で行を消す
消す前に決めておくこと
業務のデータは、消すと困るものが混ざっています。本当に取り除くのか、消えたことにするだけなのかを先に決めます。
削除フラグのやり方を論理削除と呼びます。表からは消えないので、以降の SELECT では毎回そのフラグで絞ることになります。
| やり方 | 向いている場面 |
|---|---|
| DELETE で本当に消す | 作業中の下書きなど、残す価値が無いもの |
| 削除フラグを立てる | 注文履歴など、あとから見返すもの |
| WHERE を省く | 無い。全行が消える |
| TRUNCATE を使う | 表を空にすると決めているとき |
4 / 5
考えてみよう外しても進めます
注文履歴の表から、退会した人の注文を DELETE で消しました。困るのはどれですか。
選ぶと、この枚の中で答えと理由を確かめられます。
5 / 5