數(shù)據(jù)庫(kù)SQL實(shí)戰(zhàn)|SQL答案集合及解析(11-20)

牛客數(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)白絳,感謝你的閱讀!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,951評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,796評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,566評(píng)論 6 407
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,055評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,303評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,683評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,899評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,135評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,520評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,757評(píng)論 1 282
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,528評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,844評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容