阅读目录

  • 部门、员工表数据
    • 内连接 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 empINNER 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 empLEFT JOIN dept ON emp.dept_id = dept.id;

右外连接

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

SELECT dept.*, emp.*
FROM empRIGHT 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 aJOIN 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 之后

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询常用符号:=、<>、>、>=、<、<=

根据销售部门的 id 查询员工信息。

先分开查询
查询销售部门的 id

select id from dept where name='销售部'; #id 为 4

查询销售部门中员工的信息

select * from emp where dept_id=4;

合并为一个查询:

SELECT *
FROM emp
WHERE dept_id = (SELECT dept.idFROM deptWHERE dept.name = '销售部'
);

列子查询

子查询的结果为一列 (可以是多行) 的,这种子查询为列子查询。

常用操作符:

列子查询
查询销售部和市场部的所有员工信息。
查询销售部和市场部的 id。

select id from dept where name='销售部' or name='市场部'; #id为2 4

查询两个部门的所有员工:

select * from emp where dept_id in (2,4);

合并

SELECT *
FROM emp
WHERE dept_id IN (SELECT idFROM deptWHERE name = '销售部'OR name = '市场部'
);

行子查询

子查询返回的结果是一行 (可以是多列),
这种子查询为行子查询常用操作符:=、<>、in、not in

查询与张无忌的薪资及直属领导相同的员工信息。
查询张无忌的薪资和直属领导。

select salary, managerid from emp where name='张无忌';

查询与张无忌的薪资及直属领导相同的员工信息。

SELECT *
FROM emp
WHERE (salary, managerid) = (SELECT salary, manageridFROM empWHERE name = '张无忌'
);

表子查询

子查询的结果是多行多列这种查询为表子查询。

常用操作符:in

查询与鹿杖客和宋远桥的职位和薪资相同的员工信息。

SELECT *
FROM emp
WHERE (job, salary) IN (SELECT job, salaryFROM empWHERE name IN ('鹿杖客', '宋远桥')
);

表子查询的子表作为临时表:

查询入职日期是 ’2006-01-01‘ 之后的员工信息和部门信息。
先查询出入职在 ’2006-01-01‘ 之后员工的所有信息,与部门表左连接。

SELECT e.*, dept.*
FROM (SELECT *FROM empWHERE entrydate > '2006-01-01'
) eLEFT JOIN dept ON e.dept_id = dept.id;

多表查询案例数据

create table salgrade (grade int,losal int comment '本薪资等级的最低界限',hisal int comment '最高界限'
) comment '薪资等级表';insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,025001,30000);

1 查询员工的姓名,年龄,职位,部门信息(隐式内连接)

SELECT e.name, e.age, e.job, d.*
FROM emp e, dept d
WHERE e.dept_id = d.id;

2 查询年龄小于 30 的员工的姓名、年龄、职位、部门信息(显示内连接)

select e.name,e.age,e.job,d.*
from emp e
inner join dept d on e.dept_id = d.id
where e.age<30;

3 查询拥有员工的部门 id,部门名称

select distinct d.id,d.name
from emp e, dept d
where d.id=e.dept_id;

4 查询所有年龄大于 40 的员工,及其归属部门名称,如果员工没有分配部门也要显示

select e.*,d.name
from emp e
left outer join dept d on e.dept_id = d.id
where e.age>40;

5 查询所有员工的工资等级

select e.*,s.grade
from emp e, salgrade s
where e.salary between s.losal and s.hisal;

6 查询研发部所有员工的信息即工资等级

SELECT e.*, s.grade
FROM emp e, dept d, salgrade s
WHERE (e.dept_id = d.id)AND (d.name = '研发部')AND e.salary BETWEEN s.losal AND s.hisal;

7 查询研发部员工的平均工资

select avg(e.salary)
from emp e, dept d
where e.dept_id=d.id and d.name='研发部';

8 查询工资比灭绝高的员工信息

SELECT *
FROM emp
WHERE emp.salary > (SELECT e.salaryFROM emp eWHERE e.name = '灭绝'
);

9 查询比平均薪资高的员工信息

SELECT *
FROM emp
WHERE salary > (SELECT avg(e.salary)FROM emp e
);

10 查询低于本部门平均工资的员工信息

SELECT *
FROM emp
WHERE emp.salary < (SELECT avg(salary)FROM emp eWHERE e.dept_id = emp.dept_id
);

11 查询所有部门信息,并统计部门的员工人数

select d.*, (select count(*)from empwhere emp.dept_id=d.id) as person_count
from dept d;

表与表之间的联系

1 一对多(多对一)
2 多对多
3 一对一

一对多(多对一)

例如,一个员工对应一个部门,一个部门可以对应多个员工。


一般在多的一方创建外键,指向一另一方。

员工与部门,在员工表上设置外键,指向部门表。

多对多

例如:
一个学生可以选修多门课程,一个课程可以被多名学生选修。
一般会建立第三张表,至少包含两个外键,分别指向两张表的主键。

一对一

例如:
用户和自己的学历信息的关系,一个人只对应一条学历信息。
可以在任意一方加入外键,关联另一方的主键,并且设置外键为唯一(unique)


注:可以放在一张表中,但是对其进行拆分,一张表放基础信息,另一张表放详情,可以提升操作效率。

MySQL 将一张表的数据更新到另一张表

-- 将一张表的数据同步更新到另一张表UPDATE table1 AS t1
INNER JOIN table2 AS t2
ON t1.id=t2.id
SET t1.name=t2.name;

MySQL多表联合查询相关推荐

  1. mysql教程详解之多表联合查询,MYSQL教程mysql多表联合查询返回一张表的内容实现代码...

    搜索热词 <MysqL教程MysqL多表联合查询返回一张表的内容实现代码>要点: 本文介绍了MysqL教程MysqL多表联合查询返回一张表的内容实现代码,希望对您有用.如果有疑问,可以联系 ...

  2. springboot+mybatis+mysql 多表联合查询

    ###springboot+mybatis+mysql 多表查询 这里有两张表 用户表和用户信息表user.info 两个实体类展示他们一对一的关系 通过springboot注解的方式实现多表联合查询 ...

  3. MySQL 多表联合查询有何讲究?

    今天我们来聊聊微信中的多表联合查询,应该是小表驱动大表还是大表驱动小表? 1. in VS exists 在正式分析之前,我们先来看两个关键字 in 和 exists. 假设我现在有两张表:员工表和部 ...

  4. mysql多表联合查询练习题

    1.查询至少有一个员工的部门,显示部门编号,部门名称,部门位置,部门人数 /*1.查询至少有一个员工的部门,显示部门编号,部门名称,部门位置,部门人数列:d.deptno, d.dname, d.lo ...

  5. MYSQL多表联合查询排序

    主要思想:先联合查询数据,再对查询结果按照某标签进行排序 code: String sql = "SELECT * FROM (SELECT task.idTask,task.task_na ...

  6. Mysql 多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: [sql] view plaincopy print? S ...

  7. mysql 多表联合查询怎么一行显示_使用 explain 优化你的 mysql 性能

    本文是关于在学习<高性能 Mysql>附录 D 中关于 Explain 如何获取执行计划信息相关总结.MySQL 提供了一个 EXPLAIN 命令,它可以对 SELECT 语句进行分析,获 ...

  8. mysql多表联合查询事例_MySQL——多表查询详细介绍以及实例

    1.表与表之间的关系 一对一:用户表和身份信息表,用户表是主表 例如:男人表 .女人表create table man( mid int primary key auto_increment, mna ...

  9. mysql 多表 查询慢_详解Mysql多表联合查询效率分析及优化

    1. 多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOI ...

最新文章

  1. 推荐一个牛逼的 GitHub 项目+支付宝、微信支付项目实战!快来获取!
  2. Java RMI 多个JVM间相互通信
  3. mysql 打包 脚本_windows下mysql自动备份压缩打包时间命名批处理脚本
  4. Stream anyMatch查找案例
  5. 含枚举类型的函数声明_02Golang基础类型
  6. 动态代理解决网站字符集编码
  7. Halcon教程六:为什么要二值化
  8. 计算机网络-网络安全
  9. macOS Monterey 12.0.1 (21A559) 正式版发布,ISO、IPSW、PKG 下载
  10. parquet和textfile存储对比
  11. Kubernetes1.4新特性前瞻:设置JOB执行计划
  12. 科普:Java 后端开发常用的 10 种第三方服务
  13. C语言——连续做10道题,通过计算机随机产生两个1~10之间的加数给学生出一道加法运算题, 如果输入答案正确,则显示“Right!”,否则显示“Not correct!”,不给机会重做, 10道题做完
  14. NAO机器人——运动控制(3)
  15. [应用模板]HTML5电子相册
  16. 文字转语音离线html,web端文字转语音的几种方案
  17. 【Flutter】ListView 列表 ( List 集合的 map 方法说明 | 垂直列表 | 水平列表 | 代码示例 )
  18. 微信神器:一键批量下载微信好友头像并拼成一张图
  19. 中国古代数学史上著名的“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?
  20. 贪吃蛇c语言经典程序下载,C语言实现贪吃蛇游戏(单人版)

热门文章

  1. MATLAB中如何用对数方式显示图形坐标?
  2. 2021年深圳光明区科技型中小企业市级配套资助申报条件及流程,补贴200万
  3. AVB音视频传输协议简介
  4. 百度智能云寿光设施蔬菜智脑项目斩获国际大奖
  5. google voice如何转移
  6. 42岁女博士相亲,要求对方年薪三百万,主要为淘汰一类档次低男人
  7. 安防监控系统中IP网络监控比模拟摄像头有哪些优劣?
  8. RGB颜色/色卡对照表
  9. 通用积分在积分运营中的含义是什么
  10. MATLAB批处理文件