`

Union和Union All的区别(l转)

阅读更多

 

文章出自: http://blog.csdn.net/wh62592855/article/details/4712555/

 

Union和Union All的区别

 

假设我们有一个表Student,包括以下字段与数据:

drop table student;

create table student
(
id int primary key,
name nvarchar2(50) not null,
score number not null
);

insert into student values(1,'Aaron',78);
insert into student values(2,'Bill',76);
insert into student values(3,'Cindy',89);
insert into student values(4,'Damon',90);
insert into student values(5,'Ella',73);
insert into student values(6,'Frado',61);
insert into student values(7,'Gill',99);
insert into student values(8,'Hellen',56);
insert into student values(9,'Ivan',93);
insert into student values(10,'Jay',90);

commit;

 

首先,我们来看一下UNION的例子:

 

select *
  from student
 where id < 4
union
select *
  from student
 where id > 2
   and id < 6;

 结果:

 

 

 

        ID NAME                                SCORE
---------- ------------------------------ ----------
         1 Aaron                                  78
         2 Bill                                   76
         3 Cindy                                  89
         4 Damon                                  90
         5 Ella                                   73

 

如果换成Union All连接两个结果集,则结果如下:

select *
  from student
 where id < 4
union all
select *
  from student
 where id > 2
   and id < 6;

 

结果:

        ID NAME                                SCORE
---------- ------------------------------ ----------
         1 Aaron                                  78
         2 Bill                                   76
         3 Cindy                                  89
         3 Cindy                                  89
         4 Damon                                  90
         5 Ella                                   73

6 rows selected.

 

 

 

可以看到,Union和Union All的区别之一在于对重复结果的处理。

 

接下来,我们交换一个两个SELECT语句的顺序,看看结果是怎样的。

 

 

SQL> select *
  2  from student
  3  where id>2 and id<6
  4  union
  5  select *
  6  from student
  7  where id<4
  8  ;

        ID NAME                                SCORE
---------- ------------------------------ ----------
         1 Aaron                                  78
         2 Bill                                   76
         3 Cindy                                  89
         4 Damon                                  90
         5 Ella                                   73

SQL> select *
  2  from student
  3  where id>2 and id<6
  4  union all
  5  select *
  6  from student
  7  where id<4
  8  ;

        ID NAME                                SCORE
---------- ------------------------------ ----------
         3 Cindy                                  89
         4 Damon                                  90
         5 Ella                                   73
         1 Aaron                                  78
         2 Bill                                   76
         3 Cindy                                  89

6 rows selected.

 

可以看到,对于UNION来说,交换两个SELECT语句的顺序后结果仍然是一样的,这是因为UNION会自动排序。而UNION ALL在交换了SELECT语句的顺序后结果则不相同,因为UNION ALL不会对结果自动进行排序。

 

那么这个自动排序的规则是什么呢?我们交换一下SELECT后面选择字段的顺序(前面使用SELECT *相当于SELECT ID,NAME,SCORE),看看结果如何:

 

 

 

select score, id, name
  from student
 where id < 4
union
select score, id, name
  from student
 where id > 2
   and id < 6;

结果:

 

 

 

     SCORE         ID NAME
---------- ---------- ------------------------------
        73          5 Ella
        76          2 Bill
        78          1 Aaron
        89          3 Cindy
        90          4 Damon

 

可是看到,此时是按照字段SCORE来对结果进行排序的(前面SELECT *的时候是按照ID进行排序的)。

 

那么有人会问,如果我想自行控制排序,能不能使用ORDER BY呢?当然可以。不过在写法上有需要注意的地方:

 

select score,id,name
from student
where id > 2 and id < 7

union

select score,id,name
from student
where id < 4

union

select score,id,name
from student
where id > 8
order by id desc

 

order by子句必须写在最后一个结果集里,并且其排序规则将改变操作后的排序结果。对于Union、Union All、Intersect、Minus都有效。

 

其他的集合操作符,如Intersect和Minus的操作和Union基本一致,这里一起总结一下:

 

Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

Union All,对两个结果集进行并集操作,包括重复行,不进行排序;

Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。

 

可以在最后一个结果集中指定Order by子句改变排序方式。

 

 

分享到:
评论

相关推荐

    MySQL中union和order by同时使用的实现方法

    此外,值得一提的是 `UNION` 和 `UNION ALL` 的区别。`UNION` 默认会去除结果集中的重复行,而 `UNION ALL` 则会保留所有行,包括重复的。如果你不关心去重,可以使用 `UNION ALL`,它通常比 `UNION` 更快,因为它不...

    SQL 拼音首字母

    SELECT 'L', N'w' UNION ALL SELECT 'M', N'' UNION ALL SELECT 'N', N'' UNION ALL SELECT 'O', N'a' UNION ALL SELECT 'P', N'' UNION ALL SELECT 'Q', N'' UNION ALL SELECT 'R', N'U' UNION ALL SELECT ...

    详解SQL Server如何得到汉字的声母

    UNION ALL SELECT '垃', 'L' UNION ALL SELECT '嘸', 'M' UNION ALL SELECT '拏', 'N' UNION ALL SELECT '噢', 'O' UNION ALL SELECT '妑', 'P' UNION ALL SELECT '七', 'Q' UNION ALL SELECT '呥', 'R' UNION ...

    sql 函数——汉字首字母

    SELECT 'L', N'w' UNION ALL SELECT 'M', N'' UNION ALL SELECT 'N', N'' UNION ALL SELECT 'O', N'a' UNION ALL SELECT 'P', N'' UNION ALL SELECT 'Q', N'' UNION ALL SELECT 'R', N'U' UNION ALL SELECT ...

    SQL Server中的集合运算: UNION, EXCEPT和INTERSECT示例代码详解

    ('1000000004', 'Fun4All', '829 Riverside Drive', 'Phoenix', 'AZ', 'USA', 'Denise L. Stephens', 'dstephens@fun4all.com'), ('1000000005', 'The ToyStore', '4545 53rd Street', 'Chicago', 'IL', 'USA', 'Kim...

    sql行转列动态与静态

    FROM (SELECT 'S' AS nsize UNION ALL SELECT 'M' UNION ALL SELECT 'L') a; SET @sql = STUFF(@sql, LEN(@sql) - LEN(@h) - LEN(@h), 1, ''); SET @sql = @sql + ' FROM tbl_0 GROUP BY color'; EXEC (@sql); ```...

    SQL实例集锦(很实用)

    在三个SELECT语句中使用UNION以显示ALL和圆括号的作用 使用`UNION ALL`可以保留所有行,包括重复行。例如,`SELECT column1 FROM table1 UNION ALL SELECT column1 FROM table2 UNION ALL SELECT column1 FROM ...

    .Net 文本框实现内容提示的实例代码(仿Google、Baidu)

    SELECT '垃', 'L' UNION ALL SELECT '嘸', 'M' UNION ALL SELECT '拏', 'N' UNION ALL SELECT '噢', 'O' UNION ALL SELECT '妑', 'P' UNION ALL SELECT '七', 'Q' UNION ALL SELECT '呥', 'R' UNION ALL SELECT ...

    s q l 应 用

    #### UNION & UNION ALL & INTERSECT & MINUS `UNION`操作符用于合并两个或更多`SELECT`语句的结果集,但会自动去除重复的行;`UNION ALL`则保留所有行,包括重复行;`INTERSECT`返回两个结果集的交集;`MINUS`返回...

    算法导论英文版

    2l.4 Analysis of union by rank with path compression 50 VI Graph Algorithms Introduction 525 22 Elementary Graph Algorithms 527 22.l Representations of graphs 527 22.2 Breadth-first search 531 22.3 ...

    数据结构线性表操作.docx

    8. `CreateList_L` 和 `CreateList_L_NoHead` 函数分别用于创建带头结点和不带头结点的链表。 9. `printList_L` 和 `printList_L_NoHead` 函数分别用于打印带头结点和不带头结点的链表。 10. `GetElem_L`、`List...

    oracle转DB2 对照

    UNION ALL SELECT t.* FROM table t JOIN cte ON t.parent_id = cte.id ) SELECT * FROM cte; ``` - 注意点: Oracle使用 `START WITH` 和 `CONNECT BY` 进行层次查询,而DB2使用 `WITH RECURSIVE` 子句。 ###...

    C#中Trim()、TrimStart()、TrimEnd()的用法介绍

    然而,值得注意的是,这里的"union all"被视为字符数组,而不是一个连续的字符串,所以`TrimEnd()`只会删除单个字符"u"、"n"、"i"、"o"、"n"、" "、"a"和"l",不会把"union all"作为一个整体来处理。因此,最终结果...

    经典SQL语句大全

    - `UNION ALL` 同样合并结果,但保留所有行,包括重复行。 - `EXCEPT` 运算符返回只在第一个查询中出现的行,如 `SELECT ... FROM table1 EXCEPT SELECT ... FROM table2`,`EXCEPT ALL` 不去除重复行。 - `...

    downloadSQL

    - `UNION ALL` 同样合并结果,但保留所有行,包括重复行。 - `EXCEPT` 返回在第一个查询中存在,但在第二个查询中不存在的行,如 `SELECT...EXCEPT SELECT...`。 - `EXCEPT ALL` 类似于 `EXCEPT`,但不删除重复行...

    MSSQL海量数据查询代码优化[文].pdf

    3. **避免`OR`条件**:`OR`连接的条件同样会阻碍索引的使用,可将其拆分为多个查询,用`UNION ALL`合并结果。 4. **谨慎使用`IN`和`NOT IN`**:这些操作可能导致全表扫描,尤其是当值集合较大时。对于连续的数值,...

    oracle入門訓練代碼

    - **注意**:`UNION`和`UNION ALL`要求查询的列数相同,且相应列的数据类型相容。 ### 10. ROWID #### SQL语句: ```sql SELECT ROWID, sname FROM student; ``` - **知识点**:`ROWID`是Oracle的一个特殊列,它...

    sql server数据库模糊查询语句

    SQL Server 模糊查询语句 SQL Server 模糊查询语句是指使用 LIKE ...INSERT INTO a SELECT '11%22' UNION ALL SELECT '11%33' UNION ALL SELECT '12% 这些示例展示了 SQL Server 模糊查询语句的使用方法和应用场景。

Global site tag (gtag.js) - Google Analytics