Appearance
算术运算符
- sql
# 2 SELECT 1 + 1; # 3.5 SELECT 1 + 2.5 # 2,SQL 中 + 只表示加法运算,没有连接的作用,会将字符串隐式转换。 SELECT 1 + '1'; # 1,如果字符串隐式转换不成功,会将字符串看作 0。 SELECT 1 + 'a'; # NULL, SQL 中 NULL 参与运算结果为 NULL SELECT 1 + NULL; - sh
SELECT 1 - 1; /* * 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数; * 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数; * 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的; * MySQL中+只表示数值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。 */ - sql
# 1 SELECT 1 * 1; # 1.0000 SELECT 1 * 1.0; / 或 DIV
sql# 1.0000 SELECT 1 / 1.0; # 1.0000,不管能否除尽,结果都是浮点型。 SELECT 1 / 1; # 0.5000 SELECT 1 / 2; # 0.0000 SELECT 0 / 1; # NULL SELECT 1 / 0;% 或 MOD
sql# 0 SELECT 1 % 1; # -2 SELECT -12 % 5; # -2 SELECT -12 % -5; # 2,符号和被模数一样。 SELECT 12 % -5;
比较运算符
比较的结果为真返回 1,为假返回 0,其它情况返回 NULL。
=(等于运算符)
sql# 1 SELECT 1 = 1; # 0 SELECT 1 = 2; # 1 SELECT 1 != 2; # 1,隐式转换。 SELECT 1 = '1'; # 0, SELECT 1 = 'a'; # 1,隐式转换不成功,看作 0。 SELECT 0 = 'a'; # 1 SELECT 'a' = 'a'; # 0,两边都是字符串,不发生隐式转换,比较的是字符串的 ANSI 编码。 SELECT 'a' = 'b'; # NULL,等号两边有一个为 NULL,结果为 NULL。 SELECT 1 = NULL; # NULL SELECT NULL = NULL; # 会将比较结果为 1 的记录拿出来,commission_pct = NULL 出现了 NULL,结果是 NULL, # 因此没有任何匹配记录 SELECT * FROM employees WHERE commission_pct = NULL;<=>(安全等于运算符)
sql# 安全等于运算符和等于运算符唯一的区别就是安全等于运算符可以对 NULL 进行判断 # 两个操作数均为 NULL 时,返回 1,一个操作数为 NULL 时,返回 0。 # 1 SELECT NULL <=> NULL; # 0 SELECT 1 <=> NULL;<> 或 !=(不等于运算符)
sql# 0 SELECT 3 != 2; # NULL SELECT NULL != NULL; # NULL SELECT 1 != NULL;<(小于运算符)
<=(小于等于运算符)
(大于运算符)
=(大于等于运算符)
IS NULL
ISNULL 等价于上面
IS NOT NULL
sqlSELECT * FROM employees WHERE commission_pct IS NOT NULL;LEAST()
sql# 1 SELECT LEAST(1, 2, 3, 4, 5); # 'aa' SELECT LEAST('aa', 'ab');GREATEST()
sql# 5 SELECT GREATEST(1, 2, 3, 4, 5);BETWEEN ... AND ...
sql# 包含开始和结束边界 SELECT first_name, last_name, salary FROM employees WHERE salary BETWEEN 6000 AND 8000; # 查询不到任何数据 SELECT first_name, last_name, salary FROM employees WHERE salary BETWEEN 8000 AND 6000; # 工资不在 [6000, 8000] 范围的数据 SELECT first_name, last_name, salary FROM employees WHERE salary NOT BETWEEN 6000 AND 8000;IN
sql# 部门为 10 或 20 或 30 的员工信息 SELECT first_name, last_name, salary FROM employees WHERE department_id IN (10, 20, 30);NOT IN
LIKE
sql# last_name 中包含 a 的员工信息 SELECT first_name, last_name, salary FROM employees # % 代表不确定个数的字符(0 个或多个) WHERE last_name LIKE '%a%';sql# last_name 中以 a 开头的员工信息 SELECT first_name, last_name, salary FROM employees WHERE last_name LIKE 'a%';sql# last_name 中包含 a 且包含 e 的员工信息 SELECT first_name, last_name, salary FROM employees WHERE last_name LIKE '%a%' AND last_name LIKE '%e%'; # 或者 # WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%';sql# last_name 中第二个字符是 a 的员工信息 SELECT first_name, last_name, salary FROM employees # _ 代表一个不确定的字符 WHERE last_name LIKE '_a%';sql# last_name 中第二个字符是 _ 且第三个字符是 a 的员工信息 SELECT first_name, last_name, salary FROM employees # 转义 WHERE last_name LIKE '_\_a%'; # 用于说明 $ 表示转义,效果和上面一样 # WHERE last_name LIKE '_$_a%' ESCAPE '$';REGEXP
sql# 1 SELECT 'foo' REGEXP '^f'; # 1 SELECT 'foo' REGEXP 'o$';RLIKE
逻辑运算符
结果为 1 或 0 或 NULL。 && 和 || 可以配合使用,注意 && 优先级高于 ||。
NOT 或 !
AND 或 &&
OR 或 ||
sqlSELECT first_name, last_name, salary FROM employees WHERE department_id = 10 || department_id = 20 || department_id = 30;XOR(异或)
位运算符
&
|
^(按位异或)
~(按位取反)
<<