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 ...
随机推荐
- 使用FModel提取游戏资产
目录 前言 FModel简介 FModel安装 FModel使用 初次使用 资产预览 资产导出 附录 dumper Dumper-7生成usmap文件 向游戏中注入dll 前言 这篇文章仅记录我作为初 ...
- iOS开发基础99-内购in_app
今天后台支付校验模块报错,拿到凭证去苹果校验返回的结果如下: { "receipt": { "receipt_type": "Production&q ...
- 支付宝小程序的级联选择器,对接简单操作,Cascader 级联选择器element_ui
首先,对于element_ui 的动接,由于需要数据格式是 但是支付宝提的接口返回的数据是另一种格式,并且支付宝的三级联动接口是先只有一个列表,点击列表项再发现请求,生成另外一个下拉选择, 需要这个三 ...
- XXL-JOB初见
XXL-JOB是轻量级分布式任务调度平台 port:8088 初始账号:admin/123456 主要有调度中心.执行器.任务 执行流程: 1.执行器向调度中心上报任务 2.调度中心为执行器分配任务 ...
- Python 在PDF中添加、替换、或删除图片
PDF文件中的图片可以丰富文档内容,提升用户的阅读体验.除了在PDF中添加图片外,有时也需要替换或删除其中的图片,以改进视觉效果或更新信息.本文将提供以下三个示例,介绍如何使用Python 操作PDF ...
- RHCA rh442 003 系统资源 查看硬件 tuned调优
监控工具 zabbix 监控具体业务,列如数据库.触发式事件(断网 硬盘坏一个) 普罗米修斯 给容器做监控 管理人员,如何知道几千台服务器哪些出了问题,这得需要zabbix 系统硬件资源 cpu [r ...
- python学习总结(重要!!!)
前取,后不取 index从0开始 list = [1,2,3,4,5,6,7,8,9]print(list[3:7]) #输出:[4, 5, 6, 7]print(list[3:-2]) ...
- 5、SpringBoot2之整合Durid
创建名为springboot_druid的新module,过程参考3.1节 5.1.引入相关依赖 注意:虽然本文使用的是 spring boot 2.7.18 和 MySQL 5.7 ,但是出于可移植 ...
- 【Vue2】Axios、Async+Await、解构赋值
Axios入门使用,Async和Await用法,解构赋值语法 <!DOCTYPE html> <html lang="en"> <head> & ...
- 【C3】07 盒子模型
在 CSS 中,所有的元素都被一个个的"盒子(box)"包围着, 理解这些"盒子"的基本原理,是我们使用CSS实现准确布局.处理元素排列的关键. 本文围绕 &q ...