sql的內連接、左連接與右連接.多個表之間的連接


例子:
查找所有員工的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`));

答案:
SELECT ep.last_name, ep.first_name, dp.dept_no FROM employees ep LEFT JOIN dept_emp dp ON ep.emp_no = dp.emp_no

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

 

三個表之間的連接

例:查找所有員工的last_name和first_name以及對應的dept_name,也包括暫時沒有分配部門的員工
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`));

本題思路為運用兩次LEFT JOIN連接嵌套
1、第一次LEFT JOIN連接employees表與dept_emp表,得到所有員工的last_name和first_name以及對應的dept_no,也包括暫時沒有分配部門的員工
2、第二次LEFT JOIN連接上表與departments表,即連接dept_no與dept_name,得到所有員工的last_name和first_name以及對應的dept_name,也包括暫時沒有分配部門的員工
select c.last_name,c.first_name,a.dept_name
from (employees c left join dept_emp b on b.emp_no=c.emp_no)
left join departments a on a.dept_no=b.dept_no
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM