文章出自: http://blog.csdn.net/wh62592855/article/details/4712555/
假设我们有一个表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子句改变排序方式。
相关推荐
此外,值得一提的是 `UNION` 和 `UNION ALL` 的区别。`UNION` 默认会去除结果集中的重复行,而 `UNION ALL` 则会保留所有行,包括重复的。如果你不关心去重,可以使用 `UNION ALL`,它通常比 `UNION` 更快,因为它不...
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 ...
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 ...
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 ...
('1000000004', 'Fun4All', '829 Riverside Drive', 'Phoenix', 'AZ', 'USA', 'Denise L. Stephens', 'dstephens@fun4all.com'), ('1000000005', 'The ToyStore', '4545 53rd Street', 'Chicago', 'IL', 'USA', 'Kim...
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); ```...
在三个SELECT语句中使用UNION以显示ALL和圆括号的作用 使用`UNION ALL`可以保留所有行,包括重复行。例如,`SELECT column1 FROM table1 UNION ALL SELECT column1 FROM table2 UNION ALL SELECT column1 FROM ...
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 ...
#### 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 ...
8. `CreateList_L` 和 `CreateList_L_NoHead` 函数分别用于创建带头结点和不带头结点的链表。 9. `printList_L` 和 `printList_L_NoHead` 函数分别用于打印带头结点和不带头结点的链表。 10. `GetElem_L`、`List...
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` 子句。 ###...
然而,值得注意的是,这里的"union all"被视为字符数组,而不是一个连续的字符串,所以`TrimEnd()`只会删除单个字符"u"、"n"、"i"、"o"、"n"、" "、"a"和"l",不会把"union all"作为一个整体来处理。因此,最终结果...
- `UNION ALL` 同样合并结果,但保留所有行,包括重复行。 - `EXCEPT` 运算符返回只在第一个查询中出现的行,如 `SELECT ... FROM table1 EXCEPT SELECT ... FROM table2`,`EXCEPT ALL` 不去除重复行。 - `...
- `UNION ALL` 同样合并结果,但保留所有行,包括重复行。 - `EXCEPT` 返回在第一个查询中存在,但在第二个查询中不存在的行,如 `SELECT...EXCEPT SELECT...`。 - `EXCEPT ALL` 类似于 `EXCEPT`,但不删除重复行...
3. **避免`OR`条件**:`OR`连接的条件同样会阻碍索引的使用,可将其拆分为多个查询,用`UNION ALL`合并结果。 4. **谨慎使用`IN`和`NOT IN`**:这些操作可能导致全表扫描,尤其是当值集合较大时。对于连续的数值,...
- **注意**:`UNION`和`UNION ALL`要求查询的列数相同,且相应列的数据类型相容。 ### 10. ROWID #### SQL语句: ```sql SELECT ROWID, sname FROM student; ``` - **知识点**:`ROWID`是Oracle的一个特殊列,它...
SQL Server 模糊查询语句 SQL Server 模糊查询语句是指使用 LIKE ...INSERT INTO a SELECT '11%22' UNION ALL SELECT '11%33' UNION ALL SELECT '12% 这些示例展示了 SQL Server 模糊查询语句的使用方法和应用场景。