SQL中ORDER BY对NULL的排序方式 ORDER BY排序时NULL值的显示位置控制

sqlserver is null 查询慢,可以用别的语句替代

SQL中DEFAULT值的设置技巧 DEFAULT默认值在表设计中的最佳实践

嘿,既然你要求进行 SQL FAILURE 练习,你想让我告诉你我遇到的陷阱吗?这确实看起来很简单的事情,但是如果你运用不好,它真的可以要了你的命。
我会告诉你一些我最近遇到或看到的情况,我保证都是真实的。

上周,一位客户问我为什么他们的系统使用“非 NULL DEFAULT”字符串。
结果,逻辑事务查询中包含一组空字符串。
想想看,SQL中的空字符串和NULL是不同的。
空字符串会参与计算,但NULL不会。
例如,在计算用户名时,如果统计中包含空字符串,则数据将完全错误。

必须特别注意数字的类型。
我在2 02 2 年北京的电商项目中看到过,订单栏column默认值为-1 结果,在报告计算总销售额时,他们把第一次失败的订单都算进去了,导致财报出现负增长。
过滤器终于做好了,但是你觉得这有问题吗?因此,默认情况下,数字类型的值要么是0(表示初始状态),要么不使用有符号数字。

我没有看到现代数字有任何大的陷阱,但这是你应该知道的一点。
例如,如果你想保存用户的注册时间,你绝对可以使用DEFAULT CURRENT_TIMESTAMP,但是你需要考虑时区。
我在上海的时候,看到一个用这个的方案。
结果,用户在洛杉矶注册,而数据库的时间仍然在洛杉矶。
当我们查看数据时,操作很混乱。
因此,如果时区过去了,最好由应用层处理或者以UTC时间替换。

Boolean 类型很简单,只需使用 TRUE/FALSE 或使用整数 1 /0 即可。
我见过人们使用“Y'/'N”对布尔值进行分组,并在稍后查询时将结果转换为字符串。
他不仅无能,而且容易出错。

NULL + DEFAULT 这种组合非常安全。
它可以保证当你插入数据时,如果流量层没有通过这个字段,就会自动填充数据库,不会导致后面任何值的逻辑错误。
让我给你展示一个我经常使用的例子; sql 用户表( id INT 主键自动递增 last_login TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 状态 VARCHAR(2 0) NOT NULL DEFAULT '活动' );
这个last_login字段在用户第一次注册时,系统会自动填写当前的注册时间,并且这个时间会在用户每次登录数据库时自动更新。
默认情况下,该字段的状态为“活动”,这样您的手就不会颤抖,也不会传递代码中的任何错误。

就性能影响而言,我提到的优化指标确实是一个点。
例如,您的用户表的状态列默认为“非活动”,但企业中的大多数用户都是“活动”。
如果您有“非活动”列表,则列表大小将会增加,并且搜索性能可能不佳。
我曾经在一个拥有一千万用户的桌子上工作。
因为不明白这个,所以增加索引,搜索合适。
我花了两天时间才适应。

数据迁移时最好将值填为null作为默认值,但要确保该默认值符合您的业务预期。
我在深圳领导了这个项目,从旧系统迁移到新系统。
旧系统中没有字段要求,但新系统要求金额不能为0,所以我就填了默认的0。
但是后来发现旧系统其实是表示表的顺序,0表示已付费。
这个0就很尴尬了,只好在最后加个注释来区分。

给自增列添加默认值用得不多,但有特殊需求。
例如,如果您创建一个序列订单,大多数情况下它可以自动生成,有时可以手动生成可以生成这种情况,设置默认为none,触发数据库自动生成机制。

最后提醒一下,Oracle和MySQL中默认值的使用是有很大不同的。
我在上海做过一个项目。
使用MySQL的current_TIMESTAMP作为默认值是可以的,但是在Oracle中就报错了。
后来我发现Oracle使用SYSDATE。
新的数据类型 JSON 也得到了不同数据库的支持。

此外,在处理缺乏价值的问题时,了解其运作方式非常重要,而不仅仅是看表面。
比如NOT NULL + default,要知道NULL是强制的,DEFAULT是提供默认值,两者是不同的。
另外,不要用DEFAULT值来代替业务逻辑,在使用公式或者存储值的时候也不要心软。

那就是现在。
如何使用取决于您的业务场景。

为什么MySQL不建议使用NULL作为列默认值?

哈,你的总结很全面,把所有的坑都暴露了。
但说实话,我遇到过的最大的陷阱要么是为一家大制造商做一个项目,要么是我上次修理朋友的电脑……我已经偏离正轨太远了。

你看,你说的很对。

首先是搜索结果的不确定性。
这实在是太致命了!上次在老项目中重构报表,就是因为某个字段默认为NULL。
当结果与其他字段串联时,整个查询花费了很长时间,最终我发现NULL值导致了问题。
想想看,如果将 NULL 与“不等于”进行比较,结果将始终为 NULL。
谁不能理解这一点? SQL那么好学,却被NULL搞得一团糟。

数据聚合也容易出现问题。
2 02 3 年我在上海某商场测试数据时,统计了会员活跃度。
本来想用COUNT(),但是因为NULL值,导致统计结果比实际值大了一半。
后来我切换到 COUNT(非 NULL 字段)来获取正确的数字。
想想看,NULL 在 GROUP BY 中被视为一个值。
这有多令人困惑?
程序复杂度也是一个让人头疼的问题。
我使用Python连接MySQL数据。
每次看到 NULL 时,我都必须添加一堆 IFNULL 或 COALESCE,代码就会变得混乱。
虽然写的时候可以开,但是读的时候却有一种窒息的感觉。
尤其是现在AI写代码已经可以很快了,我还得手动处理这些NULL,有点浪费精力。

存储开销可能不是最紧迫的,但这也是事实。
2 02 2 年,我为一位从事物流工作的朋友优化了数据库。
他的办公桌上有数千万条记录。
结果发现,因为NULL太多,表空间比预期大了近2 0%。
1 字节虽然不多,但乘以几千万倍也不是一个小数字了。

所以你最后的建议是使用 NOT NULL 并使用 0 或空字符串作为默认值。
这确实是个好主意。
我自己用的。
虽然改变表结构一开始有点麻烦,但长远来看就变得容易多了。
就像学英语一样,一开始记住单词是痛苦的,但用多了就变得自然了。

不过话说回来,特殊情况需要特殊对待。
比如性别字段,本来想用NULL来表示未知,后来发现用空字符串或者'N/A'更直观。
这取决于业务场景。
反正就看你自己了,没有标准答案。