戻る:[SQL実際の戦闘(1)] [Niuke NetでのSQL実際の戦闘]
++++++++++++++++++ Start line ++++++++++++++++++
1.トピック
1.1質問6
タイトル説明
全従業員の現在の(to_date = '9999-01-01')特定の給与状況を確認し、同じ給与を1回だけ表示し、逆の順序で表示します
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
出力の説明
select distinct salary from salaries
where to_date='9999-01-01'
order by salary desc;
注:WHEREステートメントはGROUP BYステートメントの前にあり、SQLはグループ化の前にWHEREステートメントを計算します。HAVINGステートメントがGROUP BYステートメントになった後、SQLはグループ化後にHAVINGステートメントを計算します。
1.2質問7
タイトル説明
すべての部門の現在の(dept_manager.to_date = '9999-01-01')マネージャーの現在の(salaries.to_date = '9999-01-01')給与を取得し、
dept_no 、emp_no、および給与を提供します(同じ人物が(複数の給与レコードがあります)
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
回答
SELECT d.dept_no, d.emp_no, s.salary
FROM dept_manager AS d, salaries AS s
WHERE d.emp_no = s.emp_no
AND d.to_date = s.to_date
AND d.to_date = '9999-01-01'
1.3質問8
タイトル説明
マネージャー以外のすべての従業員を取得するemp_no
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
回答
select e.emp_no
from employees e left join dept_manager d
on d.emp_no = e.emp_no
where d.dept_no is null
1.4質問9
タイトル説明
すべての従業員の現在の(dept_manager.to_date = '9999-01-01')マネージャーを取得します。従業員がマネージャーの場合、そのマネージャーは表示されません(つまり、現在のマネージャーがそれ自体の場合、結果は表示されません)。出力結果の最初の列は現在の従業員のemp_noを示し、2番目の列はそのマネージャーに対応するemp_noを示します。
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL, -- '所有的员工编号'
`dept_no` char(4) NOT NULL, -- '部门编号'
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL, -- '部门编号'
`emp_no` int(11) NOT NULL, -- '经理编号'
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
回答
select dept_emp.emp_no as emp_no,dept_manager.emp_no as manager_no
from dept_emp, dept_manager
where dept_emp.dept_no=dept_manager.dept_no
and dept_emp.emp_no!=dept_manager.emp_no
and dept_manager.to_date='9999-01-01';
1.5質問10
タイトル説明
現在の(dept_emp.to_date = '9999-01-01')従業員の現在の(salaries.to_date = '9999-01-01')関連情報を取得し、すべての部門で最高の給与を取得し、dept_no、emp_noおよびそれらに対応する給与を指定します
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
回答
select a.dept_no, b.emp_no, max(b.salary)
from dept_emp a inner join salaries b on
a.emp_no=b.emp_no
and a.to_date=b.to_date
and a.to_date='9999-01-01'
group by dept_no;
1.6質問11
タイトル説明
タイトルテーブルから取得し、タイトルごとにグループ化します。各グループの数は2以上で、タイトルと対応する数tが与えられます。
CREATE
TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
回答
SELECT title, COUNT(title) t
FROM titles
GROUP BY title
HAVING t >= 2
1.7質問12
タイトル説明
タイトルテーブルから取得し、タイトルごとにグループ化します。各グループの数は2以上で、タイトルと対応する数tが与えられます。
繰り返されるemp_noは無視されることに注意してください(つまり、emp_noの繰り返されるタイトルはカウントされず、タイトルに対応する番号tは増加しません)。
CREATE TABLE IF NOT EXISTS `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
回答
SELECT title, COUNT(DISTINCT emp_no) t
FROM titles
GROUP BY title
HAVING t>=2;
1.8質問13
タイトル説明
emp_noが奇数でlast_nameがMaryでない従業員テーブル内のすべての従業員を検索し(大文字と小文字を区別)、hire_dateに従って逆順に配置します(タイトルはmod関数を使用できません)。
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
回答
SELECT * FROM employees
WHERE emp_no % 2 = 1
AND last_name<>'Mary'
ORDER BY hire_date DESC;
1.9質問14
タイトル説明
各役職タイプに対応する従業員の現在の(salaries.to_date = '9999-01-01')給与に対応する現在(titles.to_date = '9999-01-01')の平均給与を計算します。結果は、タイトルと平均給与を平均します。
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
回答
select title, avg(salary)
from salaries, titles
where salaries.to_date='9999-01-01'
and titles.to_date='9999-01-01'
and salaries.emp_no=titles.emp_no
group by titles.title;
1.10質問15
タイトル説明
2番目に給与が高い従業員の現在の(to_date = '9999-01-01')emp_noとそれに対応する給与を取得します
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
回答
SELECT emp_no, salary FROM salaries
WHERE salary = (SELECT salary
FROM salaries WHERE to_date = '9999-01-01'
GROUP BY salary
ORDER BY salary DESC
LIMIT 1,1 )
++++++++++++++++++ End line ++++++++++++++++++
Next:【SQL戦闘(3)】【 Niukenet SQL実際の戦闘]