肖sir__mysql之多表__005

本文详细介绍了MySQL中如何创建和操作多表(如dept和emp表)以及各种类型的多表查询,包括内连接、左连接、右连接、左独有数据、右独有数据和全外连接,还提供了具体案例和SQL语句,如计算部门平均收入和财务部门收入总和。
摘要由CSDN通过智能技术生成

mysql之多表

一、建表(dept表,emp表)
CREATE table dept(dept1 VARCHAR(6),dept_name VARCHAR(20)) default charset=utf8;
INSERT into dept VALUES (‘101’,‘财务’);
INSERT into dept VALUES (‘102’,‘销售’);
INSERT into dept VALUES (‘103’,‘IT技术’);
INSERT into dept VALUES (‘104’,‘行政’);
CREATE table emp (sid VARCHAR(6),name VARCHAR(20),age TINYINT(2),woektime_start VARCHAR(10),incoming SMALLINT(10),dept2 VARCHAR(6))default charset=utf8;
insert into emp VALUES (‘1789’,‘张三’,35,‘1980/1/1’,4000,‘101’);
insert into emp VALUES (‘1674’,‘李四’,32,‘1983/4/1’,3500,‘101’);
insert into emp VALUES (‘1776’,‘王五’,24,‘1990/7/1’,2000,‘101’);
insert into emp VALUES (‘1568’,‘赵六’,57,‘1970/10/11’,7500,‘102’);
insert into emp VALUES (‘1564’,‘荣七’,64,‘1963/10/11’,8500,‘102’);
insert into emp VALUES (‘1879’,‘牛八’,55,‘1971/10/20’,7300,‘103’);
insert into emp VALUES (‘1880’,‘刘九’,64,‘1971/10/20’,9000,‘105’);

drop table dept ;
drop table emp ;
select * from emp ;
select * from dept ;
dept:部门表
dept1 :部门编号
dept_name:部门名称
这里插入图片描述
emp表:员工表
sid:员工编号 name:员工姓名 age:员工年龄 worktime:入职时间
incoming :工资 dept2:部门编号
在这里插入图片描述

二、多表查询介绍
1、什么是多表关联查询?
定义:查询数据来源于多张表
在实际工作中我们数据需要2个表或者更多的表中提前,需要使用多表关联查询

2、多表查询类型
(1)内连接
(2)左连接(左外连接)
(3)右连接(右外连接)
(4)左独有数据
(5)右独有数据
(6)全外连接

案例:
黄色:123数据
红色:124数据
在这里插入图片描述
内连接:左12,右边12 关联 显示 12
左连接:左表123全部显示,右边12关联,4不显示
右连接:右表124全部显示,左边12关联,3不显示
左独有数据:3
右独有数据:4
全外连接: 1,2,3,4

3、多表联查方法
(1)内连接(普通内连接,隐藏内连接)
定义:查询两个表共有的数据
a、普通内连接(inner join on)
格式:
select * from 表1 INNER JOIN 表2 on 表1.关联字段1=表2.关联字段2 ;
案例:
select * from dept INNER JOIN emp on dept.dept1=emp.dept2 ;
截图:
在这里插入图片描述
b、隐藏内连接(和普通内连接的结果是一样)
格式:select * from 表1, 表2 where 表1.关联字段1=表2.关联字段2 ;
案例:select * from dept,emp where dept.dept1=emp.dept2 ;
在这里插入图片描述

(2)左连接(left join on)
定义:以左表为主(显示整个左表),右表关联的数据就显示,没有的数据就以null显示
格式:
select * from 表1 left JOIN 表2 on 表1.关联字段1=p.d表2.关联字段2 ;
案例:
select * FROM dept left join emp on dept.dept1=emp.dept2;
截图:
在这里插入图片描述
(3)右连接 (right join on)
定义:右表是以右表数据为主(显示整个右表),右表关联的数据就显示,没有就以null值显示
格式:
select * from 表1 right JOIN 表2 on 表1.关联字段1=p.d表2.关联字段2 ;
案例:
select * from dept right JOIN emp on dept.dept1=emp.dept2;
截图:
在这里插入图片描述
(4)左独有数据:
先左连接,在根据左连接中的右表字段为空的数据就是左独有
a、先左连连接
b、添加右表中的空字段
格式:
select * from 表1 left JOIN 表2 on 表1.关联字段1=p.d表2.关联字段2 where 左表字段名 is null ;
案例:
select * FROM dept left join emp on dept.dept1=emp.dept2 where name is null;

在这里插入图片描述
(5)
右独有数据
先右连接,在根据右连接中的左表字段为空的数据就是右独有
a、先连右连接
b、添加左表中的空字段
格式:
select * from 表1 right JOIN 表2 on 表1.关联字段1=p.d表2.关联字段2 where 左表字段名 is null ;
案例:
select * FROM dept right join emp on dept.dept1=emp.dept2 where dept_name is null ;
在这里插入图片描述
(6)全外连接:
union 拼接
a、左连接+右独有
select * FROM dept left join emp on dept.dept1=emp.dept2
UNION
select * FROM lept right join emp on dept.dept1=emp.dept2 where dept_name is null ;
在这里插入图片描述

b、右连接+左独有数据
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;
在这里插入图片描述

c、内连接+左连接独有+右独有
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 dept_name is null ;
在这里插入图片描述

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

多表:
普通内连接:select * from 表1 inner join 表2 on1.关联字段=2.关联字段
隐藏内连接:select * from 表1,表2 where 表 1.关联字段=2.关联字段
左连接:select * from 表1 left join 表2    on1.关联字段=2.关联字段
右连接 :select * from 表1 right join 表2 on1.关联字段=2.关联字段
左独有数据:select * from 表1 left join 表2 on1.关联字段=2.关联字段 where 表2中的字段 is null
右独有数据:select * from 表1 right join 表2 on1.关联字段=2.关联字段 where 表1 中的字段 isnull
全外连接:union
(1)左独有+右独有+内连接
(2)左连接+右独有
(3)右连接+左独有

题目:
1、列出每个部门的平均收入及部门名称;
select dept_name,avg(incoming) FROM dept left join emp on dept.dept1=emp.dept2 GROUP BY dept_name
在这里插入图片描述
题目2:
财务部门的收入总和;
结果:
语句:sum (imcoming)
条件:dept_name=‘财务部门’
select sum(incoming) from dept INNER JOIN emp on dept.dept1=emp.dept2 where dept_name=‘财务’;
在这里插入图片描述

SELECt sum(s.incoming) from (select * from dept INNER JOIN emp on dept.dept1=emp.dept2 ) as s WHERE
s.dept_name=“财务” ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金牌j软件测试培训师肖sir

作为一个名资深IT搬运工

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值