join連接是sql編寫過程經常使用的連接表的方式,用於表集合的計算。這裏可以把表當成數據的集合,其實sql的計算過程,就是集合的運算。集合的運算有笛卡爾積,交,差,並,補運算,可以依次從join中體現出來。
數據準備:建立兩張表部門表與員工表
create table dept (
id int PRIMARY key auto_increment,
dept_name varchar(50)
)engine=INNODB auto_increment = 1 default charset utf8;
create table employee(
emp_id int PRIMARY key auto_increment,
emp_name varchar(50),
dept_id int
)engine=INNODB auto_increment = 1 default charset utf8;
insert into dept (dept_name) values ('開發部'),('運營部'),('銷售部'),('人事部'),('財務部'),('總經理辦公室'),('後勤部'),('市場部');
insert into employee (emp_name,dept_id) values ('方祖陽','1'),('張信傑','1'),('周思蒙','1'),('卜奕煒','1'),('焦宇陽','1'),
('楊仁翔','2'),('趙睿','2'),('楊志康','2'),('陳智軒','2'),('汪豪','3'),('闞志偉','3'),('朱暢',13),('劉海笛','4'),('吳迪','5');
將兩張表數據全部篩選出來
select * from employee;
select * from dept;
將員工表的數據當成A集合,部門表當成B集合
第一種情況:將A表所有數據保留
查看所有員工的部門信息
select * from employee a left join dept b on a.dept_id = b.id;
即使B表中沒有的數據也會被篩選出來。
第二種情況:只保留A表獨有的數據
篩選沒有部門的員工信息
select * from employee a left join dept b on a.dept_id = b.id where b.id is null;
第三種情況: 保留B表中的所有數據
篩選所有部門的人員信息,即使部門內沒有人也篩選出來
select * from employee a right join dept b on a.dept_id = b.id ;
第四種情況:只篩選B集合獨有的數據,即第三種情況中標紅的數據
篩選沒有員工的部門
select * from employee a right join dept b on a.dept_id = b.id where a.dept_id is null;
第五種情況:交集,
篩選已有部門的員工信息 inner join
select * from employee a inner join dept b on a.dept_id = b.id ;
等同於
select * from employee a ,dept b where a.dept_id = b.id ;
第六種情況:A集合獨有的和B集合獨有的
篩選沒有部門的員工和沒有員工的部門。第三種情況和第四種情況的並集
select * from employee a left join dept b on a.dept_id = b.id where b.id is NULL
UNION
select * from employee a right join dept b on a.dept_id = b.id where a.dept_id is null;
但是與Oracle來說有更簡單的方式 full outer join 但是mysql不支持這種關鍵字。
select * from employee a full outer join dept b on a.dept_id = b.idwhere b.id is null or a.dept_id is null
第七種情況:全集
在Oracle中可以簡單的用這種方式
select * from employee a full outer join dept b on a.dept_id = b.id
但是MySql不支持,還是用union關鍵字,並集,並且只保留一份重複的數據
select * from employee a left join dept b on a.dept_id = b.id
union
select * from employee a right join dept b on a.dept_id = b.id