表を扱うデータベースを操作する共通語が「SQL」。データを取り出すSELECT、表をつなぐJOIN、まとめて集計するGROUP BYを、身近な例でやさしく整理します。
CRUDとSELECTの基本
ねえ先生、SQLって結局なんなの? なんか呪文みたいなアルファベットの命令文だよね。
ふふ、いい言い方ね。
SQLは、表の形でデータをためるRDBに「これ取って」「これ追加して」とお願いするための、共通のことばよ。
ことば…ですかぁ。
お店で『これください』って言う感じですぅ?
まさにそれ。
お店ごとに言い方がバラバラだと困るでしょう? だからどのデータベースでもだいたい通じる、共通の注文の仕方が決まっているの。
それがSQLよ。
補足すると、よく使う命令は4つです。
SELECT(取得)、INSERT(追加)、UPDATE(更新)、DELETE(削除)。
この4つの操作をまとめてCRUDと呼びます。
クラッド? なんかカエルみたいな名前じゃん。
ふふっ。
Create(作成)・Read(読取)・Update(更新)・Delete(削除)の頭文字でCRUDなんですねぇ。
覚えやすいですぅ。
そう、その4つがデータ操作の基本。
中でも試験で一番よく出るのが取り出すSELECT。
基本の形はSELECT 列名 FROM 表名 WHERE 条件。
たとえばSELECT * FROM 会員 WHERE 年齢 >= 20で、会員表から20歳以上の人だけを取り出せるのよ。
FROMが「どの表から」で、WHEREが「どの条件で絞るか」ってことか。
* はなに?
*は『全部の列』という意味です。
WHEREで行を絞り、列名を書けば必要な列だけに絞れます。
たとえばSELECT 氏名, 年齢 FROM 会員なら氏名と年齢の2列だけ取れます。
WHEREは『行』を選んで、列名は『列』を選ぶ…タテとヨコで役割が違うんですねぇ。
ふふ、その整理が大事よ。
WHEREは横方向の行を選ぶ、列名の指定は縦方向の列を選ぶ。
混ざりやすいから気をつけてね。
JOINによる表の結合
じゃあさ、会員表と注文表みたいに表が2つに分かれてたらどうすんの? 1個ずつ取るの面倒じゃん。
そこでJOINの出番です。
共通する列をのりしろにして、2つの表をつなげて1つの結果にします。
たとえば会員IDで会員表と注文表をつなげば、『誰が何を買ったか』が一度に取れます。
つなぎ方にも種類があるのよ。
両方の表にデータがそろっている行だけを返す内部結合(INNER JOIN)と、片方の表は全部残して相手がいなければ空欄(NULL)で埋める外部結合(OUTER JOIN)ね。
あー、なるほど。
注文してない会員も一覧に残したいなら外部結合ってことか。
マジでわかりやすい。
じゃあ買い物してない人を消したくないときは外部結合、買った人だけ見たいときは内部結合ですねぇ。
GROUP BYと集約関数
その通り。
次は集計よ。
『部署ごとの平均給与』みたいにグループにまとめて計算したいときはGROUP BYを使うの。SELECT 部署, AVG(給与) FROM 社員 GROUP BY 部署で部署別の平均が出るわ。
AVGのように、まとめた行を1つの値に計算する関数を集約関数と呼びます。
代表は5つ。
COUNT(件数)・SUM(合計)・AVG(平均)・MAX(最大)・MIN(最小)です。
平均も件数も命令ひとつで出せちゃうんですねぇ。
電卓いらずですぅ。
集計前後の絞り込みと並び替え
ねえ、GROUP BYで絞り込みたいときもWHERE使うの?
そこが要注意です。
集計した結果を絞るときはWHEREではなくHAVINGを使います。
WHEREは集計する前の行を絞り、HAVINGは集計した後のグループを絞る、という順番の違いです。
覚え方は『先にWHEREで材料を選び、まとめてから、HAVINGで仕上げを選ぶ』。
順番がそのまま役割の違いになっているのよ。
並び替えはORDER BYだっけ? 部活の記録を速い順に並べたいみたいな。
はい、ORDER BYです。
小さい順はASC(昇順)、大きい順はDESC(降順)。
何も書かないとASC(昇順)になります。
最後に条件の書き方をいくつか。
あいまい検索のLIKE(部分一致)、複数の値のどれかに合うIN、範囲を指定するBETWEEN、そして値が空かどうかを調べるIS NULL。
これらは頻出だから押さえておいてね。
LIKEの%って『田%』で田から始まる名前ぜんぶ、みたいな感じですかぁ?
ふふ、その通り。氏名 LIKE '田%'なら『田』で始まる人、'%田%'なら『田』を含む人ね。
最後にまとめると、取り出すSELECT、つなぐJOIN、まとめるGROUP BY、絞るWHEREとHAVING、並べるORDER BY。
この役割分担で覚えれば、SQLはもう怖くないわよ。
確認クイズ
SQLで「社員テーブルから年齢が30歳以上のレコードを取得する」コマンドとして正しいものはどれか。
- SELECT * FROM 社員 WHERE 年齢 >= 30
- GET * FROM 社員 WHERE 年齢 >= 30
- FIND * FROM 社員 WHERE 年齢 >= 30
- SELECT * OF 社員 WHERE 年齢 >= 30
こたえを見る
正解: 1. SELECT * FROM 社員 WHERE 年齢 >= 30
データを取り出す命令はSELECT、対象の表はFROM、行を絞る条件はWHEREで指定します。基本構文はSELECT 列名 FROM 表名 WHERE 条件。GETやFINDというデータ取得命令はSQLに存在せず、表の指定はOFではなくFROMを使うため、他の3つは誤りです。