練習(xí)SQL利器琢歇,牛客網(wǎng)SQL實戰(zhàn)題庫揭保,1~8題
牌呛辏客網(wǎng)SQL實戰(zhàn)網(wǎng)址:https://www.nowcoder.com/ta/sql
持續(xù)更新——記錄自己在牛客網(wǎng)SQL的做題過程
1.查找最晚入職員工的所有信息
題目描述:
查找最晚入職員工的所有信息
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
));
應(yīng)該考慮的問題:
①最晚入職的當(dāng)天未必就一個人味榛,也許有多人予跌,使用排序并限制得只能取得指定數(shù)量的結(jié)果
SELECT *
FROM employees
WHERE hire_date = (
SELECT MAX(hire_date)
FROM employees);
注:日期最大的就是最晚的,日期較早就是較小继榆。
2.查找入職員工時間排名倒數(shù)第三的員工所有信息
題目描述:
查找入職員工時間排名倒數(shù)第三的員工所有信息
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
));
應(yīng)該考慮的問題:
①取的是日期倒數(shù)第三的人汁掠,不是倒數(shù)第三的人
SELECT emp_no, birth_date, first_name, last_name, gender, hire_date
FROM employees
WHERE hire_date=(
SELECT DISTINCT hire_date
FROM employees
ORDER BY hire_date DESC
LIMIT 2,1);
注:
①糯渲遥客網(wǎng)網(wǎng)友EricZeng的嚴(yán)謹(jǐn)寫法乞榨,可以學(xué)習(xí)当娱。
②LIMIT是從0開始計數(shù)考榨。
3.查找各個部門當(dāng)前(to_date='9999-01-01')領(lǐng)導(dǎo)當(dāng)前薪水詳情以及其對應(yīng)部門編號dept_no
題目描述:
查找各個部門當(dāng)前(to_date='9999-01-01')領(lǐng)導(dǎo)當(dāng)前薪水詳情以及其對應(yīng)部門編號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
));
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
));
應(yīng)該考慮的問題:
①薪水表是按年發(fā)放的,所以要過濾掉以前的薪水冀惭,只保留現(xiàn)在還在的當(dāng)前領(lǐng)導(dǎo)的薪水
SELECT s.*,d.dept_no FROM salaries AS s,dept_manager AS d
WHERE s.emp_no = d.emp_no
AND s.to_date='9999-01-01'
AND d.to_date='9999-01-01'
注:
①用AND可以加條件
4.查找所有已經(jīng)分配部門的員工的last_name和first_name
題目描述:
查找所有已經(jīng)分配部門的員工的last_name和first_name
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
));
應(yīng)該考慮的問題:
①因為是查找已分配部門的員工散休,所以dept_no不應(yīng)該為空乐尊,應(yīng)該使用內(nèi)連接。
SELECT emp.last_name,emp.first_name,dept.dept_no
FROM dept_emp dept,employees emp
WHERE emp.emp_no = dept.emp_no
注:表連接扔嵌。
5.查找所有員工的last_name和first_name以及對應(yīng)部門編號dept_no
題目描述:
查找所有員工的last_name和first_name以及對應(yīng)部門編號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
));
應(yīng)該考慮的問題:
①沒有具體分配的員工也要展示谣殊,也就是要保證employees表的完整
②內(nèi)連接已經(jīng)不能滿足需求牺弄,需要用左連接或者又連接
SELECT e.last_name,e.first_name,d.dept_no
FROM employees e LEFT JOIN dept_emp d
ON e.emp_no=d.emp_no;
注:
①內(nèi)連接(INNER JOIN)兩邊表任何一邊缺失都不顯示宜狐。
②左連接(LEFT JOIN)抚恒,右邊表可以無對應(yīng)數(shù)據(jù)。
③右連接(RIGHT JOIN)俭驮,左邊表可以無對應(yīng)數(shù)據(jù)。
6. 查找所有員工入職時候的薪水情況
題目描述:
查找所有員工入職時候的薪水情況遗遵,給出emp_no以及salary逸嘀, 并按照emp_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
));
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
));
應(yīng)該考慮的問題:
①因為員工會有多次漲薪,所以salaries.emp_no 不唯一翼岁,這時我們就應(yīng)該確定具體確定這個薪水的時間,也就是這個入職時間hire_date
SELECT e.emp_no, s.salary FROM employees AS e, salaries AS s
WHERE e.emp_no = s.emp_no AND e.hire_date = s.from_date
ORDER BY e.emp_no DESC
7.查找薪水漲幅超過15次的員工號emp_no以及其對應(yīng)的漲幅次數(shù)t
題目描述:
查找薪水漲幅超過15次的員工號emp_no以及其對應(yīng)的漲幅次數(shù)t
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
));
應(yīng)該考慮的問題:
①需要利用分組函數(shù)GROUP BY對emp_no進行分組悉患。
②需要利用分組限定條件限定t值
SELECT emp_no,COUNT(emp_no) as t FROM salaries
GROUP BY emp_no HAVING t>15
注:①好像是先選擇列和計算榆俺,然后再進行分組和再一次計算,也就是按照語句的順序進行谴仙。
8.找出所有員工當(dāng)前具體的薪水salary情況
題目描述:
找出所有員工當(dāng)前(to_date='9999-01-01')具體的薪水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 DISTINCT salary FROM salaries
WHERE to_date='9999-01-01'
ORDER BY salary DESC
或
SELECT DISTINCT salary FROM salaries
WHERE to_date='9999-01-01'
GROUP BY salary
ORDER BY salary DESC;
注:
①大表一般用distinct效率不高揩局,大數(shù)據(jù)量的時候都禁止用distinct掀虎,建議用group by解決重復(fù)問題。
②在不同記錄數(shù)較小時驰怎,count group by性能普遍高于count distinct二打,尤其對于text類型表現(xiàn)的更明顯。而對于不同記錄數(shù)較大的場景继效,count group by性能反而低于直接count distinct(牛客網(wǎng)網(wǎng)友—啊啥水果的總結(jié))