MYSQL基础之运算符

2021/12/17 19:50:03

本文主要是介绍MYSQL基础之运算符,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

什么语言都会涉及到运算的,SQL也不例外,而其运算符,又可以分以下几种:算术运算符,比较运算符,逻辑运算符,位运算符。

算术运算符

这个运算符主要用于数学运算,这个也是常见的一些加减乘除等运算

运算符作用例子
+加法运算符,计算两个或者表达式的和SELECT A+B
-减法运算符,计算两个或者表达式的差SELECT A-B
*乘法运算符,计算两个或者表达式的乘积SELECT A*B
/或者DIV除法运算符,计算两个或者表达式的商SELECT A/B 或 SELECT A DIV B
% 或 MOD求余又称求模运算符,计算两个或者表达式的余数SELECT A%B 或 SELECT A MOD B

这个相对来说很容易理解,直接用伪表进行演示。

SELECT 7+3,7-3,7*3,7/3,7 DIV 3, 7%3,7 MOD 3,7+3*3, 7+7%3 
FROM DUAL;

在这里插入图片描述

算是运算符其实又会涉及到一个隐式转换

SELECT  100+'1',100+'a',100+NULL,100+'',100+'2021-12-16',100/'a',100+'aa23'
FROM DUAL;

在这里插入图片描述

这个可以看出如果使用算术运算符,其如果后面各自的其它格式可以转换成数字的回转成数组,无法转换的直接转换位0,当然null除外。同样如果字符串中数字和非数字组合的,如果数字在前直接截取转换,如果不是数字在前就直接转换为0;

补充: 其实=还可以作为赋值符存在,后面聊,先记住这个即可。

比较运算符

比较运算符也就是名字的意思,就是比较这个运算符前后数据的,比较结果为真返回1,比较结果为假则返回0,其它情况则返回NULL;而比较运算符经常作为SELECT 语句中的条件来使用,返回符合条件的结果。也就是说适合放在WHERE后面。

运算符作用例子
=等于运算符,判断两个值,字符串或表达式是否相等WHERE A=B
<=>安全等于运算符,安全的判断两个值,字符串或表达式是否相等,=意义几乎一样,但是其可以判断是否等于 nullWHERE A<=>B
<>或!=不等于运算符,判断两个值,字符串或表达式是否不相等相等WHERE A<>B 或 WHERE A!=B
<小于运算符,前面的值,字符串或表达式是否小于后面的值,字符串或表达式。WHERE A<B
<=小于等于运算符(记住=必须在后面不然运行报错),前面的值,字符串或表达式是否小于等于后面的值,字符串或表达式。WHERE A<=B
>大于运算符,前面的值,字符串或表达式是否小于后面的值,字符串或表达式。WHERE A>B
>=大于等于运算符(记住=必须在后面不然运行报错),前面的值,字符串或表达式是否大于等于后面的值,字符串或表达式。WHERE A>=B

不过为了证明一些特种,暂时把数学运算符放在非条件语句中:

列举下面的例子。

SELECT 1=1,1="1",1= NULL,1="a","AB">"AC",1<=>1,NULL<=>NULL,NULL=NULL 
FROM DUAL;

在这里插入图片描述

这个时候可以看出等号的一些特点。

  • 首先等号运算符(=)判断等号两边的值,字符串或者表达式是否相等,如果相等返回1,不相等返回0.如果有NULL参与那就会返回空(NULL)
  • 但是使用等号运算的时候,又遵守下面规则:
    • 如果等号两边都是字符串,则MYSL会按照字符串进行比较。其实这个遵守了ANSI编码,这个有点像是java中String判断大小的样子,也是从左向右依次对比,如果可以判断出结果就不会在判断后面的字母。
    • 如果两侧都是数字的话,就遵守数学的规律了。
    • 如果一侧为数字,一侧为字符串,那就会将字符串转成数字进行比较。
    • 如果有NULL 参与的话,比较的结果就是NULL.

现在用具体的表演示题作为条件的结果。

先看表内信息:

在这里插入图片描述

SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr='7698';

在这里插入图片描述

SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr=NULL;

在这里插入图片描述

SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr<=>'7698';

在这里插入图片描述

这个可以看出如果是非NULL的时候,<=>=效果一样,但是如果是判断NULL值的呢?

SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr<=>NULL;

在这里插入图片描述

可见判断是否等于NULL的时候,需要用<=>,前面说过NULL值不等于0,"","NULL"。当然判断是否为NULL的时候还可以用 IS NULL.

SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr IS NULL;

在这里插入图片描述

下面的判断大小的时候,暂时不用数字了,而用判断字符串,因为逻辑还是有些不同的。

SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE ename >'SCOTT';

在这里插入图片描述

再补充一下

SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr<NULL;
SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr<=NULL;
SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr>NULL;
SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr>=NULL;
SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr!=NULL;
SELECT 	empno, ename, job, mgr, hiredate, sal, comm, deptno  FROM test.emp WHERE mgr<>NULL;

在这里插入图片描述

可以看出= > >= < <= <> !=对于NULL判断只会返回NULL值。

而这个几个遵守的规则其实很=的规则几乎一样的,所以就不在重复写出这个规则了

SELECT 1>1,1>"1",1>= NULL,1>"a","AB">"AC",1<>1,1!=1,1!='1'
FROM DUAL;

在这里插入图片描述

比较运算符

前面说的的一个IS NULL这个判断条件,而现在说一些这一部分,其名为比较运算符。

运算符作用例子
IS NULL 或 ISNULL为空运算符,判断值,字符串或者表达式是否为空WHERE A IS NULL;或WHERE A ISNULL;
IS NOTNULL不为空运算符,判断值,字符串或者表达式是否不为空WHERE A IS NOTNULL;
LEAST最小运算符,在多个值中返回最小的值LEAST(A,…,B)
GREATEST最大运算符,在多个值中返回最大的值GREATEST(A,…,B)
BETWEEN ... AND ...两值之间的运算符,判断在这个两个值之间的数据,同时包含这两个值WHERE BETWEEN A AND B;
IN属于运算符,判断一个值是否列表中的任意任意一个值WHERE BETWEEN C IN (A,B);
NOT IN不属于运算符,判断一个值是否不是列表中的任意一个值WHERE BETWEEN C NOT IN (A,B);
LIKE模糊匹配运算符,判断一个值,是否模糊查询的匹配规则(会用% _ 等符号)WHERE BETWEEN A LIKE B;
REGEXP 或 RLIKE正则表达式运算符 判断一个值,是否符号正则表达式WHERE BETWEEN A REGEXP B;或 WHERE BETWEEN A RLIKE B;

有些解释还是用代码演示呈现比较好。

IS NULL , ISNULL,IS NOT NULL,

SELECT 	empno, ename, job, mgr FROM  test.emp  WHERE  mgr IS NULL;
SELECT 	empno, ename, job, mgr FROM  test.emp  WHERE   ISNULL(mgr);
SELECT 	empno, ename, job, mgr FROM  test.emp  WHERE  mgr IS NOT NULL;

在这里插入图片描述

LEAST,GREATEST

SELECT 	 LEAST(3,"1",5,6),LEAST("A","P","F","C"),GREATEST(3,"1",5,6),GREATEST("A","P","F","C") FROM  DUAL;

在这里插入图片描述

然后看一下例子:

SELECT 	empno, ename, sal,comm,LEAST(sal,comm),GREATEST(sal,comm)  FROM  test.emp;

在这里插入图片描述

其也是遵循了算术运算符中(类似 <)的相同的规则,数字与字符串涉及到隐式转换为数字,以及字符串的如何比较大小,遇见NULL直接返回NULL.

BETWEEN AND

SELECT empno, ename, sal,comm FROM  test.emp WHERE sal BETWEEN 800 AND 1600;

在这里插入图片描述

可以看出BETWEEN AND是前后闭包的,也就是包括两个值。前后两个值不要用NULL,虽然运行不会报错但无论是否有值都不会返回值,没用什么意义。

IN , NOT IN

SELECT empno, ename, sal,comm FROM  test.emp WHERE comm IN (300,500,NULL);

通过上面截图看数据库表中的数据,comm有的值为NULL,但是得到的数据如下:

在这里插入图片描述

可以看出虽然不会报错,但是NULL的值不会通过IN得到。

但是对于NOT IN却不是这样。

SELECT empno, ename, sal,comm FROM  test.emp WHERE comm NOT IN (300,500);

在这里插入图片描述

如果添加上NULL。

SELECT empno, ename, sal,comm FROM  test.emp WHERE comm NOT IN (300,500,NULL);

在这里插入图片描述

发现其不会得到任何的数据值,所以在IN和NOT IN 中就不要添加NULL,如果真心对其操作可以单独对其,使用IS NULL, ISNULL,IS NOT NULL, <=>,NOT A <=> B

LIKE

SELECT empno, ename FROM  test.emp WHERE ename LIKE 'SMITH';

在这里插入图片描述

如果这样使用的话,还不如直接用=,至少会让其性能提高,毕竟LIKE是模糊查询消耗性能更多.

所以下面说一下在模糊查询中常用的几个字符

  • %: 表示0-N个字符,演示如下

    SELECT empno, ename FROM  test.emp WHERE ename LIKE 'S%';
    -- 这个表示是以S开始,当然其% 也可以方多个位置 比如:%S%等操作 这样表示含有S的字符串(其实日期字段也可以)。
    

在这里插入图片描述

  • _:表示任意单个字符。

    SELECT empno, ename FROM  test.emp WHERE ename LIKE '_M%';
    --  表示 第二个字符是M的所有字符串 当然也可以多地方使用比如__JJ, _M_C%等
    

在这里插入图片描述

  • \转义符,毕竟有点上面两个字符会作为本身出现

    SELECT empno, ename FROM  test.emp WHERE ename LIKE '\_M%';
    -- 因为没数据所以就不在演示
    
    

    当然你也可以自定义 转义符

    SELECT empno, ename FROM  test.emp WHERE ename LIKE '?_M%' ESCAPE '?';
    

RLIKE,REGEXP

这个后面需要跟一些正则表达式,如果就不展开说了,我在Java基础中写一篇正则表达式----地址

SELECT empno, ename FROM  test.emp WHERE ename RLIKE '[W,J]A*';

在这里插入图片描述

逻辑运算符

这个其实在前面用过一个NOT,现在整体看一下。

运算符作用例子
NOT 或!逻辑非NOT A 或 !=A
AND 或 &&逻辑与A AND B 或 A && B
OR 或 ||逻辑或A OR B 或 A ||B
XOR逻辑异或A XOR B

NOT

这个在前面用过,就是一个将一个条件进行取反。还是那句话后面不要有NULL,因为没用意义;

SELECT empno, ename FROM  test.emp WHERE NOT  empno='7521';
-- 或者
SELECT empno, ename FROM  test.emp WHERE   empno!='7521';

在这里插入图片描述

AND

其实在很多的搜索的的条件如果单一得到是数据太多,我们需要更加精确的搜索到某些数据,如下:

SELECT * FROM  test.emp WHERE   deptno='10' AND sal='1300.00';
-- 当然AND 后面可以有多个 AND 串联   A AND  B AND C

-- 或着以下写法
SELECT * FROM  test.emp WHERE   deptno='10' &&  sal='1300.00';

在这里插入图片描述

OR

这个就是看数据满足其中一个条件即可。

SELECT * FROM  test.emp WHERE   deptno='10' OR  deptno='20';
--  这个也是可以多个使用的。
--或者如下写
SELECT * FROM  test.emp WHERE   deptno='10' ||  deptno='20';

在这里插入图片描述

  • 补充

    OR和AND可以一起使用,但是在使用的时候注意两者的优先级,AND的优先级大于OR,所以MYSQL会先对AND 两边的操作进行操作,得到的数据在与OR的操作书进行结合。

XOR

这个和OR区别就是OR满足可以满足OR前后的条件就行,不如果前后都满足和满足其一都可以得到,但是XOR却只能两者之中满足一个,如果都满足也不会得到。所以方便理解,就来两个对比一下。

SELECT * FROM  test.emp WHERE   deptno='20' OR  mgr='7839';

在这里插入图片描述

SELECT * FROM  test.emp WHERE   deptno='20' XOR  mgr='7839';

在这里插入图片描述

可以看出两者得到是数据条数都不一样,同时看一下是否满足两个条件。

位运算符

其实这个有点底层的意思,其实再聊JAVA的时候,遇见过尤其是再ArrayList存储长度扩展的时候用的<<

其实聊这个有点涉及到汇编的感觉了。

现在看一下MYSQL中的文运算符

运算符作用例子
&按位与,相当于位ANDSELECT A&B
|按位或,相当于位ORSELECT A|B
^按位异或,相当于位XORSELECT A^B
~按位取反SELECT ~A
>>按位右移SELECT >>A
<<按位左移SELECT <<A

其实上面本质上将数据转成二进制然后进行操作的,不过也能说是转成而本质人家就是二进制。这个说要是展开了说会涉及原码,补码,反码。所以现在只是简单的列举例子看一下吧,如果需要到时候单独再来一篇,然后再开一个专栏,将其放在汇编下面。

演示最好用数字,因为数字对于我们来水转换二进制更方便。

SELECT 3&2,3|2,3^2,3>>1,3<<1,~1
FROM DUAL;

在这里插入图片描述

这一部分暂时先了解即可,一般基础使用的或不会涉及到位运算符,而这个如果再展开说我估计又得一大段。后面单独来一篇。

优先级

前面说了这样的运算符,其不可能单独只使用一种,而再使用中多是混合使用,所以现在看一下其优先级,下面这个表,权重越高其优先级越高。

权重运算符
1:=,=(赋值)
2||,OR , XOR
3&&, AND
4NOT
5BETWEEN ,CASE ,WHEN,THEN,ELSE
6=(比较运算符),<==>>=,<=,>,<>,!=,IS,LIKE,REGEXP,IN
7|
8&
9<<与>>
10-,+
11*,/.DIV.%,MOD
12^
13-(负号),~
14!
15()

其实上面这个权重表我直接网上复制的一份,其实本质上我也不可能全部记住的,只是使用中常用的一些知道即可,其它的可以翻看文档。



这篇关于MYSQL基础之运算符的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程