MySql中表的复合查询

复合查询

​ 本篇开始将介绍在MySql中进行复合查询的操作。平时在开发过程中只对一张表进行查询的操作是远远不够的,更多的都是多张表一起查询,所以本篇将介绍多张表中的复合查询,主要介绍多表查询、自连接以及子查询。

文章目录

    • 复合查询
      • 导入数据库
        • 表的基础查询
      • 多表查询
      • 自连接
      • 子查询
        • 单行子查询
        • 多行子查询
        • 多列子查询
        • from中使用子查询
        • 合并查询
          • union
          • union all

导入数据库

​ 本篇中使用的数据库如下,若想要与本篇进行相同的操作,可以先导入与本篇相同的数据库,按步骤:

  1. 在某目录下创建sql文件:soctt_data.sql
  2. 将如下内容复制到soctt_data.sql文件中
  3. 然后登陆进mysql,执行命令:source 某目录/scott_data.sql
mysql> source /home/jzhong/mysql/scott_data.sql
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| scott              |
| sys                |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)-- 切换使用数据库
mysql> use scott
Database changed
mysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept            |
| emp             |
| salgrade        |
+-----------------+
3 rows in set (0.00 sec)

​ soctt_data.sql:

DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE `scott`;DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (`deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',`dname` varchar(14) DEFAULT NULL COMMENT '部门名称',`loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (`empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',`ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',`job` varchar(9) DEFAULT NULL COMMENT '雇员职位',`mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',`hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',`sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',`comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',`deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (`grade` int(11) DEFAULT NULL COMMENT '等级',`losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',`hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);
表的基础查询

​ 先对以上数据库进行一些基本查询,如下:

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

-- 使用模糊匹配
mysql> select * from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%';-- 使用字符串函数进行匹配
mysql> mysql> select * from emp where (sal > 500 or job = 'MANAGER') and substring(ename, 1, 1) = 'J';

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

mysql> select * from emp order by deptno asc, sal desc;

​ 使用年薪进行降序排序,如下:

mysql> select ename, sal * 12 + ifnull(comm, 0) 年薪 from emp order by 年薪 desc;

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

mysql> select ename, job from emp where -> sal = (select max(sal) from emp);

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

mysql> select * from emp where sal > (select avg(sal) from emp);

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

mysql> select deptno, format(max(sal), 2), format(avg(sal), 2) from emp group by deptno;

​ 显示平均工资低于2000的部门号和他的平均工资:

mysql> select deptno, avg(sal) from emp group by deptno having avg(sal) < 2000;

​ 显示每种岗位雇员的总数以及平均工资:

mysql> select deptno, avg(sal), count(*) from emp group by deptno;

多表查询

​ 实际的开发场景中数据往往来自不同的表,所以需要多表查询,多表查询的核心思想:先选定来源的数据有哪些表,然后对表格进行笛卡尔积连接(从第一张表中取出一条记录,和第二个表中所有记录进行组合,接着从第一张表中取出第二条数据,以此类推不加过滤),形成一张表格,然后在这一张表格中进行查询,如下为emp和dept两个表的笛卡尔积:在这里插入图片描述

​ 进行多表查询其实就是将多表进行笛卡尔积连接,然后进行在单表中查询,所以多表查询的本质也是单表查询只不过通常笛卡尔积连接形成的单表是中间生成的表。对于以上生成的连接表数据太过冗余,我们通常需要找的是两个表中有关联的数据,比如emp和dept中的deptno就存在相同的字段,所以可以将以上表格给过滤,如下:在这里插入图片描述

​ 假若我们需要查询显示部门号为10的部门名,员工名和工资,如下:

-- 先将表格使用笛卡尔积连接起来,然后筛选出有效数据,接着筛选部门号为10的数据
mysql> select emp.deptno, dept.loc, emp.ename, emp.sal from emp, dept where dept.deptno = emp.deptno and dept.deptno = 10;

​ 显示各个员工的姓名,工资,以及工资级别:

mysql> select ename, sal, grade from salgrade, emp where sal between losal and hisal;

自连接

​ 自连接同样也是多表查询中较为特殊的一种,因为需要使用笛卡尔积连接起来的是两个相同的表。

​ 查询员工FORD的上级领导的编号和姓名,如下:

-- 多表查询思路
select t2.ename, t2.empno from emp as t1, emp as t2 where t1.ename = 'FORD' and t2.empno = t1.mgr;-- 子查询思路
mysql> select ename, empno from emp where empno in (select mgr from emp where ename = 'FORD');

子查询

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

单行子查询

​ 单行子查询就是返回一行记录的子查询。

​ 查询与SMITH同一部门的员工,如下:

mysql> select * from emp where deptno = (select deptno from emp where ename = 'SMITH');
多行子查询

​ 多行子查询就是返回多行记录的子查询。

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

mysql> select ename, job, sal, deptno from emp-> where job in (select job from emp where deptno = 10) and deptno!=10;

all关键字:查询工资比部门30的所有员工的工资的工资搞的员工的姓名,工资和部门号,如下:

mysql> select ename, sal, deptno from emp where sal > all(select sal from emp where deptno = 30);-- 使用max聚合函数
mysql> select ename, sal, deptno from emp where sal > (select max(sal) from emp where deptno = 30);

​ any关键字:查询工资比部门30的任意员工的工资高(高于最低工资)的员工的姓名、工资和部门号(包含自己的部门),如下:

mysql> select ename, sal, deptno from emp where sal > any(select sal from emp where deptno = 30);
多列子查询

​ 上文中的单列子查询和多列子查询都是返回的单列多行数据,针对的是多列,而多列子查询则是指返回多个列数据的子查询语句,如下:

​ 查询和SMITH的部门和岗位完全相同的所有雇员,不包含SMITH本人。

mysql> select ename from emp where ename != 'SMITH' and (deptno, job) = (select deptno, job from emp where ename = 'SMITH');
from中使用子查询

​ 通常我们在from子句的后面都是直接跟的表名,但是即使是select出来的子句也生成了一个暂时的表,我们只需要将这个暂时的表给加个别名就可以使用了,如下:

​ 查询每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资,如下:

mysql> select ename, deptno, sal, myavg from emp, (select avg(sal) as myavg, deptno as dt from emp group by deptno) as tmp where emp.deptno = tmp.dt and emp.sal > tmp.myavg;

​ 查找每个部门工资最高的人的姓名、工资、部门、最高工资,如下:

mysql> select ename, sal, deptno, mymax from emp, (select max(sal) mymax, deptno dt from emp group by deptno) as tmp where emp.deptno = tmp.dt and emp.sal = tmp.mymax;

​ 显示每个部门的信息(部门名、编号、地址)和人员数量,如下:

-- 子查询
mysql> select dept.deptno, dept.dname, dept.loc, mycnt from dept, (select count(*) mycnt, deptno dt from emp group by deptno) as tmp where tmp.dt = dept.deptno;-- 多表
mysql> select dept.dname, dept.deptno, dept.loc, count(*) from emp, dept  where emp.deptno = dept.deptno group by dept.deptno, dept.dname, dept.loc;
合并查询

​ 为了合并多个select的执行结果,可以使用集合操作符union,union all。

union

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

​ 查询工资大于2500或者职位为MANAGER的人找出来。

mysql> select * from emp where sal > 2500 union select * from emp where job = 'MANAGER';
union all

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

​ 将工资大于2500或职位是MANAGER的人找出来,如下:

mysql> select * from emp where sal > 2500 union all select * from emp where job = 'MANAGER';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/458177.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Discourse 是否可以简化文本操作

当下的文本处理很多都在慢慢转换到 MD。 有一段时间&#xff0c;论坛都会使用默认的 BBCode&#xff0c;包括 Discuz 现在也是这样的。 MD 文件有一定的入门使用门槛&#xff0c;但习惯了还好。 我们这里用得最多的就是标题和图片&#xff0c;其他的排版用得比较少&#xff…

如何找到适合的工程管理系统?9款对比

本文推荐的9款精选工程项目综合管理系统有: 1. Worktile&#xff1b;2. 广联达&#xff1b;3. 斯维尔&#xff1b;4. 品茗工程管理软件&#xff1b;5. 明源云&#xff1b;6. 泛微OA&#xff1b;7. Microsoft Project&#xff1b;8. Procore&#xff1b;9. Buildertrend。 在管理…

安卓在windows连不上fastboot问题记录

fastboot在windows连不上fastboot 前提是android studio安装 google usb driver 搜索设备管理器 插拔几次找安卓设备 在其他设备 或者串行总线设备会出现安卓 右键更新驱动 下一步下一步然后可以了

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-24

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-24 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-24目录1. Optimizing Preference Alignment with Differentiable NDCG Ranking摘要研究背景问题与挑战如何解决创新点算法模型算…

Linux基础知识作业

关卡任务 任务描述闯关任务完成SSH连接与端口映射并运行hello_world.py可选任务 1将Linux基础命令在开发机上完成一遍可选任务 2使用 VSCODE 远程连接开发机并创建一个conda环境可选任务 3创建并运行test.sh文件

【STM32】单片机ADC原理详解及应用编程

本篇文章主要详细讲述单片机的ADC原理和编程应用&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、STM32ADC概述 1、ADC&#xff08;Analog-to-Digital Converter&#xff0c;模数转换器&#xff09; 2、STM32工作原理 二、STM32ADC编程实战 &#xff08;一&am…

vue文件转AST,并恢复成vue文件(适用于antdv版本升级)

vue文件转AST&#xff0c;并恢复成vue文件---antdvV3升级V4 vue文件转AST&#xff0c;重新转回原文件过程如何获取项目路径读取项目文件&#xff0c;判断文件类型分别获取vue文件 template js&#xff08;vue2和vue3&#xff09;处理vue 文件template部分处理vue script部分uti…

<<机器学习实战>>15-26节笔记:逻辑回归参数估计、梯度下降及优化、模型评价指标

梯度下降缺点&#xff1a;有可能有鞍点&#xff08;如果不是凸函数的时候&#xff09;&#xff0c;不一定能找到最小值解决方法&#xff1a;随机梯度下降&#xff08;选一条数据&#xff09;和小批量梯度下降&#xff08;选几条数据这两个解决方法又会带来新问题&#xff0c;比…

机器视觉-相机、镜头、光源(总结)

目录 1、机器视觉光源概述 2、光源的作用 3、光谱 4、工业场景常见光源 4.1、白炽灯 4.2、卤素灯 4.3、 荧光灯 4.4、LED灯 4.5、激光灯 5、光源的基本性能 5.1、光通量 5.2、光效率 5.3、发光强度 5.4、光照度 5.5、均匀性 5.6、色温 5.7、显色性 6、基本光学…

2024年信息化管理与计算技术研讨会 (ICIMCT 2024)--分会场

目录 重要信息 大会简介 荣誉主席 主讲嘉宾 征稿主题 会议日程 参会方式 重要信息 大会时间&#xff1a;2024年11月15-17日 大会地点&#xff1a;中国-成都 大会官网&#xff1a; http://www.icbar.net/ 大会简介 2024年信息化管理与计算技术研讨会 (ICIMCT 2024)为…

JAVA基础:集合 (学习笔记)

集合 什么是集合&#xff1f; 一种引用数据类型&#xff0c;可以存储多个数据 为什么要学习集合&#xff1f; 数组的缺点&#xff1a; &#xff08;1&#xff09;空间长度不可以改变。 &#xff08;2&#xff09;没办法获得数组中真实的元素个数。 &#xff08;3&#xff…

【Android】perfetto使用学习

在开发者选项中的系统跟踪里抓取的perfetto文件是保存在/data/local/traces 里的 adb pull /data/local/traces ./ 主线程中的执行是受vsync信号控制的&#xff0c;即间隔调用的 如果写一个while线程&#xff0c;一直使用cpu&#xff0c;是怎样的呢&#xff0c;这里我们来试验一…

asp.net core 入口 验证token,但有的接口要跳过验证

asp.net core 入口 验证token,但有的接口要跳过验证 在ASP.NET Core中&#xff0c;你可以使用中间件来验证token&#xff0c;并为特定的接口创建一个属性来标记是否跳过验证。以下是一个简化的例子&#xff1a; 创建一个自定义属性来标记是否跳过验证&#xff1a; public clas…

【算法】递归系列:206.反转链表(两种递归实现)

目录 1、题目链接 2、题目介绍 3、解法 递归法&#xff08;从前往后递归&#xff09; 从后往前递归 4、代码 递归法&#xff08;从前往后递归&#xff09; 从后往前递归 1、题目链接 206.反转链表 2、题目介绍 3、解法 递归法&#xff08;从前往后递归&#xff09; 递归…

OpenIPC开源FPV之Ardupilot配置

OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…

基于rk356x u-boot版本功能分析及编译相关(二)

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 build.sh脚本分析make.sh编译脚本分析接上,rk3568的u-boot编译在 基于rk356x u-boot版本功能分析及编译相关(一)已有描述,下面针对编译脚本进行分析,在编译之前都进行了哪些工作。 build.sh脚本分析 在编译目录下执行…

二叉树与堆的实现

一 . 概念与结构 在树的概念与结构中树的概念与结构-CSDN博客&#xff0c; 我们发现子结点可以为 0 或者是更多 &#xff0c; 结构较为复杂 &#xff0c; 然后把树的结点个数 加个限制条件 --> 不能超过 2 --> 我们引出了二叉树&#xff0c;在实际运用广 且高效 &#xf…

springboot-springboot官方文档架构

spring官网 >project&#xff1a;spring项目列表&#xff0c;包含了spring一系列框架的List >springboot(也可以换成其他框架)&#xff1a;springboot框架 >learn:显示这个框架的各个版本的reference doc和api doc >某版本的reference doc © 著作权归作者所有…

提示工程(Prompt Engineering)指南(进阶篇)

在 Prompt Engineering 的进阶阶段&#xff0c;我们着重关注提示的结构化、复杂任务的分解、反馈循环以及模型的高级特性利用。随着生成式 AI 技术的快速发展&#xff0c;Prompt Engineering 已经从基础的单一指令优化转向了更具系统性的设计思维&#xff0c;并应用于多轮对话、…

【gRPC】什么是RPC——介绍一下RPC

说起RPC&#xff0c;博主使用CPP手搓了一个RPC项目&#xff0c;RPC简单来说&#xff0c;就是远程过程调用&#xff1a;我们一般在本地传入数据进行执行函数&#xff0c;然后返回一个结果&#xff1b;当我们使用RPC之后&#xff0c;我们可以将函数的执行过程放到另外一个服务器上…