当前位置: 首页 > news >正文

【MySQL专栏】MySQL数据库的复合查询语句

在这里插入图片描述

文章目录

  • 1、首先练习MySQL基本语句的练习
      • ①查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
      • ②按照部门号升序而雇员的工资降序排序
      • ③使用年薪进行降序排序
      • ④显示工资最高的员工的名字和工作岗位
      • ⑤显示工资高于平均工资的员工信息
      • ⑥显示每个部门的平均工资和最高工资
      • ⑦显示平均工资低于2000的部门号和它的平均工资
      • ⑧显示每种岗位的雇员总数,平均工资
  • 2、多表查询
      • ①显示部门号为10的部门名,员工名和工资
      • ②显示各个员工的姓名,工资,及工资级别
  • 3、自连接
      • ①显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)
  • 4、子查询
    • (1)where子语句的单行子查询
      • ①显示SMITH同一部门的员工——之和SMITH这一行数据作比较
    • (2)where子语句的多行子查询
      • ①in关键字:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
      • ②all关键字:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
      • ③any关键字:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
    • (3)where子语句的多列子查询
      • ①案例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
    • (4)from子句中的子查询
      • ①显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
      • ②查找每个部门工资最高的人的姓名、工资、部门、最高工资
      • ③显示每个部门的信息(部门名,编号,地址)和人员数量
  • 5、合并查询
    • (1)union关键字:进行取两个结果集的并集,会自动去重。
      • 案例:将工资大于2500或职位是MANAGER的人找出来
    • (2)union all:取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
      • 案例:将工资大于25000或职位是MANAGER的人找出来

1、首先练习MySQL基本语句的练习

语句练习的基础数据:
①一个关于公司员工部门工资的数据库:
创建数据库:scott。

create database scott;

②三张表:dept:部门表、emp:员工表、salarge:薪资表。
创建三张表,结构数据如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

①查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J

考察where条件筛选。
在这里插入图片描述

②按照部门号升序而雇员的工资降序排序

考察MySQL排序查询,下面是先满足部门号升序,存在相同部门号的,再按照工资降序排序。
在这里插入图片描述

③使用年薪进行降序排序

此处需要注意的是在comm列属性中的NULL不参与运算,任何数据和NULL运算都是NULL,因此用ifnull判断。
在这里插入图片描述
不作判断就是为NULL:不符合。
在这里插入图片描述

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

考察数学函数的使用:max()。
在这里插入图片描述

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

先查询平均工资,然后再查询工资高于平均工资的员工信息。
在这里插入图片描述

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

先分组然后统计分组后的平均工资和在该部门中的最高工资
在这里插入图片描述

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

即每个部门的平均工资,查询在对应部门低于平均工资的部门号和该部门的平均工资
在这里插入图片描述

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

看到每个岗位,就想到按岗位分组,然后统计,相同岗位的平均工资
在这里插入图片描述

上面是一些基本的查询语句,接下来主要看一下:多表查询、自连接、子查询、合并查询等相关知识。

2、多表查询

首先,什么是多表查询,即在多张表中查看想要的结果。上面来练习的语句中都是单表查询,而此处的多表查询实际上也可以看作是单表查询,只不过是经过组合的一张表,通过笛卡尔积组合后就是一张表了,然后从整个大表中进行筛选即可。

什么是笛卡尔积?有图简易说明:
在这里插入图片描述
先通过下面语句看到笛卡尔积的现象:可以看到员工表和部门表进行笛卡尔积后得到很多数据,其中有些数据是不符合的,因此需要进行筛选,即我们只要emp表中的deptno = dept表中的deptno字段的记录。
在这里插入图片描述

①显示部门号为10的部门名,员工名和工资

在这里插入图片描述
在这里插入图片描述

②显示各个员工的姓名,工资,及工资级别

即姓名和工资属于一张表,工资级别一张表,笛卡尔积后需要查询工资在对应范围的才是正确的:
在这里插入图片描述

总结:在进行多表查询的时候,先进行无脑笛卡尔积,然后通过唯一值条件筛选即可,唯一值条件即是能说明多张表组合后,只能有一条数据在符号要求的。

3、自连接

什么是自连接?即在同一张表中作连接查询,有人会觉得这有真没意义,通过下面例子说明:

①显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)

在这里插入图片描述
在这里插入图片描述

也可以通过给自己表取别名,得到新的表,作笛卡尔积,再进行判断员工对应的mgr编号和领导表中的empno是否相同:
在这里插入图片描述

4、子查询

子查询:即嵌入在其他SQL语句中的select语句,也叫嵌套查询。

(1)where子语句的单行子查询

即在查询过程中之和一行数据进行比较查询,只返回一行数据的子查询语句,这里的返回一行是字子查询里面返回的数据是一行。

①显示SMITH同一部门的员工——之和SMITH这一行数据作比较

即先查询SMITH所在的部门,再通过部门信息查找和该部门相同的员工信息即可。
在这里插入图片描述

(2)where子语句的多行子查询

即查询的时候比较数据不止一行数据,子查询返回的数据是多行的,也就再次查询的时候比较就有多行数据
主要用到:in、all、any 查询关键字。

①in关键字:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

即先查10部门的工作岗位有哪些?
然后根据更为查询对应的员工。看查找的员工的岗位是否在上面查询的岗位范围内。
在这里插入图片描述
不等于的两种写法:!= 或者 <>
在这里插入图片描述

②all关键字:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

可以先查找部门30号的员工中最高的工资,然后在其他部门查找比该工资还高的信息。
在这里插入图片描述

③any关键字:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

即这里的比部门30的任意员工工资高,是说只要查找到的员工工资高于部门30里面员工工资其中一个都满足。
因此先统计部门30的所有员工工资,然后通过any进行查询。
在这里插入图片描述

(3)where子语句的多列子查询

多列子查询则是指查询返回多个列数据的子查询语句。

①案例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

这里的多列子查询就体现在刚开始查询的结果就存在多列,即部门和岗位,因此叫多列子查询。
即先查询到SMITH的部门和岗位。

包含SMITH的时候:
在这里插入图片描述
不包含本人的时候:
在这里插入图片描述

(4)from子句中的子查询

从上买此查询的语句中可以看到都是跟到where子语句中的,作为条件子查询。而在from子语句后面的,则是通过select查询出来的作为一张临时表进行与其他表进行筛选的。下面 通过例子来看:

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

即先按部门分组,分别计算出每个部门的平均工资,然后通过查询表中高于平均工资的员工相关信息。但是真正编写SQL语句返现执行报错,因为需要显示员工姓名,而多个员工会存在在同一个部门,但是又以部门分组,显然不符合分组的条件,无法分组,因此需要通过from子句的子查询来完成。
先通过分组得到对应部门的平均工资,然后把该结果作为临时表,然后和emp表进行一起查询。
临时表
在这里插入图片描述
在这里插入图片描述

②查找每个部门工资最高的人的姓名、工资、部门、最高工资

即和上面一样需要from子句的查询,先根据分组得到每个部门的最高工资:
在这里插入图片描述
然后和emp表进行结合查询:
在这里插入图片描述

③显示每个部门的信息(部门名,编号,地址)和人员数量

使用多表查询的,即员工表和部门表,以部门表进行分组查询:
在这里插入图片描述
使用子查询:即先对员工表以部门分组进行人员统计
在这里插入图片描述

5、合并查询

即合并多个selecct查询出来的结果,使用集合操作符号:union,union all关键字。

(1)union关键字:进行取两个结果集的并集,会自动去重。

案例:将工资大于2500或职位是MANAGER的人找出来

使用子查询:
在这里插入图片描述
使用union取并集:必须保证两张表的属性列一样,数量一样才可以合并。
在这里插入图片描述

(2)union all:取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

案例:将工资大于25000或职位是MANAGER的人找出来

即没有去重的数据:union
在这里插入图片描述

相关文章:

  • 用 LangChain 手搓 RAG 系统:从原理到实战
  • [AI技术(二)]JSONRPC协议MCPRAGAgent
  • Cadence学习笔记之---原理图设计基本操作
  • ValidatorUtils工具
  • 《Piper》皮克斯技术解析:RIS系统与云渲染如何创造奥斯卡级动画短片
  • 【C语言练习】002. 理解C语言的基本语法结构
  • ECMAScript 1(ES1):JavaScript 的开端
  • 基于大牛直播SDK的Android屏幕扬声器采集推送RTMP技术解析
  • 浅谈OpenAIClaude LLM Tools的额外配置
  • 计算机网络中的DHCP是什么呀? 详情解答
  • 【速写】钩子与计算图
  • 抓包工具Wireshark的应用解析
  • Linux文件管理完全指南:从命名规则到压缩解压
  • 每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)
  • 分层设计数据仓库的架构和设计高效数据库系统的方法
  • 自然语言处理+知识图谱:智能导诊的“大脑”是如何工作的?
  • 人工智能常见的数据处理方法
  • 感知古今:探秘古代传感器的奇妙世界
  • 架构师面试(三十六):广播消息
  • 重置 Git 项目并清除提交历史
  • 美联储官员:货币政策不会立即改变,金融市场波动或致美国经济增长承压
  • 欢迎回家!日本和歌山县4只大熊猫将于6月底送返中国
  • 又双叒叕出差太空了!神二十成功出发,神十九乘组扫榻以待
  • 研究|和去年相比,人们使用AI的需求发生了哪些变化?
  • “雷公”起诉人贩子王浩文案开庭:庭审前手写道歉信,庭审中不承认拐走川川
  • 稀土管制难倒特斯拉人形机器人“擎天柱”,马斯克:“正与中国协商”