データベースの基礎

顧客表(顧客ID, 氏名)と注文表(注文ID, 顧客ID, 金額)から、一度も注文していない顧客の氏名を求めたい。正しいSQL文はどれか。

  1. ASELECT 氏名 FROM 顧客 WHERE EXISTS (SELECT * FROM 注文 WHERE 注文.顧客ID = 顧客.顧客ID)
  2. BSELECT 氏名 FROM 顧客 WHERE NOT EXISTS (SELECT * FROM 注文)
  3. CSELECT 氏名 FROM 顧客 WHERE NOT EXISTS (SELECT * FROM 注文 WHERE 注文.顧客ID = 顧客.顧客ID)
答えと解説を見る

正解:C. SELECT 氏名 FROM 顧客 WHERE NOT EXISTS (SELECT * FROM 注文 WHERE 注文.顧客ID = 顧客.顧客ID)

EXISTSは、括弧の中の副問い合わせが1行でも結果を返せば真、1行も返さなければ偽になる述語で、NOT EXISTSはその逆です。副問い合わせの中で 注文.顧客ID = 顧客.顧客ID のように外側の表の列を使うと、外側の顧客表の1行ごとに、その顧客の注文があるかどうかを調べる相関副問い合わせになります。これをNOT EXISTSと組み合わせると、注文が1件もない顧客だけが残ります。EXISTSにすると、逆に注文したことがある顧客が求まります。副問い合わせに顧客と対応させる条件がないと、注文表に1行でもあれば副問い合わせは常に行を返すので、NOT EXISTSは常に偽になり、結果は0行になります。同じ結果は、LEFT OUTER JOIN で結合して、注文側の列がNULLになる行を選ぶ方法でも得られます。

  • A. EXISTSなので、注文したことがある顧客が求まります。
  • B. 副問い合わせが顧客ごとの条件になっていないので、注文表に1行でもあれば結果は0行になります。
  • C. 正しい。顧客ごとに注文の有無を調べ、注文が1件もない顧客だけを残します。
この分野を解く 分野ページへ

関連する計算ツール

データベースの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

データベースの基礎のほかの問題

  1. 関係データベースのビューの説明として、正しいものはどれか。
  2. 関係データベースの表を正規化する主な目的はどれか。
  3. 受注表(受注番号, 商品番号, 数量, 顧客番号, 顧客名)の主キーは{受注番号, 商品番号}で、関数従属は {受注番号, 商品番号} → 数量、受注番号 → 顧客番号、顧客番号 → 顧客名 である。この表を第3正規形まで正規化した結果として正しいものはどれか。
  4. 社員表(社員番号, 氏名, 部署コード, 部署名)の主キーは社員番号で、どの列も1つの値だけを持つ。関数従属は 社員番号 → 氏名、社員番号 → 部署コード、部署コード → 部署名 である。この表の正規形として正しいものはどれか。
  5. 読み出しが大部分を占める集計用のデータベースで、正規化した表をあえて1つにまとめ、同じデータを重複して持たせる設計(非正規化)を行うことがある。この設計の長所と短所の組み合わせとして正しいものはどれか。