专业编程基础技术教程

网站首页 > 基础教程 正文

SQL - 去除重复(distinct)与联合结果集(union)的查询语句 157

ccvgpt 2024-07-30 20:58:20 基础教程 56 ℃

#头条创作挑战赛#

去除重复的行数据

distinct语句是对已查询出的结果集进行数据行去重处理的,而不是单单针对某一个列

SQL - 去除重复(distinct)与联合结果集(union)的查询语句 157

查询的结果集中只会保留唯一的行,去除重复的行(所在列的值相同),它会在查询时比较所有的列的值,只有当行数据的所有列或指定列的值都相同时才会被认为是重复行

USE School;

--使用TSQL语句创建示例表
CREATE TABLE T2
(
 TName VARCHAR(8),
 TGender BIT,
 TAge int
)
--插入数据
INSERT INTO dbo.T2( TName, TGender, TAge )
--单行插入
VALUES( N'张三',0,18 )
--多行插入
INSERT INTO dbo.T2( TName, TGender, TAge )
SELECT N'张三',0,18 UNION ALL
SELECT N'张三1',0,18 UNION ALL
SELECT N'李四',0,20 UNION ALL
SELECT N'李1四',1,20 UNION ALL
SELECT N'李四',0,20 UNION ALL
SELECT N'李1四',1,20
--使用UNION ALL 可以插入有重复的数据

--1 distinct 去除重复记录数据的语句
--查询T2表中所有的数据
SELECT * FROM dbo.T2
--针对所有列进行去重查询
SELECT DISTINCT * FROM dbo.T2
--针对指定列进行去重查询
SELECT DISTINCT TName FROM dbo.T2

--与分组查询的结果有些类似

注意事项:

1)使用 DISTINCT 语句会对查询结果进行排序,以便找到要去除重复的数据行,可能会对查询的性能产生影响,如果只需对某一列进行去重处理,考虑使用 GROUP BY 语句

2)使用Union会对查询的数据进行重复值的扫描查询效率会非常低,因此如果不是确定要合并重复行也可以使用 UNION ALL(不会进行去重处理)

联合结果集(union/union all)

1 union 是对已查询出的两个集合进行联合操作;两个集合必须具有相同的列数,对应位置的列必须具有相同的数据类型(至少能进行隐式类型转换)最终显示数据的列名由第一个集合的列名来确定,使用 UNION 操作会去除重复的结果,返回唯一的结果集

注意:1)可以连接多个结果集 2)联合之前不能使用排序语句 3)联合查询默认具有去重功能 4)如果使用 where 语句,列名只能使用各自表中的列名

--使用union 对结果集进行联合查询
SELECT TName,TAge FROM dbo.T2
UNION
SELECT TName,TNumber FROM dbo.T1
--联合查询结果的列名是第一条查询语句的列名
--第二个查询语句的列名只需要与第一条查询语句
--对应位置的数据类型相同即可(或可隐式转换)

--查询T1/T2表中数据
SELECT TName,TAge FROM dbo.T2
SELECT TName,TNumber FROM dbo.T1

张三与李1四可以被去重处理在于对应的两个列的值相同而张三1不能被去重的原因在于第一列列值相同,第二列列值不同,因此不能被进行去重处理

2)排序语句不能对联合查询前的各查询语句排序但可以对联合查询的结果集进行排序

--联合查询之前使用排序语句
SELECT TName AS N'姓名',TAge AS N'年龄' FROM dbo.T2
ORDER BY TName --这里报错
UNION
SELECT TName,TNumber FROM dbo.T1
ORDER BY TName

--错误消息:关键字 'UNION' 附近有语法错误
--错误原因:
--简单来说联合查询针对的是集合即未排序的结果集
--排序后就不再是一个集合而是游标了(前面153说过)

--联合查询之后使用排序语句
--此时排序针对的是联合查询后的结果集
SELECT TName AS N'姓名',TAge AS N'年龄' FROM dbo.T2
--这里也可以使用where 语句,只能使用自己表中的列名
UNION
SELECT TName,TNumber FROM dbo.T1
--这里也可以使用where 语句,只能使用自己表中的列名
--ORDER BY  TAge DESC
--这里可以使用别名的原因在于语句执行顺序,之前说过不再赘述
ORDER BY N'年龄' DESC

--添加了where语句
--示例中 使用的SQL server 2008 r2 版本中
==无法对联合查询的结果集使用where语句
--只能在各自查询语句中使用
SELECT TName AS N'姓名',TAge AS N'年龄' FROM dbo.T2
WHERE TAge>30
UNION
SELECT TName,TNumber FROM dbo.T1
--ORDER BY  TAge DESC
--只能使用自己表中的列名
WHERE TNumber>30
ORDER BY 年龄 DESC

3)如果需要合并的SELECT语句的列数不一致,可以使用NULL来填充缺失的列

SELECT SName,SGender,SAge,SPhone FROM dbo.Student
UNION
--T2没有对应的列可使用 null代替
SELECT TName,TGender,TAge,null FROM dbo.T2

2 union all 联合查询时不会进行去重处理

--使用union all对结果集进行联合查询
SELECT TName,TAge FROM dbo.T2
UNION
SELECT TName,TNumber FROM dbo.T1

Tags:

最近发表
标签列表