首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
9.1 基本查询语句
9.2 单表查询
9.2.1 查询所有字段
9.2.2 查询指定字段
9.2.3 查询指定数据
9.2.4 带关键字IN的查询
9.2.5 带关键字BETWEEN AND的范围查询
9.2.6 带LIKE的字符匹配查询
9.2.7 用IS NULL关键字查询空值
9.2.8 带AND的多条件查询
9.2.9 带OR的多条件查询
9.2.10 用DISTINCT关键字去除结果中的重复行
9.2.11 用ORDER BY关键字对查询结果进行排序
9.2.12 用GROUP BY关键字分组查询
9.2.13 用LIMIT限制查询结果的数量
9.3 聚合函数查询
9.3.1 COUNT()统计函数
9.3.2 SUM()求和函数
9.3.3 AVG()平均数函数
9.3.4 MAX()最大值函数
9.3.5 MIN()最小值函数
9.4 连接查询
9.4.1 内连接查询
9.4.2 外连接查询
9.4.3 复合条件连接查询
9.5 子查询
9.5.1 带IN关键字的子查询
9.5.2 带比较运算符的子查询
9.5.3 带EXISTS关键字的子查询
9.5.4 带ANY关键字的子查询
9.5.5 带ALL关键字的子查询
9.6 合并查询结果
9.7 定义表和字段的别名
9.7.1 为表取别名
9.7.2 为字段取别名
9.8 使用正则表达式查询
9.8.1 匹配指定字符中的任意一个
9.8.2 使用“*”和“ ”来匹配多个字符
9.8.3 匹配以指定的字符开头和结束的记录
10.1 MySQL函数
10.2 数学函数
10.2.1 ABS(x)绝对值函数
10.2.2 FLOOR(x)向下取整函数
10.2.3 RAND()随机数函数
10.2.4 PI()圆周率函数
10.2.5 TRUNCATE(x,y)截断函数
10.2.6 ROUND(x)近似值函数和ROUND(x,y)四舍五入函数
10.2.7 SQRT(x)平方函数
10.3 字符串函数
10.3.1 INSERT(s1,x,len,s2)替换函数
10.3.2 UPPER(s)函数和UCASE(s)字母大写函数
10.3.3 LEFT(s,n)取左函数
10.3.4 RTRIM(s)去空格函数
10.3.5 SUBSTRING(s,n,len)截取函数
10.3.6 REVERSE(s)反转函数
10.3.7 FIELD(s,s1,s2,…,sn)位置函数
10.3.8 LOCATE(s1,s)、POSITION(s1 IN s)和INSTR(s,s1)3个位置函数
10.4 日期和时间函数
10.4.1 CURDATE()和CURRENT_DATE()当前日期函数
10.4.2 CURTIME()和CURRENT_TIME()当前时间函数
10.4.3 NOW()当前日期和时间函数
10.4.4 DATEDIFF(d1,d2)间隔天数函数
10.4.5 ADDDATE(d,n)日期计算函数
10.4.6 ADDDATE(d,INTERVAL expr type)日期时间计算函数
10.4.7 SUBDATE(d,n)日期计算函数
10.5 条件判断函数
10.6 系统信息函数
10.6.1 获取MySQL版本号、连接数和数据库名的函数
10.6.2 获取用户名的函数
10.6.3 获取字符串的字符集和排序方式的函数
10.7.1 格式化函数FORMAT(x,n)
10.7.2 改变字符集的函数
10.7.3 改变字段数据类型的函数
当前位置:
首页>>
技术小册>>
MySQL从入门到精通(三)
小册名称:MySQL从入门到精通(三)
### 第9章 高级查询技巧 #### 9.6 合并查询结果 在数据库管理中,经常需要从多个表中提取数据或将同一表中的数据以不同方式呈现。MySQL提供了强大的查询功能,包括`UNION`、`UNION ALL`、`JOIN`等操作符,用于合并查询结果。本章将深入探讨如何使用`UNION`和`UNION ALL`来合并多个`SELECT`语句的结果集,以及这些操作符在实际应用中的注意事项和最佳实践。 ### 9.6.1 UNION 与 UNION ALL 的基础 #### UNION `UNION`操作符用于合并两个或多个`SELECT`语句的结果集,并自动去除重复的行。它要求每个`SELECT`语句必须拥有相同数量的列,并且对应列的数据类型也需要兼容。`UNION`结果集中的列名是从第一个`SELECT`语句中获取的。 **语法示例**: ```sql SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; ``` #### UNION ALL 与`UNION`类似,`UNION ALL`也用于合并多个`SELECT`语句的结果集,但不同之处在于它不会去除重复的行。这意味着如果两个查询结果中有相同的行,这些行在最终结果集中都会出现。`UNION ALL`通常比`UNION`执行得更快,因为它不需要执行去重操作。 **语法示例**: ```sql SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2; ``` ### 9.6.2 使用场景与示例 #### 场景一:合并相同结构的表数据 假设有两个表,`employees_2020`和`employees_2021`,它们记录了2020年和2021年的员工信息,且表结构相同(如员工ID、姓名、部门)。现在需要查询这两年中所有员工的名单,去除重复的姓名。 **SQL查询**: ```sql SELECT name FROM employees_2020 UNION SELECT name FROM employees_2021; ``` #### 场景二:包含所有重复数据的合并 如果我们需要保留所有重复的数据,即查看这两年中所有员工的姓名,包括重复出现的,那么应使用`UNION ALL`。 **SQL查询**: ```sql SELECT name FROM employees_2020 UNION ALL SELECT name FROM employees_2021; ``` #### 场景三:合并不同但相关的查询结果 有时,我们需要合并的查询结果可能来自不同但逻辑上相关的查询,或者需要对同一表的不同字段进行条件筛选后合并。 **示例**: 假设有一个`sales`表,记录了不同产品的销售信息(产品ID、销售额、销售日期)。我们想要合并两个查询:一是2023年销售额超过1000的产品ID,二是2022年销售额超过500的产品ID,但不希望去除重复的产品ID。 **SQL查询**: ```sql SELECT product_id FROM sales WHERE YEAR(sale_date) = 2023 AND amount > 1000 UNION ALL SELECT product_id FROM sales WHERE YEAR(sale_date) = 2022 AND amount > 500; ``` ### 9.6.3 注意事项与最佳实践 1. **列的数量和类型匹配**:使用`UNION`或`UNION ALL`时,确保每个`SELECT`语句中的列数相同,且对应列的数据类型兼容。 2. **排序与分页**:如果需要对合并后的结果进行排序或分页,最好在外层查询中使用`ORDER BY`和`LIMIT`,因为`UNION`或`UNION ALL`本身不保证结果的顺序。 3. **性能考虑**:在合并大量数据时,`UNION ALL`通常比`UNION`快,因为避免了去重操作。然而,如果结果集中存在大量重复数据,而你又需要去除这些重复数据,那么`UNION`可能是必要的,但此时应注意查询性能可能受到影响。 4. **索引使用**:虽然`UNION`和`UNION ALL`不直接利用索引来加速合并过程,但确保每个`SELECT`语句中的查询条件能够利用索引,可以显著提高每个子查询的效率,从而间接提升整个合并查询的性能。 5. **逻辑清晰**:当合并多个复杂查询时,保持SQL语句的逻辑清晰至关重要。可以使用子查询、临时表或视图来组织复杂的查询逻辑,使主查询更加简洁易懂。 6. **错误处理**:在处理多个数据源或复杂查询时,要注意可能出现的错误,如数据类型不匹配、列名冲突等,并准备相应的错误处理机制。 ### 9.6.4 进阶应用:结合JOIN与UNION 在某些情况下,可能需要先通过`JOIN`合并表数据,然后再使用`UNION`或`UNION ALL`来合并多个`JOIN`查询的结果。这种组合使用能够解决更复杂的数据查询需求,但也需要更高的SQL技巧和注意事项。 **示例**: 假设有两个表`orders`(订单)和`customers`(客户),以及一个`returns`(退货)表,现在想要查询所有订单的客户姓名和退货的客户姓名,且不想看到重复的姓名。 ```sql SELECT DISTINCT c.name FROM customers c JOIN orders o ON c.id = o.customer_id UNION SELECT DISTINCT c.name FROM customers c JOIN returns r ON c.id = r.customer_id; ``` 在这个例子中,我们首先通过`JOIN`分别将`customers`表与`orders`表和`returns`表连接起来,然后使用`UNION`去除重复的客户姓名。注意这里使用了`DISTINCT`来确保在`UNION`之前每个查询结果中都没有重复的行,但这在直接使用`UNION`时通常是多余的,因为`UNION`已经自动去除了重复行。然而,在某些复杂情况下,先使用`DISTINCT`可能会使查询更清晰或更高效。 综上所述,`UNION`和`UNION ALL`是MySQL中非常有用的操作符,它们允许我们以灵活的方式合并多个查询结果。通过合理应用这些操作符,我们可以解决各种复杂的数据查询问题,提高数据处理的效率和准确性。
上一篇:
9.5.5 带ALL关键字的子查询
下一篇:
9.7 定义表和字段的别名
该分类下的相关小册推荐:
MySQL8.0入门与实践
MySQL从入门到精通(四)
SQL零基础到熟练应用(增删改查)
MySQL从入门到精通(五)
细说MySQL(零基础到高级应用)
MySQL从入门到精通(一)
MySQL从入门到精通(二)
MySQL 实战 45 讲
MySQL必会核心问题