zoukankan      html  css  js  c++  java
  • 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?

  • 相关阅读:
    Nginx有哪些作用?
    MYSQL如何优化?
    jdk1.8新特性
    [javase基础] JDK JRE JVM的区别?
    JDBC中如何进行事务处理?
    JDBC、ibatis(mybatis)、Hibernate有什么不同?
    java面试题最容易犯错
    Spring高频率面试题
    python pip whl安装和使用
    深入理解 Linux的进程,线程,PID,LWP,TID,TGID
  • 原文地址:https://www.cnblogs.com/keatkeat/p/15415636.html
Copyright © 2011-2022 走看看