1. 程式人生 > >數據庫SQL實戰 1-11

數據庫SQL實戰 1-11

employees where 顯示 及其 size 坑點 desc join 行數

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`));

解答:limit 的使用,

通常 limit offset,rows

一般是用於select語句中用以從結果集中拿出特定的一部分數據。

offset是偏移量,表示我們現在需要的數據是跳過多少行數據之後的,可以忽略;rows表示我們現在要拿多少行數據。默認是0。

select * from employees order by hire_date desc limit 1

註釋:limit 的使用

2.  查找入職員工時間排名倒數第三的員工所有信息

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`));

解答:同上limit 的使用,倒數第三就是跳2條數據。

select * from employees order by hire_date desc limit 2,1

3.  查找各個部門當前(to_date=‘9999-01-01‘)領導當前薪水詳情以及其對應部門編號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`));

解答:坑點有薪水詳情,並不是只有薪水值,剩余的就是利用where連接兩個表。

select salaries.* ,dept_manager.dept_no from salaries,dept_manager
where dept_manager.to_date=9999-01-01 
and salaries.to_date=9999-01-01
and salaries.emp_no = dept_manager.emp_no

4.  查找所有已經分配部門的員工的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`));

解答:兩個表連接,其中右邊表值為NULL的元組不顯示

select employees.last_name,employees.first_name,dept_emp.dept_no
from employees inner join dept_emp
on employees.emp_no=dept_emp.emp_no

5.  查找所有員工的last_name和first_name以及對應部門編號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`));

解答:兩個表連接,左邊的表的數據全部顯示即使右邊表有值為NULL,需要用到外連接。有幾種表連接的方式,

inner join 兩邊表同時有對應的數據,即任何一邊缺失數據就不顯示。
left join 會讀取左邊數據表的全部數據,即便右邊表無對應數據。
right join 會讀取右邊數據表的全部數據,即便左邊表無對應數據。

加一個on 和 where 用法的問題,有人說join為什麽不用where在後面加選擇條件

因為where會直接對於生成好的臨時表進行過濾的。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。

select employees.last_name,employees.first_name,dept_emp.dept_no
from employees left join dept_emp on dept_emp.emp_no=employees.emp_no;

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`));

解答:入職的情況為 employees.hire_date = salaries.from_date,然後就是逆序函數order by的使用。

select employees.emp_no, salaries.salary
from employees, salaries
where employees.emp_no = salaries.emp_no 
and employees.hire_date = salaries.from_date
order by employees.emp_no desc

7.  查找薪水漲幅超過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`));

解答:首先看題知道輸出的漲幅次數為t,所以要用as語句將count(emp_no)的值轉換為t,由於count()函數不可用於where語句中,故使用having語句來限定t>15的條件

select emp_no,count(emp_no) as t from salaries 
group by emp_no
having t>=15

8.  找出所有員工當前(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`));

解答:使用了distinct 去重。

select distinct salary from salaries where to_date=9999-01-01 order by salary desc

9.  獲取所有部門當前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`));

解答:兩個表連接選擇選擇直接where選擇就行了。

select dept_manager.dept_no, dept_manager.emp_no, salaries.salary from salaries,dept_manager
where dept_manager.emp_no = salaries.emp_no
and salaries.to_date = 9999-01-01
and dept_manager.to_date = 9999-01-01

10.  獲取所有非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`));

解答:選擇那些emp_no不在dept_manager中出現的就是員工

select emp_no from employees
where emp_no not in (select emp_no from dept_manager);

11.  獲取所有員工當前的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 dept_emp.emp_no,dept_manager.emp_no as manager_no
from dept_emp ,dept_manager
where dept_emp.emp_no != dept_manager.emp_no
and dept_emp.dept_no = dept_manager.dept_no
and dept_emp.to_date=9999-01-01
and dept_manager.to_date=9999-01-01



數據庫SQL實戰 1-11