MySql 7大join連接關係

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.id
where 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 



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