sql——Union的使用场景

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

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

1:建一张测试表 user

   sql——Union的使用场景_第1张图片

插入几条数据:

    

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

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

                                     野味,2,山楂,小山楂

                                     水果,1,橘子,小橘子

                                      野味,2,杨桃,小杨桃

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

      执行结果:

sql——Union的使用场景_第2张图片

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

2.1.证明union存在去重功能

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

sql——Union的使用场景_第3张图片

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

       执行结果:

         sql——Union的使用场景_第4张图片

         分析:结果变成了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)的结果命名的。

sql——Union的使用场景_第5张图片

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

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

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

      执行结果

          sql——Union的使用场景_第6张图片

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

       将表结构变成:

       

sql——Union的使用场景_第7张图片

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

  执行结果:

   sql——Union的使用场景_第8张图片

   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的使用场景_第9张图片

你可能感兴趣的:(Mysql)