mysql中的注意事项

between and

首先看一下w3cschool对该操作符的解释:
SQL BETWEEN 操作符
其中:
不同的数据库对 BETWEEN…AND 操作符的处理方式是有差异的。某些数据库会列出介于 “Adams” 和 “Carter” 之间的人,但不包括 “Adams” 和 “Carter” ;某些数据库会列出介于 “Adams” 和 “Carter” 之间并包括 “Adams” 和 “Carter” 的人;而另一些数据库会列出介于 “Adams” 和 “Carter” 之间的人,包括 “Adams” ,但不包括 “Carter” 。

所以,请检查你的数据库是如何处理 BETWEEN….AND 操作符的!
结论:在mysql中,between and 所选取的值是包括左右边界的,也就是两端都是闭区间

and和or的优先级

假设我要根据age和性别筛选员工,代码如下

SELECT * FROM table
where age <20 or age>35 and sex='男';
#这里的or和and的优先级如何?
#情形一:
SELECT * FROM table
where (age <20 or age>35) and sex='男';
#情形二:
SELECT * FROM table
where age <20 or (age>35 and sex='男');

结论:应该是情形二正确。and的优先级更高,先计算and,后计算or。建议这种问题一律用圆括号表示,省去很多麻烦。

where条件中的字段

必须是表中的原生字段名,不能是计算出来的字段名alias,也就是不能用别名, 但可以是表达式。(alias就是别名的意思)

select id, char_length(name) as a where a>3 from table;#字段a是计算字段,不是原生的,会报错
select id , char_length(name) as a where char_length(name)>3 from table;#这么写是正确的

但是重复表达式比较繁琐,而且where中增加运算字段会使索引失效,不建议这样做。可以使用嵌套的查询结构解决这个问题。

select * from 
(
select id , char_length(name) as a from table
) as t
where t.a>3;

group by 中的字段

group by 中的分组字段必须在select之后出现。

null的判断

在SQL中,如果在IN从句中出现null,将会出现完全不符合预期的情况。例如:

 select * from user 
 where id not in (1, 2, null)

此时返回结果为空,而不是除了1,2和null以外的结果。事实上,上述not in语句相当于:

where id <> 1 and id <>2 and id<>null

null与非null数据进行比较,其结果是UNKNOWN,因此不会返回任何结果。

要判断是否为NULL,使用IS NULL, 而不是id = null 或者id <>null。

因此,在IN从句中,千万千万要记得去掉NULL。

你可能感兴趣的:(sql,mysql,between,or,and,where)