三级数据库技术-第六章考点
考点和考察形式


SELECT及其子句
一般形式:
SELECT [ALL|DISTINCT] [TOP N]
FROM table1 [,table2...]
[WHERE <条件表达式>]
[GROUP BY...[HAVING]...]
[ORDER BY...[ASC|DESC]]
TOP 限制结果集【填】
当使用select 语句进行查询时,有时列出结果集的前几行的数据,而不是全部数据,可以使用TOP谓词限制输出结果
语法:
TOP n [percent] [WITH TIES];

🔺注意:
- WITH TIES 必须搭配 ORDER BY 使用
- TOP 一般与 ORDER BY 一起使用,否则"前 n 行"没有实际意义
- TOP 直接跟在 SELECT 关键字后面
- n 可以是小数,如 TOP 10.5 percent
真题:



子查询无法使用ORDER BY

CASE多分支表达式⭐【填/选】
可以在查询语句中使用 CASE 函数,以达到分情况显示不同类型的数据的目的。
CASE 函数是一种多分支表达式,它计算条件列表并返回多个可能的结果表达式中的一个。
CASE分为简单CASE函数和搜索CASE函数
简单CASE函数
简单CASE函数用于等值测试。
CASE 测试表达式
WHEN 简单表达式1 THEN 结果表达式1
WHEN 简单表达式2 THEN 结果表达式2
...
WHEN 简单表达式n THEN 结果表达式n
[ELSE 结果表达式 n+1]
END;
执行过程:
计算测试表达式 →
按从上到下顺序与每个 WHEN 的简单表达式的值比较 →
返回第一个匹配的 THEN 后的结果 →
都不匹配则返回 ELSE(无 ELSE 则返回 NULL)
搜索CASE函数
CASE
WHEN 布尔表达式1 THEN 结果表达式1
WHEN 布尔表达式2 THEN 结果表达式2
...
WHEN 布尔表达式n THEN 结果表达式n
[ELSE 结果表达式 n+1]
END;
区别 ⚠️:搜索 CASE 的 WHEN 子句使用布尔表达式(可用比较运算符和逻辑运算符),而非与测试表达式直接比较。

真题:


INTO — 将查询结果保存到新表 ⭐【填】
当使用 SELECT 语句查询数据时,产生的结果是保存在内存中的。如果希望将查询结果永久保存下来,比如保存在一个表中,则可以通过在 SELECT 语句中使用 INTO 子句实现。
SELECT 查询列表序列 INTO <新表名>
FROM 数据源
...
三个功能
- 根据查询语句列出的列及其类型创建一个新表
- 执行查询语句
- 将查询结果插入到新表中
🔺用 INTO 子句创建的新表可以是永久表,也可以是临时表。临时表又根据其使用范围分为局部临时表和全局临时表两种。

例子:

🔺辨析:

🔺真题

集合运算
并运算UNION 🔥【选/填】
并运算可将两个或多个查询语句的结果集合并为一个结果集,这个运算可以使用 UNION 运算符实现。
SELECT 语句1
UNION [ALL]
SELECT 语句2
UNION [ALL]
...
SELECT 语句n
🔺ALL关键字

🔺UNION 与JOIN区分

使用限制 🔥
- 所有 SELECT 列表中列的个数必须相同
- 对应列的数据类型必须隐式兼容
- 合并后的结果集采用第一个 SELECT 语句的列标题
- ORDER BY 只能写在最后一个查询语句之后,排序依据列必须是第一个查询语句中出现的列名
真题:

交运算 — INTERSECT 🔥【选/填】
交运算将返回同时在两个集合中出现的记录,即返回两个查询结果集中各个列的值均相同的记录,并用这些记录构成交运算的结果。
SELECT 语句1
INTERSECT
SELECT 语句2
关键词拆解
- "同时在两个集合中出现":相当于集合论中的交集(∩)
- 对各查询语句的要求同 UNION(列数相同、类型兼容)
差运算 — EXCEPT 🔥【选/填】
差运算将返回在第一个集合中有但第二个集合中没有的数据。
SELECT 语句1
EXCEPT
SELECT 语句2
真题

子查询
在 SQL 语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块。如果一个 SELECT 语句是嵌套在一个 SELECT、INSERT、UPDATE 或 DELETE 语句中,则称为子查询或内层查询,包含子查询的语句称为主查询或外层查询。
子查询的三种形式
WHERE 表达式 [NOT] IN (子查询) ← 基于集合的测试
WHERE 表达式 比较运算符 (子查询) ← 比较测试
WHERE [NOT] EXISTS (子查询) ← 存在性测试
使用子查询进行基于集合的测试 — IN / NOT IN 🔥
WHERE 表达式 [NOT] IN (子查询)
执行顺序 ⚠️:先执行子查询 → 再在子查询结果基础上执行外层查询。
子查询返回一个集合,外层查询用 IN 运算符逐行比较。
比较测试 — 比较运算符(标量子查询)
WHERE 表达式 比较运算符 (子查询)
比较运算符:=、<>、<、>、<=、>=
⚠️ 子查询必须是返回单值的查询语句
通过比较运算符(=、<>、…)将一个表达式的值与子查询返回的单值进行比较
7.3 存在性测试 — EXISTS / NOT EXISTS 🔥🔥
WHERE [NOT] EXISTS (子查询)

EXISTS:子查询中有满足条件的数据时 → 返回真
NOT EXISTS:子查询中没有满足条件的数据时 → 返回真
辨析

真题

派生表达式的子查询
替代表达式的子查询是指在 SELECT 语句的选择列表中嵌入一个只返回一个标量值的 SELECT 语句,这个查询语句通常都是通过一个聚合函数来返回一个单值。
要点:返回标量(单值),可出现在任何允许使用表达式的地方。

派生表
派生表(有时也称为内联视图)是将子查询作为一个表来处理,这个由子查询产生的新表就被称为"派生表",这很类似于临时表。
要点:
- 派生表出现在 FROM 子句中
- 必须指定别名
- 类似临时表但不显式创建
SELECT * FROM (SELECT cust_id, cust_name FROM Customer) AS T1
开窗函数
在 SQL Server 中,一组被称为窗口,开窗函数是指可用于“分区”或“分组”计算函数
这些函数结合 OVER 子句对组内的数据进行编号,并进行求和、计算平均值等统计。
开窗函数可以分别应用于每个分区,把每个分区看成是一个窗口,并为每个分区进行计算。
🔺开窗函数必须放在 OVER 子句前边。
排名函数和聚合函数

普通聚合函数每组返回一个值,开窗函数可以为每组返回多个值


语法:
开窗函数可以分别应用于每个分区,每个分区看成一个窗口
开窗函数必须在OVER子句的前边
<开窗函数>(<参数>) OVER(
[PARTITION BY value_expression,...] - 可选:按哪些列分组(类似GROUP BY)
[ORDER BY ...]-- 可选:窗口内的行排序
[ROWS/RANGE <窗口范围>] -- 可选:定义窗口的物理/逻辑范围
)
其中:
PARTITION BY将结果集划分为多个分区,开窗函数分别应用于每个分区,为每个分区计算函数值
value_expression分区依据的列
排名函数对比


真题

公用表达式CTE
公用表表达式(Common Table Expression,CTE)是将查询语句产生的结果集指定一个临时命名的名字,这些命名的结果集就称为公用表表达式。命名后的公用表表达式就可以在 SELECT、INSERT、UPDATE、DELETE 等语句中被多次引用。
一旦查询执行完毕,这个CTE就消失了,不会在数据库中留下任何痕迹。
语法
WITH <CTE名称> [(列1,列2,...)]
AS(
SELECT 子句
)
SELECT ... FROM <CTE名称>;
特点:

例子:
WITH customer_totals AS (
SELECT
CustomerID,
SUM(Amount) AS total_sales
FROM Orders
GROUP BY CustomerID
)
SELECT *
FROM customer_totals
WHERE total_sales > 10000;
END
编者注:三级数据库考试涉及知识点不多,且粗略。
部分内容如CTE,嵌套查询,开窗函数等可参见MYSQL学习笔记


浙公网安备 33010602011771号