数据库多表连接

数据库多表的连接笔记

一、建立两张数据表

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),worktime_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','老九',55,'1971/10/20',8000,'105');

二、分析表

1.emp表:员工表

员工编号、姓名、年龄、入职时间、工资、部门编号
截图:
emp表
独有的数据105

2.dept表:部门表

部门编号、部门名名称
截图:
dept表
独有数据104
可以发现,两行表格之间可以关联的是dept1、dept2值。

多表查询:

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

三、多表详解

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;
截图:
右独有数据

2、全外连接:(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;

截图:
题目1

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="财务"
);

截图:
题目2

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

结果:sid
条件:dept_name=“IT技术”
方法:

select  sid  from   dept a  INNER JOIN  emp b  on a.dept1=b.dept2
where  dept_name="IT技术";

截图:
题目3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值