文章目录

  • 一、基本查询回顾
  • 二、多表查询
    • 1.最基本的复合查询
  • 三、自查询
  • 四、子查询
    • 1.单行子查询
    • 2.多行子查询
      • (1)in关键字
      • (2)all关键字
      • (3)any关键字
    • 3.多列子查询
    • 4.在from语句中使用子查询
    • 5.合并查询
      • (1)union
      • (2)union all

一、基本查询回顾

在了解复合查询之前,我们需要先复习一下在单表中的查询:这些查询都是在oracle标准表中进行的。

  • 查询工资高于500,或岗位为MANAGER的雇员,同时还满足他们的姓名首字母大写的J
mysql> select ename,sal,job from emp where (sal>500 or job='MANAGER') and ename like 'J%';
  • 按照部门号升序而雇员的工资降序排序
mysql> select * from emp order by deptno asc,sal desc;
  • 使用年薪进行降序排序
mysql> select ename,sal*12+ifnull(comm,0) as '年薪' from emp order by 年薪 desc;
  • 显示每个部门的平均工资和最高工资
mysql> select deptno,avg(sal),max(sal) from emp group by deptno;
  • 显示平均工资低于2000的部门号和它的平均工资
mysql> select deptno,avg(sal) from emp  group by deptno having avg(sal)<2000;
  • 显示每种岗位的雇员总数,平均工资
mysql> select job,count(*),avg(sal) from emp group by job;

二、多表查询

1.最基本的复合查询

复合查询通常是在from 后面用逗号连接多张表,比如:

mysql> select * from emp,dept;

可以看到打印的结果为:

可以观察到黄色线的左边是emp表的内容,黄色线的右边是dept表的内容。类似于笛卡尔机,将左侧表每一行都与右侧表的每一行匹配一遍。这样就将多表转化成了单表。
通常我们需要保证合理性,即两边表的部门号需要是一样的,因此引入’.'这个操作符:

mysql> select * from emp,dept where emp.deptno=dept.deptno;

  • 显示部门号为10的部门名,员工名和工资:
mysql> select emp.deptno,dname,ename,sal from emp,dept where emp.deptno=dept.deptno and dept.deptno=10;

  • 显示每一个员工的姓名,工资,以及工资级别:
mysql> select ename,sal,salgrade.grade from emp,salgrade where sal between losal and hisal;

三、自查询

自查询就是自己和自己进行拼接,这种拼接方式也是有意义的:

  • 显示员工FORD的上级领导的编号和姓名:
mysql> select leader.empno,leader.ename from emp leader,emp worker where worker.mgr=leader.empno and worker.ename='FORD';


通常当进行自查询的时候,为了避免冲突,通常需要为表取别名,由于from是在select之前就执行了的,因此select中可以使用from中起的别名。

四、子查询

子查询是指嵌入到其他sql语句中的select语句,也叫嵌套查询,无论如何嵌套最终都会转化成单表查询:

1.单行子查询

  • 显示SMITH同一部门的员工
mysql> select ename from emp where deptno=(select deptno from emp where ename='SMITH');

  • 显示工资最高的员工的名字和工作岗位
mysql> select ename,job from emp where sal=(select max(sal) from emp);

  • 显示工资高于平均工资的员工信息
mysql> select * from emp where sal>(select avg(sal) from emp);

2.多行子查询

之前我们比较的都是子查询只查出来一行的,那如果子查询查出来多行呢?使用关键字进行比较。

(1)in关键字

  • 查询和10号部门的岗位相同的雇员的名字,岗位,工资,部门号,但是不包括10自己的。
mysql> select ename,job,sal,deptno from emp where job in(select distinct job from emp where deptno=10) and deptno<>10;

(2)all关键字

  • 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
mysql> select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);

(3)any关键字

  • 显示工资比部门30的任意员工的工资高的员工的姓名,工资和部门号(包含自己部门的员工)
mysql> select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30);

3.多列子查询

单列子查询是指子查询只返回单列,单行数据;多列子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。使用括号来匹配多列数据。

  • 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人。
mysql> select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH') and ename<>'SMITH';

4.在from语句中使用子查询

以上都是在where筛选的时候使用子查询进行查找,from语句中也可以使用子查询,在from子句中使用子查询,就是将子查询结果不去匹配,而是当做一个子表来用。

  • 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
select ename,deptno,sal,format(asal,2) from emp,(select avg(sal) asal,deptno dt from emp group by deptno) tmp where emp.sal>tmp.asal and emp.deptno=tmp.dt;

对于这段代码来说,有两个比较容易错的地方:

1.拼接的时候如果出现了相同的字段,可以将子查询中的列名重命名一下。
2.select+聚合函数,必须要有分组条件,如果没有还有其他的字段,那么请在子查询中将聚合函数进行重命名。

  • 查找每个部门工资最高的人的姓名,工资,部门,最高工资
mysql> select ename,sal,deptno,max from emp,(select deptno dt,max(sal) max from emp group by deptno) tmp where emp.deptno=tmp.dt and emp.sal=tmp.max;

书写复杂的查询过程,一定要先明确执行顺序,子查询是第一个执行的,from语句是第二个执行的,where是第三个执行的,select是最后执行的。

  • 显示每个部门的信息(部门名,编号,地址)和人员数量
mysql> select dname,deptno,loc,count from dept,(select deptno dt,count(*) count from emp group by deptno) tmp where dept.deptno=tmp.dt;

5.合并查询

在实际应用中,为了合并多个select的执行结果,可以使用它集合操作符union,union all

(1)union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

  • 将工资大于2500或职位是MANAGER的人找出来
mysql> select ename,sal,job from emp where sal>2500 -> union-> select ename,sal,job from emp where job='MANAGER'-> ;
mysql> select ename,sal,job from emp where sal>2500  union select ename,sal,job from emp where job='MANAGER' or sal>2500;

这两条语句是等价的。

(2)union all

该操作符用于取得两个结果集的并集,当使用该操作符时,不会去掉结果集中重复的行。

  • 将工资大于2500或职位是MANAGER的人找出来
mysql> select ename,sal,job from emp where sal>2500-> union all-> select ename,sal,job from emp where job='MANAGER';

MySQL复合查询(多表查询)相关推荐

  1. 【一周入门MySQL—3】多表查询、子查询、常用函数

    多表查询.子查询.常用函数 一.多表查询 多表查询:通过不同表中具有相同意义的关键字段,将多个表进行连接,查询不同表中的字段信息. 对应关系 一对一:比如下图的人员信息表和人员身份证对应表,一个员工只 ...

  2. MySQL 笔记5 -- 多表查询

    MySQL 笔记5 – 多表查询 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 一.表之间关系 1.一对一 ...

  3. mysql数据库之单表查询

    单标查询 单表查询语句 关键字执行的优先级 简单查询 where约束 group by 聚合函数 HAVING过滤 order by 查询排序 LIMIT限制查询的记录数 使用正则表达式查询 单表查询 ...

  4. 在MySQL中实现交叉表查询2(动态交叉表)

    在MySQL中实现交叉表查询2(动态交叉表) 交叉表分为静态交叉表和动态交叉表.其中静态交叉表中的列是固定的,因此相对容易实现:而动态交叉表中的列需要动态生成. 一.静态交叉表的实现 参见上一篇文章: ...

  5. 在MySQL中实现交叉表查询1(静态交叉表)

    在MySQL中实现交叉表查询1(静态交叉表) 一.什么是交叉表 交叉表查询是将来源于某个表中的字段进行分组,一组列在交叉表左侧,一组列在交叉表上部,并在交叉表行与列交叉处显示表中某个字段的各种计算值. ...

  6. Mysql数据库的单表查询

    我们在使用Mysql数据库存储数据时,对数据的查询方法是至关重要的,此博客主要介绍Mysql数据库的查询数据方法. 单表查询 单表查询就是我们仅对一个表进行查询,我们可以首先创建一个名为table的表 ...

  7. MySQL约束条件和多表查询方式详解

    一.约束 什么是约束? 简述:除了数据类型以外的约束的 为什么使用约束? 简述:为了保证数据的合法性 完整性: 二.约束分类: not null 跟整型时使用其作用是限制插入数据不能为空 create ...

  8. MySQL数据库应用 多表查询_mysql数据库-多表查询

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: ​ 数据库的创建 : create ...

  9. 基于SpringDataJpa的mysql动态分页多表查询

    基于SpringDataJpa的mysql动态分页多表查询 由于这篇文章预计篇幅会很长,关于Spring Data JPA的知识就简短的分享,更多的请自行度娘,JPA 封装了很多查询的接口,但今天要讲 ...

  10. 记录:数据库(MySQL)之多表查询

    数据库(MySQL)之多表查询 1.创建表 -- 多表联合查询 -- 创建三个表,并进行插入数据 -- 创建emp表,并插入数据 CREATE TABLE emp ( eno int(5),-- 员工 ...

最新文章

  1. 使用OpenSSL实现证书操作
  2. JqueryEasyUI 解决IE下datagrid无法刷新的问题
  3. SQL Server 自定义函数 返回树结构函数
  4. 如何修改SharePoint服务器场管理员帐户和密码
  5. Centos6.5硬盘故障修复
  6. 黑马程序员_java基础笔记(06)...集合
  7. python爬虫从入门到放弃(八)之 Selenium库的使用
  8. 2018 C语言大作业--21_Ekko制作教程
  9. 三角传输的在链路均衡项目中的灵活应用
  10. ArcGIS Maritime Server 开发教程(三)Maritime Service 功能解读
  11. 陈玉琴老师的中医理学
  12. 斯托克斯公式与一些概念
  13. VMware Workstation Pro详细安装教程
  14. ArcGIS更多颜色调配
  15. 【经典】吴恩达《机器学习》课程
  16. 几乎所有的互联网公司都在进行一场脱虚向实的全新嬗变
  17. Java Web框架学习
  18. iPhone营销四大基础:共鸣、专注、灌输、用心
  19. Premiere Pro 2023下载安装、新增功能介绍
  20. 磊科NW330 LINUX下驱动安装记

热门文章

  1. 【vue2,3使用QRCode进行二维码的生成和下载】
  2. C++符号修饰与函数签名
  3. 良好意识和习惯的培养
  4. 主流操作系统分类及Linux系统简介
  5. 管理软件的重(zhong)装上阵--管理软件夜未眠(四)
  6. android的sdk离线安装详细教程,Android编程之SDK安装组件的离线安装方法分享
  7. 有好多的非处女们确实让大家反感,知道为什么吗?其实你们应该检讨下自己!
  8. CakePHP 2.x CookBook 中文版 第五章 控制器 之 脚手架
  9. Paraview如何关闭透视视图
  10. 单链表逆置(头插法图解)