1、集合运算
在数学中,不仅可以对指定的数字个体做四则运算,还可以对指定的集合整体做交并补运算。类似的,在数据库中也是不仅可以对具体的数据行进行增删改查,还可以对查询结果集进行集合运算。SQL Server 中的集合运算有并集运算、差集运算和交集运算三种,本节将逐一讲述。
1.1、并集运算 UNION
并集运算符 UNION 的作用是将两个或多个查询的结果集合并为单个结果集。在 UNION 运算中,需要确保各个子结果集的字段数相同、字段的顺序相同、字段的数据类型兼容。合并结果集的列名始终会取第一个子结果集中的列名,因此,如果要对合并结果集排序,则需要用第一个子结果集的字段名。
参数 ALL 表示将全部行并入结果集中,换句话说合并结果集可能会包含重复行;相反,如果未指定该参数,则会删除重复行。需要注意的是,在做重复判断时,UNION 会把两个 NULL 值被视为相等的。因为 UNION ALL 不需要删除重复行,所以性能比 UNION 要好。因此,除非必须要删除重复行,否则建议一律使用 UNION ALL。
1.1.1、简单 UNION ALL。查询 1 班的男生和 2 班的女生。示例如下:
SELECT * FROM T_Students t1 WHERE t1.ClassId = 1 AND t1.Gender = 1
UNION ALL
SELECT * FROM T_Students t2 WHERE t2.ClassId = 2 AND t2.Gender = 0;
1.1.2、简单 UNION ALL。查询 1 班的男生和该班的男生人数。示例如下:
SELECT 1 cnt,t1.Code,t1.Name FROM T_Students t1 WHERE t1.ClassId = 1 AND t1.Gender = 1
UNION ALL
SELECT COUNT(1),NULL,NULL FROM T_Students t2 WHERE t2.ClassId = 1 AND t2.Gender = 1;
查询结果如下:
cnt Code Name
----------- ------------------------------ ------------------------------
1 S330102001 郑强
1 S330102002 肖俊生
1 S330300007 钱波
1 S330104009 金桥
4 NULL NULL
1.1.3、UNION 与 ORDER BY。查询 1 班的男生和 2 班的女生,并且将最终结果集按年龄从大到小排序。示例如下:
SELECT * FROM T_Students t1 WHERE t1.ClassId = 1 AND t1.Gender = 1
UNION ALL
SELECT * FROM T_Students t2 WHERE t2.ClassId = 2 AND t2.Gender = 0
ORDER BY t1.Birthday;
1.1.4、UNION 与 SELECT INTO。创建一个活动学生表,并将 1 班的男生和 2 班的女生加入其中。示例如下:
SELECT t1.Code,t1.Name,t1.Gender,t1.Birthday
INTO T_ActivityStudents
FROM T_Students t1
WHERE t1.ClassId = 1