UNION 对两个 SELECT 查询的结果做什么?
- A按某个键把它们左右并排连接
- B只保留同时出现在两者中的行
- C把它们合并为一个结果并去除重复行
- D只保留出现在第一个查询中而不在第二个查询中的行
显示提示
- 两个查询必须有相同数量且类型兼容的列。
- 两个错误答案已被划掉。剩下的两个中有一个是正确的。
显示答案和解析
为什么是这个答案
UNION 把两个查询的行叠加起来并去除重复;UNION ALL 保留重复行。
免费的数据库与 SQL选择练习题,附提示和解析,分三个难度:关键术语与事实, 概念应用, 案例与分析。
哪种约束确保某列永远不能留空(NULL)?
做得好。想再做下一题吗?准备好做下一题了吗? 每个主题每天都有 5 道新题。
关系数据库把数据存储在表中。表看起来像电子表格:每一行是一条记录,每一列是一种属性。
一家商店可能有一张表 customers,列为 id、name 和 city,还有一张表 orders,列为 id、customer_id 和 total。
主键是唯一标识每一行的一列或一组列。它永远不能重复,也永远不能为空。这里就是每张表的 id。
外键是引用另一张表主键的列。在 orders 中,customer_id 说明是哪位客户下了订单。
表就是这样关联的:一位客户可以有许多订单,但每个订单只属于一位客户。这是一对多关系。
SQL(结构化查询语言)是你用来创建表、修改数据以及对数据提问的语言。
答案: 唯一标识每一行的一列或一组列. 主键是唯一的且从不为 NULL,所以它恰好选出一行。引用另一张表的列是外键。
大多数题目都涉及 SELECT 语句。它由子句构成,书写顺序总是这样:
聚合函数把许多行汇总成一个值:COUNT、SUM、AVG、MIN 和 MAX。
数据库并不按你书写的顺序运行这些子句。它先运行 FROM,然后是 WHERE、GROUP BY、HAVING、SELECT,最后是 ORDER BY。
其他语句改变数据:INSERT 添加行,UPDATE 修改行,DELETE 删除行。CREATE、ALTER 和 DROP 改变表本身。
答案: HAVING. 计数只有在行被分组之后才存在,而 HAVING 过滤的是组。WHERE 在分组之前运行,所以它不能使用 COUNT 之类的聚合函数。
连接(join)使用条件把两张表的行组合起来,通常是外键 = 主键:
规范化拆分表,使每个事实只存储一次。这避免了在多处更新同一个事实。
事务把若干语句组合成一个单元。COMMIT 使它永久生效,ROLLBACK 撤销它。事务遵循 ACID:原子性(要么全做要么全不做)、一致性、隔离性和持久性。
答案: 这位客户出现一次,订单列为 NULL. LEFT JOIN 保留左表的每一行,并用 NULL 填充缺失的右侧。把这位客户排除在外是 INNER JOIN 的做法。
要写一个查询,或判断一个给定的查询返回什么:
对于理论题,先说出概念(键、连接类型、范式、ACID 属性),然后选与其定义相符的选项。
跟着每一步走。打开下一步之前,先试着预测它。
表 customers 有行 (1, Ana)、(2, Ben) 和 (3, Cas)。表 orders 有行 (id, customer_id) = (10, 1)、(11, 1)、(12, 2) 和 (13, 1)。这个查询返回什么?SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name
每位客户与带有其 id 的订单配对。Ana 匹配订单 10、11 和 13。Ben 匹配订单 12。
Cas 没有订单。因为是 LEFT JOIN,Cas 留在结果中,o.id 为 NULL。
一共 5 行。
GROUP BY c.name 形成三个组:Ana 有 3 行,Ben 有 1 行,Cas 有 1 行。
COUNT(o.id) 只统计不为 NULL 的值。Ana 得 3,Ben 得 1。
Cas 有一行,但它的 o.id 是 NULL,所以 Cas 得 0。
Ana、Ben 和 Cas 合计有 3 + 1 + 0 = 4 个订单,与 orders 的行数相同。如果改用 COUNT(*),Cas 会错误地得到 1,因为 COUNT(*) 统计的是这一行本身。
Ana 3,Ben 1,Cas 0。
答案: 0. COUNT(col) 只统计不为 NULL 的值,所以返回 0。COUNT(*) 统计行数,会返回 10。
给出查询时,按 FROM、WHERE、GROUP BY、HAVING、SELECT、ORDER BY 的顺序在几行数据上跟踪它。大多数陷阱在三行之内就会显现。
UNION 对两个 SELECT 查询的结果做什么?
UNION 把两个查询的行叠加起来并去除重复;UNION ALL 保留重复行。
当 WHERE 子句没有匹配任何行时,SELECT SUM(amount) FROM orders 返回什么?
SUM、AVG、MIN 和 MAX 在空集上返回 NULL,而 COUNT 返回 0;COALESCE(SUM(amount), 0) 则会返回 0。
SELECT name, dept, AVG(salary) OVER (PARTITION BY dept) FROM emp 返回什么?
与 GROUP BY 不同,窗口函数保留每一行输入,并加上一个在其分区(这里是部门)上计算出的值。
一家商店可能有一张表 customers,列为 id、name 和 city,还有一张表 orders,列为 id、customer_id 和 total。
表就是这样关联的:一位客户可以有许多订单,但每个订单只属于一位客户。这是一对多关系。
每道题有四个选项,只有一个正确。 卡住了?先打开一个小提示,需要时再查看完整解析。