文章目录
算术运算符
算术运算符,包括 +
、-
、*
、/
或者 DIV
、%
或者 MOD
(求余或求模)。
- MySQL中,
+
只做数值相加,如果遇到非数值类型,MySQL会先尝试将其转换为数值,如果转换失败,则当作数值0处理。也就是说,这里存在 隐式转换。 - MySQL中,字符串拼接使用函数
CONCAT(str1,str2,...)
实现。 - 空值参与运算,运算结果仍为空值。
- MySQL中,除数为0时,结果为空值,即
NULL
。
+ 只做数值相加
# MySQL中,+只做数值相加,如果遇到非数值类型,MySQL会先尝试将其转换为数值,如果转换失败,则当作数值0处理。也就是说,这里存在 隐式转换。
SELECT 100 + '2'
FROM DUAL; -- 返回102
SELECT 100 + 'A'
FROM DUAL; -- 返回100
SELECT 'A' + 'B'
FROM DUAL; -- 返回0
字符串拼接用函数CONCAT()
# MySQL中,字符串拼接使用函数CONCAT()实现
SELECT CONCAT('HEL','LO')
FROM DUAL; -- 返回HELLO
SELECT CONCAT('a','b','c')
FROM DUAL; -- 返回abc
空值参与运算,结果仍为空值
SELECT 100 + NULL
FROM DUAL; -- 返回NULL
除数为0时,结果为空
SELECT 100/0
FROM DUAL; -- 返回NULL
比较运算符
比较运算符,包括 =
、<=>
、<>
或者 !=
、<
、<=
、>
、>=
,
也包括 IS NULL
、IS NOT NULL
、ISNULL()
、LEAST()
、GREATEST()
、BETWEEN AND
、IN()
、NOT IN()
、LIKE
、REGEXP
、RLIKE
。
=
,等号运算符。如果一侧为数值,另一侧为非数值,则存在隐式转换。即,先尝试将非数值转换为数值,如果转换失败,则当作数值0处理。=
,等号运算符。如果两侧都是字符串,则比较字符串中字符的ANSI编码。=
,等号运算符,如果任一侧出现NULL
,比较结果为NULL
。<=>
,安全等于运算符。和=
类似,区别在于,<=>
可以对NULL
进行判断。- 判断字段是
NULL
:字段<=>NULL
、字段 IS NULL
、ISNULL(字段)
。 - 判断字段不是
NULL
:NOT 字段<=>NULL
、字段 IS NOT NULL
、NOT ISNULL(字段)
。 BETWEEN 条件下界 AND 条件上界
,包含边界。- 使用
LIKE
进行模糊查询,其中,%
,代表不确定个数的字符。可以代表0个字符,可以代表1个字符,也可以代表多个字符。_
,代表任意一个字符。\
,转义字符。ESCAPE 字符
,指定某个字符为转义字符。
REGEXP
,正则匹配。常用通配符如下,^
,匹配开头。$
,匹配结尾。.
,匹配任意一个字符。*
,匹配0个或多个在它前面的字符。比如,x*
,匹配任意数量的x
字符;[0-9]*
,匹配任意数量的数字;*
,匹配任意数量的任意字符。[]
,匹配方括号内的任意字符。比如,[abc]
,匹配a
或b
或c
;[a-zA-Z]
,匹配任意大小写字母;[0-9]
,匹配任意数字。
= 和 <=>
# 如果一侧为数值,另一侧为非数值,则存在隐式转换。即,先尝试将非数值转换为数值,如果转换失败,则当作数值0处理。
SELECT 1='1',1='a',0='a','1'=1,'a'=1,'a'=0
FROM DUAL;
-- 返回 1 0 1 1 0 1
# 如果=两侧是字符串,则比较字符串中字符的ANSI编码
SELECT 'a'='a','ab'='ab','a'='b'
FROM DUAL;
-- 返回 1 1 0
# =,等号运算符,任一侧出现NULL,结果就为NULL
SELECT 1=NULL,NULL='a',NULL=NULL
FROM DUAL;
-- 返回 NULL NULL NULL
# <=>,安全等于运算符,和=(等号运算符)类似
SELECT 1<=>'1',1<=>'a',0<=>'a','1'<=>1,'a'<=>1,'a'<=>0
FROM DUAL;
-- 返回 1 0 1 1 0 1
SELECT 'a'<=>'a','ab'<=>'ab','a'<=>'b'
FROM DUAL;
-- 返回 1 1 0
# <=>,安全等于运算符,可以对NULL进行判断
SELECT 1<=>NULL,NULL<=>'a',NULL<=>NULL
FROM DUAL;
-- 返回 0 0 1
SELECT *
FROM employees
WHERE commission_pct <=> NULL;
-- 返回 72 行记录
IS NULL、IS NOT NULL和ISNULL()
# 查询表employees中,commission_pct为NULL的数据
SELECT *
FROM employees
WHERE commission_pct <=> NULL;
SELECT *
FROM employees
WHERE commission_pct IS NULL;
SELECT *
FROM employees
WHERE ISNULL(commission_pct);
# 查询表employees中,commission_pct不为NULL的数据
SELECT *
FROM employees
WHERE NOT commission_pct <=> NULL;
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;
SELECT *
FROM employees
WHERE NOT ISNULL(commission_pct);
BETWEEN … AND …
# 查询工资在[6000,8000]范围内的员工信息
SELECT *
FROM employees
WHERE salary BETWEEN 6000 AND 8000;
SELECT *
FROM employees
WHERE salary>=6000 AND salary<=8000;
SELECT *
FROM employees
WHERE salary>=6000 && salary<=8000;
# 查询工资不在[6000,8000]范围内的员工信息
SELECT *
FROM employees
WHERE salary NOT BETWEEN 6000 AND 8000;
SELECT *
FROM employees
WHERE salary<6000 OR salary>8000;
SELECT *
FROM employees
WHERE salary<6000 || salary>8000;
IN()和NOT IN()
# 查询department_id为10,20,30的员工信息
SELECT *
FROM employees
WHERE department_id IN (10,20,30);
SELECT *
FROM employees
WHERE department_id=10 OR department_id=20 OR department_id=30;
# 查询工资不是6000,7000,8000的员工信息
SELECT *
FROM employees
WHERE salary NOT IN(6000,7000,8000);
SELECT *
FROM employees
WHERE salary<>6000 && salary<>7000 && salary<>8000;
模糊查询:LIKE
# 查询last_name中包含字符'a'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%';
# 查询last_name以字符'a'开头的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE 'a%';
# 查询last_name中既包含字符'a'又包含字符'e'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%';
# 查询last_name第二个字符为'a'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '_a%';
逻辑运算符
逻辑运算符,包括 NOT
或 !
,AND
或 &&
、OR
或 ||
、XOR
(逻辑异或)。
AND
和OR
可以一起使用,且AND
的优先级比OR
的优先级高。
位运算符
位运算符,包括 ~
(按位取反)、&
(按位与)、|
(按位或)、^
(按位异或)、>>
(按位右移)、<<
(按位左移)。