MySQL:常见运算符
前言:
五一过后,我又来啦!狂玩五天,放松好心情~
MySQL中的运算符有以下4类,分别是:算数运算符,比较运算符,逻辑运算符,位操作运算符。
算数运算符:
有一定python基础的话,应该对”算数运算符“并不陌生,包括:+ - * / %。加减乘除取余数。
我们可以选择表内某一数据进行加法运算,并输出运算结果。
这里我们先创建一个新的表,tb5,字段名为 num,字段属性为INT。
向表内添加数值 55:
我们得到的表是这样的:
对该值进行加法运算,并输出:
发现,输出的结果也形成了一个表。那么我们看看原数据是否会有变化:
并不会。
# 其实做到这里,我有一个疑问,是否可以通过运算符改变原表的数值呢?SELECT * FROM <TABLE> 语句相当于把表内的值拷贝一个出来,进行数值运算。
# 具体更改原表数值中的内容需要等到学习UPDATE语句。这里的运算并不能改变原表中的值。
其他的运算也是如此。
# 0除任何数都为NULL
比较运算符:
比较运算符的结果:1,0,NULL
往往用于SELECT 查询条件中。
- 字符串和数字进行比较,会先将字符串转化为数字
- 如果一个(或一个以上的)参数为NULL,那么所得结果为NULL
- 如果两个比较类型是字符串,按照字符串类型进行对比
- 大于等于,小于等于,不等于,这些就不再一一进行比较了
- 接下来注意一下安全等于运算符(<=>)
除了判断NULL的地方不一样之外,和=的作用相同。
检验是否为NULL 的语句:
IS NULL == ISNULL 为NULL
IS NOT NULL 不为NULL
注意,使用ISNULL 的时候,判断的值要放在后面的括号里。
BETWEEN <> AND <>:
判断值是否在区间内。(字符串也是可以实现的)
LEAST <(数值)> :
筛选输入数据中的最小值。
浮点数也是可以的,看一下字符串:
在既有数字,又有字符串的情况下,优先数字大小。
既然有挑选最小值的语句,那么也一定有挑选最大值的语句。
GREATEST<>;
挑选所给数据中最大的一项。
<> LIKE <>;
- 用来匹配字符串
- 有两个通配符,% 和 _ ,%代表任意个数字符;_ 代表一个任意字符
- %可以匹配NULL
# %d 表示的就是以d结尾的任意单词。
<> REGEXP <>:
使用正则表达式中的符号来匹配字符串。
这个需要一定正则表达式基础,这里贴一个大佬的文章:
(1条消息) 正则表达式(一)字符串匹配_正则表达式匹配指定字符串_花果山来的和尚的博客-CSDN博客
匹配以g开头的单词
匹配在方括号中出现的任意字符,可以重复匹配
(如果没有*号在方括号后面,那么在正则表达式中,方括号只能匹配一次)
逻辑运算符:
逻辑运算符包括:非,与,或,异或
注意,下面的例子中使用了两个数进行比较,实际上可以有多个数进行逻辑运算,数字中间使用逻辑运算符相连接。
非:NOT 或 !
表示:后面跟着的数字是0,返回1;不是0,也不是NULL,返回1;是NULL 返回 NULL。
这样一看两个似乎相同,但是依然有例外情况:
出现这个情况是因为 NOT 和 !的运算优先级不同。
- NOT 的优先级低于 + 和 -,因此先进行算数运算,再进行逻辑运算。
- !的优先级高于 + 和 -,因此先进行逻辑运算,在进行算数运算。
- 可以利用圆括号改变运算顺序。
AND 或 &&:
<> AND <> // <> && <>
- 前后操作数均为非零,且不为NULL,所得结果为1;
- 有一个(或一个以上)数为0,结果为0;
- 非0数和NULL,结果为NULL;
- 0和NULL,结果为0;
OR 或 ||:
<> OR <> // <> || <>
- 两个操作数均为 NULL,返回NULL
- 一个数为0,一个为NULL,返回NULL
- 一个数非零,一个为NULL,返回非零数
- 两个数均为非零,返回1
- 两个数均为0,返回0
- 一个数非零,一个数为0,返回1
XOR
<> XOR <>
- 只要有一个操作数为NULL,返回NULL
- 都是非零值,或都是0,返回0
- 有一个是非零,一个是0,返回1
位运算符:
对二进制字节中的位进行测试、移动、或者测试处理,MySQL中提供的位运算符有:
- 按位或(|)
- 按位与(&)
- 按位异或(^)
- 按位左移(<<)
- 按位右移(>>)
- 按位取反(~)
按位或(|):
这个需要理解前面在“逻辑运算符”中提到的 OR 或 ||,
将参与运算的数据,按照其对应的二进制数,逐位进行“逻辑或运算”:
先来举个例子:
我们进行了两个“按位或”运算,先来看10 | 15
- 10的二进制为:1010
- 15的二进制为:1111
- 牢记逻辑或运算的内容:两个数均为非零,一个数为0一个数为非零,返回1;两个数为0,返回0
再来看4,9,2:
- 4:0100
- 9:1001
- 2:0010
- 三个数,只有全为0的时候才能返回0
结果按位或的结果是,返回一个64位无符号整数
按位与(&)
这回参照的是“逻辑与运算”:
- 均为非零,非NULL,返回1
- 有一个为0,返回0
位异或(^)
参照“逻辑异或运算”:
- 都是非零,或都是0,即全都是相同类型,返回0
- 不同类型,返回1
位左移(<<)
expr << n,n为移动位数
15:0000 1111
60:0011 1100
右侧用0补齐
位右移(>>)
和位左移一样。
位取反(~)
0 变成1, 1变成0
如果单独取反,会发现数据特别大:
可以合并其他运算:
运算符优先级:
由低到高,转换过来就是先算哪个:
- 赋值运算=,:=
- || OR
- XOR
- && AND
- NOT
- BETWEEN, CASE, WHEN, THEN, ELSE
- 比较运算=, <=>, >=, >, <, <>, !=, IS, LIKE, REGEXP, IN
- |
- &
- <<, >>
- -, +
- *, /(DIV), %(MOD)
- ^
- 负号-, 位反转~
- !