SQL查询WHERE子句仅指定字段名时,默认适用的条件是什么?
嘿,这个问题问到点子上了,很多刚接触SQL的同学都会对这种写法感到困惑,我来给你掰扯清楚:
WHERE子句仅写字段名的默认判断逻辑
当你在WHERE子句里只放一个字段名(比如执行SELECT * FROM tablename WHERE fieldname;),数据库会把这个字段的值当作布尔表达式来评估,核心逻辑是判断这个字段的值是否为「真」——不过不同数据库对“真/假”的具体判定规则略有差异:
- MySQL/MariaDB:
- 数值类型(int、tinyint等):0和
NULL被视为「假」,非零且非NULL的数值视为「真」; - 字符串类型:空字符串
''和NULL视为「假」,非空字符串(哪怕是'0')都视为「真」; - 布尔类型:
FALSE和NULL是「假」,TRUE是「真」。
- 数值类型(int、tinyint等):0和
- PostgreSQL:
- 布尔类型直接按
TRUE/FALSE判断,NULL属于未知,会被过滤; - 数值类型:0是「假」,非零是「真」;
- 注意:PostgreSQL不会自动把字符串转换成布尔值,如果你在WHERE子句里放字符串类型字段,会直接报错,这点和MySQL不一样。
- 布尔类型直接按
- SQL Server:
- 类似MySQL,数值类型0/
NULL为假,非零为真;字符串空值/NULL为假,非空为真;不过SQL Server里没有原生布尔类型,通常用bit类型代替(0为假,1为真)。
- 类似MySQL,数值类型0/
这种查询的实际结果
简单来说,这条查询会返回表中所有满足「该字段值为真」的行,同时会过滤掉两类行:
- 字段值被数据库判定为「假」的行;
- 字段值为
NULL的行(因为NULL在布尔判断中属于“未知”,既不满足真也不满足假,所以不会被包含在结果里)。
举个实际例子:假设你有一张products表,里面有个in_stock字段(tinyint类型,1表示有货,0表示缺货,还有部分行是NULL),执行SELECT * FROM products WHERE in_stock;就只会返回所有in_stock值为1的商品,缺货(0)和状态未知(NULL)的都会被排除。
内容的提问来源于stack exchange,提问作者safin chacko
相关产品推荐
相关产品推荐

