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 ...
随机推荐
- WSS SSL HTTPS之间的关系
ssl: secure socket layer 安全套接层,简单来说是一种加密技术,通过它可以在通信的双方上建立一个安全的通信链路,因此数据交互的双方可以安全地通信,而不用担心数据被窃取:wss: ...
- leetcode简单(设计):[225, 232, 303, 703, 705, 706, 933, 1603, 1656, 09, 30, 041, 03.06]
目录 225. 用队列实现栈(先入后出) 232. 用栈实现队列(先入先出) 303. 区域和检索 - 数组不可变 703. 数据流中的第 K 大元素 705. 设计哈希集合 706. 设计哈希映射 ...
- CF1468N 题解
洛谷链接&CF 链接 题目简述 共有 \(T\) 组数据,对于每组数据: 有三个桶,五种垃圾,每个桶有固定的容量. 前三种垃圾分别放入三种桶中,第四种垃圾可以放进 \(1,3\) 桶中,第五种 ...
- SQL Server AdventureWorks示例数据库
SQL Server AdventureWorks2008R2 数据字典 AdventureWorks2008R2示例数据库下载 AdventureWorks2008R2数据字典(官网) Addres ...
- Django 实现文件上传下载API
Django 实现文件上传下载API by:授客 QQ:1033553122 欢迎加入全国软件测试交流QQ群7156436 开发环境 Win 10 Python 3.5.4 Django- ...
- 自己在本地搭建 git 版本仓库服务器
请确保你安装了 git 的图形化工具和 git 软件 首先先创建一个目录作为你的项目工程目录,比如 e:/gitTest 其次右键 git init. 然后指定一个 git 服务器目录,例如:e:/g ...
- 云计算:Docker-compose快速部署前后端项目
| 更好的观看效果请前往,原文博客地址:https://www.zeker.top/posts/338829e1/ 介绍 Docker Compose 是官方编排的项目之一,负责快速的部署分布式应用. ...
- 对比python学julia(第三章:游戏编程)--(第二节)公主迎圣诞(4)
4. 碰撞检测 .得分及生命 在第 4 个阶段,利用GameZero的碰撞检测功能,使公主角色能够接到雪花 .礼物或剪刀. 在"sdgz"项目目录中 ,把 version3.jl ...
- 【Mybatis】05 官方文档指北阅读 vol3 配置 其二
对象工厂(objectFactory)[省略,入门阶段实在不懂] 插件(plugins)[省略,入门阶段实在不懂] 环境配置(environments) MyBatis 可以配置成适应多种环境,这种机 ...
- 《Python数据可视化之matplotlib实践》 源码 第二篇 精进 第六章
图 6.1 import matplotlib.pyplot as plt import numpy as np x=np.linspace(-2*np.pi, 2*np.pi, 200) y=np. ...