把一张表 想象成两张表,进行多表查询

举例:

  1. 查询 所有员工的 姓名 以及 其 上级姓名
select s1.stname, s2.stname from staff as s1, staff as s2 where s1.stmgr = s2.stid;
  1. 查询 员工李岩的 上级姓名
select s1.stname, s2.stname from staff as s1, staff as s2 where s1.stmgr = s2.stid and s1.stname='李岩';

以上是 利用表的多表查询
还可以使用子查询 来实现
比如:

 select staff.stname from staff where stid = (select stmgr from staff where stname='李岩');

复杂一些的表查询举例:
A:
有两张表,分别是员工信息表,与部门信息表,要求查询,各个部门工资最高的员工的信息
员工表:

mysql> select * from employee;
+----+-------+--------+-------+
| id | name  | salary | depid |
+----+-------+--------+-------+
|  1 | Joe   |  70000 |     1 |
|  2 | Tom   |  80000 |     1 |
|  3 | Mary  |  50000 |     2 |
|  4 | Tk    |  10000 |     3 |
|  5 | Inter |  20000 |     3 |
|  6 | Janet | 780000 |     3 |
|  7 | Li    |  75000 |     1 |
|  8 | Wang  |   2000 |     3 |
|  9 | Gao   |   5000 |     2 |
| 10 | ZhaoF |   1000 |     2 |
| 11 | ZhaoX |   2000 |     2 |
| 12 | Mx    |   5000 |     1 |
| 13 | Mi    |   6000 |     1 |
+----+-------+--------+-------+

部门表:

mysql> select * from department;
+----+--------+
| id | name   |
+----+--------+
|  1 | it     |
|  2 | kuaiji |
|  3 | yunwei |
+----+--------+

思考步骤:
1、从employee表里查询出每个部门的最高薪资,作为一张临时表 t

mysql> select depid , max(salary) as maxsalary from employee group by depid;
+-------+-----------+
| depid | maxsalary |
+-------+-----------+
|     1 |     80000 |
|     2 |     50000 |
|     3 |    780000 |
+-------+-----------+

2、将临时表 t 和 employee表进行内连接,并新增一列,显示employee表里每个员工所在部门对应的最高薪资

mysql> select e.id,e.name,e.salary, t.maxsalary,t.depid from (select depid, max(salary) as maxsalary from employee group by depid) as t inner join employee as e on t.depid=e.depid;
+----+-------+--------+-----------+-------+
| id | name  | salary | maxsalary | depid |
+----+-------+--------+-----------+-------+
|  1 | Joe   |  70000 |     80000 |     1 |
|  2 | Tom   |  80000 |     80000 |     1 |
|  3 | Mary  |  50000 |     50000 |     2 |
|  4 | Tk    |  10000 |    780000 |     3 |
|  5 | Inter |  20000 |    780000 |     3 |
|  6 | Janet | 780000 |    780000 |     3 |
|  7 | Li    |  75000 |     80000 |     1 |
|  8 | Wang  |   2000 |    780000 |     3 |
|  9 | Gao   |   5000 |     50000 |     2 |
| 10 | ZhaoF |   1000 |     50000 |     2 |
| 11 | ZhaoX |   2000 |     50000 |     2 |
| 12 | Mx    |   5000 |     80000 |     1 |
| 13 | Mi    |   6000 |     80000 |     1 |
+----+-------+--------+-----------+-------+

3、再用 employee表里每个员工的薪资字段salary 和 部门最高薪资字段列maxsalary进行判断,查询出相等数据,此处则查询出了每个部门最高薪资的员工有哪些,作为表 tt

mysql> select e.id,e.name,e.salary, t.maxsalary,t.depid from (select depid, max(salary) as maxsalary from employee group by depid) as t inner join employee as e on t.depid=e.depid where e.salary=t.maxsalary;
+----+-------+--------+-----------+-------+
| id | name  | salary | maxsalary | depid |
+----+-------+--------+-----------+-------+
|  2 | Tom   |  80000 |     80000 |     1 |
|  3 | Mary  |  50000 |     50000 |     2 |
|  6 | Janet | 780000 |    780000 |     3 |
+----+-------+--------+-----------+-------+

4、因为表 tt 没有部门名称,所以我们再将表 tt 和department 表进行内链接,查询部门id相等的数据,从而查询出每个员工所在的部门名称

mysql> select tt.*, d.name as departname from (select e.id,e.name,e.salary, t.maxsalary,t.depid as tepid from (select depid, max(salary) as maxsalary from employee group by depid) as t inner join employee as e on t.depid=e.depid where e.salary=t.maxsalary) as tt inner join department as d on tt.tepid=d.id order by tt.tepid, tt.id;
+----+-------+--------+-----------+-------+------------+
| id | name  | salary | maxsalary | tepid | departname |
+----+-------+--------+-----------+-------+------------+
|  2 | Tom   |  80000 |     80000 |     1 | it         |
|  3 | Mary  |  50000 |     50000 |     2 | kuaiji     |
|  6 | Janet | 780000 |    780000 |     3 | yunwei     |
+----+-------+--------+-----------+-------+------------+

B:
查询 那些 比本部门 平均工资 高的员工的信息

mysql> select ss.*, d.dname from (select s.stname, s.stid, s.stsal, s.stdepno, t.avgsal from (select stdepno, avg(stsal) as avgsal from staff group by stdepno) as t inner join staff as s on s.stdepno=t.stdepno where s.stsal > t.avgsal ) as ss inner join department as d on ss.stdepno = d.deptno;

另外一种写法:

mysql> select tt.*, d.dname from (select s.stid, s.stname,s.stsal,temp.avgsal, s.stdepno  from (select stdepno, avg(stsal) as avgsal from staff group by stdepno) as temp , staff as s where temp.stdepno=s.stdepno and s.stsal > temp.avgsal) as tt , department as d where tt.stdepno = d.deptno;

还有另一种简洁的写法:

select s1.* from staff as s1 where s1.stsal > (select avg(stsal) from staff as s2 where s2.stdepno = s1.stdepno );

mysql 学习笔记 多表查询02相关推荐

  1. MySQL学习笔记——多表查询

    目录 一.多表查询 1.多表查询的实现 1.1 出现笛卡尔积的错误 1.2 多表查询的正确方式,需要有连接条件 2.多表查询的分类 2.1 等值连接vs非等值连接 2.2 自连接vs非自连接 2.3 ...

  2. MySQL学习笔记(三)查询

    写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...

  3. Mysql学习笔记--多表之间约束等详细记录

    sql 进阶学习笔记-多表(二) 笔记(一)内容回顾 Mysql学习笔记(基础)基础sql语句详细记录 ​ 数据库的创建 : create database 数据库的名 character set 字 ...

  4. (四)MySQL学习笔记——多表设计、多表查询、多表查询练习题

    文章目录 一.多表设计 1.一对一设计 2.一对多设计 3.多对多设计 二.多表查询 多表查询前的数据准备 1.内连接查询 2.外连接查询 3.子查询 4.自关联查询 三.多表查询练习 一.多表设计 ...

  5. oracle 5表关联查询,Oracle学习笔记5 - 表查询

    Oracle学习笔记五 --- 表查询  下面使用scott用户,用到的表见底部 1.查看表结构 desc [表名] desc emp 2.distinct命令,去除重复行 3.练习 查找SMIT ...

  6. MySQL学习笔记-03高级查询、多表联合查询、聚合函数、子查询、视图、存储过程、权限、

    关于作者 金山老师:从事Java.大数据.Python职业化培训6年,项目管理.软件开发14年.欢迎添加我的微信号[jshand],最近建了一些微信交流群,扫描下方二维码添加公众号,回复:进群 文章目 ...

  7. mysql学习笔记之排序查询和函数(进阶四)

    USE myemployees; #进阶四:排序查询() /* 语法: select 查询列表 from 表 order by 排序列表[asc|desc]asc升序desc降序,可不写,默认升序 / ...

  8. mysql学习笔记之连接查询与子查询

    mysql连接查询与子查询 1.子查询是指在另一个查询语句中的SELECT子句. 例句: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t ...

  9. MySQL学习笔记:等值查询、范围查询、死锁、间隙锁的本质

    环境 MySQL:5.7.26-log 前言 答疑文章(二):用动态的观点看加锁 原则 1:加锁的基本单位是 next-key lock.希望你还记得,next-key lock 是前开后闭区间. 原 ...

最新文章

  1. iOS中容易混淆的知识点(持续更新中)
  2. 5-29 vscode占位
  3. 一个 .git 目录,领悟 Git 的强大!
  4. 九度OJ 1168:字符串的查找删除 (查找)
  5. Topic交换器-搭建环境
  6. newton迭代法求近似值matlab,Newton迭代法求函数极小值点 Matlab程序
  7. tensorflow分类的loss函数_tensorflow 分类损失函数使用小记
  8. [转]解决IE下CSS背景图片闪烁的Bug
  9. java一次性查询几十万,几百万数据解决办法
  10. 如何查看linux中的ssh端口开启状态
  11. AutoCAD 2022 Mac中文版发布 最好的Mac CAD软件
  12. BootStrap之导航条navigationBar
  13. 最新各大互联网公司薪酬盘点!你想好去哪家了吗?
  14. poj 1837 Balance
  15. 使用openCV进行视频人脸识别
  16. [原创] photoshop照片转手绘(第一个转手绘作品)
  17. GPT-4 太强了!一夜醒来,Excel 到 PPT 动嘴就能做!
  18. KMPlayer 3.9 播放器不能播放 AC3 音频 解决方法
  19. 白话机器学习-卷积神经网络CNN
  20. 基于python对天气的预测_使用机器学习预测天气(第一部分)

热门文章

  1. 启动LINUX下的TFTP服务器
  2. 学习 AngularJs 终于有点进步了。
  3. jsp分割字符串并遍历
  4. python2.x 文件读写
  5. 独立线性度 最佳直线
  6. 跳槽上班第一天的感受
  7. fir.im Log Guru 正式开源,快速找到 iOS 应用无法安装的原因
  8. ASP 调用dll(VB)及封装dll实例
  9. 神奇的LINQ ---可以通过对象来查询数据
  10. 基于android平台的24点游戏设计与实现需求分析,基于Android平台的24点游戏设计与实现需求分析_毕业设计论文.doc...