SQL 查询中 COUNT DISTINCT 怎么用?

COUNT(DISTINCT) 排除 NULL 值,仅统计非空非重复值。

计算一列中的客户数量,忽略重复项。
例如订单表customer_id有1 ,2 ,2 ,3 (NULL),结果为3
对于多列连接的去重,MySQL使用CONCAT,比如订单表统计中customer_id和product的唯一值的组合。

常见的SQL做法是在子查询中添加GROUP BY,例如计算orders表中customer_id和product的唯一组合。

COUNT() 对所有行进行计数,包括 NULL。
COUNT(column) 计算非空列的行数。
COUNT(DISTINCT column) 统计列的唯一非空值。

假设表数据为names:Alice、Bob、Alice、NULL,查询结果为total_rows:4 、non_null_names:3 、unique_names:2
索引可以加快去重速度,比如为orders表中的customer_id建立索引。

使用WHERE子句过滤数据可以减少计算次数,例如只计算2 02 3 年订单表中customer_id的唯一编号。

大数据场景下使用近似函数,如Presto的APPROX_DISTINCT,速度可以快,但结果不准确。

COUNT(DISTINCT) 自动忽略 NULL。
如果需要计算 NULL,则需要使用像 COALESCE 这样的解决方案。

不同的数据库对多个DISTINCT列的语法支持不同,因此需要测试目标数据库。

称一下体重。

MySQL、PostgreSQL、SQL Server和Oracle中NULL、0和空字符串的存储空间究竟有多大?

哎呀,这个数据库存储空间的事情真是让人头疼。
过去我在做项目时遇到过很多问题。
我记得2 01 8 年的时候我启动了一个项目,在MySQL InnoDB引擎中存储大量用户数据。
当时我将用户名设置为VARCHAR类型,长度5 0个字符,以节省空间。
结果有客户输入了特别长的名字,直接破坏了数据库。
后来我了解到MySQL VARCHAR类型以最大长度分配空间。
一输入客户姓名就超过预设长度,导致空间不足。

我们来谈谈 SQL Server。
2 01 9 年我负责一个电商项目。
里面有一张订单表。
订单号的类型为VARCHAR,长度设置为2 0个字符。
结果,客户下单时,订单号超过2 0个字符,导致数据录入失败。
后来我发现VARCHAR类型的SQL Server分配空间有最大长度,所以一旦客户端名称增加长度,数据库就会崩溃。

还有一个神谕。
今年我参加了一个2 02 0年的财务项目,它还有一个账户余额字段,类型为VARCHAR2 为了确保此时数据的一致性,我将默认值设置为 NULL。
结果有一天系统突然崩溃了。
经过排查,发现账户余额字段中NULL值过多,导致Oracle数据库运行速度非常慢。
因此,在选择数据库时,应考虑字段类型和存储空间。
例如,如果您经常使用空字符串,PostgreSQL 可能是一个不错的选择,因为它不会分配额外的空间。
但如果您需要像 Oracle 的 CHAR 类型这样的固定长度字符串,那么它是最适合的。

总之,这方面的学问很深,我不敢乱说,但这些都是我亲自踩过的陷阱,希望对你有帮助。

sql server 2022之,select查询时,过滤掉所有值均为空的列。

这是一个陷阱。
不要相信这个方法。
可能会出现性能问题,并且存在SQL注入的风险。