SQL基础之 - UNION与UNION ALL操作符的比较

决定菜鸟和大神的关键在于细节,张大逼是一名普通的程序员,昨天他接到了一家世界五百万强的某中国公司HR美眉打来的电话。职位是做数据库开发,请他务必来试一下,他从百忙之中抽出时间,信心满满地开始和这家公司的CTO聊开了,从自己的项目说起,唾沫星子飞溅,SSAS,SSIS,Hadoop,Warehouse,Cube,销售预测,决策评估,遗传算法,关联规则......天花乱坠,当他觉得一切尽在掌握的时候,CTO发问,咱来点实在的吧,UNION与UNION ALL有嘛区别?

张大逼愣了愣神,顿时觉得从天上急速下坠,汗从脸上淌了下来。擦他妈的,居然记不清了!!!

好吧,想记住区别,我们自己来试试看。先建一个测试数据库,再建一张测试表。

USE master
GO

IF NOT EXISTS(SELECT 1 FROM sys.databases WHERE name = 'MyQAWork')
   CREATE DATABASE [MyQAWork]
GO

USE [MyQAWork]
GO

IF OBJECT_ID('[MyQAWork].[dbo].[Student]') IS NOT NULL
   DROP TABLE [MyQAWork].[dbo].[Student]
GO

CREATE TABLE [dbo].[Student]
(
    ID INT PRIMARY KEY,
    Name NVARCHAR(255) NOT NULL,
    Score FLOAT NOT NULL
)

咱们再往表里插入点测试数据好验证下UNION与UNION ALL到底有啥区别:

INSERT INTO [dbo].[Student] VALUES(1, '张大逼', 100)
INSERT INTO [dbo].[Student] VALUES(2, '邓给力', 59)
INSERT INTO [dbo].[Student] VALUES(3, '王麻子', 0)

INSERT INTO [dbo].[Student] VALUES(4, '小南瓜', 89)
INSERT INTO [dbo].[Student] VALUES(5, '小西瓜', 75)
INSERT INTO [dbo].[Student] VALUES(6, '小冬瓜', 93)
INSERT INTO [dbo].[Student] VALUES(7, '小黄瓜', 56)
INSERT INTO [dbo].[Student] VALUES(8, '小香瓜', 82)

执行下下面这段语句,我们先根据不同的ID序号先UNION一下看看结果是什么:

SELECT * FROM [dbo].[Student] WHERE ID < 4
UNION
SELECT * FROM [dbo].[Student] WHERE ID > 2 AND ID < 7


SELECT * FROM [dbo].[Student] WHERE ID > 2 AND ID < 7
UNION
SELECT * FROM [dbo].[Student] WHERE ID < 4

好像两个语句,不管是先执行谁,得到的UNION结果都一样。

我们再来试试用UNION ALL代替UNION看看执行的结果如何吧,跟前面一样,将两段查询的顺序调换比较结果。

SELECT * FROM [dbo].[Student] WHERE ID < 4
UNION ALL
SELECT * FROM [dbo].[Student] WHERE ID > 2 AND ID < 7

SELECT * FROM [dbo].[Student] WHERE ID > 2 AND ID < 7
UNION ALL
SELECT * FROM [dbo].[Student] WHERE ID < 4

得到的结果如下:

嗯,这里可以很明显地看到UNION与UNION ALL的区别了吧,我们总结一下:

1. 使用UNION与UNION ALL的区别在于,UNION会过滤重复数据,UNION ALL不会过滤

2. UNION操作符会对查询结果进行排序,而UNION ALL则是将两个子查询的全部结果按执行顺序合并,包括重复行。

 

posted on 2013-03-28 17:22  听不清你说什么  阅读(251)  评论(0编辑  收藏  举报

导航