前言:MySQL的join连接,总结了下总共有以下的几种常用方式,用图更能直观展示:
1.inner join:即查询图中b的部分,这部分是A表和B表共同拥有的数据,以sql来表示就是:
select * from titles t inner join employees s on t.emp_no = s.emp_no
这条语句只会查询titles和salaries两张表中拥有同样emp_no的数据,通俗的讲就是将两张表拥有相同emp_no号的数据组成一条条数据,以下是数据展示:
2.left join:即查询图中a、b的部分,这部分为A表的全部数据以及A表和B表的共有部分,以sql来表示就是:
select * from titles t left join dept_manager s on t.emp_no = s.emp_no
这条语句查询的是A表的所有数据,如果B表中有数据和A表中匹配(通过emp_no),那么B表显示匹配的数据,否则以null展示,以下是数据展示:
3.right join:和left join相反,查询的是图中的b、c部分,这部分为B表的全部数据以及A表和B表的共有部分,以sql来表示就是:
select * from dept_manager s right join titles t on t.emp_no = s.emp_no
这条语句查询的是B表的所有数据,如果A表中有数据和B表中匹配(通过emp_no),那么A表显示匹配的数据,否则以null展示,以下是数据展示:
以上是最最常见的join关联查询方式,以下针对以上的join进行添加条件
4.假设我们的需求是查询图中的a部分,即查询的是A、B表中A表独有的部分,我们先进行以下查询:
select * from titles t left join dept_manager s on t.emp_no = s.emp_no
查询结果如下数据展示:
那么很显然从数据可以看出,我们要查询的是emp_no从10015~10018这几条数据,sql如下:
select * from titles t left join dept_manager s on t.emp_no = s.emp_no where s.emp_no is null
举个浅显的例子就是:当月发工资的时候,有员工表和工资表,不一定所有员工都同一天发工资,比如系统出问题,那么财务如何才能知道哪些人还没发工资呢?这时候员工表中的员工id如果在工资表存在,那么就是已经发了工资的了,那如果员工id在工资表中不存在,那么这些不存在的id是否就是没有发工资的?以下是数据展示:
5.假设我们的需求是查询图中的c部分,即查询的是A、B表中B表独有的部分,我们先进行以下查询:
select * from dept_manager s right join titles t on t.emp_no = s.emp_no
查询结果如下数据展示:
那么很显然从数据可以看出,我们要查询的是emp_no从10015~10018这几条数据,sql如下:
select * from dept_manager s right join titles t on t.emp_no = s.emp_no where s.emp_no is null
还是以员工和发工资为例子,A表是员工表,B表是工资表,关联查询后显示了发了工资的员工和未发工资的员工,现在要知道有哪些员工没发工资,只要在关联的查询结果添加条件为在工资表中emp_no为null的数据,自然就获取到B表中未发工资的数据了,以下是数据展示:
以上是在左连接和右连接添加条件的案例,以下是关于全连接的案例
6.全连接:即查询a、b、c中的数据
sql如下:
select * from titles t full join dept_manager s on t.emp_no = s.emp_no
查询结果报异常了:
未完待续。。。