SQL查询专项:从完整书写到综合判断

2026年10月16日,第5天。针对案例A3/C3缺ON、WHERE误筛外连接、GROUP BY遗漏,以及NOT EXISTS/NULL、COUNT/CASE/SUM和空输入的薄弱项。覆盖常见SQL查询结构和可组合的典型题型,不承诺穷尽全部命题;查询与SQL语言概览不等于覆盖数据库全部范式、并发、恢复和索引理论。

先学第1~12节并能闭卷写出完整查询;再学第13~20节的连接扩展、子查询、集合与排名。正确阅读和执行示例不记为独立掌握。配套SQL文件为虚构的新建练习库数据和33条查询,无真实业务操作。

1. 先把SQL名称分清

类别 含义 代表语句
DDL 定义数据结构 CREATE、ALTER、DROP
DML 操作数据 INSERT、UPDATE、DELETE
查询 检索数据,常单列称DQL,也有教材归入广义DML SELECT
DCL 权限控制 GRANT、REVOKE
事务控制 提交、撤销、保存点等 COMMIT、ROLLBACK、SAVEPOINT

SQL大小写通常不影响关键字;字符串用英文单引号。双引号在标准SQL中用于标识符,不应把中文弯引号"已支付"当成通用SQL字符串。对象名大小写、日期函数、分页等依题目产品;本讲义以通用写法为主,必要处注明方言差异。

2. 统一示例:四个客户、六张订单

Customer(customer_id主键,customer_name,city):

customer_id customer_name city
1 甲公司 南京
2 乙公司 苏州
3 丙商店 南京
4 丁公司 NULL

Orders(order_id主键,customer_id外键且允许NULL,status,amount可NULL,order_date):

order_id customer_id status amount order_date
101 1 已支付 100 2026-10-10
102 1 已取消 200 2026-10-11
103 1 已支付 300 2026-10-12
104 3 已取消 50 2026-10-13
105 NULL 已支付 80 2026-10-14
106 3 已支付 NULL 2026-10-15

客户2、4没有订单。客户3有一张金额未知的已支付订单;不能说他没有已支付订单。订单105允许customer_id为NULL;外键不自动等于NOT NULL。

3. SELECT的书写骨架

复制代码
SELECT 查询列或表达式
FROM 主表 AS a
LEFT JOIN 另一张表 AS b
  ON 两表的匹配条件
WHERE 分组前的行条件
GROUP BY 分组字段
HAVING 分组后的组条件
ORDER BY 排序字段;

不是每条查询都需要所有子句,按需求选用。ON不能空着,HAVING不能当连接条件;写聚合且按客户输出,一般要按客户GROUP BY。即使已声明外键,数据库也不会自动替普通JOIN补出ON;应明确写出两侧关联列。若连接依赖组合键,要核对每个组成列,少一项可能错误配对。

语句部分 你要回答的问题
SELECT 最后显示什么
FROM/JOIN 需要哪些表,以哪张为起点
ON 两行按什么条件配对
WHERE 哪些输入行保留
GROUP BY 以什么单位分别统计
HAVING 哪些统计组保留
ORDER BY 最终按什么顺序排列

4. 书写顺序与逻辑处理顺序

对本讲义普通查询,可按下面的逻辑理解:

复制代码
FROM/JOIN及ON匹配、外连接补行
→ WHERE
→ GROUP BY及聚合
→ HAVING
→ 窗口计算(有时)
→ SELECT输出
→ DISTINCT
→ ORDER BY
→ 分页/取前N

这是语义理解顺序,不是优化器必须采用的物理执行步骤。子查询、窗口等各自有查询层次。

因此同一查询层的WHERE中不能直接用COUNT/SUM做该层聚合筛选。为通用性,WHERE/HAVING不要依赖同层SELECT刚定义的别名;ORDER BY通常可用输出别名。需要复用表达式时增加子查询或CTE。

5. 基础筛选:比较、范围、字符串、括号、日期

复制代码
SELECT order_id, amount
FROM Orders
WHERE status='已支付'
ORDER BY order_id;

结果101/100、103/300、105/80、106/NULL。

条件 含义及易错点
amount>=100 比较值;NULL参与普通比较得到UNKNOWN
amount BETWEEN 100 AND 300 包含两个端点
status IN ('已支付','已取消') 匹配集合内任一值
customer_name LIKE '甲%' %匹配零个或多个字符
customer_name LIKE '_公司' _匹配一个字符
city IS NULL 判断空值,不能用city=NULL
条件A AND (条件B OR 条件C) 显式写清业务组合,AND优先于OR

如仅查已支付且金额<100或>150:

复制代码
SELECT order_id
FROM Orders
WHERE status='已支付'
  AND (amount<100 OR amount>150)
ORDER BY order_id;

结果103、105。漏括号会多出已取消的102,因为amount>150的分支脱离已支付约束。

月份可用半开区间表达,兼顾带时分秒的列:

复制代码
WHERE order_date >= '2026-10-01'
  AND order_date <  '2026-11-01'

示例列为DATE;实际日期类型、字面量转换按题目产品。LIKE大小写、转义和排序规则也依产品配置。

6. NULL不是0:SQL三值逻辑

NULL表示值缺失、未知或外连接没有匹配等情况;不是数字0,也不是文本'NULL'。空字符串与NULL是否等同也有产品差异,不混用。

复制代码
NULL = 0        → UNKNOWN
NULL = NULL     → UNKNOWN
NULL <> 0       → UNKNOWN
NOT UNKNOWN    → UNKNOWN
NULL IS NULL    → TRUE

WHERE、HAVING只保留条件为TRUE的行/组;FALSE和UNKNOWN都不保留。ON也只有TRUE才构成匹配,但外连接还会保留未匹配一侧并补NULL。

表达式 结果
TRUE AND UNKNOWN UNKNOWN
FALSE AND UNKNOWN FALSE
TRUE OR UNKNOWN TRUE
FALSE OR UNKNOWN UNKNOWN

来源核对:比较与NULL、逻辑运算。

7. ON、WHERE、HAVING必须分工

例:只输出已支付总额超过200的客户:

复制代码
SELECT customer_id,
       COUNT(*) AS order_count,
       SUM(amount) AS total_amount
FROM Orders
WHERE status='已支付'
GROUP BY customer_id
HAVING SUM(amount)>200
ORDER BY customer_id;

结果客户1,2单,总额400。

  • WHERE先排除已取消订单。

  • GROUP BY把同一客户的行放入一组。

  • HAVING判断整个组的总金额。

同层WHERE SUM(amount)>200不对;HAVING不是把任何WHERE条件搬过去的工具,更不是ON的替代。HAVING可以不带显式GROUP BY而对整体汇总组筛选,不能反过来背成"出现HAVING必有GROUP BY";但题目要求每客户分别统计时,必须建立对应分组。

GROUP BY之后,每个输出表达式应有明确的组内含义。考试中先按保守可移植规则:非聚合输出字段列入GROUP BY;除非题目明确允许由分组键函数确定等产品规则。

复制代码
SELECT c.customer_id, c.customer_name, COUNT(o.order_id)
FROM Customer c
LEFT JOIN Orders o ON o.customer_id=c.customer_id
GROUP BY c.customer_id, c.customer_name;

不要在只按客户分组时直接输出一个未经聚合的订单号。

8. 连接先看"哪些对象必须保留"

连接 保留方式
INNER JOIN 仅保留匹配组合
LEFT JOIN 保留左表全部行,未匹配右侧补NULL
RIGHT JOIN 保留右表全部行
FULL JOIN 保留双方未匹配行,另一侧补NULL
CROSS JOIN 笛卡尔积;m行与n行得到m×n组合

示例客户与全部订单INNER JOIN为5行,Customer LEFT JOIN Orders为7行:客户1三行、客户2占位一行、客户3两行、客户4占位一行。FULL JOIN再加入客户号NULL的105订单,为8行。CROSS JOIN为4×6=24行。这里按给定数据、不加额外筛选计算。

自连接是同一表起两个别名,不是新连接运算:例如同城不同客户,只输出一次可加a.customer_id<b.customer_id。USING要求对应列同名;NATURAL JOIN会比较所有同名列,不会自动只选择主外键。

9. 你必须会写的核心模板:全部客户+已支付订单数

复制代码
SELECT c.customer_id,
       COUNT(o.order_id) AS paid_count,
       COALESCE(SUM(o.amount),0) AS paid_amount
FROM Customer AS c
LEFT JOIN Orders AS o
  ON o.customer_id=c.customer_id
 AND o.status='已支付'
GROUP BY c.customer_id
ORDER BY c.customer_id;
客户 已支付订单数 显示金额
1 2 400
2 0 0
3 1 0
4 0 0

客户3的0来自把未知金额NULL替换为0的显示规则,不能据此断言其真实金额为0。若业务要区分未知,应保留NULL并同时输出订单数、已知金额数量。

逐句翻译:所有客户作起点;右侧仅匹配该客户已支付订单;按客户分组;数真实订单;没有数值时按展示规则处理;最后排序。

把o.status='已支付'移到WHERE,只剩客户1、3,客户2、4会被排除。右表主键在基表非NULL,不妨碍LEFT JOIN产生的补NULL行。

别无条件说"LEFT JOIN后任何右表WHERE条件都等同内连接":WHERE o.order_id IS NULL反而专门找未匹配客户。

10. COUNT、SUM、AVG、MIN、MAX及空输入

表达式 统计什么
COUNT(*) 输入行数,包括外连接占位行
COUNT(x) x非NULL的行数,0也计数
COUNT(DISTINCT x) 不同非NULL值的个数
SUM(x) 对非NULL值求和
AVG(x) 非NULL值的平均值,分母不是总行数
MIN/MAX(x) 非NULL值的最小/最大值

本例已支付订单共有4行,金额100/300/80/NULL:

复制代码
COUNT(*)=4,COUNT(amount)=3
SUM(amount)=480,AVG(amount)=160
MIN(amount)=80,MAX(amount)=300

按上节LEFT JOIN已支付后的实际分组:

客户 COUNT(*) COUNT(order_id) COUNT(amount) SUM(amount)
1 2 2 2 400
2 1 0 0 NULL
3 1 1 0 NULL
4 1 0 0 NULL

没有任何输入行、又没有GROUP BY/HAVING时,聚合返回一行:

复制代码
SELECT COUNT(*), COUNT(amount), SUM(amount), AVG(amount),
       COALESCE(SUM(amount),0)
FROM Orders
WHERE 1=0;

结果0、0、NULL、NULL、0。加GROUP BY customer_id后空输入没有组,返回零行。HAVING也可能将唯一汇总组过滤掉,不能说"聚合永远返回一行"。

COUNT的结果是数量,常规使用中无匹配为0;COUNT内部表达式可以为NULL,COUNT返回值不因此变NULL。本等值连接匹配行customer_id非NULL,所以COUNT(o.customer_id)也可用于数匹配订单;若字段业务上允许匹配行仍NULL,就不能用它替代真实行计数。不要仅凭COUNT写法判断性能优劣。

最终查询中"来自COUNT的列"仍可能为NULL:先GROUP BY聚合得到p.n,某客户根本没有聚合结果行,再用LEFT JOIN关联,p.n会被外连接补NULL;或含GROUP BY的标量子查询无结果行,整个标量值为NULL。这不是COUNT聚合自身对空输入返回NULL。配套Q19用COALESCE(p.n,0)处理的是前一种情形。

AVG忽略NULL,不等于SUM/COUNT(*):本例已支付金额AVG为160,AVG(COALESCE(amount,0))则为120,后者把未知金额按0计入分母,业务含义改变。比率运算还应注意数值类型,整型除法可能截断,按题设使用小数或CAST。

来源核对:聚合函数。

11. CASE、COALESCE、NULLIF:先算逐行值,再聚合

CASE WHEN只在条件为TRUE时命中;FALSE/UNKNOWN均继续后续分支。省略ELSE时,未命中返回NULL。判断缺失用CASE WHEN amount IS NULL THEN ...;不要用CASE amount WHEN NULL THEN ...期待普通等号比较能匹配NULL。

统计已支付订单:

复制代码
-- 两种常用正确形式,本例都是4
COUNT(CASE WHEN status='已支付' THEN 1 END)
SUM(CASE WHEN status='已支付' THEN 1 ELSE 0 END)

-- 不是条件计数!本例是6
COUNT(CASE WHEN status='已支付' THEN 1 ELSE 0 END)

最后一种写法对未支付行也产生非NULL的0,COUNT仍会计数。也不要用COUNT(status='已支付')当通用条件计数,FALSE同样不是NULL,且布尔表达式支持依产品。

外连接后客户2占位行:条件UNKNOWN,CASE ELSE0得到0,COUNT为1;省略ELSE则得到NULL,COUNT为0。SUM ELSE0对这条占位行为0,但若整个输入集合本来没有行,SUM仍可能为NULL。

复制代码
COALESCE(SUM(amount),0)

返回第一个非NULL值;不改变底层数据或证明业务值为0。SUM(COALESCE(amount,0))也不能保证空输入为0,因为没有行时没有任何0可加。分母可能为0时可用NULLIF(分母,0),再按业务决定NULL结果的处理,不直接把未知比率伪装成0。

来源核对:条件表达式。

12. EXISTS、NOT EXISTS、IN、NOT IN

存在性看子查询"是否有返回行",不是看SELECT列表有没有非NULL值。

复制代码
-- 没有任何订单的客户:2、4
SELECT c.customer_id
FROM Customer c
WHERE NOT EXISTS (
  SELECT 1
  FROM Orders o
  WHERE o.customer_id=c.customer_id
)
ORDER BY c.customer_id;

对客户2,1=2/3=2为FALSE,NULL=2为UNKNOWN,没有行满足WHERE为TRUE,因此EXISTS为FALSE、NOT EXISTS为TRUE。对客户1有匹配行,所以被排除。每位客户都按自己的编号重新理解关联条件。

SELECT 1是输出一个常量的惯用写法,不是"只取一行"。EXISTS(SELECT NULL)若该查询确实返回一行,同样为TRUE。

复制代码
1 IN (1,NULL)      → TRUE
1 NOT IN (1,NULL)  → FALSE
2 IN (1,NULL)      → UNKNOWN
2 NOT IN (1,NULL)  → UNKNOWN

本例c.customer_id NOT IN (SELECT customer_id FROM Orders)不返回客户,因为右侧含NULL;对1/3有匹配为FALSE,对2/4为UNKNOWN。改用相关NOT EXISTS,或在这个外层主键非NULL的场景中先排除子查询NULL:

复制代码
WHERE c.customer_id NOT IN (
  SELECT customer_id FROM Orders WHERE customer_id IS NOT NULL
)

不要无条件说所有情况下NOT IN与NOT EXISTS都可互换,须看外层NULL、关联条件及业务。

还有一个组合陷阱:

复制代码
WHERE EXISTS (
  SELECT COUNT(*)
  FROM Orders o
  WHERE o.customer_id=c.customer_id
)

这里没有GROUP BY/HAVING,即使COUNT为0,子查询仍返回一行,EXISTS仍TRUE,本例四个客户都会通过。这联系了"空输入聚合"和"存在性看行数"两个知识点。

来源核对:子查询表达式。

13. 外连接补救误区:OR IS NULL不总有效

需求"全部客户+已支付订单数"。客户1有已支付订单;客户2只有已取消订单;客户3完全没订单。

复制代码
LEFT JOIN Orders o ON o.customer_id=c.customer_id
WHERE o.status='已支付' OR o.order_id IS NULL

客户2已经匹配到真实的已取消订单,不会另外生成一条补NULL行;已取消不通过筛选,order_id又非NULL,所以客户2仍被删掉。不能靠OR IS NULL可靠补回所有对象。正确做法是将已支付放进ON,或先聚合已支付数据后再LEFT JOIN。配套查询Q32/Q33给出可执行对照。

14. 一对多连接引起重复统计

订单101有两条明细,订单103有一条。客户1的已支付订单真实金额为100+300=400。

连接订单明细后:

复制代码
101/明细1/订单金额100
101/明细2/订单金额100
103/明细1/订单金额300

COUNT(order_id)=3而非2,SUM(订单金额)=500而非400。COUNT(DISTINCT order_id)可修正本场景订单数;SUM(DISTINCT amount)不是通用修正,因为不同订单可能恰好同金额,会错误合并合法金额。

只统计订单头就不必连接明细;确实需要多个一对多结果时,应分别在正确粒度聚合后再连接。别盲目SELECT DISTINCT掩盖错误粒度,聚合已经重复相加后输出去重不能修正总额。

复制代码
WITH paid AS (
  SELECT customer_id, COUNT(*) AS n, SUM(amount) AS total
  FROM Orders
  WHERE status='已支付'
  GROUP BY customer_id
)
SELECT c.customer_id,
       COALESCE(p.n,0) AS paid_count,
       COALESCE(p.total,0) AS paid_amount
FROM Customer c
LEFT JOIN paid p ON p.customer_id=c.customer_id
ORDER BY c.customer_id;

WITH/CTE给中间结果命名,不代表一定物化成临时表或保证某种性能。

15. 标量、相关子查询和ANY/ALL

标量子查询期望最多一行一列:零行为NULL;多于一行通常报错,不能随意拿第一行。某些产品有不同扩展,按题设,不用SQLite的宽松行为推广到标准/其他产品。

查超过全体已支付订单平均金额的已支付订单:

复制代码
SELECT order_id, amount
FROM Orders
WHERE status='已支付'
  AND amount > (
    SELECT AVG(amount)
    FROM Orders
    WHERE status='已支付'
  );

平均160,仅103/300通过。内层限制"平均哪些订单",外层限制"输出哪些订单",不能因内层有已支付就省略外层业务筛选。

相关子查询还可按外层客户计算其自己的平均值,配套Q15;不等于每个数据库都必须逐行低效执行,优化器可改写。

ANY表示至少一个比较为TRUE,ALL表示全部比较为TRUE。仅在子查询非空且不含NULL等限定条件下,可把x>ANY理解成大于最小值,x>ALL理解成大于最大值;不能无条件替换。空集ANY为FALSE、ALL为TRUE;含NULL按三值逻辑,ANY有一项TRUE就TRUE,ALL有一项FALSE就FALSE,否则可能UNKNOWN。

16. "全部满足"与双重NOT EXISTS

假设RequiredProduct列出必选商品10、20,查已支付订单中买过全部必选商品的客户。

中文转成:不存在一种必选商品,是这个客户没有买过的。

复制代码
SELECT c.customer_id
FROM Customer c
WHERE NOT EXISTS (
  SELECT 1
  FROM RequiredProduct r
  WHERE NOT EXISTS (
    SELECT 1
    FROM Orders o
    JOIN OrderItem i ON i.order_id=o.order_id
    WHERE o.customer_id=c.customer_id
      AND o.status='已支付'
      AND i.product_id=r.product_id
  )
)
ORDER BY c.customer_id;

本例只有客户1满足。内层找是否买过某商品;中层找缺少的必选商品;最外层要求一个都不缺。若必选商品集合为空,这个逻辑对全部客户成立;如业务要求"至少买过一件",还须额外条件。

按数量比较也可处理一些"全部"题,但必须核对必选范围、去重、额外商品和空集合,不能把所有购买明细数直接等于商品数。

17. DISTINCT和集合运算

SQL默认可能保留重复行。SELECT city会给4行,SELECT DISTINCT city给南京/苏州/NULL共3个不同结果;COUNT(DISTINCT city)=2,因为该聚合不计NULL。分组/去重会把NULL归为同一组/一类,不等于普通比较NULL=NULL为TRUE。

运算 含义
UNION 合并结果并去重
UNION ALL 合并并保留重复
INTERSECT 公共结果
EXCEPT 前一个结果有、后一个没有

对应列数必须相同,按列位置匹配且类型要兼容,不是按列名自动对齐。排序通常放合并后;复杂组合用括号明确先后,不假设所有集合运算优先级相同。差集方向不能颠倒,NOT IN遇NULL不能直接当EXCEPT。

例:已支付客户编号1/1/3与已取消客户编号1/3,排除NULL后UNION是1/3,UNION ALL为1/1/1/3/3。查无订单客户也可用客户编号集合EXCEPT非空订单客户编号集合。

传统关系代数的选择对应WHERE,投影对应取列;传统集合语义投影去重,而SQL取列默认不去重,需要时加DISTINCT。不同产品对EXCEPT、MINUS及ALL扩展支持不同,按题面。集合运算。

18. 排序、分页、前N和每组前N

ORDER BY amount DESC为降序,ASC为升序;没有ORDER BY不能保证输出顺序。NULL默认放前/后依产品,不等于0。要稳定分页可增加唯一键作为次排序键;只用非唯一金额排序不能保证并列记录先后稳定。

前N具体语法可能用LIMIT、TOP、FETCH FIRST等,按产品。全表前N与每客户前N是两个问题。

窗口函数保留明细行,GROUP BY会汇总成组:

金额从高到低100、100、90、80 编号
ROW_NUMBER 1、2、3、4
RANK 1、1、3、4
DENSE_RANK 1、1、2、3

ROW_NUMBER并列顺序需额外规则才能稳定;RANK/DENSE_RANK若要让同金额同名次,不应把唯一订单号也放入同一个排名ORDER BY破坏并列。

复制代码
WITH ranked AS (
  SELECT order_id, customer_id, amount,
         ROW_NUMBER() OVER (
           PARTITION BY customer_id
           ORDER BY amount DESC, order_id
         ) AS rn
  FROM Orders
  WHERE status='已支付'
    AND customer_id IS NOT NULL
    AND amount IS NOT NULL
)
SELECT order_id, customer_id, amount
FROM ranked
WHERE rn=1
ORDER BY customer_id;

本题明确只在金额已知的已支付订单中选每客户最高一笔,结果103/1/300。需要并列第一全部返回时可用RANK=1并明确排名键。窗口结果不能在同一层WHERE直接用rn筛选,可增加外层或CTE;不要混淆窗口ORDER BY与最终输出ORDER BY。窗口函数、分页。

19. 查询以外的SQL识别

操作 基本形式或要点
新增 INSERT INTO 表(列1,列2) VALUES(值1,值2)
修改 UPDATE 表 SET 列=表达式 WHERE 行条件
删除行 DELETE FROM 表 WHERE 行条件
建表 CREATE TABLE与PRIMARY KEY、FOREIGN KEY、NOT NULL等
视图 CREATE VIEW 视图名 AS SELECT ...
授权 GRANT SELECT ON 对象 TO 用户,具体权限语法按产品
事务 COMMIT提交,ROLLBACK回滚;保存点等按产品

UPDATE/DELETE的WHERE决定影响范围,省略通常针对全部行。DROP删对象,DELETE删行,TRUNCATE清空表内容;回滚、触发器及权限行为依产品,不背"永远不能回滚"等跨产品绝对结论。

普通视图保存查询定义,不等同保存一份独立的查询结果;物化视图是另外概念。复杂视图能否更新依产品和视图定义,不能断言所有视图可更新或不可更新。

索引可为过滤、连接、排序提供检索路径,但有存储和更新成本,是否使用要看语义、统计与计划;不要承诺有索引一定快。参数化查询将输入绑定为值,不能把任意用户字符串拼成SQL条件;占位符写法依驱动而异。

20. 把中文要求翻译成SQL:固定检查流程

  1. 结果一行代表谁?客户、订单、明细还是一个统计组?

  2. 题目中的"全部"要求保留哪张表?

  3. 表之间用哪组键关联?每一个JOIN的ON是否完整?

  4. 普通行筛选放哪里?若要保留左表,右侧目标行先在ON/子查询中限定。

  5. 是否统计?按谁GROUP BY?SELECT是否只输出组内有明确定义的字段?

  6. COUNT数的是行、真实订单、非空金额还是不同客户?SUM是否被一对多重复?

  7. 是否有组条件需HAVING?题目不筛组就不必写HAVING。

  8. NULL、没有匹配、完全没有输入分别怎么表现?

  9. 是否需要排序、并列规则、前N?结果要求具体几行?

  10. 写出完整语句和结果,不用零散关键字代替程序。

完整例:沿用你刚做的供应商案例

复制代码
SELECT s.id,
       COUNT(r.receipt_id) AS receipt_count
FROM Supplier s
LEFT JOIN Receipt r
  ON r.supplier_id=s.id
 AND r.status='已验收'
GROUP BY s.id
ORDER BY s.id;

全部供应商→Supplier作左表;仅已验收→右侧匹配条件;按供应商分别统计→GROUP BY;数单据→COUNT单据主键;不删供应商组→无HAVING。你此前写空ON、把状态放WHERE、漏GROUP BY,这三处要一起修正。

21. 本轮复习安排

第一遍先完成骨架、NULL、三子句、LEFT JOIN、聚合、CASE和NOT EXISTS;用统一数据手工写结果,再看SQL验证。第二遍处理OR IS NULL、一对多重复、标量/相关子查询、集合运算;排名和"全部满足"作为扩展。先能独立完整重写"全部对象+满足条件的计数",再做新业务迁移。第6/8/11天延迟验证,阅读讲义或复制执行示例不算独立答对,不覆盖旧案例首次成绩。

配套文件:SQL专项练习数据.sql、SQL专项示例查询.sql。查询Q01~Q33是讲解例题编号,不占用下一轮考试练习题391起的题号。不同产品差异由一手文档核对,SQLite只验证兼容子集,不用其宽松分组或标量子查询行为代替其他产品规则。

相关推荐
guo_wen_qiang1 小时前
云服务器安装MongoDB
运维·服务器
Navicat中国1 小时前
SQL 编辑器生产力:重构与实时错误检测
数据库·sql·重构·编辑器·navicat
Data analyse4561 小时前
App埋点版本兼容的字段迁移校验
大数据·运维·服务器·前端·数据库·数据分析
anew___1 小时前
《从零手写操作系统 (46):设备模型与devtmpfs——硬件资源的文件系统化》
linux·运维·服务器
Data analyse4561 小时前
Nginx日志访客识别的边界处理
大数据·运维·服务器·数据库·数据分析
IvorySQL1 小时前
PostgreSQL 日报| PostgreSQL 19 RC1 正式发布(10 月 16 日)
数据库·人工智能·postgresql·开源
竣达技术1 小时前
机房运维:UPS 如何实现跨网段采集监控数据
运维·arm开发
无足鸟ICT1 小时前
【RHCA+】patch命令(更新补丁)
linux·运维·服务器
下页、再停留1 小时前
【C#桌面客户端系列学习-10】连接SQLite数据库
数据库·c#·visual studio