切换导航
简历
工具
演示
查询
导航菜单
服务端
30
前端
114
数据库
82
进阶开发
8
桌面程序
2
QA
15
软件使用
36
规范协议
5
操作系统
11
AI
0
复用资源
6
硬件
0
标签
SQL Server
Redis
MySQL
其它
Oracle
外部链接
.NET Core SDK和运行时安装包
淘宝 NPM 镜像
查询网
Tables Generator线上表格转换工具
引用cdn在线脚本和样式
首页
数据库
SQL Server 编程中易出现的问题和注意事项
[TOC] ## 1. SQL Server 中易忽略的点 ### 1.1. NULL 的比较 **说明:**在 SQL Server 中 NULL 表示缺失或未知值, 使用比较运算符(如 <>、=、<、>)与 NULL 进行比较时,结果将为 NULL,而不是 true 或 false, 因此 NULL <> 1 返回的结果是 NULL **示例:** + 数据源: |id|title|summary|amount| |:--:|:--:|:--:|:--:| |1|三国演义|NULL|NULL| |2|红楼梦|NULL|110.00| |5|水浒传|NULL|125.00| |6|罗密欧与朱丽叶|NULL|NULL| + 代码: ```SQL SELECT * FROM test WHERE amount > 100; SELECT * FROM test WHERE amount < 100; ``` + 第一条查询语句执行结果: |id|title|summary|amount| |:--:|:--:|:--:|:--:| |2|红楼梦|NULL|110.00| |5|水浒传|NULL|125.00| + 第二条查询语句执行结果: |id|title|summary|amount| |:--:|:--:|:--:|:--:| |||| | > **Tip:**示例结果说明,当列有 NULL 值时,此列只有有效的值才会参与比较运算,NULL 既不是大于100 也不是小于100的范围,NULL 与任意数据比较都将是 NULL, 因此直接 WHERE NULL 是没有结果的,如果要查找值就是 NULL 的记录,请使用 amount IS NULL(对应的否使用 IS NOT NULL) ### 1.2. 使用 Exists 语句作为查询条件 当我们在使用 Exists 判断表中的数据是符合另外一张表中的条件时,一定要注意在Exists中的子语句条件的书写方式,假设有两张表User和Customer,它们都有相同的列,名称都是Id,下面是使用 Exists 作为查询语句的示例 **示例说明:**首先我们查询的预期结果是User表在Customer表中具有相同Id值得User记录 **错误示范:** ```SQL SELECT * FROM dbo.[User] WHERE EXISTS(SELECT 0 FROM dbo.Customer b WHERE b.Id = Id) ``` 上面语句查询的结果是User的全部数据,感觉Exists并没有生效,为什么查询的结果和我们预期的结果不一样?这是因为 EXISTS 语句中的 WHERE 条件 `b.Id = Id`,这里的两个 Id 都是 Customer 的 Id,并不是我们预期的第二 Id 是 User表的 Id,在 EXISTS 语句中当查询的字段是相同名称(这里不区分大小写,即使是一个大写一个小写也会被判断为相同名称)时,等于查询的是自身的字段,因此示例中的 EXISTS 返回的都是 true,这样条件就没有起到应有的作用 **正确写法:** ```SQL SELECT * FROM dbo.[User] a WHERE EXISTS(SELECT 0 FROM dbo.Customer b WHERE b.Id = a.Id) ``` <mark>使用别名,明确的告知 EXISTS 语句中的字段的来源</mark> >** Tip:**EXISTS 使用错误导致的结果是严重的,试想如果我们使用它作为条件来更新插入数据,将会导致大量的更新错误和脏数据,例如下面的示例 ```SQL -- 错误写法 UPDATE dbo.[User] SET Address = '兖州' WHERE EXISTS(SELECT * FROM dbo.Customer b WHERE b.Id = Id) -- 上面执行的结果将会是整个 User 表的 Address 字段都将被更新为兖州 --------------------------------------------------------------- -- 正确写法 UPDATE a SET Address = '兖州' FROM dbo.[User] a WHERE EXISTS(SELECT * FROM dbo.Customer b WHERE b.Id = a.Id) -- 只有 User 表的 Id 与 Customer 表的 Id 值相同的记录才会被更新 ``` > **特别提醒:**SQL Server 不区分大小写,不要以为 EXISTS(SELECT * FROM dbo.Customer b WHERE b.Id = id) 中的 Id 和 id 不一样
扫一扫手机看
点击排行
windows 文件资源管理器使用
Layui 弹窗open使用说明
SQL Server 中字符串函数使用
C# 使用QQ邮箱代理做邮件接收功能
SQL Server关于apply的两种形式cross apply 和 outer apply
ASP.NET MVC 模型的自定义验证
nvm安装及常用命令
SQL Server 中数据类型转换
SQL Server 中WITH AS短语的使用
IE浏览器下AJAX缓存问题导致数据不更新的解决办法
订阅号