Mysql操作多表查询

news2024/11/16 3:31:16

多表查询是指在关系型数据库中,通过同时查询多个数据表来检索相关数据的操作。这种查询方式通常用于需要在多个数据表中搜索和比较数据的情况,以获取更完整和准确的结果。

在多表查询中,使用联接(join)操作将多个表连接在一起,并使用条件语句来指定要检索的数据。联接操作可以使用不同的方式进行,包括内部联接、外部联接、左联接、右联接等,这些方式可以根据查询需求选择不同的联接方式。

多表查询可以提高查询效率,避免重复的数据输入,并且可以根据需要获取更详细的查询结果。不过,在进行多表查询时,需要注意数据库表之间的关系、数据类型和查询条件等因素,以确保查询结果的准确性和完整性。

举个例子,如果我们需要查询一篇文章的作者姓名和发表时间,那么这个信息通常会被保存在不同的两个表中,一张表存储文章的信息,包括文章标题、内容等;另一张表存储作者的信息,包括姓名、ID等。在这种情况下,如果只查询文章表,我们只能获取文章的基本信息,无法获得作者的信息;但如果使用多表查询,我们就可以将两个表联接起来,获取文章的作者信息,从而得到更全面和详细的查询结果。

多表查询基本写法

-- 从两张表中查询数据
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呢?后面会讲。

笛卡尔积

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

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

image-20220109012327595

连接查询条件限制

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

  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;
    

连接查询分类

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

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

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

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

image-20220109113112570image-

内连接

内连接,使用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';

外连接

外连接,使用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;

全连接

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

MySQL不支持全连接!

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

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

自然连接

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

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

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

子查询

子查询简介

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

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

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

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

- 在where子句中:	子查询的结果可用作条件筛选时使用的值。
- 在from子句中:		子查询的结果可充当一张表或视图,需要使用表别名。
- 在having子句中:	子查询的结果可用作分组查询再次条件过滤时使用的值
- 在select子句中:	子查询的结果可充当一个字段。仅限子查询返回单行单列的情况。

在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;

在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

在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);

在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;

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....

合并查询结果集

合并查询结果集概述

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

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

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

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

合并查询结果集语法

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

【千锋教育】大数据开发全套教程,史上最全面的大数据学习视频

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

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

相关文章

【Spring框架】SpringBoot创建和使用

目录 什么是SpringBoot&#xff1f;SpringBoot优点创建SpringBootSpringBoot使用 什么是SpringBoot&#xff1f; Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 SpringBoot优点 1.起步依赖(创建的时候就可以方…

day47-SSM分页

SSM分页&#xff08;增删改查登录注册&#xff09; applicationContext.xml中加入mybatis-config.xml路径 mybatis-config.xml Mapper接口 Service接口及其实现类 Mapper.xml page.jsp personDetail.jsp addPerson.jsp updatePerson.jsp login.jsp regist…

DMA传输原理与实现详解(超详细)

DMA&#xff08;Direct Memory Access&#xff0c;直接内存访问&#xff09;是一种计算机数据传输方式&#xff0c;允许外围设备直接访问系统内存&#xff0c;而无需CPU的干预。 文章目录 Part 1: DMA的工作原理配置阶段&#xff1a;数据传输阶段&#xff1a; Part 2: DMA数据…

【弹力设计篇】聊聊灾备设计、异地多活设计

单机&集群架构 对于一个高可用系统来说&#xff0c;为了提升系统的稳定性&#xff0c;需要以下常用技术服务拆分、服务冗余、限流降级、高可用架构设计、高可用运维&#xff0c;而本篇主要详细介绍下&#xff0c;高可用架构设计。容灾备份以及同城多活&#xff0c;异地多活…

Python开发之手动实现一维线性插值

Python开发之手动实现一维线性插值 1.线性插值法介绍2.手动实现线性插值3.案例一手动实现线性插值4.使用pandas的插值方法实现要求(推荐) 前言&#xff1a;主要介绍手动实现一维线性插值以及pandas里面的interpolate方法实现线性插值。 1.线性插值法介绍 线性插值法是一种简单…

MySQL中锁的简介——行级锁之 间隙锁 和 临键锁

1.间隙锁演示 2.临键锁演示 间隙锁锁住的是间隙&#xff0c;不包含对应的数据记录&#xff0c;而临键锁既会包含当前这条数据记录&#xff0c;也会锁定该数据记录之前的间隙。间隙锁的目的是防止其他事务插入间隙造成幻读现象。间隙锁是可以共存的&#xff0c;一个事务采用的间…

maven引入本地jar包的简单方式【IDEA】【SpringBoot】

前言 想必点进来看这篇文章的各位&#xff0c;都是已经习惯了Maven从中央仓库或者阿里仓库直接拉取jar包进行使用。我也是&#x1f921;&#x1f921;。 前两天遇到一个工作场景&#xff0c;对接三方平台&#xff0c;结果对方就是提供的一个jar包下载链接&#xff0c;可给我整…

sqlSugar应用表值函数

一、新建表值函数 TableIntSplit 二、新建类 var employees _sqlSugarClient.Queryable<Employees>().InnerJoin(_sqlSugarClient.SqlQueryable<TableID>("select * from dbo.TableIntSplit(ids,split)").AddParameters(new { ids "1,2", s…

无涯教程-jQuery - Slide方法函数

幻灯片效果可以与show/hide/toggle一起使用。这会将元素滑出视口。 Slide - 语法 selector.hide|show|toggle( "slide", {arguments}, speed ); 这是所有参数的描述- direction - 效果的方向。可以是"左(left)"&#xff0c;"右(right)"&…

C语言第十一课--------操作符的使用与分类-------基本操作

作者前言 作者介绍&#xff1a; 作者id&#xff1a;老秦包你会&#xff0c; 简单介绍&#xff1a; 喜欢学习C语言和python等编程语言&#xff0c;是一位爱分享的博主&#xff0c;有兴趣的小可爱可以来互讨 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们…

解决 tensorflow 出现的 ImportError: Could not find the DLL(s) ‘msvcp140_1.dll‘. 问题

在安装完tensorflow库后出现 问题详述&#xff1a; ImportError: Could not find the DLL(s) msvcp140_1.dll. TensorFlow requires that these DLLs be installed in a directory that is named in your %PATH% environment variable. You may install these DLLs by downlo…

JSP 文件上传

JSP 可以与 HTML form 标签一起使用&#xff0c;来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。 本章节我们使用 Servlet 来处理文件上传&#xff0c;使用到的文件有&#xff1a; upload.jsp : 文件上传表单。 message.jsp : 上传成功后跳转页…

超聚变和厦门大学助力兴业银行构建智慧金融隐私计算平台,助力信用卡业务精准营销...

兴业银行与超聚变数字技术有限公司、厦门大学携手&#xff0c;发挥产学研用一体化整体优势联合建设&#xff0c;厦门大学提供先进的算法模型及科研能力&#xff0c;超聚变提供产品解决方案及工程能力&#xff0c;兴业银行提供金融实践能力&#xff0c;三方发挥各自领域优势&…

RTPS规范v2.3(中文版)

实时发布订阅协议 DDS互操作性有线协议 &#xff08;DDSI-RTPS&#xff09; 技术规范 V2.3 &#xff08;2019-04-03正式发布&#xff09; https://www.omg.org/spec/DDSI-RTPS/2.3/PDF   目 录 0. 序言&#xff08;关于对象管理组&#xff09; 4 0.1 OMG 4 0.2 OMG规…

C++之浅拷贝和深拷贝总结(一百七十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【SLAM】A-LOAM 算法部署与测试(Win10 + VMWare + Ubuntu18.04)

基础环境 ubuntu及ROS安装&#xff0c;略&#xff1b;安装完ROS以后&#xff0c;默认已经安装好了PCL和Eigen库&#xff1b; 安装Ceres 下载Ceres源文件&#xff1a;&#xff08; Vmware没有网络&#xff0c;到下面的网址手动下载安装包 &#xff09; - https://github.com…

MyBatis-Plus自定义sql注入器

文章目录 一、前言二、MyBatis-Plus自定义sql注入器功能实现2.1、编写自定义sql类2.2、将自定义sql添加到BaseMapper中2.3、编写自己的sql注入器 一、前言 在日常开发过程中&#xff0c;我们可能会发现 MyBatis-Plus 提供的那些自带的 sql 语句无法满足我们的开发需求&#xf…

Java中注解应用场景

1.Parameter注解 Parameter(names "-browser", description "browser name, supported scope [chrome]", required true) Param注解的用法解析_parameter_fFee-ops的博客-CSDN博客 Public User selectUser(param(“userName”) String name, param(“…

C# Solidworks二次开发:向量相关的数学函数API的使用介绍

今天要讲的是Solidworks二次开发时候&#xff0c;如何使用一些与数学相关的API方法的介绍&#xff0c;在Solidworks中本身提供了一个函数用于对数学对象的访问&#xff0c;函数名为MathUtility。借助这个函数&#xff0c;我们来引出今天要介绍的几个API。 &#xff08;1&#…

剑指 Offer. 二叉树的镜像

请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 例如输入&#xff1a; 镜像输出&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 代码如下&#xff1a; class Solution { public:Tre…