美文网首页
SQL 组合查询

SQL 组合查询

作者: 山药鱼儿 | 来源:发表于2022-03-23 19:10 被阅读0次

本节我们学习如何使用 UNION 操作符将多条 SELECT 语句组合成一个结果集返回,即组合查询。下面是两种使用组合查询的场景:

  • 在一个查询中,从不同的表返回结构数据;
  • 对一个表执行多个查询,按一个查询返回数据。

注:任何具有多个 WHERE 子句的 SELECT 查询都可以作为一个组合查询。

使用 UNION 创建组合查询

UNION 操作符用来组合多条 SQL 查询,只需要在各条 SELECT 语句之间放上关键字 UNION

比如,第一条 SQL 查询客户所在州为 IL INMI 的顾客信息:

SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_state IN ( 'IL', 'IN', 'MI' );

运行结果:

第二条 SQL 则检索姓名为 Fun4All 的顾客:

SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_name = 'Fun4All';

运行结果:

组合上述两条 SQL 即为:

SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_state IN ( 'IL', 'IN', 'MI' ) UNION
SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_name = 'Fun4All';

运行结果:

上述两条 SELECT 语句使用 UNION 关键字分隔,UNION 指示 DBMS 执行这两条 SELECT 语句,并把输出组合成一个查询结果。

并且,从组合查询的结果我们发现,UNION 并不仅仅是简单地将两个查询结果拼接在一起,而是对组合结果进行了去重。比如:Fun4All Jim Jones 在两条 SQL 中都有返回,而组合结果中却只有一条。

注:对于复杂的过滤条件,或者从多个表中检索数据的情形,使用 UNION 会更加简洁。

当然,你可以使用包含多个 WHERE 条件的 SQL 实现相同的检索目标:

SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_state IN ( 'IL', 'IN', 'MI' ) 
    OR cust_name = 'Fun4All';

注意事项 1 UNION 中每个查询必须包含相同的列、表达式或聚集函数,字段(列)的顺序可以不同;列的数据类型不必完全一致,但必须是 DBMS 可以隐式转换的。

注意事项 2 UNION 关键字组合的 SQL 如果字段的名称不同,比如第一条 SQL 返回 SELECT prod_name 第二条 SQL 返回 SELECT productname ,则查询结果返回的名字为第一条 SQL 的字段名。

UNION ALL 组合查询

在上文实践 UNION 时,我们发现 UNION 会对查询结果进行去重,重复的行会被自动取消。如果想返回所有的行时,可以使用 UNION ALL

SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_state IN ( 'IL', 'IN', 'MI' ) UNION ALL
SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_name = 'Fun4All';

使用 UNION ALL 组合查询的运行结果:

使用 UNION ALL DBMS 不会取消重复的行,因此这里返回 5 条记录。

对组合查询结果排序

SELECT 语句的输出用 ORDER BY 子句进行排序。不过,在用 UNION 组合查询时,只能使用一条 ORDER BY 子句,它必须位于最后一条 SELECT 语句之后。

下面的 SQL 对上文 UNION 返回的结果进行排序:

SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_state IN ( 'IL', 'IN', 'MI' ) UNION
SELECT
    cust_name,
    cust_contact,
    cust_email 
FROM
    Customers 
WHERE
    cust_name = 'Fun4All' 
ORDER BY
    cust_name;

排序检索结果:

注意事项 1 对于 UNION 结果集,不存在用一种方式排序一部分,用另一种方式排序另一部分的情况,因此不允许使用多条 ORDER BY 子句。

注意事项 2 UNION 关键字组合的 SQL 如果字段的名称不同,如果想要排序,排序依据的字段名必须是第一条 SQL 语句中的字段名或其别名。

总结

本节我们学习了如何使用 UNION 来组合SELECT 语句,利用 UNION 可以将多条 SELECT 语句查询的结果作为一条组合查询返回,并且自动去除结果集中重复的行。

使用 UNION 可以极大地简化复杂的 WHERE 子句,此外,UNION 在组合多个工作表时也很有用,即使是有不匹配列名的表,在这种情况下,可以将 UNION 与别名组合,检索出一个结果集。

相关文章

  • ThinkPHP查询

    查询方式 表达式查询 快捷查询 区间查询 组合查询 统计查询 动态查询 SQL查询 ThikPHP支持原生SQL查...

  • 11. 组合查询

    组合查询 SQL 允许执行多个查询,并将结果作为一个查询结果集返回,这些组合查询通常称为并(union)或复合查询...

  • SQL 组合查询

    本节我们学习如何使用 UNION 操作符将多条 SELECT 语句组合成一个结果集返回,即组合查询。下面是两种使用...

  • 【GOLANG】GORM组合查询,构建复杂查询

    组合 使用 Group 条件可以更轻松的编写复杂 SQL 形成的SQL语句: 子查询 子查询可以嵌套在查询中,GO...

  • Mysql语法之组合查询

    本章讲述如何利用UNION操作符将多条SELECT语句组合成一个结果集。 一、组合查询 多数SQL查询都只包含从一...

  • 数据库学习笔记——14组合查询

    本课学习如何利用UNION操作符将多条SELECT语句组合成一个结果集。 1 组合查询 多数SQL查询只包含从一个...

  • iOS数据库优化

    1.改变sql语句,做分表查询,内存组合数据 2.不改变sql语句,添加索引,加快查询速度。 3.区分对待数据库串...

  • SQL学习十一、组合查询

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,1、UNION 内部的每个 SELEC...

  • 【SQL】(十四):组合查询(UNION)

    本系列为自己学习时的笔记及心得体会,转载请注明出处。 利用UNION操作符将多条SELECT语句组合成一个结果集。...

  • EF Core 备忘

    模糊查询sql linq 内连接查询sql linq 左连接查询sql linq 左连接查询(连接内带条件)sql...

网友评论

      本文标题:SQL 组合查询

      本文链接:https://www.haomeiwen.com/subject/flfhjrtx.html