牛客數(shù)據(jù)庫(kù)SQL實(shí)戰(zhàn)題(11-20題)
11、獲取所有員工當(dāng)前的manager
如果當(dāng)前的manager是自己的話結(jié)果不顯示,當(dāng)前表示to_date='9999-01-01'。結(jié)果第一列給出當(dāng)前員工的emp_no,第二列給出其manager對(duì)應(yīng)的manager_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 emp.emp_no, ma.emp_no as manager_no
from dept_emp as emp
join dept_manager as ma
on ma.dept_no=emp.dept_no
where ma.to_date='9999-01-01' and emp.to_date='9999-01-01'
and emp.emp_no <> ma.emp_no;
如果當(dāng)前的manager是自己的話不顯示該條,這個(gè)條件用不等號(hào)來(lái)表示就可以。
12、獲取所有部門(mén)中當(dāng)前員工薪水最高的相關(guān)信息,給出dept_no, emp_no以及其對(duì)應(yīng)的salary
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 de.dept_no, de.emp_no, max(sa.salary) as salary
from dept_emp as de
join salaries as sa
on de.emp_no=sa.emp_no
where de.to_date='9999-01-01' and sa.to_date='9999-01-01'
group by de.dept_no;
根據(jù)de.dept_no分組,選擇sa.salary最大的行,de.emp_no也會(huì)選擇相應(yīng)的行。
13、從titles表獲取按照title進(jìn)行分組,每組個(gè)數(shù)大于等于2,給出title以及對(duì)應(yīng)的數(shù)目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) as t
from titles
group by title
having t>=2;
select title之后還可以count(title)。
14、從titles表獲取按照title進(jìn)行分組,每組個(gè)數(shù)大于等于2,給出title以及對(duì)應(yīng)的數(shù)目t。
注意對(duì)于重復(fù)的emp_no進(jìn)行忽略。
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) as t
from titles
group by title
having t>=2;
要去除重復(fù)的emp_no可以在count中對(duì)distinct emp_no進(jìn)行計(jì)數(shù)。
15、查找employees表所有emp_no為奇數(shù),且last_name不為Mary的員工信息,并按照hire_date逆序排列
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;
mysql中取余用%除數(shù),在oracle中取余是mod(被除數(shù), 除數(shù))。
16、統(tǒng)計(jì)出當(dāng)前各個(gè)title類型對(duì)應(yīng)的員工當(dāng)前薪水對(duì)應(yīng)的平均工資。結(jié)果給出title以及平均工資avg。
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 ti.title as title, avg(sa.salary) as avg
from titles as ti
join salaries as sa
on ti.emp_no=sa.emp_no
where ti.to_date='9999-01-01' and sa.to_date='9999-01-01'
group by ti.title;
17、獲取當(dāng)前(to_date='9999-01-01')薪水第二多的員工的emp_no以及其對(duì)應(yīng)的薪水salary
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 to_date='9999-01-01' and salary=
(select distinct salary
from salaries
order by salary desc
limit 1,1);
薪水第二多的人可能有多個(gè)
18、查找當(dāng)前薪水(to_date='9999-01-01')排名第二多的員工編號(hào)emp_no、薪水salary、last_name以及first_name,不準(zhǔn)使用order by
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));
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 em.emp_no, max(sa.salary) as salary, em.last_name, em.first_name
from employees as em
join salaries as sa
on em.emp_no=sa.emp_no
where sa.to_date='9999-01-01' and sa.salary<
(select max(salary) from salaries where to_date='9999-01-01');
不用order by選擇次高,則先選出最高,然后排出最高,選出剩下數(shù)據(jù)中的最高。
19、查找所有員工的last_name和first_name以及對(duì)應(yīng)的dept_name,也包括暫時(shí)沒(méi)有分配部門(mén)的員工
CREATE TABLE departments (
dept_no char(4) NOT NULL,
dept_name varchar(40) NOT NULL,
PRIMARY KEY (dept_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 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 em.last_name, em.first_name, dename.dept_name
from (employees as em
left join dept_emp as de
on em.emp_no=de.emp_no)
left join departments as dename
on de.dept_no=dename.dept_no;
連接三張表,先將employees表和dept_emp表左連接,employees中的有的員工沒(méi)有分配部門(mén),所以要用left join。也會(huì)有員工有多個(gè)部門(mén)的記錄,這題并沒(méi)有要求篩選當(dāng)前。
20、查找員工編號(hào)emp_no為10001其自入職以來(lái)的薪水salary漲幅值growth
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 (select salary
from salaries
where emp_no='10001'
order by from_date desc
limit 1) -
(select salary
from salaries
where emp_no='10001'
order by from_date
limit 1) as growth;
另外,在MS Access中支持first()函數(shù)和last()函數(shù),分別可以獲取列的第一個(gè)值和最后一個(gè)值。但是其他數(shù)據(jù)庫(kù)不支持,一般用limit來(lái)選擇。
結(jié)尾
如果您發(fā)現(xiàn)我的文章有任何錯(cuò)誤,或?qū)ξ业奈恼掠惺裁春玫慕ㄗh,請(qǐng)聯(lián)系我!如果您喜歡我的文章,請(qǐng)點(diǎn)喜歡~*我是藍(lán)白絳,感謝你的閱讀!