MySQL join连接和子查询

emp表:员工表

员工编号、姓名、年龄、入职时间、工资、部门编号

图片

独有的数据103

dept表:部门表

部门编号、部门名名称

图片

图片

多表查询:

内连接、左连接、右连接、左独有数据、右独有数据、全外连接

二、多表详解

1、内连接(普通内连接、隐藏内连接)

定义:左边有的数据,右边也有数据,关联起来只显示两个表共有的数据

案例:左表:123   右表124        内连接:显示:左边12,右边12 ,其中3,4不显示

普通内连接:

格式:inner join

select   *  from  表1  INNER JOIN 2  on  表1.关联字段=表2.关联字段 ;

select   *  from  dept  INNER JOIN emp  on  dept.dept1=emp.dept2 ;

图片

隐藏内连接:

格式:

select  *  from   表1,表2   where  表1.关联字段=表2.关联字段;

方法:

select  *  from   dept,emp  where  dept.dept1=emp.dept2;

图片

左连接:left join

以做左表为主(左表全部显示),右表右关联的关联,没有关联就不显示

案例: 左表:123   右表124        内连接:显示:左边123,右边12 ,其中4不显示

格式:

select   *  from  表1  left JOIN 表2 on  表1.关联字段=表2.关联字段 ;

方法:select   *  from  dept  left JOIN emp  on  dept.dept1=emp.dept2 ;

图片

右连接:right  join

以做右表为主(右表全部显示),左表有关联的关联,没有关联就不显示

案例: 左表:123   右表124        内连接:显示:左边12,右边124 ,其中3不显示

格式:

select   *  from  表1  right JOIN 表2 on  表1.关联字段=表2.关联字段 ;

方法:select   *  from  dept  right JOIN emp  on  dept.dept1=emp.dept2 ;

截图:

图片

左独有数据:

左表中独有的数据

是在左连接后接条件(接右表的字段为null就可以)

格式:

select   *  from  表1  right JOIN 表2 on  表1.关联字段=表2.关联字段  where   右表字段   is  null;

方法:

select   *  from  dept  left JOIN emp  on  dept.dept1=emp.dept2 where name is  null;

截图:

图片

右独有数据:

右表中独有的数据

是在右连接后接条件(接左表的字段为null就可以)

格式:

select   *  from  表1  right JOIN 表2 on  表1.关联字段=表2.关联字段  where   左表字段   is  null;

方法:

select   *  from  dept  right JOIN emp  on  dept.dept1=emp.dept2 where dept1 is  null;

图片

全外连接:(union)

(1)左独有+内连接+右独有

方法:

select   *  from  dept  INNER JOIN emp  on  dept.dept1=emp.dept2 

UNION

select   *  from  dept  left JOIN emp  on  dept.dept1=emp.dept2 where name is  null

UNION

select   *  from  dept right JOIN emp  on  dept.dept1=emp.dept2  where   dept1  is null;

图片

(2)左连接+右独有数据

方法:

select   *  from  dept  left JOIN emp  on  dept.dept1=emp.dept2 

UNION

select   *  from  dept right JOIN emp  on  dept.dept1=emp.dept2  where   dept1  is null;

截图:

图片

(3)右连接+左独有数据

方法:

select   *  from  dept right JOIN emp  on  dept.dept1=emp.dept2 

UNION

select   *  from  dept  left JOIN emp  on  dept.dept1=emp.dept2 where name is  null;

截图

图片

=========================

练习:

(1)列出每个部门的平均收入及部门名称; 

结果:avg(incoming)emp表,dept_name  dept表

条件:  group  by  dept_name

语句:

select  avg(incoming),dept_name  from  dept a left  JOIN

emp b  on  a.dept1=b.dept2 group  by  dept_name


2.财务部门的收入总和; 
结果:sum(incoming)
条件:dept_name="财务"

方法1:

select sum(incoming)  from dept a

 INNER JOIN  emp  b on  a.dept1=b.dept2 where  dept_name="财务"

方法2:

select  sum(incoming) from  emp  where dept2=(

select  dept1  from dept  where  dept_name="财务"

)

3.It技术部入职员工的员工号

结果:sid

条件:dept_name="IT技术"

select  sid  from   dept a  INNER JOIN  emp b  on a.dept1=b.dept2

where  dept_name="IT技术"

子查询:

在一个查询中以另一个查询为条件,将后者查询结果作为一张表操作。

子查询:

(一)

定义:一个查询嵌套另一查询

(二)分类

1、标量子查询(一行一列)

2、列子查询(一列值)

3、行子查询(一行值)

4、表子查询(一个表)

(三)实操

1、标量子查询(一行一列)

案例:.财务部门的收入总和; 

步骤:

a、将财务部门的编号求出在dept中,

b、根据编号在到emp找通过收入总和

图片

方法:

select  sum(incoming)  from  emp  where  dept2=(

select  dept1  from dept  where  dept_name="财务")

2、列子查询(一列值)

求出销售和财务的收入总和?

方法

select  sum(incoming)  from  emp  where  dept2 in(

select  dept1  from dept  where  dept_name="财务" or 

dept_name="销售" 

)

条件是一列值

截图

图片

3、行子查询(一行值)

条件是一行值:(一行多列)

语句:

select  age,incoming,dept2  from  emp where  name="张三";

select  *  from emp where (age,incoming,dept2)in (

select  age,incoming,dept2  from  emp where  name="张三"

)

截图:

图片

以上三种都是接在where  后面

4、表子查询(一个表)

一般接from后面

求出来的条件是一个表

案例:

select  SUM(s.incoming) from (

select   *  from  dept  INNER JOIN emp  on  dept.dept1=emp.dept2 where  dept_name="财务"

) as s

图片

求出每个部门最大年龄的姓名和部门编号?

图片

select  name,dept_name  from dept  INNER JOIN emp  on dept.dept1=emp.dept2 where (age,dept_name) in(

select   max(age),dept_name  from  dept  INNER JOIN emp  on  dept.dept1=emp.dept2 group  by   dept_name

)

图片


1、求财务部门最低工资的员工姓名;

方法:

select  min(incoming)  from  emp where dept2=

(select dept1 from dept  where  dept_name="财务");

 2、找出销售部门中年纪最大的员工的姓名

select  name  from  dept INNER JOIN  emp on dept.dept1=

emp.dept2 where  age=(

select  max(age)  from  emp where dept2=

(select dept1 from dept  where  dept_name="销售"))

and dept_name="销售"

;

3.查找张三所在的部门名称;

结果:depe_name

条件:name=张三

SELECT   dept_name  from dept  where dept1=(

select  dept2  from  emp  where  NAMe="张三"

)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值