mysql运算符!

一、算数运算符

​ + - * / %(求余运算)

mysql> CREATE TABLE test3(num INT);                /*创建一个表,表中有一个字段,类型为INT*/
Query OK, 0 rows affected (0.13 sec)

mysql> INSERT INTO test3 VALUES(40);            /*字段中插入一个数字40*/
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM test3;
+------+
| num  |
+------+
|   40 |
+------+
1 row in set (0.00 sec)
/*使用算数运算符来操作表中的INT字段*/
mysql> SELECT num,num+10,num-100,num*3,num/3,num%3 FROM test3;
/*使用算数运算符查看test3的num字段,以及字段中的值+10的结果,值-100的结果,值*3的结果,值/3的结果,值除以3之后的余数*/
+------+--------+---------+-------+---------+-------+
| num  | num+10 | num-100 | num*3 | num/3   | num%3 |
+------+--------+---------+-------+---------+-------+
|   40 |     50 |     -60 |   120 | 13.3333 |     1 |
+------+--------+---------+-------+---------+-------+
1 row in set (0.01 sec)
mysql> ALTER TABLE test3 MODIFY num DECIMAL(4,1);   /*修改数据类型为定点数据类型保留小数一位*/
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> INSERT INTO test3 VALUES(40.2);        /*插入带有小数点的一个值40.2*/
Query OK, 1 row affected (0.00 sec)

mysql> SELECT  num%3 FROM test3;   
/*小数点后的数字不参与取余的运算,直接拿余数+小数位的数字,也就是40.2中40除以3余1,在加上剩下的0.2*/
+-------+
| num%3 |
+-------+
|   1.0 |
|   1.2 |
+-------+

二、比较运算符(用来判断真假命题,也就是返回值为1(真)或者0(假)

=                    等于                            

<=>                    安全等于                       

<>,!=                不等于                            

>                    大于                            

<                    小于                            

>=                    大于等于                       

<=                    小于等于

IS NULL                判断一个值是否为NULL

ISNULL                同上

IS NOT NULL            判断一个值是否不为null

LEAST                多个参数取最小值

GREATEST            多个参数取最大值

BETWEEN    AND            判断一个值是否介于两个值之间

IN                     判断一个值是否是IN列表中的值

NOT IN                判断一个值是否不是IN列表中的值

LIKE                通配符查询

REGEXP                正则表达式查询

判断 1 真 0 假 返回值

=:等于号的使用,判断真假命题

mysql> SELECT 1=1,'2'=2,(1+1)=(2+0),1=NULL;  /*只要一个值为NULL,则返回值为NULL,NULL不参与判断*/
+-----+-------+-------------+--------+
| 1=1 | '2'=2 | (1+1)=(2+0) | 1=NULL |
+-----+-------+-------------+--------+
|   1 |     1 |           1 |   NULL |
+-----+-------+-------------+--------+

<=>:安全等于号的使用

安全等于相当于安全判断会将一切的值进行正常的判断

mysql> SELECT NULL<=>NULL;(空=空)        /*安全等于将NULL也会正常判断,比较=来说相对安全,也就是能看到返回的真假命题的值*/
+-------------+
| NULL<=>NULL |
+-------------+
|           1 |
+-------------+

<>以及!=的使用

mysql> SELECT 1<>1;            
+------+
| 1<>1 |
+------+
|    0 |
+------+

mysql> SELECT 50!=10,(1+2)<>(2+1),1<>NULL;        /*<>也不能判断NULL*/
+--------+--------------+---------+
| 50!=10 | (1+2)<>(2+1) | 1<>NULL |
+--------+--------------+---------+
|      1 |            0 |    NULL |
+--------+--------------+---------+

IS NULL以及ISNULL的使用

两个运算符,用法不同,用来判断值是否非空,只有当值为NULL才会返回1,反之全为0

IS NULL:判断值 IS NULL

ISNULL:ISNULL(判断值)

mysql> SELECT 10 IS NULL,NULL IS NULL,0 IS NULL;
+------------+--------------+-----------+
| 10 IS NULL | NULL IS NULL | 0 IS NULL |
+------------+--------------+-----------+
|          0 |            1 |         0 |
+------------+--------------+-----------+

mysql> SELECT ISNULL(10),ISNULL(NULL),ISNULL(0);
+------------+--------------+-----------+
| ISNULL(10) | ISNULL(NULL) | ISNULL(0) |
+------------+--------------+-----------+
|          0 |            1 |         0 |
+------------+--------------+-----------+

IS NOT NULL的使用

mysql> SELECT 10 IS NOT NULL,NULL IS NOT NULL,2 IS NOT NULL;
+----------------+------------------+---------------+
| 10 IS NOT NULL | NULL IS NOT NULL | 2 IS NOT NULL |
+----------------+------------------+---------------+
|              1 |                0 |             1 |
+----------------+------------------+---------------+

IFNULL的使用

+-------+--------+-----------+------+------------+---------+---------+--------+
| empNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | deptNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-07-13 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-06-13 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+

mysql> SELECT ENAME,12*(SAL+COMM) FROM emp;        /*发现comm为null的全部值都是NULL*/
+--------+---------------+
| ENAME  | 12*(SAL+COMM) |
+--------+---------------+
| SMITH  |          NULL |
| ALLEN  |      22800.00 |
| WARD   |      21000.00 |
| JONES  |          NULL |
| MARTIN |      31800.00 |
| BLAKE  |          NULL |
| CLARK  |          NULL |
| SCOTT  |          NULL |
| KING   |          NULL |
| TURNER |      18000.00 |
| ADAMS  |          NULL |
| JAMES  |          NULL |
| FORD   |          NULL |
| MILLER |          NULL |
+--------+---------------+

mysql> select ename, 12*(sal+ifnull(comm, 0)) from emp;
/*将comm字段中,如果是null的改为0*/
+--------+--------------------------+
| ename  | 12*(sal+ifnull(comm, 0)) |
+--------+--------------------------+
| SMITH  |                  9600.00 |
| ALLEN  |                 22800.00 |
| WARD   |                 21000.00 |
| JONES  |                 35700.00 |
| MARTIN |                 31800.00 |
| BLAKE  |                 34200.00 |
| CLARK  |                 29400.00 |
| SCOTT  |                 36000.00 |
| KING   |                 60000.00 |
| TURNER |                 18000.00 |
| ADAMS  |                 13200.00 |
| JAMES  |                 11400.00 |
| FORD   |                 36000.00 |
| MILLER |                 15600.00 |
+--------+--------------------------+

LEAST判断最小值的使用

mysql> SELECT LEAST('a','b','c','d','e'),LEAST(100,50,80,120);
+----------------------------+----------------------+
| LEAST('a','b','c','d','e') | LEAST(100,50,80,120) |
+----------------------------+----------------------+
| a                          |                   50 |
+----------------------------+----------------------+

GREATEST判断最大值的使用

同“least”相反,在给出的范围中,判断一个最大值返回

mysql> SELECT GREATEST('a','b','c','d','e'),GREATEST(100,50,80,120);
+-------------------------------+-------------------------+
| GREATEST('a','b','c','d','e') | GREATEST(100,50,80,120) |
+-------------------------------+-------------------------+
| e                             |                     120 |
+-------------------------------+-------------------------+

mysql> ALTER TABLE test3 ADD id INT;
mysql> UPDATE test3 SET id=100;
mysql> SELECT * FROM test3;
+------+------+
| num  | id   |
+------+------+
| 40.0 |  100 |
| 40.2 |  100 |
+------+------+
mysql> UPDATE test3 SET id=20 WHERE num=40.2;

mysql> SELECT *,GREATEST(num,id) FROM test3;            /*判断test3表中的num字段和id字段中的最大值*/
+------+------+------------------+
| num  | id   | GREATEST(num,id) |
+------+------+------------------+
| 40.0 |  100 |            100.0 |
| 40.2 |   20 |             40.2 |
+------+------+------------------+

BETWEEN AND介于两者之间

between 值 and 值:这两个值代表的是给定的范围。(判断值是否在给定的范围值之间,在返回1,不在返回0)

语法:判断值 between 范围值 and 范围值

​ 如:between 10 and 20代表10-20之间的所有数字,包括10和20

如果between后的值大于and后的值,则代表除了10-20之间的数字

​ 如:between 20 and 10代表大于等于20的值,和小于等于10的值

mysql> SELECT 10 BETWEEN 10 AND 20,20 BETWEEN 10 AND 20,30 BETWEEN 10 AND 20;
/*判断10是否在10-20之间,判断20是否在10-20之间,判断30是否在10-20*/
+----------------------+----------------------+----------------------+
| 10 BETWEEN 10 AND 20 | 20 BETWEEN 10 AND 20 | 30 BETWEEN 10 AND 20 |
+----------------------+----------------------+----------------------+
|                    1 |                    1 |                    0 |
+----------------------+----------------------+----------------------+

mysql> SELECT 50 BETWEEN 60 AND 30;    
/*判断的值的范围是大于等于AND前的值,且小于等于AND后面的值,被判定为介于两者之间,否则不在两者之间*/
+----------------------+
| 50 BETWEEN 60 AND 30 |
+----------------------+
|                    0 |   /*50不大于60也不小于30,所有为假命题,返回0*/
+----------------------+

mysql> SELECT * FROM test3 WHERE id BETWEEN 50 AND 100;
/*在实际的应用中,判断字段中的值是否介于50-100之间*/
+------+------+
| num  | id   |
+------+------+
| 40.0 |  100 |
+------+------+

IN判断值是否存在给出的列表值中

判断值如果在给出的列表中,则返回1,反之为0

mysql> SELECT 10 IN (1,20,2,3,4);/*判断10是否在1,20,2,3,4这几个值中,可以看到并不在,所以返回0*/
+--------------+
| 10 IN (1,20) |
+--------------+
|            0 |
+--------------+

mysql> SELECT * FROM test3 WHERE num IN(40.2);
/*实际应用中,判断某个字段中的数值是否在给定的列表中,用来查询指定数据的一条记录*/
+------+------+
| num  | id   |
+------+------+
| 40.2 |   20 |
+------+------+

NOT IN

判断值是否不再给出的列表值中

mysql> SELECT 10 NOT IN (1,20,2,3,5);/*判断10是否不再1,20,2,3,5这几个数值中,可以看到确实不再,所以返回1*/
+------------------------+
| 10 NOT IN (1,20,2,3,5) |
+------------------------+
|                      1 |
+------------------------+

LIKE通配符查询(模糊查询)

​ _:匹配任意单个字符

​ %:匹配任意数量字符

mysql> SELECT 'tfhz' LIKE 'tf__','tfhz' LIKE '__z_','tfhz' LIKE 't%','tfhz' LIKE '%z';
+--------------------+--------------------+------------------+------------------+
| 'tfhz' LIKE 'tf__' | 'tfhz' LIKE '__z_' | 'tfhz' LIKE 't%' | 'tfhz' LIKE '%z' |
+--------------------+--------------------+------------------+------------------+
|                  1 |                  0 |                1 |                1 |
+--------------------+--------------------+------------------+------------------+

REGEXP正则表达式

^ 匹配以什么开头的数据

$ 匹配以什么结尾的数据

. 匹配任意单个字符

[] 匹配括号内任意字符

| 匹配管道符前后任意字符串

“*” 匹配符号前后数据0次或者多次

mysql> SELECT 'tfhz' REGEXP '^t', 'tfhz' REGEXP 'z$','tfhz' REGEXP '[azb]','tfhz' REGEXP 'fz|zh','tfhz' REGEXP 't..z';
/*判断tfhz是否匹配以t开头,判断tfhz是否匹配以z结尾,判断tfhz字符串中是否有a或者z或者b其中一个*/
+--------------------+--------------------+-----------------------+-----------------------+----------------------+
| 'tfhz' REGEXP '^t' | 'tfhz' REGEXP 'z$' | 'tfhz' REGEXP '[azb]' | 'tfhz' REGEXP 'fz|zh' | 'tfhz' REGEXP 't..z' |
+--------------------+--------------------+-----------------------+-----------------------+----------------------+
|                  1 |                  1 |                     1 |                     0 |                    1 |
+--------------------+--------------------+-----------------------+-----------------------+----------------------+

mysql> UPDATE test3 SET num=num*3,id=id+10 WHERE  id REGEXP '^1';
/*修改test3中id以1开头中的num字段乘以3,id字段+10*/
mysql> SELECT * FROM test3;
+-------+------+
| num   | id   |
+-------+------+
| 120.0 |  110 |
|  40.2 |   20 |
+-------+------+

mysql> SELECT 'pjjjjmupeifeiyi' REGEXP '^pj*m.pei[sdf]ei[yi|asd]';
/*判断pjjjjmupeifeiyi是否匹配以p开头(^p),有0个或者多个j(j*),m后面有一个未知字符(m.),
pei后面是否有sdf其中一个字符,ei后是否有yi字符串或者asd字符串*/
+-----------------------------------------------------+
| 'pjjjjmupeifeiyi' REGEXP '^pj*m.pei[sdf]ei[yi|asd]' |
+-----------------------------------------------------+
|                                                   1 |
+-----------------------------------------------------+

三、逻辑运算符(布尔运算,要么是,要么非)

1)逻辑非 NOT或者!

(1)当操作数为0,返回1

(2)当操作数不为0,返回0

(3)当操作数为NULL时,返回NULL

只要值为0就返回1,反之除了NULL以外全为1

mysql> SELECT NOT 0,NOT 10,! 10, ! (1+1),! NULL;
+-------+--------+------+---------+--------+
| NOT 0 | NOT 10 | ! 10 | ! (1+1) | ! NULL |
+-------+--------+------+---------+--------+
|     1 |      0 |    0 |       0 |   NULL |
+-------+--------+------+---------+--------+

2)逻辑与 AND或者&&

(1)当所有操作数均不为0(都不是错的),且均不为NULL返回1

(2)当一个或者多个为0,返回0(只要有一条为假的,则这个条都为错的)

(3)其余情况返回NULL

mysql> SELECT 1 AND -1,1 && 0,0 AND NULL,1 AND NULL;
/*1和-1之间不为0,也不是NULL,则返回1,1和0之间,有一个0,则返回0,
0和NULL之间,有一个0,虽然有NULL,但也返回0,1和NULL之间,1位真,但是null不能判断,所以返回null*/
+----------+--------+------------+------------+
| 1 AND -1 | 1 && 0 | 0 AND NULL | 1 AND NULL |
+----------+--------+------------+------------+
|        1 |      0 |          0 |       NULL |
+----------+--------+------------+------------+

3)逻辑或 OR或者||(管道符)

(1)当两个操作数均不为NULL,且任意一个操作数不为0时,返回1,否则为0

0 or 1 返回1, 0 or 0 返回0

(2)当有一个操作数为NULL,且另外一个操作数不为0,返回1,否则为NULL

NULL or 1 返回1 ,NULL or 0 返回NULL

(3)当两个操作数都为NULL,返回NULL

NULL or NULL

4)逻辑异或 XOR

(1)a XOR b 相当于 ((NOT a)AND b) or (a AND (NOT b) )

100 XOR 50 == ((NOT 50)AND 100) or (50 AND (NOT 100) )

not 50在逻辑非运算中,不为0,则返回0,同理not 100也返回0

逻辑与中AND前后的两个操作数只要有一个0或者多个0,则返回0,也就是只要有一条是假的,则都是错的

所以:

100 XOR 50 =((NOT 50)AND 100) or (50 AND (NOT 100) )

​ =(0 AND 100)or (50 AND 0)

​ = 0 or 0

​ = 0

(2)如果一个操作数为NULL,返回NULL

(3)如果均不为NULL,如果两个操作数都为0或者都不为0,返回0

(4)如果一个为0,另一个不为0,返回1

结论:同真同假为假(0),一真一假为真(1)

mysql> SELECT 100 XOR 50;
+------------+
| 100 XOR 50 |
+------------+
|          0 |
+------------+

四、位操作运算符

运算符        说明
|          位或
&          位与
^          位异或
>>          位右移
<<          位右移
~          位取反

1、位或(|):

对应的二进制位只要有一个或者两个为1,则该位为1,否则为0(只有两个都为0时,结果为0,其余都为1)

例:

5 | 9

0101 1001

将5和9进行位或运算

0101

1001

按照规则可以看出结果为1101=13

mysql> SELECT 5 | 9 ;
+-------+
| 5 | 9 |
+-------+
|    13 |
+-------+

27 | 19 =27

11011 10011 = 11011=27

mysql> SELECT 27 | 19;
+---------+
| 27 | 19 |
+---------+
|      27 |
+---------+

2、位与(&):

对应的二进制位都为1则为1,否则为0

例:

27 & 19 = 19

11011 & 10011 = 10011 = 19

mysql> SELECT 27 & 19;
+---------+
| 27 & 19 |
+---------+
|      19 |
+---------+

47 & 13 = 13

101111 & 1101 = 1101 =13

mysql> SELECT 47 & 13;
+---------+
| 47 & 13 |
+---------+
|      13 |
+---------+

23 & 8 = 0

10111 & 1000 = 0000 = 0

mysql> SELECT 23 & 8;
+--------+
| 23 & 8 |
+--------+
|      0 |
+--------+

3、位异或(^)

对应的二进制位不相同则为1,相同为0

例:

30 ^ 15 = 17

11110 ^ 01111 = 10001 = 17

mysql> SELECT 30 ^ 15;
+---------+
| 30 ^ 15 |
+---------+
|      17 |
+---------+

4、位右移(>>)数字会越来越小

将对应的二进制位向右移动指定的位数,右移之后,右边低位将被移除并丢弃,左边高位用0补齐

向右移几位则在该数值的二进制中在最后删除几个数值

例:

31 >> 2 将31的二进制位向右移动两位

11111 >> 右移两位 = 111 = 7

mysql> select 31 >> 2;
+---------+
| 31 >> 2 |
+---------+
|       7 |
+---------+

5、位左移(<<)数字会愈来愈来大

将对应的二进制位向左移动指定的位数,左移之后,左边高位将被移除并丢弃,右边低位用0补齐

向左移几位则在该数值的二进制中在最后添加几个0

17 << 2 = 68

10001 << 2 = 1000100 = 68

mysql> select 17 << 2;
+---------+
| 17 << 2 |
+---------+
|      68 |
+---------+

6、位取反(~)

将对应的二进制位逐位取反,即0变1,1变0,(mysql中最多支持64位)

例:

mysql> SELECT ~ 1;    相当于   有63位1,最后一位为0
+----------------------+
| ~ 1                  |
+----------------------+
| 18446744073709551614 |
+----------------------+

mysql> SELECT ~ 1 & 5;   /*简化后相当于1110   &   0101   =    0100   =    4   8*/
+---------+
| ~ 1 & 5 |
+---------+
|       4 |
+---------+

五、运算顺序(优先级) 由低到高

括号会影响运算的优先级

=(赋值运算)

|| OR

XOR

&& AND

NOT

BETWEEN, =(比较运算),<=>,>=,<=,>,<,IS NULL,LIKE,IN ,REGEXP

|

&

<< >>

^

-(减号)+

*/%

-(负号)~

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0