# Question06 - 複数テーブルの結合検索 本資料の練習問題は、複数のプログラミング言語(Java / PHP / C# / Python)で共通して利用できるよう記述されています。使用するデータベース接続の仕組み(JDBC、PDO、ADO.NET、DB-API 2.0準拠のドライバ など)やSQLへのパラメータの指定方法、自動採番された値の取得方法など、言語・環境固有の仕様に基づき、問題文の表現をご使用の環境の仕様に適宜読み替えて進めてください。 [共通の前提](../00.共通前提.md)を参照してください。 ## この問題のねらい - 複数のテーブルを内部結合(INNER JOIN)して検索し、関連するデータをまとめて取得できること ## 前提:社員テーブル(employee) 共通の前提の部署テーブルに加えて、以下の項目を持つ「社員」テーブルが、あらかじめ用意されているものとします。社員テーブルの各データは、所属する部署を部署IDで参照します。 | カラム名 | 内容 | 型 | | --- | --- | --- | | id_employee | 社員ID(主キー。新規登録時は自動的に採番される) | 整数 | | nm_employee | 社員名 | 文字列 | | id_department | 所属する部署の部署ID(部署テーブルのid_departmentを参照) | 整数 | 初期データとして、以下の4件が登録されているものとします。 | id_employee | nm_employee | id_department | | --- | --- | --- | | 1 | 山田太郎 | 1 | | 2 | 鈴木花子 | 2 | | 3 | 佐藤次郎 | 3 | | 4 | 田中三郎 | 1 | 以下の設問はそれぞれ独立したプログラムとして実装してください。 ## ファイル名・フォルダ構成 - 設問ごとに1つのフォルダを作成し、そのフォルダの直下にプログラムのファイルを配置すること。 - フォルダ名は、設問番号に対応した連番(`question01`、`question02`、…)とすること(全言語共通・小文字)。 - ファイル名は、設問番号に対応した連番(`Question01`、`Question02`、…)を基本とし、言語の慣習に合わせて次のとおりとすること。 - 本問題(Question06-Join)の構成は次のとおり。 ``` Question06-Join/ ├── question01/    ← 設問1 │ └── Question01.<拡張子> ├── question02/    ← 設問2 │ └── Question02.<拡張子> └── question03/    ← 設問3 └── Question03.<拡張子> ``` - Java: `Question01.java`(公開クラス名もファイル名と同じ `Question01` とする) - C#: `Question01.cs` - PHP: `Question01.php` - Python: `question01.py`(モジュール名は小文字とする慣習のため、ファイル名のみ小文字) - 上記ツリー中の `Question01.<拡張子>` は、使用する言語に応じて上記のファイル名に読み替えること。 - プロジェクトファイルが必要な場合など、言語・開発環境の規則上やむを得ない場合は、その規則を優先してよい。その場合も、設問ごとのフォルダ分けと連番の命名は維持すること。 - 設問内で追加で作成するクラス・関数などは、その設問のフォルダ直下に配置すること。 - 他の設問で作成したクラス等を使用する設問では、各フォルダ単独で実行できるよう、そのフォルダ直下にも同じ内容を配置すること。 --- ## 設問1 社員テーブルと部署テーブルを内部結合し、社員ID順に、すべての社員の社員名と、その社員が所属する部署の部署名を取得して出力するプログラムを実装してください。 ### 要件 - データベースへの接続・SQLの実行・接続の切断を、すべて自分で実装すること - テーブルの結合には内部結合(INNER JOIN)を使用し、2つのテーブルのデータを1回のSQLで取得すること - 取得結果を先頭から1件ずつ取り出し、社員名・部署名をタブ区切りで出力すること ### 実行例 ``` 山田太郎 営業部 鈴木花子 人事部 佐藤次郎 開発部 田中三郎 営業部 ``` --- ## 設問2 標準入力から部署名を受け取り、社員テーブルと部署テーブルを内部結合して、その部署名に一致する部署に所属する社員を社員ID順に取得し、社員名を出力するプログラムを実装してください(該当する社員は0件・1件・複数件のいずれの場合もあります)。 ### 要件 - データベースへの接続・SQLの実行・接続の切断を、すべて自分で実装すること - 「検索する部署名を入力してください」と表示し、標準入力から部署名を読み込むこと - テーブルの結合には内部結合(INNER JOIN)を使用して2つのテーブルのデータを1回のSQLで取得し、部署名による絞り込みは、SQLに値を直接埋め込むのではなく、パラメータとして値を渡す仕組みを使用すること - 取得結果を先頭から1件ずつ取り出し、社員名を1件ずつ出力すること - 該当する社員が1件も存在しない場合は、「一致する社員は見つかりませんでした」と出力すること ### 実行例 - 入力が `営業部` の場合 - 出力: ``` 山田太郎 田中三郎 ``` - 入力が `広報部`(存在しない部署名)の場合 - 出力:`一致する社員は見つかりませんでした` --- ## 設問3 社員テーブルと部署テーブルを内部結合し、部署ごとに所属する社員の人数を集計したうえで、部署IDの昇順で、部署名と所属人数を出力するプログラムを実装してください。 ### 要件 - データベースへの接続・SQLの実行・接続の切断を、すべて自分で実装すること - テーブルの結合・人数の集計は、1件ずつ数える繰り返し処理ではなく、1回のSQLで行うこと。結合には内部結合(INNER JOIN)を、人数の集計には集計関数に相当する仕組みを使用すること - 内部結合のため、所属する社員がいない部署(東京支店・大阪支店)は出力されない - 取得結果を先頭から1件ずつ取り出し、「(部署名):(所属人数)人」の形式で出力すること ### 実行例 ``` 営業部:2人 人事部:1人 開発部:1人 ```