データ操作とSQL
要点と定義
関係データベースの操作では、表を行と列の集まりとして捉え、必要なデータを選択・射影・結合などで取り出します。選択は条件に合う行を選び、射影は必要な列を取り出します。関係の射影では同じ値の組を一つにまとめます。過去の出題で扱った補足として、SQLでこの重複除去を行うには DISTINCT を使い、ORDER BY は並び順を指定する句です。
関係の和は、属性の構成が対応する関係どうしの行をまとめ、重複する行は一つとして扱う演算です。差は一方だけにある行を取り出し、直積は一方の各行と他方の各行を組み合わせます。結合は共通する値などを条件に行を対応させ、表の列を組み合わせます。
SQLの SELECT 文は、列や行の指定、表の結合、集約、グループ化などを組み合わせて問合せを表します。ビューは問合せによって得られる表として定義でき、列名に別名を付けたり、条件で行を絞ったりできます。複数表を結合したビューは、結合の形などによって更新できるかが異なります。過去の出題で扱った補足として、ビューは問合せの結果として得られる表です。
外部キーによる参照制約は、参照する側の値が参照先に存在することを求めます。過去の出題で扱った補足として、通常の即時検査を前提にすると、参照先にない値を持つ行の追加は制約違反となり得ます。
集約関数は複数行の値を集計します。過去の出題で扱った補足として、SQLの AVG は NULL を平均の対象から除外します。外部結合で対応行がない側の列が NULL になっても、その行自体が残ることと、平均に加算されることは別です。
自然結合は、同じ名前の共通列を条件に対応行を結合し、結果では共通列を一列として扱います。SQLの通常の列指定による結合では、結合条件と出力列を確認し、自然結合と同じ列構成になるように指定します。
表から何が分かるかは、表に含まれる属性にも左右されます。たとえば、顧客別の購入数量があっても購入日が記録されていなければ、購入数量を日別に集計する根拠はありません。過去の出題で扱った補足として、日付列がない表だけから日別の購入者数を得ることはできません。
適用条件と例
例として、貸出記録から「返却済みの行だけ」を取り出すのは選択です。その結果から「利用者番号と返却日だけ」を取り出すのは射影です。選択は行を絞り、射影は列を絞るため、目的に応じて両方を組み合わせられます。
二つの関係を和でまとめるには、列の数や対応する属性の構成が適合している必要があります。結合では対応条件を決め、どの列を結果に出すかも確認します。自然結合と同じ結果を作る場合は、共通列を重複して出力しないよう列を選びます。
SQL例では、集約対象に NULL がある場合、AVG はその値を平均計算から外す前提で考えます。たとえば値が 12、NULL、30 なら、平均は (12+30)÷2=21 です。この例では、NULL はゼロとして扱いません。SQL方言や設定による違いがあり得るため、実際の動作を評価するときは使用環境の仕様を確認します。更新と参照制約の評価時点も、即時検査か遅延検査かなど実装・定義の前提を確認します。
誤りやすい点
選択と射影を取り違えないようにします。行を条件で絞るのが選択、列を取り出すのが射影です。関係演算で重複する組をまとめる考え方と、SQLで重複を残す指定があり得ることも区別します。
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む