sql——Union的使用场景

最近遇到一个需求,需要将数据库的一条记录展示成4条记录。初次一听,什么玩意??仔细分析之后,大概是这样,一条记录有多个字段,这些字段又可以归为不同类别,所以需要展示成多行形式。

这里想到2种方案,1是将记录从数据库中原模原样取出来,在代码中将记录分成多条记录;2是使用union,选择记录中的部分字段,合并记录中的另一部分字段,接下来分析第二种方法。

1:建一张测试表 user

   

插入几条数据:

    

2:使用union 将每条记录显示成 2条记录,

       前端展示成   :     水果,1,苹果,小苹果

                                     野味,2,山楂,小山楂

                                     水果,1,橘子,小橘子

                                      野味,2,杨桃,小杨桃

      sql语句:select name,id,apple,appleName from user union select name,id,orange,orangeName from user

      执行结果:

      分析:如果单独执行 select name,id,apple,appleName from user,只会得到2条记录,使用union后将 select name,id,orange,orangeName from user (2条)的记过合并 ,并且去重。合并,去重表现在结果的总记录行数。 上述结果已经可以证明union 有进行合并(4条),如何证明有去重呢?

2.1.证明union存在去重功能

       这里需要改变user表的数据,不然没法证明。

       sql:select name,id,apple,appleName from user union select name,id,orange,orangeName from user 

       执行结果:

         

         分析:结果变成了3条,select name,id,apple,appleName from user 的结果有2条, select name,id,orange,orangeName from user 也有2条,但是 4条结果中有2条是重复的记录:水果,1,苹果,小苹果。最终去掉一条,剩下3条。如果想要不去重记录,使用 union all 连接结果。

3.union使用的注意事项

      3.1.union 的结果记录 名称是 以第一条sql(使用union)的结果命名的。

       3.2 使用union的sql 返回的列数必须一致,且必需与第一条sql的列数一致

       sql:select name,id,apple from user union select name,id,orange,orangeName from user

                第一条sql 返回 3 个字段,第二条sql返回4个字段

      执行结果

          

   3.3 使用union的sql 返回字段类型可以不用一致

       将表结构变成:

       

  sql:select name,id,apple,appleName from user union select name,id,orange,orangeName from user

  执行结果:

   

   3.4 使用union 可以构造 数据

       添加一列 type 数据

      sql:select name,id,apple,appleName, 1 type from user union select name,id,orange,orangeName, 2 from user

      执行结果:

       

### SQL UNION 使用方法 #### 基本概念 `UNION` 是一种用于组合多个 `SELECT` 查询结果的操作符。它能够将来自不同表的数据合并成单个结果集,前提是这些查询返回的列数和数据类型相匹配。 基本语法如下所示: ```sql SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; ``` 此语法表示从两个不同的表格中选取指定列并将其结果合并为一个单一的结果集合[^1]。 当涉及到更复杂的场景时,比如基于特定条件来筛选记录或者处理重复项,则需进一步理解其特性与应用方式: #### 合并与去重 默认情况下,`UNION` 会对最终输出执行一次隐式的 DISTINCT 操作以移除任何可能存在的冗余条目。例如,在员工列表里可能存在既属于雇员又担任经理角色的人士;通过下面这个例子可以看到如何区分他们而不会造成重复显示: ```sql SELECT name, 'Employee' AS Type FROM employees WHERE department_id = 5 UNION SELECT name, 'Manager' FROM managers WHERE department_id = 5; ``` 这里不仅展示了名字还附加了一个标签标明身份类别,“Type”,从而即使同一个人出现在两组之中也只会被计作一条独立的信息呈现出来[^2]。 然而有时候我们并不希望去除那些看似“重复”的项目——也许它们实际上代表了某些有意义的区别。这时就可以考虑采用另一种形式叫做 `UNION ALL` ,它可以保留所有的原始记录而不做额外过滤: ```sql SELECT product_id FROM products_sold_in_store_a UNION ALL SELECT product_id FROM products_returned_to_warehouse_b; ``` 上述代码片段说明了即便某个商品ID同时存在于销售记录以及退货清单上也不会丢失信息的情况[^3]。 #### 性能考量 值得注意的是关于性能方面的小贴士:通常来说利用 `UNION ALL` 能够带来更快的速度表现因为它省去了内部对于唯一性的判断过程。因此除非确实有必要消除副本否则推荐优先选用后者版本[^4]。 ### 示例教程 假设有一个数据库包含了三张分别存储书籍、电影还有音乐专辑基本信息的表格(`books`, `movies`, `albums`),现在想要创建一份综合目录展示所有媒体资源的名字及其分类名称。那么可以这样实现: ```sql SELECT title AS Name, 'Book' AS Category FROM books UNION SELECT title, 'Movie' FROM movies UNION SELECT album_title AS title, 'Album' FROM albums; ``` 这段脚本将会生成一张新表其中每一行都对应着一本书籍、一部影片或者是某张唱片,并且清楚地标明所属种类以便于后续检索分析等工作流程之用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值