MySql常见复合查询(重点)

news2024/9/21 11:01:49

复合查询(重点)

多表查询

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

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

在这里插入图片描述

from后面跟两张表,多表查询,实际上是产生两张表的笛卡尔积(排列组合),我们把所有相关的数据,聚合到了一张表,接下来的问题,就变成了一个单表查询!! !;

在这里插入图片描述
其实我们只要emp .deptno = dept.deptno字段的记录;(排列组合中的有效记录)

select EMP.ename, EMP.sal, DEPT.dname from EMP, DEPT where EMP.deptno = DEPT.deptno;
  • 显示部门号为10的部门名,员工名和工资
select dname,ename,sal from EMP, DEPT where EMP.deptno = DEPT.deptno and EMP=10;
  • 显示 各个 员工的 姓名,工资,及工资级别

工资级别表格式 : SALGRADE :

字段1 grade级别

字段2,3 满足这个级别的区间losal , hisal;

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

自连接

自连接是指在同一张表连接查询 (同一张表 做笛卡尔积)

  • 显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno
-- 使用的子查询(select 嵌套,下面介绍):
select empno,ename from EMP where empno = (select mgr from EMP where ename='FORD');

-- 使用多表查询(自查询):
select t2.empno,t2.ename from EMP t1,EMP t2 where t1.mgr=t2.empno and t1.ename='FORD';

子查询

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

单行子查询

返回一行记录的子查询()

  • 显示SMITH同一部门的员工
select * from EMP where deptno = (select deptno from EMP where ename='SMITH');

多行子查询

返回多行记录的子查询()

  • 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,返回多行
  • all关键字;显示工资比 部门30的 所有 员工的工资高的 员工的姓名、工资和部门号
select ename,sal,deptno from EMP where sal > all(select sal from EMP where deptno=30);
  • any关键字;显示工资比 部门30的 任意 员工的工资高的员工的姓名、工资和部门号(包含30自己部门的员工)
select ename,sal,deptno from EMP where sal > any(select sal from EMP where deptno=30);

多列子查询

单行子查询 和 多行子查询,返回的都是1列(n行), 多列子查询返回多列多行;

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

select * from EMP where (deptno,job) = all(select depthno,job from EMP where ename = 'SMITH') and ename != 'SMITH'; -- 很明显,多列子查询的话,因为多列(多字段),所以 = 的左边需要上(字段1,字段2) = (select *......);来匹配

在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧把一个子查询当做一个临时表 来进行 笛卡尔积 多表查询 使用

我们可以理解为MySql每次查询的结果都是一个临时表 “表结构”!,那么这个临时表也能当做一张表用于多表查询;

  • 显示每个高于 自己 部门平均工资 的员工的姓名、部门、工资、平均工资
-- 下面这个查询出来的 每个部门平均工资 的临时表 可以当成一张表进行 笛卡尔积 多表查询;
select depthno agv(sal) as agvs from EMP group by depthno; 


select ename,depthno,sal,agvs from EMP , (select depthno agv(sal) as agvs from EMP group by depthno)as tmp where tmp.depthno = EMP.depthno and EMP.sal>tmp.agvs;
  • 查找 每个部门工资最高 的人的姓名、工资、部门、最高工资
-- 下面这个查询出来的 每个部门max工资 的临时表 可以当成一张表进行 笛卡尔积 多表查询;
select depthno max(sal) as msal from EMP group by depthno;


select ename,sal,depthno,msal from EMP ,(select depthno max(sal) as msal from EMP group by depthno) as tmp where tmp.depthno = EMP.depthno and EMP.sal=tmp.msal; 
  • 显示 每个部门的信息(部门名,编号,地址)和 人员数量
-- 方法1:使用多表
select DEPT.dname,DEPT.depthno,DEPT.loc,count(*) from DEPT,EMP
where EMP.depthno=DEPT.depthno;
group by DEPT.dname,DEPT.depthno,DEPT.loc; -- 细节:一般group by之后的字段,在select中除了聚合函数以外,需要一一匹配,否则出现歧义,报错

-- 方法1:使用子查询
-- 将下面的 统计每个部门的人数 表看成临时表;
select count(*) from EMP group by depthno;

select dname,DEPT.depthno,loc , cnt from DEPT,(select count(*) as cnt from EMP group by depthno)as tmp
where tmp.depthno=DEPT.depthno;

总结一下,复合查询还是比一般的查询要复杂,但是也是最重要,最常用的,而且套路很深!

合并查询

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

union

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

  • 案例:将工资大于2500 或 职位是MANAGER的人找出来
    select ename, sal, job from EMP where sal>2500 union
    select ename, sal, job from EMP where jos='MANAGER';

    -- 结果去掉了重复记录; 
    -- 等价于 select ename, sal, job from EMP where sal>2500 OR jos='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

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

  • 案例:将工资大于2500 或 职位是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 | -- BLAKE
| SCOTT | 3000.00 | ANALYST |
| KING | 5000.00 | PRESIDENT |
| FORD | 3000.00 | ANALYST |
| JONES | 2975.00 | MANAGER |
| BLAKE | 2850.00 | MANAGER | -- BLAKE
| CLARK | 2450.00 | MANAGER |
+-------+---------+-----------+

表的内连和外连(重点)

内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选(筛选出有意义的记录),下面要介绍的join on语法就是简化了我们的使用;

我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。

语法:

select 字段 from1 inner join2 on 连接条件 and 其他条件;

案例:显示SMITH的名字和部门名称

-- 多表 + where写法
select ename,dname from EMP,DEPT where EMP.depthno=DEPT.depthno and ename='SMITH';

-- 用标准的内连接写法
select ename,dname from EMP inner join DEPT on EMP.depthno=DEPT.depthno and ename='SMITH';

外连接

左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。

语法:

select 字段名 from 表名1 left join 表名2 on 连接条件

原表结构:

在这里插入图片描述

  • 查询所有学生的成绩,!!!如果这个学生没有成绩,也 要 将 学生的个人信息显示出来!!!
-- 当左边表和右边表没有匹配时,也会显示左边表的数据

select * from stu left join exam on stu.id=exam.id;

(左外连接)左侧的信息保留全

在这里插入图片描述

右外连接

如果联合查询,右侧的表完全显示我们就说是左外连接。

语法:

select 字段名 from 表名1 right join 表名2 on 连接条件

原表结构:
在这里插入图片描述

  • 对stu表和exam表联合查询,!!!把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来!!!
-- 当右边表和左边表没有匹配时,也会显示左边表的数据
select * from stu right join exam on stu.id=exam.id;

在这里插入图片描述

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

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

相关文章

如何解决Web前端安全问题?

我国网络技术水平的提升&#xff0c;带动着WEB前端业务量的显著增长&#xff0c;人们对于网络服务的需求也日益复杂&#xff0c;与此同时&#xff0c;越来越多的黑客出现&#xff0c;其攻击水平也有了明显提升&#xff0c;WEB前端也成为了众多黑客进行网络攻击的主要目标。 因…

什么是零代码?零代码与低代码有什么联系与区别?

传统的软件研发方式目前并不能很好地满足企业的需求&#xff1a;人员成本高、研发时间长、运维复杂。 这时零代码或低代码工具出现在市面上并被关注就是必然趋势了。对于不太了解两者的人来说&#xff0c;零代码和低代码是什么&#xff1f;又有什么联系与区别&#xff1f; 01 …

uni小程序——评论、文本域、发送、键盘调起、有值后按钮变色等

一、简介 文本域默认显示一行&#xff0c;最多显示4行&#xff0c;到了4行之后不再增高。 输入值后按钮变色 二、案例演示 三、代码 <template><view><view class"plBox"><textarea auto-height"true" maxlength"-1" :s…

[Linux安装软件详解系列]04 安装Redis

目录1、查看服务器是否已安装Redis2、安装Redis1&#xff09;下载2&#xff09;解压3&#xff09;安装4&#xff09;移动配置文件到安装目录下5&#xff09;配置redis为后台启动6&#xff09;将redis-cli&#xff0c;redis-server拷贝到bin下7&#xff09;启动redis8&#xff0…

RabbitMQ简介及在Linux中安装部署(yum)

一、RabbitMQ简介及其作用 RabbitMQ简介 RabbitMQ是在2007 年发布&#xff0c;是一个在 AMQP(高级消息队列协议)基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;是当前最主流的消息中间件之一。RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queu…

Arcpy入门教程01:从零开始制作一个arcpy脚本

从零开始制作一个arcpy脚本 文章目录 需求分析代码实现构造临时工作目录数据处理过程及API解析脚本打包代码封装在红盒子中创建脚本报错提醒 EOL while scanning string literal完整代码需求分析 我们现在有一个GDB存储这西安市各个区的绿地面的GDB,以及碑林区和新城区的行政…

将时间序列转成图像——相对位置矩阵方法 Matlab实现

目录 1 方法 2 Matlab代码实现 3.结果 【若觉文章质量良好且有用&#xff0c;请别忘了点赞收藏加关注&#xff0c;这将是我继续分享的动力&#xff0c;万分感谢&#xff01;】 其他&#xff1a; 1.时间序列转二维图像方法及其应用研究综述_vm-1215的博客-CSDN博客 2.将时…

Nginx实现负载均衡

目录 一、环境准备 1、准备3台centos服务器 2、软件安装 二、负载均衡配置 三、其他分配策略 1、fair&#xff08;第三方&#xff09; 一、环境准备 1、准备3台centos服务器​​​​​​​ 服务器名称主机名IP安装服务备注Nginx反向代理服务器proxy192.168.1.10nginx关…

ES倒排序索引

前言 在学习Elasticsearch的使用前&#xff0c;我们先来了解下es是如何实现全文搜索的。 倒排索引是 Elasticsearch 中非常 重要的索引结构&#xff0c;从 文档单词到文档 ID 的过程 为什么要使用倒排索引 先看下面的商品数据goods id 标题 描述 1 小米手机 小米手机性…

【保姆级】新机器部署Redis

1、登录服务器&#xff0c;如果非root用户则切root用户 sudo su - 2、安装gcc yum install gcc-c 3、在/usr/tmp目录上传redis安装包 4、将安装包移到/opt/byd目录 mv redis-4.0.11.tar.gz /opt/byd 5、解压 & 重命名 tar -xzvf redis-4.0.11.tar.gz mv redis-4.0.11 …

安全狗受邀出席CIS 2022网络安全创新大会

11月16日&#xff0c;由网络安全行业门户Freebuf主办的CIS 2022网络安全创新大会&#xff08;简称CIS&#xff09;在上海主会场顺利开幕。 作为国内云原生安全领导厂商&#xff0c;安全狗也收到邀请出席此次活动。 据悉&#xff0c;此次大会分为上海、北京、深圳等多个会场&am…

Pytorch中的DDP

一. 概览 DDP的原理&#xff1f; 在分类上&#xff0c;DDP属于Data Parallel。简单来讲&#xff0c;就是通过提高batch size来增加并行度。为什么快&#xff1f; DDP通过Ring-Reduce的数据交换方法提高了通讯效率&#xff0c;并通过启动多个进程的方式减轻Python GIL的限制&am…

2022-11-17 mysql列存储引擎-聚合运算中间结果缓存磁盘文件以避免OOM-需求分析

摘要: mysql列存储引擎-聚合运算中间结果缓存磁盘文件以避免OOM-需求分析 关联ISSUE: https://github.com/stoneatom/stonedb/issues/21 需求分析ISSUE: https://github.com/stoneatom/stonedb/issues/949 上下文说明: 当前聚合运算的结果都缓存在了内存的HASH中, 一旦数据量…

数据库等值查询与统计信息

概念 统计信息是为优化器的 cost 估算提供数据支撑&#xff0c;其中很重要的一点需求便是等值查询(EQUALS, IN 等) 场景下的基数估算。考虑以下 Case CREATE TABLE mc_tac_template (ID BIGINT ,NAME varchar(50) NOT NULL,GENDER varchar(10) NOT NULL,PRIMARY KEY (ID),KEY K…

工业设计公司的办公环境有哪些特点?

设计公司的办公环境一直被称之为个性化的意味着&#xff0c;见惯了新科技公司的各类智能化豪情万丈的办公环境&#xff0c;也有别于正儿八经办公楼的循规蹈矩&#xff0c;每个设计公司的公司办公室总似一股清流一般的存在&#xff0c;自然各种设计公司&#xff0c;如平面、工业…

Flutter 在项目中使用动画(不使用包)

Flutter 在项目中使用动画(不使用包) 前言 动画对于 web 和移动应用程序都非常重要。但是在移动应用程序中不应该使用夸张的动画。简单但是很多动画使你的应用程序更好用。以至于当你点击一个按钮时&#xff0c;一种平滑的感觉或者页面过渡都会影响到你。 正文 1 按下按钮柔软的…

UNIAPP实战项目笔记39 我的页面布局

UNIAPP实战项目笔记39 我的页面布局 my.vue 我的页面布局 具体图片自己替换哈&#xff0c;随便找了个图片的做示例 代码 pages.json部分 去掉默认导航栏&#xff0c;改为自定义导航栏 ,{"path" : "pages/my/my","style" : …

408 | 【数据结构】 排序 —— 总复习框架总结

(一)排序的基本概念 排序算法的稳定性:经过排序后,能使关键字相同的元素保持原顺序中的相对位置不变。 (二)内部排序 2.1、插入排序 算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。 2.1.1、直接插入排序 顺…

通过Xamarin实现东大集成PDA的扫码

目录1、东大集成PDA的扫码说明2、Xamarin通过广播实现扫码2.1 PDA的扫码工具设置2.2 代码实现2.2.1 主界面2.2.1 定义广播接收器2.2.2 在活动页面实现读取2.3 实现效果3、demo下载1、东大集成PDA的扫码说明 东大集成的PDA有两种方式实现设备自带的扫码功能。一种为调用硬件接口…

终极大招~pycharm自动补全opencv代码提示功能

你的pycharm还能自动补全opencv代码提示吗&#xff1f; 你可能通过修改cv2,进入__init__.py文件&#xff0c;一顿操作&#xff0c;还是不行。 你以为是工具问题&#xff0c;卸载重装&#xff1f; 还是opencv卸载重装好几次了 这次分享下我的方案&#xff0c;保证你一看就会。…