• <MySQL> 查询数据进阶操作 -- 联合查询


    目录

    一、什么是笛卡尔积?

    二、什么是联合查询?

    三、内连接

    3.1 简介

    3.2 语法

    3.3 更多的表

    3.4 操作演示

    四、外连接

    4.1 简介

    4.2 语法

    4.3 操作演示

    五、自连接

    5.1 简介

    5.2 自连接非必要不使用

    六、子查询(嵌套查询)

    6.1 简介

    6.2 in 和 exists 关键字

    6.3 子查询可能让简单的语句变复杂

    七、合并查询

    7.1 简介

    7.2 合并查询可能让简单的语句变复杂

    八、MySQL 中各个关键字的执行顺序


    一、什么是笛卡尔积

            笛卡尔积(Cartesian product)是一种数学概念,用于描述两个或多个集合之间的组合。它表示为两个或多个集合的乘积,其中每个元素都来自不同的集合。

            在编程中,笛卡尔积通常用于描述两个或多个数据集合之间的组合。

    编程中使用笛卡尔积,需要注意以下两点:

    实际开发中,使用笛卡尔积需要慎重,需要预估笛卡尔积后的结果集的规模,避免规模过大。
    通常表与表之间存在关联关系,才可以进行笛卡尔积。没有关联关系的数据得出的笛卡尔积,通常也没有意义。

    二、什么是联合查询

            在MySQL中,联合查询是一种查询多个表的多个列的查询,通过取笛卡尔积,这些表和列被组合成一个结果集。联合查询通常用于查询多个表之间的关联数据。

    联合查询的常见方式包括:内连接、外连接、自连接、子查询(嵌套查询)、合并查询


    三、内连接

    3.1 简介

            内连接是查询两个表或多个表之间的关联数据,返回两个表之间的交集数据。内连接是默认的连接类型,如果不指定连接类型,那么查询默认为内连接

    3.2 语法

    基本语法:select * from 表1 join 表2 on 关联条件;
    基本语法:select * from 表1,表2 where 关联条件;
    释义:

    根据关联条件,全列查询指定表的笛卡尔积。

    以上两种写法效果一致。

    可以指定别名。

    以上语法只进行了基本的查询,后续往往需要根据需要根据需求对表的内容进行精简

    查询和精简步骤:

    1、进行笛卡尔积

    2、指定表之间的关联条件

    3、指定结果集的筛选条件
    4、指定需要打印的列(对需要打印的列进行精简或聚合运算)

    join on

    语法:

    select 需要打印的列名... from 表1 join 表2 on 关联条件 and 结果集的其他筛选条件;

    where语法:

    select 需要打印的列名... from 表1,表2 where 关联条件 and 结果集的其他筛选条件;

    3.3 更多的表

    在超过两个表做笛卡尔积时,两种语法分别是怎样添加对应语句的?

    假设此时有三个表做笛卡尔积:

    join on 语法:

    select 需要打印的列名...

    from 表1 join 表2 on 关联条件 join 表3 on 关联条件

    and 结果集的其他筛选条件;

    where 语法:

    select 需要打印的列名...

    from 表1,表2,表3 where 关联条件,关联条件 

    and 结果集的其他筛选条件;

            第一种写法清晰地表达了表之间是什么关联条件;而第二种写法则更为简洁,但表之间的关联条件却写成一团;两种写法各有各的优点。

    3.4 操作演示


    四、外连接

    4.1 简介

            外连接也是查询两个表之间的关联数据,但有所不同的是,内连接查询的是两个表的交集,而外连接则会以一侧的表为主,显示所有列

    4.2 语法

            外连接需要使用 left join 或 right join 子句指定连接方向。使用 left join 表示完全显示左侧表,称为左外连接;使用 right join 表示完全显示右侧表,称为右外连接。

    语法:

    select 需要打印的列名...

    from 表1 left join 表2 on 关联条件 

    and 结果集的其他筛选条件;

    释义:根据关联条件和结果集的其他筛选条件,以指定的左侧表为主,查询指定表中指定的列数据。

    4.3 操作演示


    五、自连接

    5.1 简介

            自连接是指一个表和自己进行笛卡尔积,这种查询方式应用场景不多,在需要将行关系转化成列关系时可以使用

    语法:

    select * from 表名 as 别名1,表名 as 别名2;
    释义:

    指定一个表和自己进行笛卡尔积,并打印结果集。

    由于在同一个语句中表名相同,因此自连接需要使用别名。

    没有使用别名将报错:

    5.2 自连接非必要不使用

    假设有以下场景:

            从上图可知,除了行列关系不同,使用其他方法可以和自连接获得一样的数据,但是自连接还需要对数据进行笛卡尔积,查询开销大因此,自连接的查询方式并不常用。如果出现一定要使用自连接进行查询才能获得正确数据的情况,此时则应考虑表的设计是否存在缺陷。


    六、子查询(嵌套查询)

    6.1 简介

            子查询是嵌套在主查询内部的SQL查询,它返回一个结果集,然后被用作主查询的条件。子查询需要使用where子句,并将其放在主查询的括号内。

    语法:

    主查询语句 where 包含(子查询语句)的条件表达式;
    释义:

    使用子查询语句返回的结果集作为主查询语句的条件。

    6.2 in 和 exists 关键字

    子查询语句可以配合 in 和 exists 关键字使用。

    关键字释义
    in / exists包含在(子查询语句返回的结果集中)
    not in / not exists不包含在(子查询语句返回的结果集中)

    6.3 子查询可能让简单的语句变复杂


    七、合并查询

    7.1 简介

            合并查询用于查询多个表的多个列的查询,这些表和列将被组合成一个结果集。在前后查询的结果集中,列的类型和数量需要一致,列名则不需要一致。

            合并查询需要使用 union 或 union all 关键字。

    关键字说明
    union取得两个结果集的并集,去重
    union all取得两个结果集的并集,不去重
    语法:查询语句1 union 查询语句2;
    释义:将两个查询的结果集合并,去重,打印。

    7.2 合并查询可能让简单的语句变复杂


    八、MySQL 中各个关键字的执行顺序

    fromonjoinwheregroup bywithhavingselectdistinctorder bylimit
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

            关键字从左到右,优先级依次从高到低。优先级高的关键字先执行。


    阅读指针 -> 《什么是数据库索引?数据库索引的底层结构是什么?》

    <MySQL> 什么是数据库索引?数据库索引的底层结构是什么?-CSDN博客介绍了什么是数据库索引?简单介绍了数据库索引的底层结构B+树。归纳了数据库索引使用B+树作为底层的理由。https://blog.csdn.net/zzy734437202/article/details/134444029

  • 相关阅读:
    React JSX常用语法总结
    动态规划学习1
    C++桌面应用开发(Qt学习)——控件(2)ItemWidget
    抖音web逆向教程
    [附源码]计算机毕业设计人体健康管理appSpringboot程序
    DCDC电源电流定义
    SSH连接MobaXterm
    ZJU-199001 第三周练习 2 数字特征值 位运算算法
    Apache Doris (五十二): Doris Join类型 - Broadcast Join
    「降本」有可能,「增效」不确定
  • 原文地址:https://blog.csdn.net/zzy734437202/article/details/134424446