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?
SQL Server – 冷知识 (新手)的更多相关文章
- SQL server基础知识(表操作、数据约束、多表链接查询)
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
- Sql Server 基础知识
Sql Server 基础知识: http://blog.csdn.net/t6786780/article/details/4525652 Sql Server 语句大全: http://www.c ...
- 转:sql server锁知识及锁应用
sql server锁(lock)知识及锁应用 提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用 ...
- SQL Server群集知识介绍
集群CLUSTER种类介绍 基于iSCSI的SQL Server 2012群集测试(一)--SQL群集安装 SQL Server群集如何在线检测 群集中的MS DTC分布式事务协调器 一.SQL Se ...
- SQL Server基础知识
1.SQL Server表名为什么要加方括号? 这个不是必须要加,但表名或字段名如果引用了sqlserver中的关键字,数据库会不识别这到底是关键字还是表名(或字段名)时就必须要加. 比如,一个表名叫 ...
- SQL Server 索引知识-概念
概念篇 索引概念(index concept) 一种表或视图中相关的B-tree的数据结构.索引键列由一列或多列组成.可拥有包含性列(sql2005).用于提升Sql Server 查找相关数据行效率 ...
- SQL Server基础知识三十三问 (15-21)
15. 存储过程可以调用自己么, 或者说可能有递归的存储过程么? SP nesting最多可以到多少层? 答: 可以的. 因为Transact-SQL 支持递归, 你可以编写可以调用自己的存储过程. ...
- SQL Server基础知识三十三问 (7-14)
8. 一般什么时候使用update_statistics命令? 答: 这个命令基本上是在很多数据被处理过了之后才使用的. 如果大量的删除, 修改, 或这大量的数据插入已经发生了, 那么index就需 ...
- SQL Server基础知识三十三问 (1-7)
1. SQL Server运行在什么端口上? 可以被修改么? 答: 1433端口. 可以修改的, 在SQL Server Configuration Manager的SQL Server Networ ...
- SQL Server相关知识和经验的碎片化记录
1.在向服务器发送请求时发生传输级错误 在向服务器发送请求时发生传输级错误. (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接.) ---> Sy ...
随机推荐
- CentOS 8安装docker
1.查看Linux内核(Docker最低支持CentOS 7 64位 内核3.10) uname -a 2.安装docker(输入yes,然后等待-) yum install docker 3.启动d ...
- [oeasy]python0011 - python虚拟机的本质_cpu架构_二进制字节码_汇编语言
程序本质 回忆上次内容 我们把python源文件 词法分析 得到 词流(token stream) 语法分析 得到 抽象语法树(Abstract Syntax Tree) 编译 得到 字节码 (b ...
- P2427 题解
洛谷链接 题目简述 给定 \(N \times M\) 的字符矩阵,有 \(Q\) 次询问,对于每次询问给出 \(x,y\),求以 \((x,y)\) 为中心的最大正方形边长且正方形中字符均相同. 思 ...
- 01-初识springboot
目录 01,什么是springboot 02,如何使用springboot 01,什么是springboot springboot是一个基于spring框架开发出来的一个新的框架,目的是为了简化spr ...
- 汇编+qemu玩转控制台打印
有段时间开始对汇编感兴趣,也因此在写各种不同的demo,现在分享之前学习的成果,需要下载的东西有nasm和qemu-system-i386,看看枯燥的汇编能产生多大的能量. 先来复习一下通用寄存器: ...
- 人机协同的半自动人形机器人 —— Covariant公司的RFM-1机器人
Covariant公司的RFM-1机器人实现了一个极为有意思的功能,那就是在机器人执行任务的过程中如果遇到无法处理的情况下就会停止下来然后等待人类的语言指示,比如:夹具向上移动2cm,更换更大型号的夹 ...
- Ubuntu18.04 server 双网卡,一个设置为静态IP, 一个设置为动态IP
操作目的如题: 修改网络配置文件: sudo vim /etc/netplan/50-cloud-init.yaml 修改内容如下: # This file is generated from inf ...
- win10系统wifi不会自动连接怎么解决
参考: https://jingyan.baidu.com/article/d621e8da743bab2865913f99.html ================================ ...
- Oracle数据库表转换为Mysql表
1.背景 在实际开发中,可能会涉及到开始是Oracle数据库,但是后面想使用mysql数据库 那么这时候我们就需要使用到Oracle数据库转变为mysql数据库 2.具体步骤 步骤一:导出Oracle ...
- 【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究
本文,我们将一起探讨探讨,如下所示的一个卡片 Hover 动画,应该如何实现: 这个效果的几个难点: 鼠标移动的过程中,展示当前卡片边缘的 border 以及发光效果: 效果只出现在鼠标附近?这一块的 ...