09 复合查询

news2024/9/24 13:17:29

前面的查询都是对一张表进行查询,但这远远不够

基本查询回顾

  • 查询工资高于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表,因此要联合查询

在这里插入图片描述
这种两个表穷举组合方式叫笛卡尔积,将两个表的每一条数据都合并成一个新数据

其实我们只要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 where
leader.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;

  • 上面的条件再加知道对应的员工属于部门的名字

上面的整体可以看做一个表,然后和部门表笛卡尔积,筛选条件

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

  • 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 EMP
where ename=‘SMITH’) and ename <> ‘SMITH’;
在这里插入图片描述

支持()里多个字段条件,也可以将=号换为in,也就是可以处理多列单行和多列多行

4.4 在from子句中使用子查询

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

案例:

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

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

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

select DEPT.dname, DEPT.deptno, DEPT.loc,count(*) ‘部门人数’ from EMP,
DEPT
where 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) tmp
where DEPT.deptno=tmp.deptno;

推荐使用第二种,因为第一种过于简单粗暴,并且为了照顾前面显示,分组多加了题干中没有的字段

解决多表问题本质:想办法吧多表转换为单表,所以mysql中,所有select的问题全部可以转换为单表问题

4.5 合并查询

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

4.5.1 union

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

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

mysql> select ename, sal, job from EMP where sal>2500 union -> select ename, sal, job from EMP where job=‘MANAGER’;–去掉了重复记录
在这里插入图片描述

4.5.2 union all

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

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

mysql> select ename, sal, job from EMP where sal>2500 union all -> select ename, sal, job from EMP where job=‘MANAGER’;
在这里插入图片描述

要拼接两个表的列需要时一样的

5. 实战题

查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
针对库中的所有表生成select count(*) from tableName 对应的SQL语句
获取所有非manager的员工emp_no
获取所有员工当前的manager,获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date=‘9999-01-01’

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

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

相关文章

免费用的写作神器:一键自动生成文章,提升内容创作效率!

传统的写作过程往往耗时耗力&#xff0c;从构思、调研到撰写、修改&#xff0c;每一步都需要创作者亲力亲为。免费写作神器的出现&#xff0c;犹如一场及时雨&#xff0c;为创作者提供了强大的支持。它利用先进的算法和自然语言处理技术&#xff0c;能够在短时间内生成高质量的…

了解Redis数据持久化(中)

3.5写时复制 Redis在使用RDB方式进行持久化时&#xff0c;会用到写时复制机制。写时复制的效果: bgsave子进程相当于复制了原始数据&#xff0c;而主线程仍然可以修改原来的数据。 对Redis来说&#xff0c;主线程fork出bgsave子进程后&#xff0c;bgsave子进程实际是复制了主线…

初识C语言指针(5)

目录 1. 回调函数 2. qsort函数 2.1 qsort函数的基本参数 2.2 qsort函数的使用 2.3 qsort排序结构体类型数据 结语 1. 回调函数 什么是回调函数呢&#xff1f;回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另…

超分CAMixerSR 使用笔记

目录 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: 设置预训练模型: 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: codes/basicsr改为codes/basicsr_m 设置预训练模型: path:pretrain_network_g: F:\project\chaofen\CAMixerSR-main\pretrained_mode…

解决html中文乱码问题

在head上面添加 <% page contentType"text/html;charsetUTF-8" language"java" %>

【Three.js基础学习】19.Custom models with Blender

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 blender模型资源:【blender】一个汉堡包-CSDN博客 一、代码 import ./style.css import * as THREE from three import { OrbitControls } from three/examples/jsm/co…

集成mybatis-plus框架

文章目录 1.新建一个sun_frame数据库并创建user表2.新建一个sun-common-mybatisplus模块1.maven项目2.添加依赖 3.sun-user集成mybatis-plus1.配置application.yml2.修改架构&#xff0c;由sun-user模块引入需要的公共模块3.代码目录结构4.mapper&#xff1a;po查&#xff0c;p…

SQLSugar进阶使用:高级查询与性能优化

文章目录 前言一、高级查询1.查所有2.查询总数3.按条件查询4.动态OR查询5.查前几条6.设置新表名7.分页查询8.排序 OrderBy9.联表查询10.动态表达式11.原生 Sql 操作 &#xff0c;Sql和存储过程 二、性能优化1.二级缓存2.批量操作3.异步操作4.分表组件&#xff0c;自动分表5.查询…

了解Redis数据持久化(上)

Redis常用作缓存&#xff0c;提高读取相应性能。Redis如果宕机可以从后端数据库里恢复数据&#xff0c;但是会出现的问题&#xff1a; 数据是从慢速数据库里获取数据&#xff0c;速度比不上从Redis缓存中获取。频繁访问数据库会给数据库造成压力。 处理宕机的方法就是&#xf…

Go 调用Rust函数

Go 调用Rust函数 在golang 中,go可以引用c代码&#xff0c;和c共舞&#xff0c;也就是cgo.在一些包里就能看到cgo的身影&#xff0c;gopcap(引用了libpcap),go-sqlite(引用了libsqlite).毕竟c是"万物之主"嘛.本文利用cgo实现go调rust函数 这是一个rust demo用于生成…

【Docker】Docker学习03 | Docker的volume

本文首发于 ❄️慕雪的寒舍 1. 引入 在docker的基本知识讲解中&#xff0c;提到了docker镜像是由一层一层文件系统构成的。这一系列文件系统是一系列的只读层。当我们创建一个容器的时候&#xff0c;Docker会读取镜像&#xff08;只读&#xff09;&#xff0c;并在镜像的顶部再…

SpringBoot集成google登陆快速入门Demo

1.为何要使用 Google 账号登录 借助“使用 Google 账号登录”功能&#xff0c;您可通过安全性备受信赖的 Google 账号&#xff0c;轻松快捷地在网上登录和注册网站与应用。该功能可消除您对密码的依赖&#xff0c;从而降低使用密码带来的困扰和安全风险。 2.环境准备 登录 G…

【IEEE出版】第八届电气、机械与计算机工程国际学术会议(ICEMCE 2024,10月25-27)

由西京学院主办&#xff0c;AEIC学术交流中心协办&#xff0c;中国科学技术大学、深圳大学、浙江工业大学等校联合支持的第八届电气、机械与计算机工程国际学术会议&#xff08;ICEMCE 2024&#xff09;将于2024年10月25日至27日在西安举办。 本次会议主要围绕“电气”、"…

【文档】软件项目售后服务标准文档参考(word原件)

软件售后服务方案的售后服务范围广泛&#xff0c;涵盖了多个方面&#xff0c;以确保客户在使用软件过程中得到全面、及时的支持。具体来说&#xff0c;这些服务范围通常包括以下几个核心内容&#xff1a; 技术支持服务维护与更新服务培训与教育服务定制化服务数据管理与服务客户…

[C语言]一、C语言基础(函数)

G:\Cpp\C语言精讲 6. 函数 6.1函数的基本使用 6.1.1 为什么需要函数 《街霸》游戏中&#xff0c;每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码&#xff0c;在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码&#xff0c;这样程序会变得很臃肿&#xff…

[学习笔记]深度学习详解-Datawhale学习组

第三章&#xff1a;深度学习基础 3.1 局部极小值与鞍点 3.1.1 临界点及其种类 优化神经网络时&#xff0c;使用梯度下降法&#xff0c;遇到梯度为0的点&#xff0c;训练就停了下来&#xff0c;损失也不再下降。 这个梯度为0的点&#xff0c;可以称为临界点。 临界点可以细分…

在挫折感中遇见更好的自己

你是如何克服编程学习中的挫折感的&#xff1f; 编程学习之路上&#xff0c;挫折感就像一道道难以逾越的高墙&#xff0c;让许多人望而却步。然而&#xff0c;真正的编程高手都曾在这条路上跌倒过、迷茫过&#xff0c;却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的…

ssrf+redisssrf+fastcgi

curl支持很多协议&#xff0c;有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDA ssrfredis dict被禁用了用&#xff08;?urlhttp://172.19.0.3端口&#xff09;来探测一下端口吧 172.19.0.3主机只开放一个80端口 看看内网还有其他服务器没 这里可以看到内网还有…

Ai+若依(代码生成 -- 树表“有层级关系的”):【03篇】

代码生成 代码生成器,根据数据库表结构自动生成前后端CRUD代码提供三种生成模板:单表、树表、主子表(一对多)现在来说说树表,主子表 树表: 例如:公司==》部门==》员工 层级关系的这种 主子表: 例如: 数据之间存在一对多,比如菜品和口味表 一个菜品可以多个口味 自动化…

图形几何算法 -- 判断两条线段是否相交

线段相交检测是计算几何中的一个基本问题&#xff0c;广泛应用于计算机图形学、游戏开发、物理模拟等领域。我们可以通过以下步骤和理论来判断两条线段是否相交。 概念 在二维平面上&#xff0c;给定两条线段 A(P1, P2) 和 B(Q1, Q2)&#xff0c;我们需要判断这两条线段是否相…