テクノロジ系データベース出題頻度 ★★★

データ操作(選択・射影・結合)

表から必要なデータを取り出す「選択・射影・結合」の違いを、八百屋の商品表と販売表を使って図解。SQLのSELECT文・WHERE句・集計関数・GROUP BYの読み方まで、SQLの実行結果を手で求める問題が解けるようになります。

この単元の用語:選択 / 射影 / 結合 / SQL / SELECT / WHERE / ORDER BY / GROUP BY / 集計関数

データベースから欲しいデータだけを取り出すのって、どうやるんですか?

基本は3つの操作だけ。行を選ぶ「選択」、列を選ぶ「射影」、表をつなぐ「結合」だよ。八百屋さんの表で練習しよう。

例に使う2つの表

商品表

商品番号商品名分類単価
P1りんご果物150
P2にんじん野菜80
P3バナナ果物120
P4キャベツ野菜200
P5ぶどう果物400

販売表

販売番号商品番号数量
S1P13
S2P41
S3P12
S4P51

選択と射影:横に切るか、縦に切るか

選択(行を取り出す) 商品名 分類 単価 りんご果物150 にんじん野菜80 バナナ果物120 キャベツ野菜200 ぶどう果物400 条件「分類が果物」に合う行だけ 射影(列を取り出す) 商品名 分類 単価 りんご果物150 にんじん野菜80 バナナ果物120 キャベツ野菜200 ぶどう果物400 「商品名」と「単価」の列だけ
選択は表を横に切り、射影は表を縦に切るイメージ
操作取り出すものイメージ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行です。

結合:表と表をつなぐ

販売表には商品番号しかないので、「何が売れたか」の名前がわかりません。そこで、商品番号 という共通の列で商品表とつなぎます。これが 結合 です。

販売表 販売番号商品番号数量 S1P13 S2P41 商品表 商品番号商品名 P1りんご P4キャベツ 商品番号が 同じ行どうしを つなぐ 結合した結果 S1P13りんご S2P41キャベツ
共通の列(商品番号)の値が一致する行どうしを横に貼り合わせる
SELECT 販売.販売番号, 商品.商品名, 販売.数量
FROM 販売, 商品
WHERE 販売.商品番号 = 商品.商品番号   -- 結合の条件

「表名.列名」と書くのは、両方の表に「商品番号」があってどちらの列か区別するためです。

集計関数とGROUP BY

SELECT文では、集計もできます。

集計関数意味
COUNT(*)行の数
SUM(列)合計
AVG(列)平均
MAX(列) / MIN(列)最大値 / 最小値

GROUP BY を使うと、同じ値ごとにグループに分けて集計できます。

SELECT 分類, COUNT(*), AVG(単価) FROM 商品 GROUP BY 分類

分類COUNT(*)AVG(単価)
果物3223.3…(=(150+120+400)÷ 3)
野菜2140(=(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:降順)

確認クイズ

選択肢をタップすると、すぐに正解と解説が表示されます。

Q1関係データベースの操作のうち、表から特定の列だけを取り出す操作はどれか。

Q2「商品」表が次のとき、SQL文 SELECT 商品名 FROM 商品 WHERE 分類 = '果物' AND 単価 >= 150 の結果として得られる商品名をすべて挙げたものはどれか。

商品名|分類|単価
りんご|果物|150
にんじん|野菜|80
バナナ|果物|120
キャベツ|野菜|200
ぶどう|果物|400

Q3次の「販売」表と「商品」表を商品番号で結合し、分類が「果物」である販売の金額(単価 × 数量)を合計した値はどれか。

販売:販売番号|商品番号|数量
S1|P1|3
S2|P4|1
S3|P1|2
S4|P5|1

商品:商品番号|分類|単価
P1|果物|150
P4|野菜|200
P5|果物|400

Q4表に登録済みの行について、列の値を書き換えるときに使うSQL文はどれか。