SQL基础入门② | 运算符篇

0 序言

本文围绕MySQL中的运算符展开,重点讲解算术、比较、逻辑、位运算符的定义、规则、示例及优先级并介绍正则表达式查询的相关内容。

通过本文的学习,你能初步掌握各类运算符的用法,理解其背后逻辑,解决实际查询中的运算问题,提升SQL语句编写能力。

1 算术运算符

算术运算符用于数学运算,连接两个数值或表达式,进行取模操作。

1.1 加法与减法运算符

计算两个值或表达式的和(+)、差(-)。

sql 复制代码
SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5 FROM dual;

结果如下:

就跟正常的运算是一样的,这里就不过多解释了。

牢记以下几点规则

  • 整数间加减,结果为整数;整数与浮点数加减,结果为浮点数
  • 加法和减法优先级相同,运算顺序不影响结果。
  • MySQL中"+"仅表数值相加,遇非数值先转数值,失败则按0计算,字符串拼接用CONCAT()。

1.2 乘法与除法运算符

计算两个值或表达式的乘积(*)、商(/或DIV)。

sql 复制代码
SELECT 2*5/2, 100*1, 100*1.0, 100/1.0, 100/2, 100+2*5/2, 100/3, 100 DIV 0 FROM dual;

结果如下:

同理,牢记以下规则

  • 乘1或除1(整数)结果为原数;乘1.0或除1.0结果为浮点数,值与原数相等。
  • 除法结果为浮点数,除不尽时保留4位小数。
  • 乘除优先级相同,顺序不影响结果;除数为0时结果为NULL。

1.3 求模(求余)运算符

计算两个值或表达式的余数(%或MOD)。

sql 复制代码
SELECT 12%3, 12 MOD 5 FROM dual;

结果如下:

又比如说,我要筛选employee_id为偶数的员工:

sql 复制代码
SELECT * FROM employees WHERE employee_id MOD 2 = 0;

这里id号为偶数的员工就全被选择出来了。

2 比较运算符

用于比较左右操作数,结果为1(真)、0(假)或NULL,常用于SELECT查询的条件。

2.1 等号运算符(=)

判断两边值、字符串或表达式是否相等。

规则如下:

  • 均为字符串:比较ANSI编码;
  • 均为整数:比较大小;一整数一字符串:字符串转数字比较。
  • 含NULL时结果为NULL。
sql 复制代码
SELECT 1=1, 1='1', 1=0, 'a'='a', (5+3)=(2+6), ''=NULL, NULL=NULL FROM dual;

结果如下:

2.2 安全等于运算符(<=>)

与=类似,但两边均为NULL时返回1,而非NULL。

sql 复制代码
SELECT 1<=>'1', 1<=>0, 'a'<=>'a', (5+3)<=>(2+6), ''<=>NULL, NULL<=>NULL FROM dual;

结果如下:

2.3 不等于运算符(<>或!=)

判断两边值是否不相等,不相等返回1,相等返回0;含NULL时结果为NULL。

sql 复制代码
SELECT 1<>1, 1!=2, 'a'!='b', (3+4)<>(2+6), 'a'!=NULL, NULL<>NULL FROM dual;

结果如下:

2.4 空运算符(IS NULL或ISNULL)

判断值是否为NULL,是则返回1,否则返回0。

sql 复制代码
SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL FROM dual;

结果如下:

2.5 非空运算符(IS NOT NULL)

判断值是否不为NULL,是则返回1,否则返回0。

sql 复制代码
SELECT NULL IS NOT NULL, 'a' IS NOT NULL, 1 IS NOT NULL FROM dual;

结果如下:

逻辑跟上一节相反,这里注意区分!

2.6 最小值运算符(LEAST)

返回多个值中的最小值,含NULL时结果为NULL。

sql 复制代码
SELECT LEAST(1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2) FROM dual;

结果如下:

2.7 最大值运算符(GREATEST)

返回多个值中的最大值,含NULL时结果为NULL。

sql 复制代码
SELECT GREATEST(1,0,2), GREATEST('b','a','c'), GREATEST(1,NULL,2) FROM dual;

结果如下:

2.8 BETWEEN AND运算符

判断值是否在两值之间(含边界),是则返回1,否则返回0。

sql 复制代码
SELECT 1 BETWEEN 0 AND 1, 10 BETWEEN 11 AND 12, 'b' BETWEEN 'a' AND 'c' FROM dual;

结果如下:

2.9 IN运算符

判断值是否为列表中的一个,是则返回1,否则返回0;含NULL时结果为NULL。

sql 复制代码
SELECT 'a' IN ('a','b','c'), 1 IN (2,3), NULL IN ('a','b'), 'a' IN ('a',NULL) FROM dual;

结果如下:

2.10 NOT IN运算符

判断值是否不是列表中的一个,不是则返回1,否则返回0。

sql 复制代码
SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN (2,3) FROM dual;

结果如下:

2.11 LIKE运算符

模糊匹配字符串,用%(匹配0+字符)和_(匹配1字符),含NULL时结果为NULL。

sql 复制代码
SELECT first_name FROM employees WHERE first_name LIKE 'S%';
SELECT last_name FROM employees WHERE last_name LIKE '_o%';

2.12 REGEXP运算符

用正则表达式匹配字符串,满足则返回1,否则返回0,含NULL时结果为NULL。

常用匹配规则如下:

  • ^:匹配开头;
  • $:匹配结尾;
  • .:匹配任一字符;
  • *****:匹配前一字符0+次;
  • +:匹配前一字符1+次;
  • []:匹配集合中任一字符等。
sql 复制代码
SELECT 'shkstart' REGEXP '^s', 'shkstart' REGEXP 't$', 'shkstart' REGEXP 'hk' FROM dual;

结果如下:

从结果看出,第一个就是找到以s为开头的,

第二个则是找到以t为结尾的,

最后一个就是找到中间包含hk的。

3 逻辑运算符

用于判断表达式真假,返回1、0或NULL。

3.1 逻辑非(NOT或!)

值为0返回1,非0返回0,NULL返回NULL。

sql 复制代码
SELECT NOT 1, NOT 0, NOT(1+1), NOT !1, NOT NULL FROM dual;

结果如下;

3.2 逻辑与(AND或&&)

所有值非0且非NULL返回1;任一值为0返回0;否则返回NULL。

sql 复制代码
SELECT 1 AND -1, 0 AND 1, 0 AND NULL, 1 AND NULL FROM dual;

结果如下:

3.3 逻辑或(OR或||)

非NULL且任一非0返回1;一为NULL另一非0返回1;均为NULL返回NULL;否则返回0。

sql 复制代码
SELECT 1 OR -1, 1 OR 0, 1 OR NULL, 0 || NULL, NULL || NULL FROM dual;

结果如下:

其实这里,不管是与还是或,基本的判断逻辑都不变的,

记住NULL这个特殊情况就好了。

3.4 逻辑异或(XOR)

任一为NULL返回NULL;两非NULL值均为0或均非0返回0;一为0一非0返回1。

sql 复制代码
SELECT 1 XOR -1, 1 XOR 0, 0 XOR 0, 1 XOR NULL FROM dual;

结果如下:

不同为1,相同为0,有NULL就返回NULL

4 位运算符

对二进制数操作,先转二进制运算,再转十进制返回。

4.1 按位与(&)

二进制位均为1则返回1,否则返回0。

sql 复制代码
SELECT 1&10, 20&30 FROM dual;

结果:0、20(1二进制0001,10二进制1010,与为0000=0;20二进制10100,30二进制11110,与为10100=20)

这里难度稍微大一点,但也不难理解。

比如这个1&10,你可以把10换成二进制表示,如:

sql 复制代码
00001 & 01010  →  00000  →  十进制0
10100 & 11110 →  10100  →  十进制20

就是这个原理。

4.2 按位或(|)

二进制位任一为1则返回1,否则返回0。

sql 复制代码
SELECT 1|10, 20|30 FROM dual;

结果:11、30(1|10二进制1011=11;20|30二进制11110=30)

这个也是同样的道理,把两个数转换成二进制表达出来,

然后再进行操作,最后再转成十进制,

就是输出结果了。

4.3 按位异或(^)

二进制位不同返回1,相同返回0。

sql 复制代码
SELECT 1^10, 20^30 FROM dual;

结果:11、10(110二进制1011=11;2030二进制01010=10)

sql 复制代码
00001 & 01010  →  01011  →  十进制11
10100 & 11110 →  01010  →  十进制10

原理不难。

4.4 按位取反(~)

二进制位1变0,0变1。

sql 复制代码
SELECT 10 & ~1 FROM dual;

结果:10

4.5 按位右移(>>)

二进制位右移指定位数,低位丢弃,高位补0。

sql 复制代码
SELECT 1>>2, 4>>2 FROM dual;

结果:0、1

1二进制0001右移2位为0000=0;4二进制0100右移2位为0001=1

4.6 按位左移(<<)

二进制位左移指定位数,高位丢弃,低位补0。

sql 复制代码
SELECT 1<<2, 4<<2 FROM dual;

结果:4、16

1二进制0001左移2位为0100=4;4二进制0100左移2位为10000=16

5 运算符的优先级

数字越大优先级越高,优先级高的先运算。核心优先级(从高到低):

  • ()最高
  • 按位取反(~)、负号(-)
  • *、/、DIV、%、MOD
  • +、-
  • 按位左移(<<)、右移(>>)
  • 比较运算符(=、<=>、>等)
  • NOT
  • AND、&&
  • OR、||、XOR
  • 赋值运算符(=)最低

6 小结

本文详细介绍了MySQL中算术、比较、逻辑、位运算符的定义、规则、示例及优先级,还涵盖正则表达式查询。

希望通过本文的学习,可以初步掌握这些运算符,帮助构建准确的SQL查询,理解优先级可避免运算顺序错误。