頻出高 ⏱ 9分 ★★★★★

午後対策:SQL問題

EXISTS・HAVING・外部結合・ウィンドウ関数の実戦パターン

業務要件を SQL で表現する能力が問われる。JOIN・サブクエリ・集計・ウィンドウ関数の組み合わせが頻出。SQL の穴埋めと記述の両方がある。

-- 「受注がある顧客の一覧」
SELECT 顧客ID, 顧客名
FROM   顧客 c
WHERE EXISTS (
  SELECT 1 FROM 受注 o
  WHERE o.顧客ID = c.顧客ID
);
-- 「3件以上受注した顧客」
SELECT 顧客ID, COUNT(*) AS 受注件数
FROM   受注
GROUP BY 顧客ID
HAVING COUNT(*) >= 3;
-- 「受注がない顧客を探す」
SELECT c.顧客ID, c.顧客名
FROM   顧客 c
LEFT JOIN 受注 o ON c.顧客ID = o.顧客ID
WHERE  o.受注ID IS NULL;
-- 「各部門で給与が最高の社員」
SELECT *
FROM (
  SELECT 氏名, 部門ID, 給与,
    RANK() OVER (PARTITION BY 部門ID ORDER BY 給与 DESC) AS rk
  FROM 社員
) t
WHERE rk = 1;
-- 「部門別売上上位3商品」
WITH 部門売上 AS (
  SELECT 部門ID, 商品ID, SUM(売上) AS 合計売上,
    ROW_NUMBER() OVER (PARTITION BY 部門ID ORDER BY SUM(売上) DESC) rn
  FROM 売上明細
  GROUP BY 部門ID, 商品ID
)
SELECT * FROM 部門売上 WHERE rn <= 3;

📝 理解度チェック

「受注が1件もない顧客を取得する」SQLとして正しいのはどれか?
「部門ごとの給与ランキング1位の社員を取得する」に使うSQLの技術はどれか?

読了ボタンを押すとトップページの進捗に反映されます