【349天】我愛刷題系列108(2018.01.20)

叨叨兩句

  1. ~

SQL習題003

1

查找各個部門當前(to_date='9999-01-01')領導當前薪水詳情以及其對應部門編號dept_nospa

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 d.dept_no,s.*
from salaries s,dept_manager d
where
s.emp_no = d.emp_no
and s.to_date = '9999-01-01'
and d.to_date = '9999-01-01'

2

查找全部已經分配部門的員工的last_name和first_namecode

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

法1:12MSblog

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

法2:19MSrem

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

3

查找全部員工的last_name和first_name以及對應部門編號dept_no,也包括展現沒有分配具體部門的員工it

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 e.last_name,e.first_name,d.dept_no
from employees e left outer join dept_emp d
on e.emp_no = d.emp_no;

注意:
INNER JOIN 兩邊表同時有對應的數據,即任何一邊缺失數據就不顯示。
LEFT JOIN 會讀取左邊數據表的所有數據,即使右邊表無對應數據。
RIGHT JOIN 會讀取右邊數據表的所有數據,即使左邊表無對應數據。

注意on與where有什麼區別,兩個錶鏈接時用on,在使用left  jion時,on和where條件的區別以下:
一、on條件是在生成臨時表時使用的條件,它無論on中的條件是否爲真,都會返回左邊表中的記錄。 
二、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left  join的含義(必須返回左邊表的記錄)了,條件不爲真的就所有過濾掉。
相關文章
相關標籤/搜索