関係データ操作とSQL
要点と定義
関係データの操作では、選択は条件に合う行を残し、射影は必要な列を残します。結合は指定した条件を満たす行を組み合わせ、直積は条件を使わず、二つの関係の行をすべて組み合わせます。直積の結果件数は、左の行数と右の行数の積です。たとえば3行と5行なら、組合せは3×5=15通りです。これらの区別は、関係演算の意味を判断する基礎になります。過去の出題で扱った補足として、直積は二つの関係の全タプルの組合せを作る演算です。
和集合・差集合・共通集合は、二つの関係のタプルを同じ形式で比較したりまとめたりする演算です。属性数が等しく、対応する属性の定義域が同じという和両立が必要です。直積はタプルを組み合わせて新しいタプルを作るため、和両立を必要としません。この違いは、各集合演算の適用条件を見分けるのに必要です。過去の出題で扱った補足として、直積には和両立が必要ないことが確認できます。
過去の出題で扱った補足として、二つの表を単純な入れ子ループ法で結合する場合、外側の各行について内側の表を調べます。両方がn行なら比較回数はn×n=n²で、計算量はO(n²)です。行数が異なり、それぞれp行とq行なら比較回数はp×qです。この見積りは単純な入れ子ループ法についてのもので、別の実行方法のコストまで一律に表すものではありません。
分散データベースでは、結合に伴う通信量も考慮します。過去の出題で扱った補足として、セミジョインは結合キーを先に送り、相手側で該当行を絞ってから結合に使う方法です。表全体をそのまま転送する場合に比べて通信量を抑えやすい考え方ですが、効果はデータの分布や行数などに左右されます。
SQLのSELECT文では、条件による行の選択、列の指定、表の結合、集約やグループ化などを組み合わせて、求めるデータを問い合わせます。相関副問合せでは、内側の問合せが外側の行の値を参照します。過去の出題で扱った補足として、各社員について同じ性別の行に絞って生年月日の最小値を求めれば、外側の生年月日と比較できます。日付が早いほど年長という条件では、最小日付と同じ人も最年長者に当たるため、それを除く条件なら同率者も除かれます。この判断には、内側の絞込みが外側の行と対応していることが必要です。
過去の出題で扱った補足として、EXISTSは条件に合う行があるかを調べ、NOT EXISTSはそのような行がないことを調べます。たとえば社員コードが上司欄に一度も現れない社員を探すには、外側の社員コードに対応する上司欄の行が存在しないことを判定します。SQLではNULLとの通常の等値比較は真にならないため、NULLを含む条件の扱いも確認します。
過去の出題で扱った補足として、FULL JOINでは片側にしかない行の反対側の列がNULLになります。COALESCEは引数を左から見て最初の非NULL値を返すので、左右のキー列のうち存在する値を結果にできます。この説明は、COALESCEを備えたSQL方言を前提にしています。
過去の出題で扱った補足として、同じ会員・同じ項目の履歴から最新行を選ぶには、行番号が追加順に増える条件のもとで、会員番号と項目名ごとの最大行番号を求めます。その後、条件式で項目ごとの値を振り分け、会員単位に集約して列にまとめます。グループに項目名を含めることで、異なる項目の履歴が混ざるのを防ぎます。
この節の続き
- 適用条件と例
- 誤りやすい点
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む