SQL Server – 冷知识 (新手)

前言

没有系统化学一本语言或技术, 那便会被一些冷知识坑. 这里做些记入.

变量作用域

SQL 是远古语法, 声明变量在最顶部就是一条上古法则. 如果我看见有了用这个法则写 C# 或 JS 我就会杀了它.

但是在 SQL 这条法则还真的不是没有用的呢.

DECLARE @value INT 

变量的作用域很大, 不受限于 IF, WHILE, 之受限于 GO

所以在做 IF, WHILE 的时候要声明变量要小心,我的做法是一定给变量赋值. 比如 set to NULL.

当 Compare 对比遇上 NULL

参考: SQL NULL值比较陷阱

解决方法就是用 ISNULL(), IS NULL, IS NOT NULL 等, 总之就是要表达清楚, NULL 值你想怎样处理.

比如 EF Core 载翻译 == 和 != 的时候是这样翻的 

5 种情况

a. 2 个都是 not null, 等于/不等于的情况:

columnA = columnB, columnA <> columnB 简单

b. 其中一个是 nullable, 等于的情况:

columnA = columnB, 直接等于就可以了, 因为假如其中一个是 null 那么它不可能匹配另一个. 所以肯定是要过滤掉的, 只 care 等于的就可以了

c. 其中一个是 nullable (假设 columnA 是 nullable), 不等于的情况:

columnA <> columnB or columnA is null, 多加了一个 or nullable column is null, 因为假如 nullable 的是 null 另一个肯定不是 null (因为前提说了其中一个是 nullable 而已), 所以它肯定不等于, 得匹配出来。

d. 2 个都是 nullable, 等于的情况:

columnA = columnB or (columnA is null and columnB is null), 挺直观的, 就是多加了一个 null 对比 null 的判断.

e. 2 个都是 nullable, 不等于的情况:

(
  (columnA <> columnB) or (columnA is null or columnB is null)
) 
AND (columnA is not null or columnB is not null)

4 种可能

null, null  (2 个 null 就是相等, 我们不要这个)

not null, null (1 个 null, 1个 not null, 符合不相等, 我们要)

null, not null (1 个 null, 1个 not null, 符合不相等, 我们要)

not null, not null (2 个不是 null, 有可能相等, 也可能不相等, 要进一步过滤)

step1: 通过最后一句 AND (columnA is not null or columnB is not null), 过滤掉了第 1 种可能 null, null

step2: 通过 columnA is null or columnB is null, 获取到了第 2,3 种可能

step3: 通过 columnA <> columnB, 完成了第 4 种可能的再过滤

当 Sum, Top 1 遇到 0 rows 和 NULL

UPDATE Invoice SET TotalAmount = (SELECT SUM(Subtotal) FROM InvoiceItem WHERE InvoiceItemId < 0);

如果 Invoice Item 是 0 rows,  TotalAmount 值会是 NULL 而不是 0 哦.

如果 Subtotal 是 nullable 而所有的 rows 刚好都是 NULL 那么最后返回依然是 NULL, 如果其中一个是 number, 那么它 sum number and skip null

Top 1 遇到 0 rows 结果也是 NULL

UPDATE Invoice SET TotalAmount = (SELECT TOP 1 Subtotal FROM InvoiceItem WHERE InvoiceItemId < 0 ORDER BY InvoiceItemId DESC);

解决方法就是用 ISNULL.

Where 的顺序重要吗?

不重要, SQL Server 会做词法优化的, 至于是不是所有情况下它都做的好, 这个我就不清楚啦, 但我们应该要相信它.

Does the order of where clauses matter in SQL?

原文地址:https://www.cnblogs.com/keatkeat/p/15415636.html