运算符
运算符 | 含义 | 示例 |
---|---|---|
( ) | 改变计算优先级和分组 | (1+2)*3 |
+ | 相加 | 1+2 |
− | 相减 | 2-1 |
* | 相乘 | 1*2 |
/ | 相除 | 8/2 |
= | 等于 | 1=2 |
<> | 不等于 | 1<>2 |
> | 大于 | 2>1 |
>= | 大于或等于 | 200 >= 100 |
< | 小于 | 5 < 0 |
<= | 小于或等于 | 5 <= 100 |
CONCAT | 文本连接函数 | CONCAT(‘123′,’456’) |
AND | 逻辑"与" | [CountryRegion] = "USA" AND [Quantity]>0 |
OR | 逻辑"或" | [CountryRegion] = "USA" OR [Quantity]>0 |
NOT | 逻辑"非" | NOT [Quantity] > 2 |
IS NULL | 判断值是否为空 | 123 IS NULL |
IS NOT NULL | 判断值是否非空 | 123 IS NOT NULL |
BETWEEN AND | 判断值是否在闭区间中 | 123 BETWEEN 10 AND 1000 |
IN | 判断值是否存在与指定列表中 | 123 IN (1,2,3,4,123,100) || (5,6) in ((1,2),(‘5′,’6’)) |
LIKE | 判断值是否与包含通配符的值匹配 | SALARY LIKE ‘20%’ %:任意字符,:单个字符 |
EXISTS | 判断表是否不为空 | EXISTS (SELECT xxxx) |
ALL / SOME | 比较值与列表,全部满足才成立 | 123 > ALL (SELECT xxxx) |
ANY | 比较值与列表,任意一个满足即可 | 123 > ANY (SELECT xxxx) |
数据类型
数据类型 | 含义 |
---|---|
INTERGER / INT | 整数 |
DECIMAL(p,s) | 定点小数 |
FLOAT(p,s) | 浮点数 |
VARCHAR(n) | 文本-变长字符串 |
TEXT | 文本-超长字符串 |
DATETIME | 日期时间 |
DATE | 日期 |
TIME | 时间 |
TIMESTAMP | 时间戳 |
NULL | 空值 |
TRUE/FALSE | 布尔值 |
不同数据库实现可能会使用不同的关键词来代替以上数据类型的关键字,但支持的数据类型基本一致。
数据类型转换
数据类型的转换分为隐式转换和显示转换/手工转换,其中隐式转换是指操作符与数据类型不一致时,数据库系统自动进行类型转换以兼容操作符,而显示转换/手工转换则是指使用转换函数手工进行数据类型的转换。
在不同的数据库实现之间的数据类型转换规则可能不相同,因此在使用时需要查询特定的数据库实现的文档。但最佳实践就是使用显示转换函数,因为显示转换函数在各个数据库实现中基本一致,但隐式转换则是各有差异,而且隐式转换可能会出现以下问题:
1、程序可读性差,且依赖数据库的隐式转换规则,效率差,会增加处理时间;且如果数据库升级,则程序可能无法正确执行;
2、有可能会导致索引失效;
3、有可能会导致意想不到的结果;
所以使用显示转换函数来进行数据类型的转换是最佳实践。
下面给出MySQL和SQL Server的数据类型转换规则:
1、MySQL
隐式转换:
- 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
- 两个参数都是字符串,会按照字符串来比较,不做类型转换
- 两个参数都是整数,按照整数来比较,不做类型转换
- 十六进制的值和非数字做比较时,会被当做二进制串
- 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
- 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
- 所有其他情况下,两个参数都会被转换为浮点数再进行比较
手工转换:
- 使用
CONVERT(value,type)
或CAST(value AS type)
函数,例如:将整数:123 转换为字符串:- CONVERT(123,VARCHAR(255))
- CAST(123 AS VARCHAR(255))
- 使用隐式转换规则,例如:将字符串"123"转换为整数,"123"+0
2、SQL Server
隐式转换:
- 当两个不同数据类型的表达式用运算符组合后,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。 如果此转换不是所支持的隐式转换,则返回错误。 当两个操作数表达式具有相同的数据类型时,运算的结果便为该数据类型。
- 参考文档:数据类型优先级 (Transact-SQL) | Microsoft Learn
手工转换:
- 使用
CONVERT(type,value,[stylus])
或CAST(value AS type)
函数,例如:将整数:123 转换为字符串:- CONVERT(VARCHAR(255),123)
- CAST(123 AS VARCHAR(255))
- 使用隐式转换规则,例如:将字符串"123"转换为整数,"123"+0