データベースから欲しいデータだけを取り出すのって、どうやるんですか?
基本は3つの操作だけ。行を選ぶ「選択」、列を選ぶ「射影」、表をつなぐ「結合」だよ。八百屋さんの表で練習しよう。
例に使う2つの表
商品表
| 商品番号 | 商品名 | 分類 | 単価 |
|---|---|---|---|
| P1 | りんご | 果物 | 150 |
| P2 | にんじん | 野菜 | 80 |
| P3 | バナナ | 果物 | 120 |
| P4 | キャベツ | 野菜 | 200 |
| P5 | ぶどう | 果物 | 400 |
販売表
| 販売番号 | 商品番号 | 数量 |
|---|---|---|
| S1 | P1 | 3 |
| S2 | P4 | 1 |
| S3 | P1 | 2 |
| S4 | P5 | 1 |
選択と射影:横に切るか、縦に切るか
| 操作 | 取り出すもの | イメージ | SQLでいうと |
|---|---|---|---|
| 選択 | 条件に合う 行 | 横に切る | WHERE 句 |
| 射影 | 指定した 列 | 縦に切る | SELECT の後ろの列名 |
| 結合 | 複数の表を 共通の列 でつないだ表 | 横に貼り合わせる | FROM に複数の表 + 結合条件 |
射影 は「影を映す」と書きます。懐中電灯で横から照らすと、表の 縦の列 が壁に影として映る…と想像すると「射影=列」を忘れません。
SQLで書いてみよう
データベースを操作する言語が SQL です。データを取り出すには SELECT文 を使います。
SELECT 商品名, 単価 -- 射影:取り出す列
FROM 商品 -- どの表から
WHERE 分類 = '果物' -- 選択:行の条件
ORDER BY 単価 DESC -- 並べ替え(DESCは降順、ASCは昇順)
実行結果(果物の行だけを、単価の高い順に、商品名と単価の列だけ)
| 商品名 | 単価 |
|---|---|
| ぶどう | 400 |
| りんご | 150 |
| バナナ | 120 |
WHERE句の条件は AND(両方を満たす)、OR(どちらかを満たす)、NOT(満たさない)で組み合わせられます。例えば WHERE 分類 = '野菜' OR 単価 >= 300 なら、にんじん・キャベツ・ぶどうの3行です。
結合:表と表をつなぐ
販売表には商品番号しかないので、「何が売れたか」の名前がわかりません。そこで、商品番号 という共通の列で商品表とつなぎます。これが 結合 です。
SELECT 販売.販売番号, 商品.商品名, 販売.数量
FROM 販売, 商品
WHERE 販売.商品番号 = 商品.商品番号 -- 結合の条件
「表名.列名」と書くのは、両方の表に「商品番号」があってどちらの列か区別するためです。
集計関数とGROUP BY
SELECT文では、集計もできます。
| 集計関数 | 意味 |
|---|---|
| COUNT(*) | 行の数 |
| SUM(列) | 合計 |
| AVG(列) | 平均 |
| MAX(列) / MIN(列) | 最大値 / 最小値 |
GROUP BY を使うと、同じ値ごとにグループに分けて集計できます。
SELECT 分類, COUNT(*), AVG(単価) FROM 商品 GROUP BY 分類
| 分類 | COUNT(*) | AVG(単価) |
|---|---|---|
| 果物 | 3 | 223.3…(=(150+120+400)÷ 3) |
| 野菜 | 2 | 140(=(80+200)÷ 2) |
データを追加したり消したりするときもSELECTですか?
いや、別の文を使うよ。追加は INSERT、変更は UPDATE、削除は DELETE。UPDATE と DELETE は WHERE を書き忘れると全部の行が対象になるから要注意だ。
| SQL文 | 働き |
|---|---|
| SELECT | 行・列を取り出す(検索) |
| INSERT | 行を追加する |
| UPDATE | 行の値を変更する |
| DELETE | 行を削除する |
試験に出るポイント
- 選択 = 条件に合う 行 を取り出す(WHERE)
- 射影 = 指定した 列 を取り出す(SELECT 列名)
- 結合 = 共通の列 で複数の表をつなぐ
- WHERE の AND(両方)/OR(どちらか)、「以上(>=)」「より大きい(>)」の境界に注意
- 集計は COUNT・SUM・AVG・MAX・MIN、グループごとの集計は GROUP BY
- 並べ替えは ORDER BY(ASC:昇順、DESC:降順)