SQL两次不同条件查询一张表的结果合并
在SQL中,我们经常会遇到需要针对同一张表进行两次不同条件的查询,并希望将这两次查询的结果合并在一起。这种情况下,我们可以使用UNION或UNION ALL关键字来实现结果的合并。
UNION和UNION ALL的区别
首先,我们来了解一下UNION和UNION ALL这两个关键字的区别。
- UNION:UNION操作符用于合并两个或多个SELECT语句的结果集,并去除重复的行。换句话说,UNION会将两个结果集合并在一起,并去除重复的行。
- UNION ALL:UNION ALL操作符也用于合并两个或多个SELECT语句的结果集,但不去除重复的行。换句话说,UNION ALL会将两个结果集合并在一起,包括重复的行。
示例
假设我们有一个名为students
的表,表结构如下:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
gender VARCHAR(10)
);
INSERT INTO students (id, name, age, gender) VALUES
(1, 'Alice', 20, 'Female'),
(2, 'Bob', 22, 'Male'),
(3, 'Charlie', 21, 'Male'),
(4, 'David', 23, 'Male'),
(5, 'Eve', 20, 'Female');
现在我们需要查询students
表中满足以下两个条件的数据:
- 年龄小于等于21岁的学生;
- 性别为男性的学生。
我们可以分别编写两个SELECT语句来满足以上两个条件,并使用UNION或UNION ALL关键字将两个结果集合并在一起。
-- 查询年龄小于等于21岁的学生
SELECT * FROM students
WHERE age <= 21
UNION
-- 查询性别为男性的学生
SELECT * FROM students
WHERE gender = 'Male';
上述SQL查询语句将会返回如下结果:
| id | name | age | gender |
|----|---------|-----|--------|
| 1 | Alice | 20 | Female |
| 2 | Bob | 22 | Male |
| 3 | Charlie | 21 | Male |
| 4 | David | 23 | Male |
如果我们使用UNION ALL关键字来合并两个结果集,则会包含重复的行:
-- 查询年龄小于等于21岁的学生
SELECT * FROM students
WHERE age <= 21
UNION ALL
-- 查询性别为男性的学生
SELECT * FROM students
WHERE gender = 'Male';
上述SQL查询语句将会返回如下结果:
| id | name | age | gender |
|----|---------|-----|--------|
| 1 | Alice | 20 | Female |
| 3 | Charlie | 21 | Male |
| 4 | David | 23 | Male |
| 2 | Bob | 22 | Male |
| 3 | Charlie | 21 | Male |
总结
通过使用UNION或UNION ALL关键字,我们可以很方便地将两个不同条件查询的结果合并在一起。需要注意的是,UNION会去除重复的行,而UNION ALL会保留所有行,包括重复的行。在实际应用中,我们可以根据具体的需求来选择合适的关键字来完成结果的合并操作。