### 単一テーブルのクエリ
#### テーブル構造 テーブル名はemployeeで、フィールド名はすべて日本語です。例えば、部署番号、給与、社員番号、入社日などです。 テーブルの作成:-- employeeテーブルの作成
CREATE TABLE `employee` (
`部署番号` int(11) NOT NULL,
`社員番号` int(11) NOT NULL,
`入社日` date NOT NULL,
`給与` float(8,2) NOT NULL,
`政治的` varchar(10) NOT NULL DEFAULT '一般',
`名前` varchar(20) NOT NULL,
`生年月日` date NOT NULL,
PRIMARY KEY (`社員番号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
-- テーブルにデータを挿入
INSERT INTO `employee` (`部署番号`, `社員番号`, `入社日`, `給与`, `政治的`, `名前`, `生年月日`) VALUES (101, 1001, '2015-5-4', 3500.00, '一般', '田中', '1990-7-1');
INSERT INTO `employee` (`部署番号`, `社員番号`, `入社日`, `給与`, `政治的`, `名前`, `生年月日`) VALUES (101, 1002, '2017-2-6', 3200.00, '若手', '佐藤', '1997-2-8');
INSERT INTO `employee` (`部署番号`, `社員番号`, `入社日`, `給与`, `政治的`, `名前`, `生年月日`) VALUES (102, 1003, '2011-1-4', 8500.00, '党員', '山本', '1983-6-8');
INSERT INTO `employee` (`部署番号`, `社員番号`, `入社日`, `給与`, `政治的`, `名前`, `生年月日`) VALUES (102, 1004, '2016-10-10', 5500.00, '一般', '鈴木', '1994-9-5');
INSERT INTO `employee` (`部署番号`, `社員番号`, `入社日`, `給与`, `政治的`, `名前`, `生年月日`) VALUES (102, 1005, '2014-4-1', 4800.00, '党員', '高橋', '1992-12-30');
INSERT INTO `employee` (`部署番号`, `社員番号`, `入社日`, `給与`, `政治的`, `名前`, `生年月日`) VALUES (102, 1006, '2017-5-5', 4500.00, '党員', '吉田', '1996-9-2');
#### クエリ要件
1. すべての従業員の基本情報を表示します。
SELECT * FROM employee;
2. すべての従業員が所属する部署番号を表示し、重複を除外します。
SELECT DISTINCT 部署番号 FROM employee;
3. 従業員の総数を求めます。
SELECT COUNT(*) FROM employee;
4. 最高給与と最低給与をリストします。
SELECT MAX(給与) AS 最高給与, MIN(給与) AS 最低給与 FROM employee;
5. 従業員の平均給与と総給与をリストします。
SELECT AVG(給与) AS 平均給与, SUM(給与) AS 総給与 FROM employee;
6. 社員番号、名前、入社日のみを含む新しいテーブルwork_dateを作成します。
CREATE TABLE work_date AS SELECT 社員番号, 名前, 入社日 FROM employee;
7. すべての女性従業員の年齢を表示します。
元のテーブルには「性別」フィールドがないため、追加します。
ALTER TABLE employee ADD COLUMN `性別` VARCHAR(2);
UPDATE employee SET `性別`='男' WHERE 社員番号=1001;
UPDATE employee SET `性別`='女' WHERE 社員番号=1002;
UPDATE employee SET `性別`='男' WHERE 社員番号=1003;
UPDATE employee SET `性別`='男' WHERE 社員番号=1004;
UPDATE employee SET `性別`='女' WHERE 社員番号=1005;
UPDATE employee SET `性別`='男' WHERE 社員番号=1006;
クエリ文:
SELECT
`名前`,
TIMESTAMPDIFF(YEAR, `生年月日`, CURDATE()) AS `年齢`
FROM
employee
WHERE
`性別` = '女'
ORDER BY
`社員番号`;
8. 「李」씨 이름の従業員の社員番号、名前、生年月日をリストします。
SELECT 社員番号, 名前, 生年月日 FROM employee WHERE 名前 LIKE '李%';
「李」씨の従業員はいませんので、結果は空となります。
9. 1960年以前に生まれた従業員の名前と入社日をリストします。
SELECT 名前, 入社日 FROM employee WHERE 生年月日 < '1960-01-01';
1960年以前に生まれた従業員はいませんので、結果は空となります。
10. 給与が1000から2000までの従業員の名前をリストします。
SELECT 名前 FROM employee WHERE 給与 BETWEEN 1000 AND 2000;
最低給与が3200であるため、結果は空となります。
11. 「陳」씨または「李」씨の従業員の名前をリストします。
SELECT 名前 FROM employee WHERE 名前 LIKE '陳%' OR 名前 LIKE '李%';
12. 部署番号が102の従業員の社員番号、名前、政治的をリストします。
SELECT 社員番号, 名前, 政治的 FROM employee WHERE 部署番号 = 102;
13. 従業員テーブルemployeeの従業員を生年月日順に並べ替えます。
SELECT * FROM employee ORDER BY 生年月日;
14. 給与が高い上位3人の従業員の社員番号と名前を表示します。
SELECT 社員番号, 名前 FROM employee ORDER BY 給与 DESC LIMIT 3;
15. 各部署の党員の人数を求めます。
SELECT
部署番号,
COUNT(*) AS 党員人数
FROM
employee
WHERE
政治的 = '党員'
GROUP BY
部署番号;
16. 各部署の給与合計と平均給与を計算します。
SELECT 部署番号, SUM(給与) AS 給与合計, AVG(給与) AS 平均給与 FROM employee GROUP BY 部署番号;
17. 従業員数が4人以上の部署の部署番号と従業員数をリストします。
SELECT 部署番号, COUNT(*) AS 従業員数 FROM employee GROUP BY 部署番号 HAVING COUNT(*) > 4;
従業員数が4人以上の部署は存在しないので、結果は空となります。