当前位置: 首页 > news >正文

SQL基础入门② | 运算符篇

0 序言

本文围绕MySQL中的运算符展开,重点讲解算术、比较、逻辑、位运算符的定义、规则、示例及优先级并介绍正则表达式查询的相关内容。
通过本文的学习,你能初步掌握各类运算符的用法,理解其背后逻辑,解决实际查询中的运算问题,提升SQL语句编写能力。

1 算术运算符

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

1.1 加法与减法运算符

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

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)。

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)。

SELECT 12%3, 12 MOD 5 FROM dual;

结果如下:

在这里插入图片描述
又比如说,我要筛选employee_id为偶数的员工:

SELECT * FROM employees WHERE employee_id MOD 2 = 0;

在这里插入图片描述

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

2 比较运算符

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

2.1 等号运算符(=)

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

规则如下:

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

结果如下:

在这里插入图片描述

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

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

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

结果如下:

在这里插入图片描述

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

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

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。

SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL FROM dual;

结果如下:

在这里插入图片描述

2.5 非空运算符(IS NOT NULL)

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

SELECT NULL IS NOT NULL, 'a' IS NOT NULL, 1 IS NOT NULL FROM dual;

结果如下:

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

在这里插入图片描述

2.6 最小值运算符(LEAST)

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

SELECT LEAST(1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2) FROM dual;

结果如下:

在这里插入图片描述

2.7 最大值运算符(GREATEST)

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

SELECT GREATEST(1,0,2), GREATEST('b','a','c'), GREATEST(1,NULL,2) FROM dual;

结果如下:

在这里插入图片描述

2.8 BETWEEN AND运算符

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

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。

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。

SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN (2,3) FROM dual;

结果如下:

在这里插入图片描述

2.11 LIKE运算符

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

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+次;
  • []:匹配集合中任一字符等。
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。

SELECT NOT 1, NOT 0, NOT(1+1), NOT !1, NOT NULL FROM dual;

结果如下;

在这里插入图片描述

3.2 逻辑与(AND或&&)

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

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。

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。

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。

SELECT 1&10, 20&30 FROM dual;

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

在这里插入图片描述
这里难度稍微大一点,但也不难理解。
比如这个1&10,你可以把10换成二进制表示,如:

00001 & 0101000000  →  十进制0
10100 & 1111010100  →  十进制20

就是这个原理。

4.2 按位或(|)

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

SELECT 1|10, 20|30 FROM dual;

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

在这里插入图片描述
这个也是同样的道理,把两个数转换成二进制表达出来,
然后再进行操作,最后再转成十进制,
就是输出结果了。

4.3 按位异或(^)

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

SELECT 1^10, 20^30 FROM dual;

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

在这里插入图片描述

00001 & 0101001011  →  十进制11
10100 & 1111001010  →  十进制10

原理不难。

4.4 按位取反(~)

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

SELECT 10 & ~1 FROM dual;

结果:10

在这里插入图片描述

4.5 按位右移(>>)

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

SELECT 1>>2, 4>>2 FROM dual;

结果:0、1

在这里插入图片描述

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

4.6 按位左移(<<)

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

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查询,理解优先级可避免运算顺序错误。

http://www.dtcms.com/a/291448.html

相关文章:

  • 【HarmonyOS】ArkTS语法详细解析
  • 阿里云技术三面:java社招面经+面试题分享!
  • rancher使用rke在华为云多网卡的服务器上安装k8s集群问题处理
  • Supervisor 核心原理:如何实现进程管理?
  • 机器视觉的食品包装贴标应用
  • [论文阅读] 人工智能 | ZipMPC:让短视的MPC拥有长远眼光——通过模仿学习压缩长 horizon 智慧
  • A1-静态Mpls
  • 二、计算机网络技术——第2章:物理层
  • [1-01-01].第90节:如何学习新特性:
  • 一文速通《矩阵的特征值和特征向量》
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pywifi’问题
  • 马斯克布局儿童 AI 领域,xAI 推出 Baby Grok,将带来哪些变革?
  • Windows防火墙配置详解
  • PDF限制功能如何用?简单教程来了!
  • 网络设备功能对照表
  • TipTap 富文本编辑器在小说写作中的应用实践
  • PyCharm 未正确关联 .jpg 为图片格式
  • 重学前端008 --- 响应式网页设计 CSS 无障碍 Quiz
  • React探索高性能Tree树组件实现——react-window、react-vtree
  • 安装cobalt_Strike_4.7
  • B树、B+树的区别及MySQL为何选择B+树
  • Python 使用期物处理并发(使用concurrent.futures模块启动 进程)
  • 【Elasticsearch】BM25的discount_overlaps参数
  • 卷积神经网络(CNN)原理
  • 零拷贝技术(Zero-Copy)
  • OneCode 3.0 @APIEventAnnotation 注解速查手册
  • 从 Hi3861 平台到 WS63 星闪平台的程序移植全解析
  • 网络编程之 UDP:用户数据报协议详解与实战
  • 二分查找:区间内查询数字的频率
  • 网络协议(三)网络层 IPv4、CIDR(使用子网掩码进行网络划分)、NAT在私网划分中的应用