[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,一经查实,立即删除!

相关文章

OPPO 2024届校招正式批笔试题-后端(C卷)

小欧的括号嵌套 题目描述 小欧想要构造一个合法的括号序列满足以下条件&#xff1a; 括号序列长度恰好为 2 n 2n 2n。括号序列的嵌套层数最大值为 r r r。 括号嵌套层数是指在一个字符串中&#xff0c;以左括号 “(” 和右括号 “)” 形成的括号对的最大嵌套深度。 输入…

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

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

联邦学习(Federated learning)—— 去中心化联邦中心化联邦

提出联邦学习的目的&#xff1a;解决数据孤立问题和安全隐私问题。 联邦学习的主要思想&#xff1a;基于分布在多个设备上的数据集构建机器学习模型&#xff0c;同时防止数据泄露。&#xff08;是一种分布式机器学习方法&#xff09; 联邦学习架构 联邦学习的架构分为两种&…

修改了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气象数据预处理…

docker替换主程序排错

docker替换主程序排错 背景&#xff1a;经常会遇到主程序启动错误&#xff0c;导致无法进入到容器内部排错。 替换命令 docker run --rm -it --entrypoint/bin/sh 镜像名

石油与化工行业的工业互联网平台革新之路

石油和化工工业互联网平台的变革是近年来工业发展的重要趋势之一&#xff0c;它基于工业互联网技术&#xff0c;通过数字化、网络化和智能化手段&#xff0c;推动石油和化工行业的转型升级。以下是关于石油和化工工业互联网平台变革的详细分析&#xff1a; 一、革新背景 行业…

@Valid校验前端参数

1、导入依赖。&#xff08;springmvc的stater-web和json依赖也需要添加&#xff0c;此处先不列举&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependen…

批量下载网易云音乐歌单的Python脚本

在日常的音乐收藏和整理中,有时候我们希望能够快速地备份或下载网易云音乐中的歌曲,以便在没有网络连接的情况下也能随时听到自己喜欢的音乐。这时候,Python可以提供一种便捷的解决方案,让我们能够轻松地实现这一目标。 技术背景 本文介绍的Python脚本利用了Requests库和…

SpringSecurity + JWT 实现登录认证

目录 1. JWT 的组成和优势 2. JWT 的工作原理 2.1 生成 JWT 2.2 传输JWT 3. SpringSecurity JWT 实现登录认证 3.1 配置 Spring Security 安全过滤链 3.2 自定义登录认证过滤器 3.3 实现SpringSecurity用户对象 3.4 获取当前登录用户 1. JWT 的组成和优势 JWT 由三…

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 网…