MySQL篇七:复合查询

文章目录

  • 前言
  • 1. 基本查询回顾
  • 2. 多表查询
  • 3. 自连接
  • 4. 子查询
    • 4.1 单行子查询
    • 4.2 多行子查询
    • 4.3 多列子查询
    • 4.4 在from子句中使用子查询
    • 4.5 合并查询
      • 4.5.1 union
      • 4.5.2 union all

前言

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

1. 基本查询回顾

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

select * from EMP where (sal>500 or job='MANAGER') and ename like 'J%';

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

select * from EMP order by deptno, sal desc;

  使用年薪进行降序排序

select ename, sal*12+ifnull(comm,0) as '年薪' from EMP order by 年薪 desc;

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

select ename, job from EMP where sal = (select max(sal) from EMP);

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

select ename, sal from EMP where sal>(select avg(sal) from EMP);

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

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

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

select deptno, avg(sal) as avg_sal from EMP group by deptno having avg_sal<2000;

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

select job,count(*), format(avg(sal),2) from EMP group by job;

2. 多表查询

  实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询。
  显示雇员名、雇员工资以及所在部门的名字。 因为上面的数据来自EMP和DEPT表,因此要联合查询,其实我们只要emp表中的deptno = dept表中的deptno字段的记录

select EMP.ename, EMP.sal, DEPT.dname from EMP, DEPT where EMP.deptno = DEPT.deptno;

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

select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and DEPT.deptno = 10;

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

select ename, sal, grade from EMP, SALGRADE where EMP.sal between losal and hisal;

3. 自连接

  自连接是指在同一张表连接查询
  显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)
  使用的子查询:

select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');

  使用多表查询(自查询)

-- 使用到表的别名
--from emp leader, emp worker,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别select leader.empno,leader.ename from emp leader, emp worker whereleader.empno = worker.mgr and worker.ename='FORD';

4. 子查询

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

4.1 单行子查询

  返回一行记录的子查询
  显示SMITH同一部门的员工

select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');

4.2 多行子查询

  返回多行记录的子查询
  in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;

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

select ename, sal, deptno from EMP where sal > all(select sal from EMP where deptno=30);

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

select ename, sal, deptno from EMP where sal > any(select sal from EMP where deptno=30);

4.3 多列子查询

  单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
  查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

mysql> select ename from EMP where (deptno, job)=(select deptno, job from EMPwhere ename='SMITH') and ename <> 'SMITH';

4.4 在from子句中使用子查询

  子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
  显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资。

//获取各个部门的平均工资,将其看作临时表select ename, deptno, sal, format(asal,2) from EMP,(select avg(sal) asal, deptno dt from EMP group by deptno) tmpwhere EMP.sal > tmp.asal and EMP.deptno=tmp.dt;

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

select EMP.ename, EMP.sal, EMP.deptno, ms from EMP,(select max(sal) ms, deptno from EMP group by deptno) tmpwhere EMP.deptno=tmp.deptno and EMP.sal=tmp.ms;

  显示每个部门的信息(部门名,编号,地址)和人员数量
  方法1:使用多表

select DEPT.dname, DEPT.deptno, DEPT.loc,count(*) '部门人数' from EMP,DEPTwhere EMP.deptno=DEPT.deptno group by DEPT.deptno,DEPT.dname,DEPT.loc;

  方法2:使用子查询

-- 1. 对EMP表进行人员统计
select count(*), deptno from EMP group by deptno;-- 2. 将上面的表看作临时表
select DEPT.deptno, dname, mycnt, loc from DEPT,(select count(*) mycnt, deptno from EMP group by deptno) tmpwhere DEPT.deptno=tmp.deptno;

4.5 合并查询

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

4.5.1 union

  该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
  将工资大于2500或职位是MANAGER的人找出来

select ename, sal, job from EMP where sal>2500 unionselect ename, sal, job from EMP where job='MANAGER';--去掉了重复记录

4.5.2 union all

  该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
  将工资大于25000或职位是MANAGER的人找出来

 select ename, sal, job from EMP where sal>2500 union allselect ename, sal, job from EMP where job='MANAGER';

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

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

相关文章

【高中数学/指数函数】比较a=0.6^0.9 b=0.6^1.5 c=1.5^0.6的大小

【问题】 比较a0.6^0.9 b0.6^1.5 c1.5^0.6的大小 【解答】 指数函数y0.6^x是减函数&#xff0c;因为0.9<1.5,所以0.6^0.9>0.6^1.5,即a>b; 指数函数y1.5^x是增函数&#xff0c;1.5^0.6>1.5^01>0.6^0.9,即c>a; 综上&#xff0c;得出c>a>b的结论。 …

【运维】docker批量删除临时镜像(两种方式)

docker批量删除Tag<none>的临时镜像 在开发的时候&#xff0c;需要经常发布开发包&#xff0c;在使用docker build构建镜像的时候&#xff0c;同一个版本经常会使用相同tag&#xff0c;频繁打包一段时间后&#xff0c;本地会出现很多Tag<none>的临时镜像&#xff…

【MySQL】MySQL中的字段类型和区别

文章目录 前言一、说明举例1. 数值类型2. 字符串类型3. 日期和时间类型 二、总结 前言 在设计数据库和创建表时&#xff0c;理解MySQL中的各种字段类型及其区别是非常重要的。每种类型都有其特定的用途和存储需求。在本文中&#xff0c;我们将详细讨论MySQL中的各种字段类型&a…

uniapp如何发送websocket请求

方法1&#xff1a; onLoad() {uni.connectSocket({url: ws://127.0.0.1:8000/ws/stat/realTimeStat/,success: (res) > {console.log(connect success, res);}});uni.onSocketOpen(function (res) {console.log(WebSocket连接已打开&#xff01;);uni.sendSocketMessage({d…

Xinstall揭秘:APP推广数据背后的真相,让你的营销更精准!

在这个移动互联网时代&#xff0c;APP如同雨后春笋般涌现&#xff0c;但如何在这片红海中脱颖而出&#xff0c;成为每一个开发者与运营者面临的共同难题。其中&#xff0c;APP推广统计作为衡量营销效果、优化推广策略的关键环节&#xff0c;更是不可忽视的一环。今天&#xff0…

[GDOUCTF 2023]Tea writeup

通过strings找到关键函数 int __fastcall main_0(int argc, const char **argv, const char **envp) {char *v3; // rdi__int64 i; // rcxchar v6; // [rsp20h] [rbp0h] BYREFint v7; // [rsp24h] [rbp4h]int v8; // [rsp44h] [rbp24h]int four_key[12]; // [rsp68h] [rbp48h]…

你知道滚筒式高速视觉检测机外观怎么“看”出产品质量吗?

点火线圈胶套是一种用于保护点火线圈绝缘部分的胶质套管。这种胶套通常由高温耐磨的橡胶或硅胶材料制成&#xff0c;具有良好的绝缘性能和耐高温性能。点火线圈胶套的作用是防止点火线圈与外部环境接触&#xff0c;防止受潮、灰尘或化学物质的侵蚀&#xff0c;同时起到绝缘和保…

python怎么调用cmd命令

关于python调用cmd命令&#xff1a; 1、python的OS模块 OS模块调用CMD命令有两种方式&#xff1a;os.popen()、os.system()都是用当前进程来调用。 OS.system是无法获取返回值的。当运行结束后接着往下面执行程序。用法如&#xff1a;OS.system("ipconfig"). OS.…

随身WiFi市场乱象横生,随身WiFi测评最好的格行随身WiFi如何引领变革?

在当今随身WiFi市场乱象频发、内卷严重的背景下&#xff0c;消费者对于产品的性能与商家是否会后台割韭菜依旧存疑&#xff0c;尤其是“随身WiFi到底卡不卡&#xff1f;”的问题&#xff0c;成为了广大消费者关注的重点。然而&#xff0c;在众多品牌中&#xff0c;格行随身WiFi…

【音频特征提取】傅里叶变换算法源码学习记录

目录 背景快速理解FFT&#xff08;快速傅里叶变换&#xff09;IFFT&#xff08;逆傅里叶变换&#xff09;STFT&#xff08;短时傅里叶变换&#xff09; 代码实现FFT源代码IFFT源代码FFT、IFFT自己实验STFT源代码STFT自己实验 总结 背景 最近用到了相关操作提取音频信号特征&am…

Vue3 根据相对路径加载vue组件

一、设置动态组件加载器 1、"DynamicFormLoader.vue" <template><div><component :is"formComponent" v-if"formComponent" /></div> </template><script setup> import { ref, watch } from vue; import …

如何测试扫地机器人的稳定性

测试扫地机器人的稳定性是一个综合性的过程&#xff0c;旨在确保机器人在各种环境和条件下都能稳定运行。以下是一些关键的测试步骤和方面&#xff1a; 清洁效果测试 目的&#xff1a;评估扫地机器人在不同地面和污渍类型上的清洁能力。 方法&#xff1a; 使用不同类型的地面&…

标签印刷检测,如何做到百分百准确?

印刷标签是一种用于标识、识别或包装产品的平面印刷制品。这些标签通常在纸张、塑料膜、金属箔等材料上印刷产品信息、条形码、图像或公司标识&#xff0c;以便于产品识别和管理。印刷标签有各种形状、尺寸和材质&#xff0c;可以根据具体需求进行定制设计。常见的印刷标签包括…

FlutterFlame游戏实践#15 | 生命游戏 - 演绎启动

theme: cyanosis 本文为稀土掘金技术社区首发签约文章&#xff0c;30天内禁止转载&#xff0c;30天后未获授权禁止转载&#xff0c;侵权必究&#xff01; Flutter\&Flame 游戏开发系列前言: 该系列是 [张风捷特烈] 的 Flame 游戏开发教程。Flutter 作为 全平台 的 原生级 渲…

android 居中对齐

在 Android 中&#xff0c;要使 LinearLayout 中的内容居中对齐&#xff0c;你可以通过设置 android:gravity 属性或使用 android:layout_gravity 属性来实现。这两个属性的使用取决于你希望对齐的内容是 LinearLayout 内部的子视图还是 LinearLayout 本身相对于其父布局的对齐…

4.3 设备管理

大纲 设备分类 输入输出 虚设备和SPOOLING技术

管理客户的10个CRM系统技巧

客户是企业生存和发展的基石。为此&#xff0c;客户关系管理系统&#xff08;CRM&#xff09;应运而生&#xff0c;旨在帮助企业实现大规模的个性化客户接触&#xff0c;并通过定制化的互动增强客户忠诚度&#xff0c;从而推动企业的持续增长。 然而&#xff0c;引入CRM系统并…

vue3对比 Setup、Render、SFC 从 vue 底层实现和性能开销上全面分析三者区别及优略

vue3 中对比 Setup、Render、SFC 从 vue 底层实现和性能开销上全面分析三者区别及优略 /* setup 方式 */ export const Setup defineComponent({setup() {const handleChange (v: any) > {};return () > {return (<div><button onClick{handleChange}>Tes…

AD确定板子形状

方法1 修改栅格步进值&#xff0c;手动绘制 https://cnblogs.com/fqhy/p/13768031.html 方法2 器件摆放确定板子形状 https://blog.csdn.net/Mark_md/article/details/116445961

Java实战:寻找完美数

文章目录 一、何谓完美数二、寻找完美数&#xff08;一&#xff09;编程思路&#xff08;二&#xff09;编写程序&#xff08;三&#xff09;运行程序 三、实战小结 一、何谓完美数 完美数是一种特殊的自然数&#xff0c;它等于其所有正除数&#xff08;不包括其本身&#xff…