如何在mysql中一次性查出某表中所有字段的非空个数

对于外部程序来说,NULL是一个未知的、不正确的且无法解释的值。
所以很多公司的开发规范中都明确规定必须为NOTNULL。
事实上,NULL在任何场景下都可以转换为有意义的字符或值;首先,它可以使数据更具可读性,更易于后期维护;其次,它可以减少编写SQL语句的难度;NULL的特点如下:1、NULL字段拼接的结果全部为NULL,可能与预期存在差异。
我打算拼接字段r1,然后将其插入到新表t3中,结果t3表中的记录不符合预期。
mysql>showcreatetablet1\G****************************1.row******************************表:t1CreateTable:createtable`t1`(`r1`varchar(10)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci1rowinset(0.00sec)mysql>showcreatetablet2\GP************************************1.行********************************表:t2CreateTable:CREATEDABLE`t2`(`r1`varchar(10)NOTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci1rowinset(0.00sec)mysql>createtablet3liket1QueryOK,0rowsfected(0.04sec)mysql>insertintot3selectconcat(r1,'数据库')fromt1limit2;QueryOK,2rowsfected(0.02sec)记录:2重复:0警告:0mysql>select*fromt3+------+|r1|+------+|NULL||NULL|+------+2rowsinset(0.00sec)正确的方法如下,使用IFNULL函数专门处理NULL。
mysql>insertintot3selectconcat(ifnull(r1,''),'database')fromt1limit2;QueryOK,2rowsfected(0.01sec)记录:2重复:0警告:0mysql>select*fromt3+-------+|r1|------+|Database||Database|+------------+2rowsinset(0.00sec)2.计算包含NULL的列的COUNT值不精确。
t1和t2具有相同的记录数,但字段r1包含NULL,导致结果忽略这些值。
mysql>selectcount(r1)asrcfromt1+-------+|rc|+-------+|16384|+------+1rowinset(0.01sec)mysql>selectcount(r1)asrcfromt2+--------+|rc|+--------+|32768|+--------+1rowinset(0.03sec)此时我们大概就对了会想到方法它是用NULL相关函数处理的,mysql>selectcount(ifnull(r1,''))asrcfromt1+-------+|rc|+-------+|32768|+-------+1rowinset(0.03sec)或者直接使用COUNT(*)包含所有可能的值mysql>selectcount(*)asrcfromt1+-------+|rc|+--------+|32768|+------+1rowinset(0.02sec)当然,不仅仅是COUNT,除了对于NULL相关的函数,大多数都不适合NULL处理。
所以其实从以上两点来看,对于NULL的处理是需要特殊处理的,这也增加了SQL的编写难度。
3.包含NULL的索引列将比不包含NULL的字段多占用1个BIT用于存储。
示例key_len分别为43和42,t1比t2多了一个字节。
这里可能有人会问,不是说是BIT状态吗?那为什么还有一个字节呢?你可以关注我之前的文章(第02期:MySQL数据类型的艺术——大对象字段),了解BIT的详细描述。
mysql>pagergrep-i'key_len'PAGER设置为'grep-i'key_len''mysql>explanselect*fromt1wherer1=''\Gkey_len:431rowinset,1warning(0.00sec)mysql>explainselect*fromt2wherer1=''\Gkey_len:421rowinset,1warning(0.00sec)4.各个存储引擎相关的NULL处理,MySQL8.0版本发布后,只有InnoDB、MyISAM和内存支持NULL列索引。
就像新开发银行一样。

空值的判定-MySQL

在MySQL中,判断字段是否为NULL的语句本质上是ISNULL。
例如,假设我们有一个名为“customers”的表,其中包含一个名为“email”的字段。
要检查特定客户记录的电子邮件是否为空,您可以使用以下SQL查询:SELECT*FROMcustomersWHEREemailISNULL;此语句将返回“电子邮件”字段中具有空值的所有客户记录。
重要的是要了解插入引号(')和插入NULL值之间存在差异。
插入括号(')表示字符串值,插入NULL表示缺失值。
插入引号(')后,MySQL会将其视为非空字符串。
例如:INSERTINTOcustomers(email)VALUES('example@example.com');和INSERTINTOcustomers(email)VALUES(NULL);第一个查询将客户记录的电子邮件字段设置为包含“example@example.com”字符串的字符。
第二个查询将该字段设置为空。
因此,在执行数据验证或查询时区分NULL值和非NULL值非常重要。
使用ISNULL语句可以帮助您识别这些null情况。