今天要做个实验,碰到了在查询时,给where语句中,紧跟where的字段加了引号,导致结果和预期不符的问题,经过偶然的对粘到记事本中的病句的查看,突然想到了老师说过的一句话,在查询语句中,带引号的都是常量这句话,解答了遇到的问题是如何产生的原因。
先看,实验,最后,总结时候说明原委。
有一个 TSubject 表,
mysql> select * from TSubject;
请注意,这个表里有部分记录的个别列是空值。
现在,新建了一个表,ST
mysql> create table ST(subjectid varchar(10),subjectname varchar(30));
现在,要练习使用命令 mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject;将需要的列的值,从 TSubject 复制到 ST 表中。
没有问题,9条记录全过来了,
现在,增加难度,把 TSubject 表中 publisher 字段值为 非空的记录 复制到 ST 表中,共5条记录。
为确保实验不受影响,先删除 ST 表 中原有的数据,
mysql> truncate ST;
环境搭建好,开始实验,
mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject where ‘publisher’ is null;
命令成功了,但随之问题也出现了,
结果中,显示了 9 条记录,而我们在 where 中 已经指定了 字段 publisher 非空,正常返回的结果应该是 5 条才对,
这是为啥捏?再次恢复实验环境,
mysql> truncate ST;
这次把 where 后的字段名 去掉引号试试,
mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject where publisher is not null;
没问题,返回的就是我们需要的 在 TSubject 表中 publisher 字段 值 不为空的 那 5 条记录。从上面的实验可以看出来,问题就出在 where 后边 字段名 是否有引号包裹上了,
开篇中提到了,老师讲过,在查询语句中,不管什么类型的数据,只要被引号包裹起来,带着引号的它就变成了,常量,而常量永远都不为空的,
所以,where ‘publisher’ is not null 就等价成了 where true,就是 1
实际上 where ‘publisher’ is not null 在这里不起任何作用
最后,
mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject where publisher is not null;
就和
mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject 一样了。
总结,在指定查询条件时, where 后的 字段 一定不要使用括号括起来,那样的话,这个字段就失去了其本身是代表table 列的意义,变成了一个常量,而 where 后接一个 常量 是没有什么意义的。
补充
where 接 常量 没有意义,
January the 13th 2022 Thursday