前者按字符'6'和'7"这两个字符去筛选记录行,后者用6和8这两个数字去筛选记录行,尽管这两种写法的返回结果通常是一样的,但是请注意数据库引擎在实际执行时会根据字段“send_status”的数据类型实施不同的执行策略,因为执行策略的不同在某些情形下可能会返回不一样的结果。
如果"send_status”的数据类型是数字,对于第一条语句,系统会先将字符'6'和'7"这两个字符转换数字6和7,然后才去按数字筛选出符合条件的行。对于第二条语句则无需类型转换直接按数字筛选符合条件的行了;反之,如果"send_status”的数据类型是文本,数据库引擎的执行策略则刚好相反。
在发生了类型转换的情况下,提问中的两种SQL语句返回的结果不一致是有可能的,因为字符转换为数字或数字转换为字符其结果的变化其实是比较复杂的,举个例子字符“4.00”转化为数字就变成4了,如果加上具体的数字类型来考虑例如定点数、浮点数那就更加复杂了。因此我们要在编写涉及数字筛选的SQL语句时,在是否对数字值加引号的问题上要根据被筛选字段的数据类型来确定,如果被筛选字段的类型属于数字,则不要对数字值加引号,反之就要对数字值加上引号,这样我们编写出来的SQL语句才能确保始终返回正确结果。
你可以用select * from send_black t where send_status in('6','7') and t.id not in (select t.id from send_black t where send_status in(6,7)) 来查询哪些数据无法用第二种SQL查询出,这些数据是否符合你预期的查询结果集 t.id是 send_black t 表的主键