# ストアドプロシージャってやつでなんとかして!!!! ## 問題文 あなたはA社に今年入社した新入社員です。 A社は人手不足でAさんの他に上司のBさんしか情報システム部門にいません。 ある日突然Bさんが人事のCさんに、「簡単に指定のデータを取り出せるようにしてほしい」と言われました。 ですが、Bさんは次の日からバカンスに行く予定があったため、あなたに任せて出国してしまいました。 Bさんの代わりにCさんを助けてあげてください。 ### 問1 性別名が"男"の従業員のみを取得してください。 カラムは(employee_id, name, birthday, sex_name)を表示してください。 ```sql CREATE PROCEDURE q01() BEGIN SELECT employee_id, name, birthday, sex_name FROM Employees INNER JOIN Sex ON Employees.sex_id = Sex.sex_id WHERE sex_name = '男'; END ``` ### 問2 性別名が"女"で年齢が女性従業員の平均年齢以上の従業員のみを取得してください。 カラムは(employee_id, name, age, sex_name)を表示してください。 age(年齢)に関してはbirthdayから求めて答えてください。 ```sql CREATE PROCEDURE q02() BEGIN SELECT employee_id, name, TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) AS age, sex_name FROM Employees INNER JOIN Sex ON Employees.sex_id = Sex.sex_id WHERE sex_name = '女' AND TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) >= (SELECT AVG(TIMESTAMPDIFF(YEAR, `birthday`, CURDATE())) FROM Employees INNER JOIN Sex ON Employees.sex_id = Sex.sex_id WHERE sex_name = '女'); END ``` ### 問3 部署も権限もすでに決まっている(NULL以外である)従業員のデータのみを取得してください。 カラムは(employee_id,name,age,department_name,permit_name) age(年齢)に関してはbirthdayから求めて答えてください。 ```sql CREATE PROCEDURE q03() BEGIN SELECT employee_id, name, TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) AS age, department_name, permit_name FROM Employees INNER JOIN Departments ON Departments.department_id = Employees.department_id INNER JOIN Permit ON Employees.permit_id = Permit.permit_id WHERE Employees.department_id IS NOT NULL AND Employees.permit_id IS NOT NULL; END ``` ## 条件 Employees以外のテーブル内にあるカラム"〇〇_id"は今後内容が変更されることがあるので注意すること。 ## ゴール 問1, 2, 3で指定したデータを取得するクエリを、q01, q02, q03という名前でストアドプロシージャとして登録する。 ## 情報 IPアドレス: 192.168.0.1 ユーザー名: admin パスワード: 6pfmqje365Ed DBユーザー名: root DBパスワード: なし ## テーブル ### Department ``` select * FROM Departments; ``` ``` +---------------+-----------------+ | department_id | department_name | +---------------+-----------------+ | 1 | 総務 | | 2 | デザイン | | 3 | 開発 | +---------------+-----------------+ ``` ### Employees ``` select * FROM Employees; ``` ``` +-------------+---------------------+------------+--------+---------------+-----------+ | employee_id | name | birthday | sex_id | department_id | permit_id | +-------------+---------------------+------------+--------+---------------+-----------+ | 1001 | 東京 太郎 | 1984-10-02 | 0 | 2 | 2 | | 1002 | 桜庭 花男 | 1980-05-06 | 0 | 1 | 3 | | 1003 | 神奈川 太郎 | 2001-04-05 | 0 | NULL | 1 | | 1004 | 埼玉 小太郎 | 1972-12-22 | 0 | 2 | 2 | | 1005 | 滝本 宗次郎 | 2000-02-13 | 0 | 1 | 1 | | 1006 | 千葉 太郎坊 | 1966-03-02 | 0 | 1 | 1 | | 1007 | 飯島 れん | 1995-04-01 | 0 | 3 | 3 | | 1008 | 葉月 もずく | 1995-11-03 | 0 | 2 | 3 | | 1009 | 大和 和子 | 1996-10-01 | 1 | 1 | 3 | | 1010 | 涼風 青葉 | 2001-02-02 | 1 | 2 | 2 | | 1011 | 望月 紅葉 | 2000-01-17 | 1 | NULL | 1 | | 1012 | 阿波根 うみこ | 1989-07-20 | 1 | 3 | 3 | | 1013 | 鳴海 ツバメ | 1999-05-16 | 1 | NULL | 1 | | 1014 | 飯島 ゆん | 1997-12-06 | 1 | 2 | 2 | | 1015 | 滝本 ひふみ | 1995-01-23 | 1 | 2 | 2 | | 1016 | 桜 ねね | 2000-05-05 | 1 | NULL | 1 | | 1017 | 遠山 りん | 1993-12-03 | 1 | 2 | 2 | | 1018 | 葉月 しずく | 1983-05-22 | 1 | 1 | 3 | | 1019 | 八神 コウ | 1993-08-02 | 1 | 2 | 3 | | 1020 | 篠田 はじめ | 1998-01-01 | 1 | 2 | 2 | +-------------+---------------------+------------+--------+---------------+-----------+ ``` ### Permit ``` SELECT * FROM Permit; ``` ``` +-----------+----------------+ | permit_id | permit_name | +-----------+----------------+ | 1 | none | | 2 | read only | | 3 | read and write | +-----------+----------------+ ``` ### Sex ``` SELECT * FROM Sex; ``` ``` +--------+----------+ | sex_id | sex_name | +--------+----------+ | 0 | 男 | | 1 | 女 | +--------+----------+ ``` ## 解答 お疲れ様です。:thonk_spin.ex-large.rotate.parrot:です。 問題「ストアドプロシージャってやつでなんとかして!!!!」の解答を送らせていただきます。 問1, 2, 3で指定されたデータを取得するクエリを、それぞれq01, q02, q03という名前のストアドプロシージャとして登録いたしました。ストアドプロシージャ登録クエリは以下の通りになります。 ## 問1 ``` CREATE PROCEDURE q01() BEGIN SELECT employee_id, name, birthday, sex_name FROM Employees INNER JOIN Sex ON Employees.sex_id = Sex.sex_id WHERE sex_name = '男'; END ``` ## 問2 ``` CREATE PROCEDURE q02() BEGIN SELECT employee_id, name, TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) AS age, sex_name FROM Employees INNER JOIN Sex ON Employees.sex_id = Sex.sex_id WHERE sex_name = '女' AND TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) >= (SELECT AVG(TIMESTAMPDIFF(YEAR, `birthday`, CURDATE())) FROM Employees INNER JOIN Sex ON Employees.sex_id = Sex.sex_id WHERE sex_name = '女'); END ``` ## 問3 ``` CREATE PROCEDURE q03() BEGIN SELECT employee_id, name, TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) AS age, department_name, permit_name FROM Employees INNER JOIN Departments ON Departments.department_id = Employees.department_id INNER JOIN Permit ON Employees.permit_id = Permit.permit_id WHERE Employees.department_id IS NOT NULL AND Employees.permit_id IS NOT NULL; END ```