[SQL実際の戦闘(2)] [Niuke NetでのSQL実際の戦闘]

戻る:[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実際の戦闘]

おすすめ

転載: blog.csdn.net/qq_42893334/article/details/107788685