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则是将两个子查询的全部结果按执行顺序合并,包括重复行。