[MySQL][复核查询][多表查询][自连接][自查询]详细讲解

目录

  • 1.铺垫&基本查询回顾
  • 1.多表查询
    • 1.何为笛卡尔积?
    • 2.示例
  • 2.自连接
    • 1.何为自连接?
    • 2.示例
  • 3.子查询
    • 1.何为子查询?
    • 2.单行子查询
    • 3.多行子查询
    • 4.多列子查询
    • 5.在from子句中使用子查询
    • 6.合并查询


1.铺垫&基本查询回顾

  • 前面讲解的MYSQL表的查询都是对一张表进行查询,在实际开发中这远远不够
  • 解决多表问题的本质(指导思想)
    • 想办法把多表转化成为单表
    • 所以MYSQL中,所有select的问题全部都可以转成单表问题
  • 查询工资高于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;
    

1.多表查询

1.何为笛卡尔积?

  • 实际开发中往往数据来自不同的表,所以需要多表查询
    请添加图片描述

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;
    

2.自连接

1.何为自连接?

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

2.示例

  • 显示员工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';
    

3.子查询

1.何为子查询?

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

2.单行子查询

  • 返回一行记录的子查询
  • 示例:显示SMITH同一部门的员工
    select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');
    

3.多行子查询

  • 返回多行记录的子查询
  • 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的所有员工的工资高的员工的姓名、工资和部门号
    • 以下两种写法结果相同,感受all的作用
    select * from emp where sal > (select max(sal) from emp where deptno=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.多列子查询

  • 单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
  • 示例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
    # 以下两个写法结果相同,感受in的作用
    select ename from EMP where (deptno, job)=(select deptno, job from EMP
    where ename='SMITH') and ename <> 'SMITH';select ename from EMP where (deptno, job) in (select deptno, job from EMP
    where ename='SMITH') and ename <> 'SMITH';
    

5.在from子句中使用子查询

  • 子查询语句出现在from子句中,这里要用到数据查询的技巧,把一个子查询当做一个临时表使用
  • 示例:
  • 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
    # 获取各个部门的平均工资,将其看作临时表,再进行笛卡尔积筛选
    select ename, deptno, sal, format(asal,2) from EMP, (select avg(sal) asal, deptno from EMP group by deptno) tmp 
    where EMP.sal > tmp.asal and EMP.deptno=tmp.deptno;
    
  • 查找每个部门工资最高的人的姓名、工资、部门、最高工资
    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;
    
  • 显示每个部门的信息(部门名,编号,地址)和人员数量
    • 方法一:使用多表(不建议,比较笨&暴力的方法,限制多,要照顾语法)
      select DEPT.dname, DEPT.deptno, DEPT.loc, count(*) '部门人数' from EMP, DEPT
      where EMP.deptno=DEPT.deptno group by DEPT.deptno, DEPT.dname, DEPT.loc;
      
    • 方法二:使用子查询(也属于多表范畴)
      # 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;
      

6.合并查询

  • 在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all
  • union:该操作符用于取得两个结果集的并集,当使用该操作符时,会自动去掉结果集中的重复行
    • 示例:将工资大于2500或职位是MANAGER的人找出来
    mysql> select ename, sal, job from EMP where sal>2500 union-> select ename, sal, job from EMP where job='MANAGER';
    +-------+---------+-----------+
    | ename | sal     | job       |
    +-------+---------+-----------+
    | JONES | 2975.00 | MANAGER   |
    | BLAKE | 2850.00 | MANAGER   |
    | SCOTT | 3000.00 | ANALYST   |
    | KING  | 5000.00 | PRESIDENT |
    | FORD  | 3000.00 | ANALYST   |
    | CLARK | 2450.00 | MANAGER   |
    +-------+---------+-----------+
    
  • 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';
    +-------+---------+-----------+
    | ename | sal     | job       |
    +-------+---------+-----------+
    | JONES | 2975.00 | MANAGER   |
    | BLAKE | 2850.00 | MANAGER   |
    | SCOTT | 3000.00 | ANALYST   |
    | KING  | 5000.00 | PRESIDENT |
    | FORD  | 3000.00 | ANALYST   |
    | JONES | 2975.00 | MANAGER   |
    | BLAKE | 2850.00 | MANAGER   |
    | CLARK | 2450.00 | MANAGER   |
    +-------+---------+-----------+
    

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

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

相关文章

获取欧洲时报中国板块前新闻数据-scrapy

这里写目录标题 1.创建项目文件二.爬虫文件编写三.管道存储四.settings文件 1.创建项目文件 创建scrapy项目的命令&#xff1a;scrapy startproject <项目名字> 示例&#xff1a; scrapy startproject myspiderscrapy genspider <爬虫名字> <允许爬取的域名>…

修改了mybatis的xml中的sql不重启服务器如何动态加载更新

目录 一、背景 二、注意 三、代码 四、使用示例 五、其他参考博客 一、背景 开发一个报表功能&#xff0c;好几百行sql&#xff0c;每次修改完想自测下都要重启服务器&#xff0c;启动一次服务器就要3分钟&#xff0c;重启10次就要半小时&#xff0c;耗不起时间呀。于是在…

windows docker nvidia wsl2

下载驱动(GeForce Experience里的也可以)https://www.nvidia.cn/Download/index.aspx 安装wsl2https://blog.csdn.net/qq_39942341/article/details/121512900?ops_request_misc%257B%2522request%255Fid%2522%253A%2522172122816816800227436617%2522%252C%2522scm%2522%253A…

Docker构建LNMP环境并运行Wordpress平台

1.准备Nginx 上传文件 Dockerfile FROM centos:7 as firstADD nginx-1.24.0.tar.gz /opt/ COPY CentOS-Base.repo /etc/yum.repos.d/RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c make && \useradd -M -s /sbin/nologin nginx && \cd /o…

沙尘传输模拟教程(基于wrf-chem)

沙尘传输模拟教程(基于wrf-chem) 文章目录 沙尘传输模拟教程(基于wrf-chem)简介实验目的wrf-chem简介 软件准备wps、wrf-chem安装conda安装ncl安装ncap安装 数据准备气象数据准备下垫面数据准备 WPS数据预处理namelist.wps的设置geogrid.exe下垫面处理ungrib.exe气象数据预处理…

SSE(Server Sent Event)实战(3)- Spring Web Flux 实现

上篇博客 SSE&#xff08;Server Sent Event&#xff09;实战&#xff08;2&#xff09;- Spring MVC 实现&#xff0c;我们用 Spring MVC 实现了简单的消息推送&#xff0c;并且留下了两个问题&#xff0c;这篇博客&#xff0c;我们用 Spring Web Flux 实现&#xff0c;并且看…

STM32(六):STM32指南者-定时器实验

目录 一、基本概念1、常规定时器2、内核定时器 二、基本定时器实验1、实验说明2、编程过程&#xff08;1&#xff09;配置LED&#xff08;2&#xff09;配置定时器&#xff08;3&#xff09;设定中断事件&#xff08;4&#xff09;主函数计数 3、工程代码 三、通用定时器实验实…

【Neural signal processing and analysis zero to hero】- 2

Nonstationarities and effects of the FT course from youtube: 传送地址 why we need extinguish stationary and non-stationary signal, because most of neural signal is non-stationary. Welch’s method for smooth spectral decomposition Full FFT method y…

【TDA4板端部署】基于 Pytorch 训练并部署 ONNX 模型在 TDA4

1 将torch模型转onnx模型 Ti转换工具只支持以下格式&#xff1a; Caffe - 0.17 (caffe-jacinto in gitHub) Tensorflow - 1.12 ONNX - 1.3.0 (opset 9 and 11) TFLite - Tensorflow 2.0-Alpha 基于 Tensorflow、Pytorch、Caffe 等训练框架&#xff0c;训练模型&#xff1a;选择…

数据结构与算法(2):顺序表与链表

1.前言 哈喽大家好喔&#xff0c;今天博主继续进行数据结构的分享与学习&#xff0c;今天的主要内容是顺序表与链表&#xff0c;是最简单但又相当重要的数据结构&#xff0c;为以后的学习有重要的铺垫&#xff0c;希望大家一起交流学习&#xff0c;互相进步&#xff0c;让我们…

数据结构之跳表SkipList、ConcurrentSkipListMap

概述 SkipList&#xff0c;跳表&#xff0c;跳跃表&#xff0c;在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中&#xff0c;跳跃表使用概率均衡技术而不是使用强制性均衡&#xff0c;因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。 Skip lis…

AQS详解(详细图文)

目录 AQS详解1、AQS简介AbstractQueuedSynchronizer的继承结构和类属性AQS的静态内部类Node总结AQS的实现思想总结AQS的实现原理AQS和锁的关系 2、AQS的核心方法AQS管理共享资源的方式独占方式下&#xff0c;AQS获取资源的流程详解独占方式下&#xff0c;AQS释放资源的流程详解…

如何通过DBC文件看懂CAN通信矩阵

实现汽车CAN通信开发&#xff0c;必不可少要用到DBC文件和CAN通信矩阵。 CAN通信矩阵是指用于描述 CAN 网络中各个节点之间通信关系的表格或矩阵。它通常记录了每个节点能够发送和接收的消息标识符&#xff08;ID&#xff09;以及与其他节点之间的通信权限。 通信矩阵在 CAN 网…

利用Msfvenom获取WindowsShell

一、在kali主机上利用msfvenom生成windows端的安装程序(exe文件),程序名最好取一个大家经常安装的程序,如腾讯视频、爱奇艺等。 (1)由于生成的程序可能会被杀毒软件识别,我们比较一下使用单个编码器生成的程序与用两个编码器生成的程序,哪个更容易被识别。 利用单个编码…

SSE(Server Sent Event)实战(2)- Spring MVC 实现

一、服务端实现 使用 RestController 注解创建一个控制器类&#xff08;Controller&#xff09; 创建一个方法来创建一个客户端连接&#xff0c;它返回一个 SseEmitter&#xff0c;处理 GET 请求并产生&#xff08;produces&#xff09;文本/事件流 (text/event-stream) 创建…

如何使用Milvus Cloud进行稀疏向量搜索

如何使用Milvus Cloud进行向量搜索Milvus Cloud 是一款高度可扩展、性能出色的开源向量数据库。在最新的 2.4 版本中,Milvus Cloud 支持了稀疏和稠密向量(公测中)。本文将利用 Milvus Cloud 2.4 来存储数据集并执行向量搜索。 接下来,我们将演示如何利用 Milvus Cloud 在 M…

[GXYCTF2019]Ping Ping Ping1

打开靶机 结合题目名称&#xff0c;考虑是命令注入&#xff0c;试试ls 结果应该就在flag.php。尝试构造命令注入载荷。 cat flag.php 可以看到过滤了空格,用 $IFS$1替换空格 还过滤了flag&#xff0c;我们用字符拼接的方式看能否绕过,ag;cat$IFS$1fla$a.php。注意这里用分号间隔…

睡前故事—绿色科技的未来:可持续发展的梦幻故事

欢迎来到《Bedtime Stories Time》。这是一个我们倾听、放松、并逐渐入睡的播客。感谢你收听并支持我们&#xff0c;希望你能将这个播客作为你睡前例行活动的一部分。今晚我们将讲述绿色科技的未来&#xff1a;可持续发展的梦幻故事的故事。一个宁静的夜晚&#xff0c;希望你现…

0602STM32定时器输出比较

STM32定时器输出比较 PWM简介 主要用来输出PWM波形&#xff0c;PWM波形又是驱动电机的必要条件&#xff0c;所以如果想用STM32做一些有电机的项目&#xff0c;比如智能车&#xff0c;机器人等。那输出比较功能就要认真掌握 1.PWM驱动LED呼吸灯 2.PWM驱动舵机 3.PWM驱动直流电机…

搜维尔科技:【研究】触觉技术将在5年内以8种方式改变人们的世界

触觉技术在过去几年中发展迅猛&#xff0c;大大提高了反馈的精确度和真实度。其应用产生了真正的影响&#xff0c;数百家公司和企业都集成了触觉技术来增强培训和研究模拟。 虽然触觉技术主要用于 B2B 层面&#xff0c;但触觉技术可能会彻底改变我们的生活&#xff0c;尤其是通…