「SQL Server - 副問い合わせ(サブクエリ)」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

288行目: 288行目:
  C        20210103 100
  C        20210103 100
<br><br>
<br><br>
== その他の使用例 ==
==== サブクエリと集約関数の組み合わせ ====
<center>
{| class="wikitable" | style="background-color:#fefefe;"
|+ employees テーブル構造
! style="background-color:#00ffff;" | カラム名
! style="background-color:#00ffff;" | データ型
! style="background-color:#00ffff;" | 説明
! style="background-color:#00ffff;" | 制約
|-
| id || SERIAL || 従業員ID || PRIMARY KEY
|-
| department_name || VARCHAR(50) || 部署名 || NOT NULL
|-
| employee_name || VARCHAR(100) || 従業員名 || NOT NULL
|-
| position || VARCHAR(50) || 役職 || NOT NULL
|-
| salary || INTEGER || 給与 ||
|-
| hire_date || DATE || 入社日 || NOT NULL
|}
</center>
<br>
<center>
{| class="wikitable" | style="background-color:#fefefe;"
|+ employees テーブルのサンプルデータ
! style="background-color:#00ffff;" | id
! style="background-color:#00ffff;" | 部署名
! style="background-color:#00ffff;" | 従業員名
! style="background-color:#00ffff;" | 役職
! style="background-color:#00ffff;" | 給与
! style="background-color:#00ffff;" | 入社日
|-
| 1 || 営業部 || 山田太郎 || 営業担当 || 350000 || 2022-01-15
|-
| 2 || 営業部 || 鈴木一郎 || 営業担当 || 350000 || 2022-02-01
|-
| 3 || 営業部 || 佐藤花子 || 営業主任 || 400000 || 2021-04-01
|-
| 4 || 営業部 || 田中美咲 || 営業担当 || 350000 || 2022-03-15
|-
| 5 || 営業部 || 高橋健一 || 営業部長 || 600000 || 2020-01-01
|-
| 6 || 総務部 || 伊藤真理 || 総務担当 || 330000 || 2022-06-01
|-
| 7 || 総務部 || 渡辺裕子 || 総務担当 || 330000 || 2022-07-15
|-
| 8 || 総務部 || 加藤正男 || 総務主任 || 380000 || 2021-08-01
|-
| 9 || 総務部 || 中村智子 || 総務担当 || 330000 || 2022-09-01
|-
| 10 || IT部 || 小林洋介 || プログラマー || 400000 || 2022-01-15
|}
</center>
<br>
<center>
{| class="wikitable" | style="background-color:#fefefe;"
|+ インデックス定義
! style="background-color:#00ffff;" | インデックス名
! style="background-color:#00ffff;" | 対象カラム
! style="background-color:#00ffff;" | 説明
|-
| idx_department_name || department_name || 部署名での検索を高速化
|}
</center>
<br>
以下の例では、特定の部署の人数が10人以上の場合、その部署の従業員を抽出している。<br>
<br>
* IN句を使用した方法
*: 可読性が良い。
*: 全カラムを取得する場合に適している。
* 特定のカラムを選択する方法
*: 必要なカラムのみを指定する。
*: ORDER BYで結果を並び替えが可能
*: <br>
* EXISTS句を使用した方法
*: 大量データの場合、IN句よりもパフォーマンスが良いことがある。
*: 存在確認のみを行うため、メモリ使用量が少なくなる可能性がある。
<br>
<syntaxhighlight lang="sql">
-- 基本的な書き方 : 10人以上いる部署の全従業員情報を取得
SELECT *
FROM  employees
WHERE  department_name IN (
    SELECT  department_name
    FROM    employees
    GROUP BY department_name
    HAVING  COUNT(*) >= 10
);
-- 複数のカラムを指定する場合 : 10人以上いる部署の従業員の基本情報のみを取得
SELECT
    t1.department_name,
    t1.employee_name,
    t1.position
FROM  employees t1
WHERE t1.department_name IN (
    SELECT  department_name
    FROM    employees
    GROUP BY department_name
    HAVING  COUNT(*) >= 10
)
ORDER BY t1.department_name;
-- EXISTS句を使用した別の書き方 : 10人以上いる部署の全従業員情報を取得
SELECT *
FROM employees t1
WHERE EXISTS (
    SELECT  1
    FROM    employees t2
    WHERE    t2.department_name = t1.department_name
    GROUP BY t2.department_name
    HAVING  COUNT(*) >= 10
);
-- 部署ごとの人数を確認する
SELECT
    department_name,
    COUNT(*) as employee_count
FROM    employees
GROUP BY department_name
ORDER BY employee_count DESC;
</syntaxhighlight>
<br><br>


{{#seo:
{{#seo: