pulpul 日本の試験

基本情報技術者 概念書 · データベース

関係データ操作とSQL集計

要点と定義

関係データベースでは、表の行を条件で絞る操作を選択、必要な列だけを取り出す操作を射影といいます。たとえば、社員と部門を部門コードで結合し、フロアが2の行を選択して、部門名・社員番号・氏名を射影すれば、条件に合う社員一覧を作れます。選択は行、射影は列に作用する点を区別します。

結合は、関連する列の値が一致する行同士を組み合わせます。SQLで表を並べ、WHEREに対応列の一致条件を置く書き方では、その条件を満たす行の組合せが残ります。結合条件を書き忘れると、意図しない組合せが生じます。社員と部門を所属名で結び、フロアが2の部門に属する社員を数える例では、該当部門に所属する社員は3人です。

直積は、表Rの各行と表Sの各行をすべて組み合わせる演算です。Rに2行、Sに3行あれば、直積は2×3=6組になります。FROM R, Sのように結合条件を指定せず表を並べるSQLは、この組合せを作ります。行をまとめるUNION、片方にだけある行を求めるEXCEPT、共通する行を求めるINTERSECTとは用途が異なります。

グループ化と集合関数は、同じ値を持つ行をひとまとまりにして集計する仕組みです。GROUP BYに指定した列の値ごとにグループを作り、SUMは数値の合計、COUNTは行数、AVGは平均、MAXは最大値を求めます。通勤費表の各行が従業員ごとの交通費を表すなら、従業員番号でグループ化して交通費をSUMすると従業員ごとの合計になります。交通機関コードでグループ化してCOUNTすれば、交通機関ごとの利用行数を数えられます。

利用記録のように「1行が1回の利用」を表すデータでは、対象列でグループ化してCOUNT(*)を使うと、グループごとの延べ利用回数を数えられます。番号を合計するSUMや、最大番号を求めるMAXは件数を表しません。

適用条件と例

文字列の条件指定にはLIKEを使えます。パターン中の%は任意の長さの文字列、_は任意の1文字に対応します。コードが3文字固定で、対象コードがBから始まるという条件なら、LIKE 'B%'は先頭がBのコードを選びます。IN ('B00', 'B99')ではその2種類しか選べず、LIKE 'B_'はBの後に1文字だけ続くパターンなので、3文字コードには合いません。

副問合せは、SQL文の中で別の検索を行い、その結果を外側の条件に使う方法です。副問合せが複数のコードを返す可能性があるとき、単一値との比較を意図する=ではなく、候補の集合に含まれるかを調べるINを使います。たとえば、指定した複数の交通機関名からコードを取り出し、そのコードを使う通勤費の行を選べます。

条件に該当する行を選んだ後、同じ従業員番号を一度だけ表示するには、その番号でグループ化します。番号をSELECTするのに、別の列だけでグループ化しても一意な番号一覧にはなりません。従業員番号でグループ化すれば、該当する通勤費行が複数あっても番号はグループごとに一つになります。

この節の続き

ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。

アプリでこの節を読む