Day03 02-MySQL多表查询详解

news2024/12/26 23:40:54

文章目录

      • 第八章 多表查询
        • 8.1 多表查询介绍
          • 8.1.1 什么是多表查询
          • 8.1.2 多表查询基本写法
          • 8.1.3 笛卡尔积
          • 8.1.4 连接查询条件限制
        • 8.2 连接查询分类
          • 8.2.1 内连接
          • 8.2.2 外连接
          • 8.2.3 全连接
          • 8.2.4 自然连接
        • 8.3 子查询
          • 8.3.1 子查询简介
          • 8.3.2 在where子句中
          • 8.3.3 在from子句中
          • 8.3.4 在having子句中
          • 8.3.5 在select子句中
          • 8.3.6 SQL完整的执行顺序
        • 8.4 合并查询结果集
          • 8.4.1 合并查询结果集概述
          • 8.4.2 合并查询结果集语法

第八章 多表查询

8.1 多表查询介绍

8.1.1 什么是多表查询

有的时候,我们的业务需求的数据并不只是在一张表中,而是分布在两张或两张以上的表中,而这些表中通常都会存在着“有关系”的字段。那么此时的查询操作,我们需要从多张表中查询数据,我们称之为多表关联查询。或者叫做连接查询。

多表查询方式,在复杂、海量数据的场景下怎么应用?这些思维与技能其实就是我们大数据后续课程中的技巧与应用场景,所以打好SQL坚实基础,能极提升后续你对数据仓库(SQL为主)的见解。

8.1.2 多表查询基本写法
-- 从两张表中查询数据
select * from A, B;

-- 从两张表中查询数据
select * from A join B;

TIPS:

其实,连接两张表进行查询,标准SQL采用的是join的语法。上述的select * from A, B;的写法,其实只是在MySQL中的“方言”,只在MySQL中生效,在其他的DBMS中就不一定能使用了。

select * from A, B; 其实是等价于 select * from A inner join B; 的。那么什么是inner join呢?后面会讲。

8.1.3 笛卡尔积

在做连接查询的时候,一张表中的每一行数据都会和另一张表中的每一行数据进行关联,形成笛卡尔积。

假如A表中有m行数据,B表中有n行数据,连接查询之后的结果就是m*n行数据,其中有太多的数据是我们不需要的了。

image-20220109012327595

8.1.4 连接查询条件限制

通过上图,我们知道了在两张表进行连接查询的时候,会出现大量的无效的数据。因此,我们就需要通过一些操作,去除连接查询之后的无用的数据,只得到我们需要的数据!而这个过程是可以通过条件的限制来实现的:

  1. MySQL的查询方言

    -- 用where进行条件的过滤,得到满足条件的所有的数据。
    select * from A, B where A.empno = B.mgr;
    
  2. 标准SQL的语法

    -- 用on的方式,进行连接查询的多余数据过滤
    select * from A join B on A.empno = B.mgr;
    

8.2 连接查询分类

将两张表连接在一起查询的时候,通常情况下我们需要进行一定的条件限制,来达到去除查询结果笛卡尔积中多余的数据,保留我们需要的数据的目的。通常情况下,进行连接查询的多张表之间是有一定的逻辑关联的,具体表现为有一个相同的字段,在两张表中都会出现。因此,我们在进行连接查询的时候就会使用这个字段的值进行数据的过滤。

那么,连接查询就会出现这样的几种情况:

  • A表中,通过关联的字段,可以在B表中查询到数据。
  • A表中,通过关联的字段,无法在B表中查询到数据。
  • B表中,通过关联的字段,无法的A表中查询到数据。

此时,根据所需的不同结果,可以将连接查询分为两类: 内连接、外连接

image-20220109113112570

8.2.1 内连接

内连接,使用inner join来表示,在进行查询的时候,inner是可以省略的,因此通常情况下直接写join就是内连接。

所谓内连接,以左表为驱动表,右表为从动表。查询结果中保留A表的数据通过连接的字段,在B表中能够查询到的数据。

-- 查询员工的编号、职位、入职时间、部门编号、部门名称
select empno, job, hiredate, deptno, dname from emp join dept on emp.deptno = dept.deptno;

-- 查询LOCATION在NEW YORK的员工数量
select count(*) from emp join dept on emp.deptno = dept.deptno where loc = 'NEW YORK';
8.2.2 外连接

外连接,使用outer join来表示,但是外连接还有更加明细的分类: 左外连接和右外连接。

  • 左外连接: 以左表为驱动表,右表为从动表,查询结果中保留A表的数据通过连接的字段,在B表中能够查询到的数据。如果通过这个连接字段无法在B表中查询到数据,则B表与之关联的就是null数据。
  • 右外连接: 以右表为驱动表,左表为从动表,查询结果中保留B表的数据通过连接的字段,在A表中能够查询到的数据。如果通过这个连接字段无法在A表中查询到数据,则A表与之关联的就是null数据。

总结来说

左外连接查询结果: 包含左表中的所有数据,右表与之关联的数据,如果在右表没有与之关联的数据,则用null填充。

右外连接查询结果: 包含右表中的所有数据,左表与之关联的数据,如果在左表没有与之关联的数据,则用null填充。

语法: 左外连接使用 left outer join来表示,右外连接使用 right outer join来表示。

而outer是可以省略不写的,也就是: 左外连接: left join,右外连接: right join

-- 查询所有的部门的人数
select deptno, dname, count(empno) from dept left join emp on dept.deptno = emp.deptno;
8.2.3 全连接

全连接,又叫全外连接。全连接的意义是保留两张表中的所有的数据。如果在另外一张表中没有与之连接的数据,使用null进行填充。也就是说,其实全连接就是将左外连接和右外连接的查询结果合并到一起并去除重复的数据。

MySQL不支持全连接!

虽然MySQL不支持全连接,但是可以使用其他的方式来间接实现:

将左外连接和右外连接的查询结果,使用union合并到一起即可。

8.2.4 自然连接

我们在进行连接查询的时候,通常会在需要连接的两张表中找到字段关联在一起,而绝大多数情况下我们所需要进行的是等值连接。在进行数据库和表的设计的时候,这样用来联系多张表之间的关系的字段,一般情况下命名是相同的。

所谓“自然连接“指的就是找到需要进行连接查询的两张表中名字相同、类型也相同的字段,自动的使用这个字段作为连接的字段。如果不存在这样的名字相同的字段,会有错误。

select * from emp natural join dept;
select * from emp natural right join dept;

8.3 子查询

8.3.1 子查询简介

有的时候,当一个查询语句A所需要的数据,不是直观在表中体现,而是由另外一个查询语句B查询出来的结果,那么查询语句A就是主查询语句,查询语句B就是子查询语句。这种查询我们称之为高级关联查询,也叫做子查询。

子查询语句的返回数据形式:

- 返回单行单列	=> 可以被视为一个数值来使用
- 返回多行单列	=> 可以被视为一个集合来使用
- 返回单行多列	=> 可以被视为一个虚拟表使用
- 返回多行多列	=> 可以被视为一个虚拟表使用

子查询语句的位置可以在以下几个子句中:

- 在where子句中:	子查询的结果可用作条件筛选时使用的值。
- 在from子句中:		子查询的结果可充当一张表或视图,需要使用表别名。
- 在having子句中:	子查询的结果可用作分组查询再次条件过滤时使用的值
- 在select子句中:	子查询的结果可充当一个字段。仅限子查询返回单行单列的情况。
8.3.2 在where子句中
# 需求:查询工资大于员工编号为7369这个员工的所有员工信息。
# 解析:
# 第一步:目的是查询工资大于某一个数num的所有员工信息
#     select * from emp where sal>num
# 第二步:num的值7369员工的工资
#     select sal from emp where empno = 7369;
# 第三步:将主查询中的代词使用子查询语句替换
select * from emp where sal>(select sal from emp where empno = 7369);

# 需求:查询工资大于10号部门的平均工资的所有员工信息
select * from emp where sal>(select avg(ifnull(sal,0)) from emp where deptno=10);

# 需求:查询工资大于10号部门的平均工资的非10号部门的员工信息。
select * from emp where sal>(select avg(ifnull(sal,0)) from emp where deptno=10) and deptno<>10;

# 需求:查询与7369同部门的同事信息。
select * from emp where deptno=(select deptno from emp where empno=7369) and empno<>7369;
8.3.3 在from子句中
# 需求:查询员工的姓名,工资,及其部门的平均工资。
# 解析:
# 第一步:先查询每个部门的平均工资
# select deptno,avg(ifnull(sal,0)) from emp group by deptno;
# 第二步:将上一个查询语句的返回结果当成一张表,与员工表进行关联查询
select A.ename, A.sal, B.avg_sal
from emp A join (select deptno,avg(ifnull(sal,0)) avg_sal from emp group by deptno) B on A.deptno = B.deptno
8.3.4 在having子句中
# 需求:查询平均工资大于30号部门的平均工资的部门号,和平均工资
select deptno,avg(ifnull(sal,0)) from emp group by deptno having avg(ifnull(sal,0))>
(select avg(ifnull(sal,0)) from emp where deptno=30);
8.3.5 在select子句中
# 查询每个员工的信息及其部门的平均工资,工资之和,部门人数
select A.empno,A.ename,A.sal,
(select avg(ifnull(sal,0)) from emp B where B.deptno=A.deptno) avg_sal,
(select sum(sal) from emp C where C.deptno=A.deptno) sum_sal,
(select count(*) from emp D where D.deptno=A.deptno) count_
from emp A;
8.3.6 SQL完整的执行顺序
select distinct..from t1 [inner|left|right] join t2 on 条件 
where...group by...having...order by...limit

1. from t1
2. on 条件
3. [inner|left|right] join t2
4. where...
5. group by...
6. having...
7. select...
8. distinct...
9. order by...
10. limit....

8.4 合并查询结果集

8.4.1 合并查询结果集概述

合并结果集,就是将两次或者多次的查询结果,合并到一起,存入一张查询结果虚拟表中。

进行结果集合并的多张表,要求字段的数量是完全相同的。

A查询的结果有5个字段,B查询的结果有5个字段。此时是可以合并到一起的。

A查询的结果有5个字段,B查询的结果有3个字段。此时是无法合并到一起的。

8.4.2 合并查询结果集语法
  • union: 对两次的查询结果进行合并,对最终的合并结果会进行去重的处理。
  • union all : 对两次的查询结果的直接合并,没有进行去重的处理。

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

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

相关文章

是德科技keysight E8257D信号发生器

产品概览 Keysight E8257D (Agilent) PSG 模拟信号发生器提供业界领先的输出功率、电平精度和高达 67 GHz 的相位噪声性能&#xff08;工作频率可达 70 GHz&#xff09;。Agilent PSG 模拟信号发生器的高输出功率和卓越的电平精度通常无需使用外部放大器来测试高功率设备&…

国内热门AI智能音箱品牌都采用了哪些功放芯片

音频功放IC是各类音响、耳机等器材不可或缺的一部分&#xff1b;音频功率放大器芯片俗称“扩音器”&#xff0c;是音响系统中最基本的设备&#xff0c;负责将来自信号源的微弱电信号进行放大&#xff0c;以驱动扬声器发声&#xff0c;从而将声音传至我们的听觉系统。 现如今&a…

浅谈电解电容在电路设计中的作用

谈起电解电容我们不得下多了解一下它的作用 1、滤波作用 在电源电路中&#xff0c;整流电路将交流变成脉动的直流&#xff0c;而在整流电路之后接入一个较大容量的电解电容&#xff0c;利用其充放电特性(储能作用)&#xff0c;使整流后的脉动直流电压变成相对比较稳定的直流电…

启动页/闪屏/引导页-你还傻傻分不清?

启动页/闪屏/引导页-你还傻傻分不清&#xff1f;&#xff08;转载&#xff09; - 知乎 今天就跟大家一起来认识一下开屏三姐妹&#xff1a;启动页/闪屏/引导页。 通常三姐妹出场顺序如下&#xff1a; 下面我们来深入认识一下这三姐妹&#xff1a; 1、启动页 定义&#xff1…

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时之传统的网络安全

ChatGPT&#xff1a;你真的了解网络安全吗&#xff1f;浅谈网络安全攻击防御进行时 传统的网络安全 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序&#xff0c;是人工智能技术驱动的自…

搭建hadoop集群

搭建Hadoop集群 1&#xff0c;准备环节 Hadoop完全分布式集群式&#xff08;master/slave&#xff09;主从架构。 因为Hadoop是由java编写的&#xff0c;所以需要Java的环境支持&#xff0c;作为开发者我们需要安装jdk。 安装jdk的教程http://t.csdn.cn/6qJKg 下载Hadoop的…

spring(不是springboot)集成apllo方案

现在到处都是基于 springboot 的微服务项目。 不巧手头碰到了一个 spring 的项目&#xff0c;打war包直接放到tomcat中启动的。 现在要将apollo集成进来&#xff0c;要求 Access Key 不可以放在properties 配置文件中&#xff0c;要统一使用apollo来管理。 步骤如下&#xff1a…

《计算机网络——自顶向下方法》精炼——3.5.5-3.6.1

学习是劳动&#xff0c;是充满思想的劳动。——乌申斯基 文章目录 TCP流量控制TCP连接管理建立TCP连接拆除TCP连接TCP状态的转换 TCP拥塞控制情况1&#xff1a;两个发送方&#xff0c;一个无限缓存的路由器情况2&#xff1a;两台主机&#xff0c;一台具有有限缓存的路由器情况3…

【源码解析】EasyExcel导入导出源码解析

EasyExcel介绍 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都…

XPCIE1032 — 高速高精,超快交互速率的PCIe EtherCAT实时运动控制卡

产品导读 XPCIE1032是一款基于PCI Express的EtherCAT总线运动控制卡&#xff0c;可选4-16轴运动控制&#xff0c;支持多路高速数字输入输出&#xff0c;可轻松实现多轴同步控制和高速数据传输。 XPCIE1032集成了强大的运动控制功能&#xff0c;结合MotionRT7运动控制实时软核…

PyQt5桌面应用开发(17):中文书评+类结构+QWebEngineView

本文目录 PyQt5桌面应用系列PyQt5学习PyQt5类结构和帮助速查实现与解释最终界面和完整源代码界面完整的代码 总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 PyQt5桌…

【中危】Apache Ranger 2.3.0 存在远程代码执行漏洞

漏洞描述 Apache Ranger 是一款用于在 Hadoop 平台及其他平台启用、监控和管理全面的数据安全性的开源框架。Apache Ranger 表达式策略是一种动态访问控制策略&#xff0c;通过自定义表达式来指定更细粒度的访问控制条件。 Apache Ranger 受影响版本中具有管理员权限或策略管…

【微博-自定义Cell-创建子控件 Objective-C语言】

一、自定义Cell 1.既然我们要自定义Cell,这个自定义Cell,属于MVC哪个部分, 这个Cell类,属于MVC哪个部分, Model、Controller、还是View, View吧, 所以说,应该在这里去新建一个类, 在这里去新建一个类,右键,New File,

SpringBoot中使用枚举类、switch、常量类(声明并初始化map)实现类策略者模式,接口返回常量数据

场景 SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else&#xff1a; SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else_霸道流氓气质的博客-CSDN博客 SpringBootVa…

Python对Excel文件多表对多表之间的匹配(两种不同表头)——之json版

首先Excel文件多表对多表之间的匹配(VLOOKUP),有多种办法&#xff0c; 1&#xff1a;将Excel文件导入Mysql或其他数据库,然后将两种表合并成一张表&#xff0c;接着用数据库匹配 2&#xff1a;将两种表内容&#xff0c;复制粘贴到一起&#xff0c;各自分别保存成一张表&#xf…

伦茨科技带你了解蓝牙App开发的流程

随着移动互联网的快速发展&#xff0c;给我们的生活带来了越来越多的便利&#xff0c;蓝牙App的开发也越来越普及。那么&#xff0c;简单来说&#xff0c;蓝牙App软件的开发就是在手机上为蓝牙物理设备提供具有相关功能的App软件终端&#xff0c;让蓝牙设备更方便的为用户提供服…

appsync unified怎么安装

一、什么是AppSync Unified&#xff1f; AppSync Unified是一款iOS设备上的越狱插件&#xff0c;它可以帮助用户安装和运行未经苹果审核的应用程序和插件。AppSync Unified可以支持iOS 11-14系统&#xff0c;并可以在iPhone和iPad上使用。它的功能主要是允许用户安装和运行不经…

电脑正常开机后几分钟就黑屏一直循环怎么办?

电脑正常开机后几分钟就黑屏一直循环怎么办&#xff1f;有用户在使用电脑的时候&#xff0c;正常去进行电脑的开机&#xff0c;但是开机之后&#xff0c;却发现屏幕变成了黑屏&#xff0c;而且重新启动电脑之后&#xff0c;依然是会出现这样的问题&#xff0c;那么这个情况怎么…

mmdetection3d框架安装与Demo模型运行--基于Ubuntu18.04+Cuda10.1

1.NVIDIA Driver和Cuda安装 在Ubuntu18.04机器上安装好NVIDIA Driver4.18和CUDA10.1&#xff0c;版本号分别为4.18和10.1 查看NVIDIA Driver版本号&#xff1a;nvidia-smi 查看CUDA版本号&#xff1a;nvcc -V 2.安装MiniConda&#xff0c;并创建和管理虚拟环境 2.1 安装Min…

八、数据仓库详细介绍(监控告警)

1. 前言 在前边的章节&#xff0c;我们设计完存储模型&#xff0c;开发了 ETL 任务&#xff0c;并且配置好流程依赖&#xff0c;然后上调度系统&#xff0c;至此我们的数据仓库基本搭建完成&#xff0c;而且所有流程任务都可以自动化运转了。 随着公司上线的数据处理任务越来越…