SQL 題目 no.1

#來自牛客網 部分題目
#實際的運算順序
FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY

#選出第三個人的信息 LIMIT的用法 忽略前兩個人,選第三個記錄
SELECT * 
FROM employees
ORDER BY hire_date DESC
LIMIT 2,1;

#內連接
SELECT  
salaries.emp_no,
salaries.salary,
salaries.from_date,
salaries.to_date,
dept_manager.dept_no
FROM salaries
INNER JOIN dept_manager
ON dept_manager.emp_no=salaries.emp_no
WHERE dept_manager.to_date='9999-01-01'
AND salaries.to_date='9999-01-01';

#考察HAVING,GROUP BY 和count的組合用法
#題目
查找薪水漲幅超過15次的員工號emp_no以及其對應的漲幅次數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`));
#答案
SELECT emp_no,COUNT(emp_no) as t
FROM salaries
GROUP BY emp_no
HAVING t>15;
#首先GROUP BY以後再COUNT纔可以 
#因爲實際上是是算出來出現15+的員工有多少人
#其次因爲用的是COUNT,所以只能HAVING

#考察內聯結 和其中改的細節
#題目
#獲取所有部門當前manager的當前薪水情況,
#給出dept_no, emp_no以及salary,
#當前表示to_date='9999-01-01'
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 de.dept_no, sa.emp_no,sa.salary
FROM dept_manager de
INNER JOIN salaries sa
ON sa.emp_no=de.emp_no 
WHERE sa.to_date='9999-01-01'
AND  de.to_date='9999-01-01';
#注意的是除了GROUP BY 其他的都要有前綴!!!

#考察內聯結+題目理解
獲取所有非manager的員工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 emp_no FROM employees 
WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager);
#使用內聯結 先連起來 然後用IS NULL來限制
SELECT em.emp_no
FROM employees em
LEFT JOIN dept_manager de
ON de.emp_no=em.emp_no
WHERE de.emp_no IS NULL;

#題目
獲取所有員工當前的manager,
如果當前的manager是自己的話結果不顯示,
當前表示to_date='9999-01-01'。
結果第一列給出當前員工的emp_no,
第二列給出其manager對應的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 de.emp_no,dm.emp_no as manager_no
FROM dept_emp as de
INNER JOIN dept_manager as dm
ON de.dept_no=dm.dept_no
WHERE de.emp_no <> dm.emp_no
AND de.to_date='9999-01-01'
AND dm.to_date='9999-01-01';
#限制條件不要只限制一個表的數據,另一個也要!

#依舊考察聯結以後的表怎麼整
#問題
#前員工薪水最高的相關信息,
#給出dept_no, emp_no以及其對應的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 d.dept_no,d.emp_no,max(s.salary) AS salary
FROM dept_emp as d
LEFT JOIN salaries as s
ON d.emp_no=s.emp_no
WHERE d.to_date='9999-01-01'
AND s.to_date='9999-01-01'
GROUP BY d.dept_no;
#因爲是所有部門 所以是GROUP BY 

#題目
#查找當前薪水(to_date='9999-01-01')排名第二多的
#員工編號emp_no、薪水salary、last_name以及first_name,
#不準使用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 e.emp_no,MAX(s.salary) as salary,
e.last_name,e.first_name
FROM employees e
INNER JOIN salaries s
ON e.emp_no=s.emp_no
WHERE s.to_date='9999-01-01'
AND s.salary NOT IN 
(SELECT MAX(salary) FROM salaries 
WHERE to_date='9999-01-01');
#如何不使用GROUP BY的情況之下選


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章