一、级联查询

级联查询(Cascade Query)是指在一个查询中嵌套使用另一个查询的结果,将多个查询连接在一起,形成一条长的查询语句。它用于获取多个数据集之间的相关信息。在级联查询中,一个查询的结果作为下一个查询的输入,以此类推。这样可以通过查询多个表或多个数据集,获取更全面的数据信息。

  1. 嵌套查询:级联查询是通过嵌套多个查询来实现的,一个查询的结果作为下一个查询的条件或输入。
  2. 多层次关联:级联查询可以通过多层嵌套查询获取更深层次的数据关联,可以处理更复杂的数据依赖关系和查询需求。
  3. 递归性:级联查询可以处理递归的数据结构,例如树形结构或关系图中的递归关系。
  4. 灵活性:级联查询可以根据需要自由组合和嵌套子查询,灵活应对不同的数据关系和查询场景。

3.使用方法

  1. 子查询:
    子查询是指在主查询中嵌套使用另一个查询作为子查询,子查询的结果作为主查询的条件之一。可以在SELECT、FROM、WHERE、HAVING或者IN等子句中使用子查询。例如:

    SELECT column1, column2
    FROM table1
    WHERE column1 IN (SELECT column1 FROM table2);
    
  2. 临时表:
    可以使用临时表来进行级联查询,在查询和连接过程中创建一个临时表,用于存储中间结果。然后再将临时表与其他表进行连接获取最终结果。例如:

    CREATE TEMPORARY TABLE temp_table AS
    SELECT column1, column2
    FROM table1
    WHERE condition;
    SELECT t1.column1, t2.column2
    FROM temp_table t1
    INNER JOIN table2 t2
    ON t1.column1 = t2.column1;
    
  3. 视图:
    视图是基于一个或多个表的查询结果集,可以将视图看作是虚拟的表。可以先创建一个视图,然后通过查询视图来实现级联查询。例如:

    CREATE VIEW view_name AS
    SELECT column1, column2
    FROM table1
    WHERE condition;
    SELECT t1.column1, t2.column2
    FROM view_name t1
    INNER JOIN table2 t2
    ON t1.column1 = t2.column1;
    

    数据库进行级联查询的一般步骤如下:

    1. 确定需要查询的表格和字段。
    2. 根据查询条件选择使用子查询、临时表或者视图等方式进行级联查询。
    3. 编写SQL语句实现级联查询,使用JOIN关键字指定连接条件。
    4. 执行SQL语句,获取级联查询的结果。
    5. 根据需要进行结果的处理和显示。

    4.使用场景

    • 级联查询适用于需要在一个查询中嵌套使用另一个查询的结果,以获取更全面的数据信息的场景。
    • 当需要根据一个查询的结果作为下一个查询的条件,以获取更深层次的数据关联时,可以使用级联查询。
    • 级联查询常用于复杂的数据关系查询、数据递归查询、数据依赖查询等需要多层次查询的操作。

    二、联合查询

            联合查询(Join Query)是通过连接两个或多个表格的公共字段,将它们的记录连接在一起形成一个结果集。联合查询根据连接条件从不同表格中提取相关的记录,并生成一个包含所有相关信息的结果集。联合查询可以根据连接方式的不同,分为内连接、外连接和交叉连接等。它常用于将具有相关性的数据合并在一起,以便进行更复杂的查询和分析。

    1. 表的连接:联合查询是通过连接两个或多个表格的公共字段来实现的,将相关数据合并在一起。
    2. 合并相关信息:联合查询可以从不同的表格中提取相关信息,并生成一个包含所有相关字段的结果集。
    3. 数据合并:联合查询可以将多个数据源的记录合并在一起,以实现更全面的数据分析和查询。
    4. 扩展性:联合查询可以根据需要使用不同的连接方式(如内连接、外连接等),适应不同的数据关系和查询需求。

    3.使用方法

    1. 内连接(INNER JOIN):
      内连接是最常用的多表联查方式,它会根据连接条件从两个表中筛选出符合条件的记录。仅返回两个表中有匹配关系的记录。

      SELECT column1, column2
      FROM table1
      INNER JOIN table2 ON table1.column = table2.column;
      
    2. 左连接(LEFT JOIN):
      左连接返回左表中的所有记录,以及与右表中匹配的记录。如果右表中没有与左表对应的记录,则右表的字段为NULL。

      SELECT column1, column2
      FROM table1
      LEFT JOIN table2 ON table1.column = table2.column;
      
    3. 右连接(RIGHT JOIN):
      右连接返回右表中的所有记录,以及与左表中匹配的记录。如果左表中没有与右表对应的记录,则左表的字段为NULL。

      SELECT column1, column2
      FROM table1
      RIGHT JOIN table2 ON table1.column = table2.column;
      
    4. 全连接(FULL JOIN):
      全连接返回两个表中的所有记录,无论是否有匹配关系。如果某个表中没有匹配的记录,则另一个表的字段为NULL。

      SELECT column1, column2
      FROM table1
      FULL JOIN table2 ON table1.column = table2.column;
      
    5. 自连接(Self Join):
      自连接是指连接同一个表格的不同实例,通过别名区分。它常用于解决需要在同一表格中对比和查询相关记录的场景。

      SELECT a.column1, b.column2
      FROM table as a
      INNER JOIN table as b ON a.column = b.column
      WHERE condition;

    4.使用场景

    • 联合查询适用于需要将多个表格中的相关数据合并在一起进行查询和分析的场景。
    • 当需要从多个表格中获取相关信息,并将它们合并成一个结果集时,可以使用联合查询。
    • 联合查询常用于生成报表、统计分析、数据对比等需要综合多个数据源的操作。

    三、级联查询和联合查询的区别

    • 级联查询是将多个查询操作嵌套在一起,形成一条较长的查询语句,用于获取多个数据集的相关信息。
    • 联合查询是通过连接两个或多个表的公共字段,将它们的记录连接在一起形成一个结果集,用于合并相关信息。
    • 级联查询可以使用子查询、临时表或者视图等方式实现,而联合查询使用JOIN关键字来指定连接条件。
    • 级联查询更侧重于查询多个数据集的关联信息,而联合查询更侧重于合并相关信息。
    在真实业务背景中的系统中,对于用户的认证、授权以及鉴权的问题,通常不只依靠一张用户表来完成。一般还涉及用户角色表,用户-角色关系表,权限表,以及角色-权限关系表。此时查询数据库,除了使用关联查询还有一种方式,级联查询,也是这篇博客的主题。级联查询也叫嵌套查询,在sql中,一个SELECT-FROM-WHERE语句成为一个查询语句块,那么将一个语句块嵌套在另一个语句块的WHERE字句的条件中的查询称为嵌套查询,下文将通过上述讲述的五表案例来具体描述。 一对多级联查询 一条主表数据对应多条子表数据 ,由关联表产生联系,在pojo类中,子表以子表pojo类型的集合形式存在于主表pojo类的属性上 所谓级联查询就是将主表不能直接查的数据,使用自定义映射规则调用子表来查,通过column属性将主表id传给子查询,子查询使用孙子查询在关联表中查询查询传来的id对应的子表id,再将子表id作为条件查询出所有子表对象,然后封装在集合中映射到主表属性上 <resultMap type="travelGroup" id="id"> mybatis之关联查询一、简单一对一级联查询二、嵌套结果与嵌套查询三、一对多单向查询四、缓存(了解)五、延迟加载(了解)六、鉴别器(自)七、调用存储过程八、分页拦截器九、多形参问题 一、简单一对一级联查询   有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如:最常见到的一对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。前面节中介绍的都是单表映射的一些操作,然而在我们的实际项目中往往是用到多表映射。在 Java 实体对象对中,一对多可以根据 List 和 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KF0vouJ0-1689741090768)(https://i0.wp.com/img-blog.csdnimg.cn/ccfd456b4bb548cc8a9174f5b3dea04f.png)]自动映射到 Person 的 idCard 属性的 id、no、address 属性上面去。💜 该写法需要数据库驱动支持(如:MySQL 支持,而 Oracle 不支持)💜 只执行了一条 SQL 语句。💦 添加 MAVEN 依赖。 一:join 和 inner join 与等值连接: 1:SELECT st.s_name,co.c_name FROMrelevance re, student st, course co WHERE re.s_id = st.s_id AND re.c_id = co.t_id(内连接) 2:selectst.s_name...