您当前的位置: 首页 >  sql

知其黑、受其白

暂无认证

  • 0浏览

    0关注

    1250博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MySQL多表联合查询

知其黑、受其白 发布时间:2022-06-27 17:58:23 ,浏览量:0

阅读目录
  • 部门、员工表数据
    • 内连接 inner join
    • 外连接 outer join
      • 左外连接
      • 右外连接
    • 自连接
    • 联合查询
    • 交叉连接 cross join 笛卡尔积
    • 子查询
      • 标量子查询
      • 列子查询
      • 行子查询
      • 表子查询
  • 多表查询案例数据
    • 1 查询员工的姓名,年龄,职位,部门信息(隐式内连接)
    • 2 查询年龄小于 30 的员工的姓名、年龄、职位、部门信息(显示内连接)
    • 3 查询拥有员工的部门 id,部门名称
    • 4 查询所有年龄大于 40 的员工,及其归属部门名称,如果员工没有分配部门也要显示
    • 5 查询所有员工的工资等级
    • 6 查询研发部所有员工的信息即工资等级
    • 7 查询研发部员工的平均工资
    • 8 查询工资比灭绝高的员工信息
    • 9 查询比平均薪资高的员工信息
    • 10 查询低于本部门平均工资的员工信息
    • 11 查询所有部门信息,并统计部门的员工人数
  • 表与表之间的联系
    • 一对多(多对一)
    • 多对多
    • 一对一
  • MySQL 将一张表的数据更新到另一张表

部门、员工表数据

部门表

在这里插入图片描述

create table dept (
    id int auto_increment primary key comment 'id',
    name varchar(50) not null comment '部门名称'
) comment '部门表';

insert into dept (id, name)
values (1, '研发部'),
       (2, '市场部'),
       (3, '财务部'),
       (4, '销售部'),
       (5, '总经办'),
       (6, '人事部');

员工表

在这里插入图片描述

create table emp(
    id int auto_increment primary key ,
    name varchar(50) not null ,
    age int,
    job varchar(20) comment '职位',
    salary int ,
    entrydate date comment '入职时间',
    managerid int comment '直属领导id',
    dept_id int comment '所在部门id'
) comment '员工表';

insert into emp
values ( 1, '金庸', 66, '总裁', 20000, '2000-01-01', null, 5 ),
       ( 2, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1 ),
       ( 3, '杨晓', 33, '开发', 8400, '2000-11-03', 2, 1 ),
       ( 4, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1 ),
       ( 5, '陈玉存', 43, '开发', 10500, '2004-09-07', 3, 1 ),
       ( 6, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1 ),
       ( 7, '灭绝', 60, '财务总监', 8500, '2002-09-12', 1, 3 ),
       ( 8, '周芷若', 19, '会计', 48000, '2006-06-02', 7, 3 ),
       ( 9, '丁敏君', 23, '出纳', 5250, '2009-05-13', 7, 3 ),
       ( 10, '赵敏', 20, '市场部总监', 12500, '2004-10-12', 1, 2 ),
       ( 11, '鹿杖客', 56, '职员', 3750, '2006-10-03', 10, 2 ),
       ( 12, '何碧文', 19, '职员', 3750, '2007-05-09', 10, 2 ),
       ( 13, '东方白', 19, '职员', 5500, '2009-02-12', 10, 2 ),
       ( 14, '张三丰', 88, '销售总监', 14000, '2004-10-12', 1, 4 ),
       ( 15, '鱼梁洲', 38, '销售', 4600, '2004-10-12', 14, 4 ),
       ( 16, '宋远桥', 40, '销售', 4600, '2004-10-12', 14, 4 ),
       ( 17, '陈友谅', 42, null, 2000, '2011-10-12', 1, null );

内连接 inner join

在这里插入图片描述 语法:

# 隐式内连接
select 字段列表 from 表1,表2 where 条件;

# 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件;

内连接查询的是两张表交集的部分。

查询每一个员工的姓名及关联的部门的名称

SELECT emp.name, dept.name
FROM emp, dept
WHERE emp.dept_id = dept.id;

在这里插入图片描述

SELECT emp.name, dept.name
FROM emp
	INNER JOIN dept ON emp.dept_id = dept.id;

在这里插入图片描述

外连接 outer join

语法:

# 左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件;

# 右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件;

左外连接相当于查询表 1 的所有数据包含表 1 和表 2 交集的部分数据。 右外连接相当于查询表 2 的所有数据包含表 1 和表2交集部分的数据。

左外连接和右外连接可以进行相互转化。

左外连接

在这里插入图片描述 无论左表在右表有无匹配,都返回左表的数据,缺失的右表数据为NULL 。

查询 emp 表的所有数据,和应于的部门信息(左)

SELECT emp.*, dept.*
FROM emp
	LEFT JOIN dept ON emp.dept_id = dept.id;

在这里插入图片描述

右外连接

在这里插入图片描述

查询 dept 表的所有数据,和对于的员工信息(右)

SELECT dept.*, emp.*
FROM emp
	RIGHT JOIN dept ON emp.dept_id = dept.id;

在这里插入图片描述

自连接

语法:

select 字段列表 from 表a 别名a join 表a 别名b on 条件;

自链接查询可以是内连接查询也可以是外连接查询。

1 查询员工及其所属领导的名字。 2 自连接可以看成两张一样的表进行连接查询。

SELECT a.name, b.name
FROM emp a
	JOIN emp b ON a.managerid = b.id;

在这里插入图片描述

联合查询

对于联合查询就是把多次查询的结果合并起来,形成一个新的查询结果集。

语法:union、union all

select 字段列表 from 表a
union [all]
select 字段列表 from 表b

对于联合查询的多张表的列数必须保持一致,字段类型也要保持一致。 union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

将薪资低于 5000 的员工和年龄大于 50 的员工查询出来。

select * from emp where salary>5000
union all
select * from emp where age>50;

在这里插入图片描述 没有 all 重复满足条件的只出现一次。 将薪资低于 5000 的员工和年龄大于 50 的员工查询出来。

select * from emp where salary>5000
union
select * from emp where age>50;

在这里插入图片描述

交叉连接 cross join 笛卡尔积

交叉连接相当于求左右两表的笛卡尔积。

查询产生笛卡尔积的结果

select * from emp, dept ;

在这里插入图片描述

消除笛卡尔积(添加条件):

select * from emp, dept where emp.dept_id=dept.id;

在这里插入图片描述 什么是笛卡尔积?

比如我有两组数据,a(1, 2, 3) 与 b(4, 5 6),求它们的笛卡尔积的结果就是:

在这里插入图片描述

select * from emp cross join dept;

在这里插入图片描述

在这里插入图片描述

子查询

概念:SQL语句中嵌套 select 语句为嵌套查询,又称子查询。

select * from 表1 where 字段=(select 字段 from 表2);

子查询外的语句可以是 insert、update、delete、select 中的一个根据子查询的结构不同,分为:

标量子查询:子查询的结果为单个值     列子查询:子查询的结果为一列     行子查询:子查询的结果为一行     表子查询:子查询的结果为多行多列

根据子查询的位置,分为:

where 之后   from 之后  select 之后

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询常用符号:=、、>、>=、 ( SELECT e.salary FROM emp e WHERE e.name = '灭绝' );

在这里插入图片描述

9 查询比平均薪资高的员工信息
SELECT *
FROM emp
WHERE salary > (
	SELECT avg(e.salary)
	FROM emp e
);

在这里插入图片描述

10 查询低于本部门平均工资的员工信息
SELECT *
FROM emp
WHERE emp.salary             
关注
打赏
1665558895
查看更多评论
0.0503s