【MySQL】复合查询

文章目录
  • [1. 基本查询练习](#1. 基本查询练习)
  • [2. 多表查询](#2. 多表查询)
  • [3. 自连接](#3. 自连接)
  • [4. 子查询](#4. 子查询)
    • [4.1 单行子查询](#4.1 单行子查询)
    • [4.2 多行子查询](#4.2 多行子查询)
    • [4.3 多列子查询](#4.3 多列子查询)
    • [4.4 在from子句中使用子查询](#4.4 在from子句中使用子查询)
  • [5. 合并查询](#5. 合并查询)
    • [5.1 union](#5.1 union)
    • [5.2 union all](#5.2 union all)
  • [6. 表的内连](#6. 表的内连)
  • [7. 表的外连](#7. 表的外连)
    • [7.1 左外连接](#7.1 左外连接)
    • [7.2 右外连接](#7.2 右外连接)

1. 基本查询练习

我们已有如下三张表:

  • EMP员工表
  • DEPT部门表
  • SALGRADE工资等级表
  1. 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
  1. 按照部门号升序而雇员的工资降序排序
  1. 使用年薪进行降序排序

年薪 = 月薪 * 12 + 奖金 => sal * 12 + comm

  1. 显示工资最高的员工的名字和工作岗位

首先要找出最高的工资,然后使用工资去比较,使用嵌套查询(子查询)

  1. 显示工资高于平均工资的员工信息

首先计算出平均工资,然后找出工资高于平均工资的员工的信息

  1. 显示每个部门的平均工资和最高工资

先按照部门分组,然后再查平均和最高工资

  1. 显示平均工资低于2000的部门号和它的平均工资

要先计算出每个部门 的平均工资,然后与2000比较

  1. 显示每种岗位的雇员总数,平均工资

先按照岗位分组

2. 多表查询

实际开发中往往数据来自不同的表,所以需要多表查询。我们依旧使用上面的三张表EMP、DEPT、SALGRADE来演示如何进行多表查询。

  1. 显示雇员名、雇员工资以及所在部门的名字

上面的数据来自EMP和DEPT表,因此要联合查询

联表查询语法:

复制代码
select 列名... from 表1,表2... 条件..

我们只要找出 雇员表中 部门号与 部门表中 部门号相同的即可。

注意两张表中相同的列名要指明。

  1. 显示部门号为10的部门名,员工名和工资
  1. 显示各个员工的姓名,工资,及工资级别

涉及 工资级别表 与 员工表

3. 自连接

自连接是指在同一张表中连接查询

  1. 显示员工FORD的上级领导的编号和姓名

mgr是领导的编号,empno是员工的编号

  • 使用子查询:
  • 使用自连接(多表查询):

4. 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

4.1 单行子查询

只返回一行记录的子查询

  1. 显示与SMITH同一部门的员工的姓名

4.2 多行子查询

返回多行记录的子查询

  1. 查询和10号部门的工作岗位相同 的雇员的名字,岗位,工资,部门号,但是不包含10号部门自己的

先查询10号部门的岗位,就当前表而言,其结果会有多行记录;然后再找出岗位相同的

in关键字:结果中有"我"就行

  1. 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

all关键字:结果中所有的

  1. 显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

解释:只要30部门中有一个员工的工资低于我,那我就符合条件

any关键字:结果中的任意一个/多个

4.3 多列子查询

  • 单行子查询是指子查询只返回单列、单行数据;
  • 多行子查询是指返子查询回单列、多行数据
  • 多列子查询是指子查询返回多个列数据的子查询语句
  1. 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

4.4 在from子句中使用子查询

子查询语句出现在from子句中。

首先我们要始终明确一点:sql查询出来的结果一定是一张表,所以可以把一个子查询的结果当做一个临时表使用。

  1. 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

首先,要有一张每个部门的平均工资临时表,然后用临时表与员工表做连接查询,从连接查询的结果中筛选出来符合条件的即可。

各部门平均工资的临时表:

两表连接,条件筛选

  1. 查找每个部门工资最高的人的姓名、工资、部门、最高工资
  1. 显示每个部门的信息(部门名,编号,地址)和人员数量

使用子查询:

使用多表:

5. 合并查询

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

5.1 union

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

如果两结果集有不同的列,则二者不能合并

  1. 将工资大于2500或职位是MANAGER的人找出来

5.2 union all

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

6. 表的内连

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选。

我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。

语法:

复制代码
select 字段 from 表1 [inner] join 表2 on 连接条件 [and 其他条件];

7. 表的外连

7.1 左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。

复制代码
select 字段名 from 表名1 left join 表名2 on 连接条件

有如下两张表:

  1. 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

7.2 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接

  1. 对student表和test表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
  1. 列出部门名称和这些部门的员工信息,同时列出没有员工的部门


相关推荐
异世界贤狼转生码农1 小时前
MongoDB Windows 系统实战手册:从配置到数据处理入门
数据库·mongodb
QuZhengRong1 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
码农阿豪1 小时前
Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
数据库·windows
冷崖6 小时前
MySQL异步连接池的学习(五)
学习·mysql
时序数据说7 小时前
时序数据库市场前景分析
大数据·数据库·物联网·开源·时序数据库
听雪楼主.11 小时前
Oracle Undo Tablespace 使用率暴涨案例分析
数据库·oracle·架构
我科绝伦(Huanhuan Zhou)11 小时前
KINGBASE集群日常维护管理命令总结
数据库·database
妖灵翎幺11 小时前
Java应届生求职八股(2)---Mysql篇
数据库·mysql
HMBBLOVEPDX11 小时前
MySQL的事务日志:
数据库·mysql
weixin_4196583113 小时前
MySQL数据库备份与恢复
数据库·mysql