目录
1、算数运算符
1.1、加法与减法运算符
SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5 FROM DUAL;
SELECT 100 + '1' FROM DUAL; #结果是101
SELECT 100 + 'a' FROM DUAL; #结果是100
SELECT 100 + NULL; #结果是NULL
结论:- 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;- 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;- 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;- 在 Java 中, + 的左右两边如果有字符串,那么表示字符串的拼接。但是在 MySQL 中 +只表示数 值相加。如果遇到非数值类型,先尝试转成数 值,如果转失败,就按0计算。(补充: MySQL 中字符串拼接要使用字符串函数CONCAT() 实现)
1.2、乘法与除法运算符
SELECT 100, 100 * 1, 100 * 1.0, 100 / 1.0, 100 / 2,100 + 2 * 5 / 2,100 /3, 100 DIV 0 FROM dual;
#计算出员工的年基本工资
SELECT employee_id,salary,salary * 12 annual_sal FROM employees;
结论:
- 一个数乘以整数 1 和除以整数 1 后仍得原数;- 一个数乘以浮点数 1 和除以浮点数 1 后变成浮点数,数值与原数相等;- 一个数除以整数后,不管是否能除尽,结果都为一个浮点数;- 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后 4 位;- 乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。- 在数学运算中, 0 不能用作除数,在 MySQL 中,一个数除以 0 为 NULL 。
1.3、取模
SELECT 12 % 3, 12 MOD 5, -12 % 3, -12 MOD 5 FROM DUAL;
#筛选出employee_id是偶数的员工
SELECT * FROM employees WHERE employee_id MOD 2 = 0;
2、比较运算符
2.1、等号运算符
# 1.等号运算符
# 字符串存在隐式转换。如果转换数值不成功,则看作0
# 两边都是字符串的话按照ansi的比较规则比较
# 只要有null参与,结果都为null
SELECT 1 = 1, 1 = '1', 1 = 0, 0 = 'a', 'a' = 'a', (5 + 3) = (2 + 6), '' = NULL , NULL = NULL;
SELECT 1 = 2, 0 = 'abc', 1 = 'abc' FROM DUAL;
2.2、安全等于
SELECT 1 <=> 2, NULL <=> NULL, 2 <=> NULL;
2.3、不等于运算符
注意:
BETWEEN ... AND ... 包含边界
转义字符:/
# 3.不等于
# IS NULL / IS NOT NULL / ISNULL
SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NULL;
SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NOT NULL;
SELECT last_name, salary, commission_pct FROM employees WHERE ISNULL(commission_pct);
# LEAST() / GREATEST()
SELECT LEAST('c', 't', 'p', 'r'), GREATEST('c', 't', 'p', 'r');
# BETWEEN 条件1 AND 条件2 (包含边界)
# 查询工资在6000到8000的员工信息
SELECT * FROM employees WHERE salary BETWEEN 6000 AND 8000;
# 条件1 > 条件2 时没有结果
SELECT * FROM employees WHERE salary BETWEEN 8000 AND 6000;
# 查询工资不在6000到8000的员工信息
SELECT * FROM employees WHERE salary NOT BETWEEN 6000 AND 8000;
# IN(SET) / NOT IN(SET)
# 查询部门为10,20,30部门的员工信息
SELECT * FROM employees WHERE department_id IN(10, 20, 30);
# 查询工资不是6000,7000,8000的员工信息
SELECT * FROM employees WHERE salary NOT IN(6000,7000,8000);
# LIKE:模糊查询
# %代表任意个字符,包括0个
# _代表一个任意字符
# 查询last_name中包含字符'a'的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';
# 查询last_name中包含字符'a'和'e'的员工信息
SELECT * FROM employees
#WHERE last_name LIKE '%a%e%' or last_name like '%e%a%';
WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';
# 查询last_name第二个字符是'a'的员工
SELECT * FROM employees WHERE last_name LIKE '_a%';
# 查询last_name第二个字符是_且第三个字符是a的员工
# 需要使用转义字符/
SELECT * FROM employees
#where last_name like '_/_a%';
WHERE last_name LIKE '_^_a%' ESCAPE '^'; #ESCAPE中的字符任意
2.3.1、REGEXP运算符
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
(1)‘^’匹配以该字符后面的字符开头的字符串。
(2)‘$’匹配以该字符前面的字符结尾的字符串。
(3)‘.’匹配任何一个单字符。
(4)“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”或“b”或“c”。为了命名字符的范围,使用一 个‘-’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
(5 ) ‘*’ 匹配零个或多个在它前面的字符。例如, “x*” 匹配任何数量的 ‘x’ 字符, “[0-9]*” 匹配任何数量的数字, 而“*” 匹配任何数量的任何字符。
# REGEXP / RLIKE
SELECT 'sfhef' REGEXP '^s', 'fesiofi' REGEXP 'i$', 'fakef' REGEXP 'ak';
SELECT 'faufake' REGEXP 'fa.fa';
SELECT 'bbbaaa' REGEXP 'b{2}', 'bbbbaa' RLIKE 'b{2,5}';
3、逻辑运算符
MySQL中支持4种逻辑运算符如下:
注意:
4、位运算符
位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。
4.1、按位与运算符
按位与(&)运算符将给定值对应的二进制数逐位进行逻辑与运算。当给定值对应的二进制位的数值都为1时,则该位返回1,否则返回0。
4.2、按位或运算符
按位或( | )运算符将给定的值对应的二进制数逐位进行逻辑或运算。当给定值对应的二进制位的数值有一个或两个为1时,则该位返回1,否则返回0。
4.3、按位异或运算符
按位异或(^)运算符将给定的值对应的二进制数逐位进行逻辑异或运算。当给定值对应的二进制位的数值不同时,则该位返回1,否则返回0。
SELECT 12 & 5, 12 | 5,12 ^ 5
4.4、按位取反运算符
按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为o,将0变为1。
SELECT 10 & ~1; # 结果为10
由于按位取反(~)运算符的优先级高于按位与(&)运算符的优先级,所以10&~1,首先,对数字1进行按位取反操作,结果除了最低位为o,其他位都为1,然后与10进行按位与操作,结果为10。