为何写这篇博客,源于工作时虽然写了大量sql语句包括复杂sql。可是一但脱离sql执行环境和运行结果。发现很多东西只是在尝试中解决了问题,但这还远远不够。
本文列取了常用但是容易遗漏的一些知识点。另外关键词一般大写,为了便于阅读所以很多小写。
也许你经常对单个字段去重,并且知道不建议用distinct,而是group by,因为大多数情况下distinct会引起全表扫描。但是还是需要了解:
#此时distinct 是对(column1+column2)联合去重。
select distinct column1,column2 from table;
也许你经常使用下面sql显示表结构,如果有天你要通过代码同步表结构,会用得上。
show create table table_name;
而忘记了下面这个
#显示表详细表结构
describe table_name;
#同上
desc table_name;
select LEAST(1,2,0,3);# 0
select GREATEST(1,2,0,3);# 3
select LEAST("c","a","b");# a
select GREATEST("c","a","b");# c
select 1 + '-1';# 0
#整数+符串,字符串隐式转换不成功,当作0
select 1 + 'a';# 1
select 1 + "a";# 1
select 1 + NULL;# NULL
select 1 * -1.0;# -1.0
select 1 / -1;# -1.0000
select 1 / 1.0;# 1.0000
select 1 / 0;# NULL
select 1 % 1.0;# 0.0
select 1 % 0;# NULL
select -3 % 2;# -1
select -3 % -2;# -1
select 3 % -2;# 1
#整数和符串比较,字符串隐式转换不成功,当作0
select 0 = 'a';# 1
#NULL参与判断,结果为NULL
select 1 = NULL;# NULL
select NULL = NULL;# NULL
#没有NULL参与相当于等号,有NULL参与如下
select 1<=> NULL;# 0
select NULL <=> NULL;# 1
select NULL <=> 'NULL', NULL <=> "NULL";# 0 0
#当然也可以这样比较
select 1 IS NULL;# 0
select 1 IS NOT NULL;# 1
select NULL IS NULL;# 1
select ISNULL(1);# 0
select ISNULL(NULL);# 1
select NOT 0;# 1
select NOT 100;# 0
select NOT 'A';# 1
select NOT (select 0 = 1);# 1
select 1 NOT between 0 and 2;# 0
select ! 0;# 1
select ! 100;# 0
select ! 'A';# 1
select ! (select 0 = 1);# 1
# \
select a from (select "_abc" as a) t where a like '\_%';# _abc
# ESCAPE 函数
select a from (select "_abc" as a) t where a like 'a_%' escape 'a';# _abc
select a from (select "_abc" as a) t where a like '$_%' escape 'a'$';# _abc
select 0 xor 0;# 0
select 0 xor 1;# 1
select 1 xor 0;# 1
select 1 xor 1;# 0
select 1 xor NULL;# NULL
#如果按顺序来执行按理结果应是0,而实际结果是1,所以and优先级高于or
select 1 or 1 and 0;# 1
#等价于
select 1 or (1 and 0);# 1
待续。。。