MySQL复合查询(重点)

前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够。

基本查询回顾

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

mysql> select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';//用where逻辑筛选

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

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

 使用年薪进行降序排序(月薪*12+奖金)

因为有的雇员的comm(奖金)为NULL,而NULL不参与运算,所以对于comm为NULL的奖金为0用到函数ifnull();

mysql> select ename,sal*12+comm 年薪 from emp where ename='SMITH' order by 年薪 desc;//对于SMITH他的年薪不为NULL,但为什么最后是NULL,因为comm是NULL,任何数与NULL计算最后都是NULL,所以导致年薪最后为NULL
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);

sql中允许在一条sql内部执行对应的select查询,叫做子查询

select max(sal) from emo本身返回数值,让他的值等于where的sal查询即可(里部的select叫做子查询)

 显示工资高于平均工资的员工信息(用到子查询)

mysql> select * from emp where sal>(select avg(sal) from emp);//子查询查到平均工资,然后外部where筛选

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

每个部门的注定了要分组了,按照部门分组再求平均和最高(就是将emp这一张表逻辑上分成几组子表在进行聚合统计)

mysql> select deptno,avg(sal),max(sal) from emp group by deptno;
如果觉得平均工资显示的不优雅,可以使用format(avg(sal),2)保留两位精度

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

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

首先把每个部门的平均工资算出(注定要分组),再筛选出低于两千(注定用having筛选,用where的话不对)

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

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

mysql> select job,count(*),format(avg(sal),2) from emp  group by job;

多表查询 

实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张 表EMP,DEPT,SALGRADE来演示如何进行多表查询。

案例

显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询

select count(*) from emp,dept=(count(*) from emp)*(select count(*) from dept;)

如果不经过筛选的话得到的信息是多余的且错误的;其实我们只要emp表中的deptno = dept表中的deptno字段的记录

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

如果是唯一的话就不用  表名.列名  直接用列明即可

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

mysql> select ename, sal,dname from emp, dept where dept.deptno=dept.deptno and  dept.deptno = 10;

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

mysql> select ename, sal,grade from emp, salgrade where sal between losal and hisal;//这个where筛选相当于在进行笛卡尔积的时候进行过滤过滤掉不符合的信息

 笛卡尔积本质就是穷举,如有筛选就筛选;

 自连接

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

不能将同一张表写两次:mysql> select * from salgrade,salgrade;
ERROR 1066 (42000): Not unique table/alias: 'salgrade'

但是能将重命名后查询:

mysql> select * from salgrade t1,salgrade t2;
mysql> select * from salgrade t1,salgrade;
mysql> select * from salgrade ,salgrade t;//只要重命名任意一个就行,不要在sql中出现一样的表名

 案例

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

1.先找到领导的编号:mysql> select mgr from emp where ename='FORD';

2.再根据编号找信息:mysql> select ename,empno from emp where empno=7566;


方法1(子查询):mysql> select ename,empno from emp where empno=(select mgr from emp where ename='FORD');//使用子查询


方法2(多表查询--自查询):mysql> select leader.empno,leader.ename from emp leader, emp worker where leader.empno = worker.mgr and worker.ename='FORD';//这里from重命名where能用并且select也能用因为sql语句先执行from;因为要先做笛卡尔积,所以别名可以先识别

子查询

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

 单行子查询

返回一行记录的子查询

显示SMITH同一部门的员工

mysql> select * from emp where deptno=(select deptno from emp where ename='SMITH');//内部查询出的结果作为外部查询的条件

多行子查询

返回多行记录的子查询

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

首先查出10号部门的工作岗位:mysql> select job from emp where deptno=10;//如有重复的加distinct即可

in关键字:只要满足集合的一个条件即可

查找:mysql> select ename,job,sal,deptno from emp where job in (select job from emp where deptno=10);//查出所有的

最终:mysql> select ename,job,sal,deptno from emp where job in (select job from emp where deptno=10) and deptno <> 10;


那如果查询出后再查出部门名称怎么做呢?

mysql> select * from (select ename,job,sal,deptno from emp where job in (select job from emp where deptno=10) and deptno <> 10) t1,dept where t1.deptno=dept.deptno;

一个sql的查询结果本身就是表结构,我们也可以将查出来的表结构进行进行笛卡尔积;

子查询不仅能出现在where后面充当判断条件也可以出现在from后面充当表

最后:mysql> select ename,job,sal,dname from (select ename,job,sal,deptno from emp where job in (select job from emp where deptno=10) and deptno <> 10) t1,deppt where t1.deptno=dept.deptno;

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

首先筛选出部门30的所有员工的最高工资:mysql> select max(sal) from emp where deptno=30;
结果:筛选出工资大于部门30的所有员工的最高工资的人:mysql> select * from emp where sal > (select max(sal) from emp where deptno=30);

all关键字:都大于集合的才满足

结果:mysql> select * from emp where sal > all (select sal from emp where deptno=30);//这里不挑选出最大的,而是列出所有30部门员工的sal,只有员工的薪水都大于all集合里的薪水才满足条件;

用all相当于我比你们班任何一个人的成绩都要高相当于我比你们班的第一名成绩还要高(学霸思想)


最终查到的都比部门30的员工任意sal都要高

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

all关键字:都大于集合的才满足

结果:mysql> select * from emp where sal > any (select sal from emp where deptno=30);

用any相当于我只要比你们班一个人高就行(学渣思想)


最终查到的最低sal只要比部门30的最低sal高就行

多行子查询也是单列

多列子查询

行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言 的,而多列子查询则是指查询返回多个列数据的子查询语句

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

首先找到SMITH的部门和岗位:mysql> select deptno,job from emp where ename='SMITH';
最终:mysql> select * from emp where (deptno,job) = (select deptno,job from emp where ename='SMITH') and ename <> 'SMITH';//多列用括号,得一一对应

目前全部的子查询,全部都在where语句中充当判断条件;

任何时刻查询出来的临时结构本质上也是表结构; 

在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

案例

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

先找出每个部门的平均工资(分组与聚合):mysql> select deptno,avg(sal) from emp group by deptno;
筛选:mysql> select * from emp,(select deptno,avg(sal) myavg from emp group by deptno) tmp where emp.deptno=tmp.deptno and emp.sal>tmp.myavg;

注意:子查询语句出现在from子句中一定要起别名

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

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

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

先找到每个组的人数:mysql> select count(1) from emp group by deptno;

使用子查询:mysql> select * from dept,(select deptno,count(1) from emp group by deptno) t1 where dept.deptno=t1.deptno;//几乎所有的笛卡尔积后都要加判断条件

使用多表:select dept.dname, dept.deptno, dept.loc,count(*) '部门人数' from emp, dept where emp.deptno=dept.deptno group by dept.deptno,dept.dname,dept.loc;

//为什么已经按照deptno分过组了还要按照dname和loc分组?

一方面是防止按照deptno分过后结果不对再按照dname分组;另一方面mysql不允许在分组中出现未被分组的列,例如:select dept.dname, dept.deptno, dept.loc,count(*)  from emp, dept where emp.deptno=dept.deptno group by dept.deptno;这样就不行,要求在使用 GROUP BY 时,SELECT 中的列要么是聚合函数,要么是在 GROUP BY 子句中明确列出的列。

解决多表问题的本质:想办法将多表转化为单表,所以在MySQL中,所有的select的问题全部都可以转化成单表问题!--多表查询的指导思想 

合并查询

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

union

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

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

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

mysql> select * from emp where sal> 2500 union select * from emp where job ='MANAGER';//自动去重

 union all

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

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

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

两个表拼接合集的话列属性得一样

mysql> select ename,job,sal from emp where sal> 2500 union all select * from emp where job ='MANAGER';
不能左边的表是筛选出三列跟右边的全列信息拼接,这样拼不上

 

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

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

相关文章

【数据结构初阶】详解 环形链表:链表的带环问题(判断是否带环、环形链表的入口点)

文章目录 一、链表的带环问题1.1、判断链表是否带环&#xff08;力扣 141.环形链表&#xff09;1.2 、证明&#xff1a;为什么带环时快慢指针一定相遇&#xff1f;1.3、证明&#xff1a;当slow走1步&#xff0c;fast可走3/4/5步&#xff08;fast的速度是slow的3/4/5倍&#xff…

Open3d入门 一文读懂三维点云

三维点云技术的发展始于20世纪60年代&#xff0c;随着激光雷达和三维扫描技术的进步&#xff0c;在建筑、考古、地理信息系统和制造等领域得到了广泛应用。20世纪90年代&#xff0c;随着计算机处理能力的提升&#xff0c;点云数据的采集和处理变得更加高效&#xff0c;推动了自…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

单体项目和微服务项目

“好的架构是演化出来的&#xff0c;不是设计出来的”。 微服务是用来处理海量数据、业务复杂和需求频繁变更场景下的架构风格。并不是万金油。 单体项目有哪些缺点&#xff1f; 1.不好扩展&#xff0c;即使只有一个组件需要扩展也需要扩展整个项目。 2.不好维护&#xff0c;屎…

在unity中的球形插值方法中第三个参数t是什么

在Unity中&#xff0c;球形插值&#xff08;Spherical Linear Interpolation&#xff0c;简称Slerp&#xff09;是一种用于在两个向量之间进行平滑插值的方法。球形插值通常用于旋转或方向的插值&#xff0c;以确保插值结果在球面上平滑过渡。 在Unity中&#xff0c;球形插值方…

【Vue3组件】LottieAnimation组件封装,用于流畅的页面动画效果

lottie是什么就不多介绍了&#xff0c;自己封装了一个平时用的比较多的组件&#xff0c;主要用于快速使用lottie动画&#xff0c;支持自动播放&#xff0c;循环播放&#xff0c;暂停继续 必要的库–lottie-web <template><div class"lottie" ref"lot…

【Rust】——不安全Rust

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

【调试笔记-20240713-Windows-Tauri 多个HTML页面支持】

调试笔记-系列文章目录 调试笔记-20240713-Windows-Tauri 多个HTML页面支持 文章目录 调试笔记-系列文章目录调试笔记-20240713-Windows-Tauri 多个HTML页面支持 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤搜索相似问题 三、应用场…

FPGA入门-自用

写代码&#xff0c;并将引脚对应到板子相应的引脚上 下载程序到板子上 遇到错误了&#xff0c;不按想的来的了&#xff0c;进行仿真 查看网表图查看问题所在 简化了一些步骤&#xff1a;未使用引脚的设置&#xff0c;电压设置&#xff1b; 通过画网表结构图来构成电路 时钟 …

SpringBoot+Vue实现简单的文件上传(txt篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传txt文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el-…

Windows安装linux子系统

Windows安装linux子系统 步骤 1 - 启用适用于 Linux 的 Windows 子系统 需要先启用“适用于 Linux 的 Windows 子系统”可选功能&#xff0c;然后才能在 Windows 上安装 Linux 分发。 以管理员身份打开 PowerShell&#xff08;“开始”菜单 >“PowerShell” >单击右键 …

Ubuntu 安装搜狗输入法

搜狗输入法已支持Ubuntu1604、1804、1910、2004、2010 各系统安装步骤可能略有不同 1、添加中文语言支持 打开 系统设置——区域和语言——管理已安装的语言——在“语言”tab下——点击“添加或删除语言” 弹出“已安装语言”窗口&#xff0c;勾选中文&#xff08;简体&…

[笔试训练](二十七)109:旋转字符串110:合并k个已排序的链表111:滑雪

目录 109:旋转字符串 110:合并k个已排序的链表 111:滑雪 109:旋转字符串 题目链接:旋转字符串_牛客题霸_牛客网 (nowcoder.com) 题目: 题解: class Solution { public:bool solve(string A, string B) {int nA.size();if(n!B.size()) return false;for(int i0;i<n;i){…

java《ArrayList篇》--ArrayList全套知识点总结及其配套习题逐语句分析(附带全套源代码)

一、前言 来不及悼念字符串了&#xff0c;接下来登场的是集合&#xff0c;集合和数组的用法差不多&#xff0c;不同之处就在于存储的内容&#xff0c;数组是固定的长度的&#xff0c;集合的长度不固定。学习的过程中可以参照数组 今天已经是学习java的第八天了&#xff0c;接下…

掌握精准测量:解锁企业成功的IS010012测量管理体系

在现代企业的竞争环境中&#xff0c;精准的测量管理是成功的基石。IS010012测量管理体系提供了全面而系统的方法&#xff0c;帮助企业在质量、效率和竞争力方面实现飞跃。让我们深入探讨IS010012测量管理体系的关键作用&#xff0c;揭示其如何成为企业成功的秘密武器。 IS01001…

PHP MySQL 创建数据库

PHP MySQL 创建数据库 在Web开发中,PHP和MySQL的组合是一种非常流行的技术栈。PHP是一种服务器端脚本语言,而MySQL是一种关系型数据库管理系统。它们共同为开发者提供了一种强大且灵活的方式来创建动态的、数据驱动的网站。在本教程中,我们将介绍如何使用PHP来创建一个MySQ…

SpringBoot后端代码基本逻辑

数据持久化&#xff08;Dao---Entity---mapper&#xff09; 配置&#xff08;application.yml&#xff09; server:port: 10086 ​ spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/wiki?useUnicodetrue&characterEnco…

LabVIEW中modbusTCP怎样才能和profibusDP通信?

在LabVIEW中&#xff0c;Modbus TCP和Profibus DP是两种不同的工业通信协议&#xff0c;要实现这两者之间的通信&#xff0c;可以采用网关设备进行协议转换&#xff0c;或者通过一个中间设备&#xff08;如PLC&#xff09;进行数据桥接。以下是实现此通信的一些方法&#xff1a…

Github 2024-07-14 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10CSS项目1Symfony PHP框架和组件 创建周期:5130 天开发语言:PHP协议类型:MIT LicenseStar数量:28999 个Fork数量:9440 次关注人数…

24/07/10数据结构(5.1213)链表OJ

继续练习题: 7.判断链表是不是回文结构 对于一个链表,设计一个时间复杂度O(n)空间复杂度O(1)的算法,判断是否为回文结果 给定一个链表的头指针A,返回一个bool值代表其是否为回文结构. 测试样例:1->2->2->1 返回:ture bool chkPalindrome(ListNode* A){ …