SQL基础:sql语句中union的用法与踩坑记录

1. 了解Union的基本用法

在SQL语句中,Union是常用的关键字之一,用来将两个或多个Select语句的结果合并成一个结果集。Union的使用方法很简单,只需在两个Select语句之间添加Union关键字即可。

例如,我们有两张表A和B,分别包含学生的成绩和考试时间的记录。

-- 创建A表,包含学生的成绩记录

CREATE TABLE A (

student_id INT,

score INT

);

-- 创建B表,包含考试时间的记录

CREATE TABLE B (

student_id INT,

exam_time DATE

);

-- 向A表中插入数据

INSERT INTO A VALUES (1, 90), (2, 80), (3, 70);

-- 向B表中插入数据

INSERT INTO B VALUES (1, '2021-01-01'), (2, '2021-01-02'), (3, '2021-01-03');

我们可以使用Union来将这两个表的数据合并:

-- 选取A表中的数据

SELECT student_id, score FROM A

UNION

-- 选取B表中的数据

SELECT student_id, exam_time FROM B;

以上SQL语句返回的结果集中包含了两个表的所有记录:

student_id | score

-----------+-------

1 | 90

2 | 80

3 | 70

1 | 2021-01-01

2 | 2021-01-02

3 | 2021-01-03

需要注意的是,Union会自动去重,即如果两个Select语句的结果集中有重复的记录,Union只会将其中的一条记录保留在结果集中。

2. Union All的使用方法

与Union不同的是,Union All不会自动去重,而是将两个Select语句的结果集合并在一起。

以下示例代码展示了如何使用Union All:

-- 选取A表中的数据

SELECT student_id, score FROM A

UNION ALL

-- 选取B表中的数据

SELECT student_id, exam_time FROM B;

Union All返回的结果集与Union相比,会包含所有的记录:

student_id | score

-----------+-------

1 | 90

2 | 80

3 | 70

1 | 2021-01-01

2 | 2021-01-02

3 | 2021-01-03

需要注意的是,使用Union All可能会导致结果集中包含大量的重复记录。

3. 在Union中使用常量

假设我们需要在结果集中添加一列常量,可以使用以下SQL语句:

-- 在结果集中添加一列常量值

SELECT student_id, score, 'A' AS type FROM A

UNION ALL

SELECT student_id, exam_time, 'B' AS type FROM B;

以上SQL语句将返回以下结果集:

student_id | score | type

-----------+-------+-----

1 | 90 | A

2 | 80 | A

3 | 70 | A

1 | 2021-01-01 | B

2 | 2021-01-02 | B

3 | 2021-01-03 | B

可以看到,我们在结果集中新增了一列名为type的常量列,其中A和B分别代表着结果集来自A表和B表。

4. 踩坑记录

4.1 Union和Order By的注意事项

如果在使用Union时需要对结果集进行排序,需要将Order By的语句写在最后一个Select语句之后。

例如,以下SQL语句会导致错误:

SELECT student_id, score FROM A

UNION

SELECT student_id, exam_time FROM B

ORDER BY student_id;

正确的写法如下:

SELECT student_id, score FROM A

UNION

SELECT student_id, exam_time FROM B

ORDER BY student_id DESC;

需要注意的是,Order By支持对多个列进行排序,如果需要对多列进行排序,可以在Order By语句中使用逗号分隔。

4.2 Union和Limit的注意事项

在使用Union时,如果需要限制结果集的大小,可以使用Limit关键字。需要注意的是,Limit关键字只能写在最后一个Select语句之后。

例如,以下SQL语句会导致错误:

SELECT student_id, score FROM A

UNION

SELECT student_id, exam_time FROM B

LIMIT 3;

正确的写法如下:

SELECT student_id, score FROM A

UNION

SELECT student_id, exam_time FROM B

ORDER BY student_id DESC

LIMIT 3;

需要注意的是,如果在使用Limit时需要改变偏移量,可以在Limit后面添加偏移量,例如:

SELECT student_id, score FROM A

UNION

SELECT student_id, exam_time FROM B

ORDER BY student_id DESC

LIMIT 3 OFFSET 1;

以上SQL语句将返回从第二行开始的三行记录。

总结

本文介绍了Union的基本用法和Union All的使用方法,同时还介绍了如何在Union中使用常量,并给出了在使用Union时需要注意的事项和踩坑记录。

需要注意的是,在使用Union时需要谨慎,避免结果集中包含大量的重复记录,同时在使用Order By和Limit时需要注意语句的书写顺序。

数据库标签