データ操作
要点と定義
関係データベースの操作では、表(関係)から必要な行や列を取り出し、複数の表を組み合わせたり、行を追加・変更・削除したりします。SQLでは、検索条件や集計の段階を区別して指定することが大切です。データ操作の基本と、SQLによる検索・更新を整理します。
関係代数の選択は条件に合う行を取り出し、射影は指定した列を取り出します。たとえば商品表から「仕入先が特定の二社である行」を選ぶのは選択、商品名と単価だけを取り出すのは射影です。行と列のどちらを絞る操作かを区別します。
SQLのSELECT文では、WHEREが集計前の行を絞り、GROUP BYが指定した列の値ごとに行をまとめ、HAVINGが集計後のグループを絞ります。AVGやCOUNTなどの集合関数は、グループごとの平均や件数を求めます。学生ごとの平均点を求める場合は学生番号でグループ化し、平均値への条件はHAVINGに指定します。
期間内の行を先にWHEREで選び、書籍ごとにまとめて貸出回数を数え、その件数でグループを絞る、という段階的な検索もできます。グループ単位の集計条件をWHEREに書くと、集計前の行に対する条件として扱えず、意図した判定になりません。
行の追加・更新・削除には、それぞれINSERT、UPDATE、DELETEを使います。主キーは行を一意に識別する列(または列の組)です。更新文の条件に複数行が該当すると、すべての行が更新対象になり得ます。更新後に主キー値が重複するなら制約違反になります。
適用条件と例
二つ以上の条件のどちらかに合う行を選ぶときは、ORまたはINが使えます。仕入先IDがM002またはM004の行を対象にするなら、仕入先ID IN ('M002','M004')は二つの等価条件をORで結んだ場合と同じ対象になります。値が連続した範囲ではなく、指定した値だけを対象にする点に注意します。
BETWEENは通常、下限と上限を含む範囲を指定します。たとえば日付が4月1日から翌年3月31日までという条件なら、範囲の両端を含む指定として使えます。条件をORで「開始日以降または終了日以前」とすると範囲外まで含んでしまうため、期間の内側を表す条件にします。
返却日が未設定の貸出記録を貸出中とみなす例では、NULLを通常の日付と同じように比較せず、IS NULLで未設定を判定します。CASE式で未設定なら貸出中、日付があれば貸出可と分類できます。状態とNULLの対応を逆にすると、表示も逆になります。
副問合せが単一の値を返す場所では、対象の貸出日の最大値を求めるMAXを使うと、最も新しい日付を比較できます。貸出日をそのまま選ぶと複数行になる場合があり、単一値との比較に使えません。DISTINCTは重複を除くだけで、最大の日付だけに絞る関数ではありません。
この節の続き
- 誤りやすい点
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む