算术、比较、逻辑、位运算,外加优先级
这一节全是表格,一条条点开试最省事。

试一试四类运算符,点一行算一个
| 表达式 | 结果 |
|---|
重 点
运算符加上运算对象就是表达式,表达式算出来的那个东西就是值。
想一想
这些运算符里,哪几个是别的语言里没见过的?
这一节全是表格,一条条点开试最省事。

| 表达式 | 结果 |
|---|
运算符加上运算对象就是表达式,表达式算出来的那个东西就是值。
这些运算符里,哪几个是别的语言里没见过的?
DIV 只要整数商,MOD 只要余数。

| 写法 | 算出什么 |
|---|---|
| 2 DIV 4 | 0,商取整 |
| 5 % 3 | 2,余数 |
4/8 算出来是 0.5000 带四位小数,MySQL 的除法结果是精确类型。
5 % 3 和 5 MOD 3 完全一样,MOD 既能当运算符也能当函数用。
1 是真,0 是假,还有一个 NULL。

任何值跟 NULL 比,结果都是 NULL,不是 0 也不是 1。
WHERE score = NULL 能查出成绩为空的行吗?
IS NULL、IS NOT NULL,还有一个飞碟符号。

| 写法 | 结果 |
|---|---|
| NULL = NULL | NULL |
| NULL <=> NULL | 1 |
| NULL IS NULL | 1 |
IN 判断在不在集合里,BETWEEN 判断在不在区间里,两头都算。
LIKE 只有两个通配符,正则有一整套。

'abc' REGEXP '[a-z]' 结果是 1,只要串里有一个小写字母就算匹配。
LIKE 的 % 和正则的 .* 是一回事吗?
* 是零次到多次,{n,m} 是至少 n 次至多 m 次。

'aa' REGEXP 'a{2,5}' 结果是 1,两个 a 落在二到五次这个范围里。
正则不是 MySQL 独有的,会写这一套,以后在别的地方也用得上。
NOT 可以写成叹号,AND 可以写成两个与号。

| 写法 | 什么时候真 |
|---|---|
| AND / && | 两边都真 |
| OR / || | 有一个真 |
| XOR | 只有一边真 |
| NOT / ! | 原来是假 |
一边是 NULL 的时候要当心:5 AND NULL 算出来是 NULL,不是 0。
复杂的 WHERE 条件就是这样搭出来的。

5*10>25-4 AND -5+2*3<10 结果是 1,两个比较都成立。
10 BETWEEN 5 AND 20 OR 'ABC' LIKE 'A_C' 也是 1,前一半就已经成立了。
OR 的两边,MySQL 会不会两边都算一遍?
按位与、按位或、按位异或、左移右移。

7 & 4 结果是 4:0111 和 0100 逐位相与,只剩第三位。
一排开关,两个人各按了一部分,按位与就是问哪几个开关两人都按了。
^ 在 MySQL 里是按位异或,不是乘方。求乘方要写 POWER(4,3)。
1 << 4 为什么等于 16?
记不住全部没关系,记住几条最容易错的。

同一级的运算符从左往右算,3*9 MOD 7 是先乘后取余。
拿不准就加括号。括号不要钱,看错一次代价可大得多。
1 << 2+8-3*9 MOD 4^3 到底等于几。

答案是 16。四个运算符全用上了,谁先谁后完全看那张优先级表。
2021 除以 4 余 1,所以第一个括号里 1=0 不成立,整个 AND 就是 0。