亲宝软件园·资讯

展开

mysql运算符

公号运维家 人气:0

运用运算法有什么好处呢?

运用运算符可以更加灵活的使用表中的数据,我们可以通过使用运算符来解决我们的很多问题,大大提高效率。

什么是运算符

运算符是告诉mysql执行特定算术或者逻辑操作的符号。

mysql的内部运算符很丰富,主要有四大类,分别是:

算术运算符:用于各类数值运算

可以看到上面有多达20多种运算符,我们接下来就根据这个来一一进行整理。

算术运算符

算术运算符是sql中最基本的运算符;

老规矩,一切都在操作中;

举个例子

创建表一个名为yunweijia_1的数据表;

mysql> create table yunweijia_1 (num int);
Query OK, 0 rows affected (0.04 sec)
mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| yunweijia_1 |
+-------------------+
1 row in set (0.00 sec)

mysql>

yunweijia_1的数据表中插入数据;

mysql> insert into yunweijia_1 values (66);
Query OK, 1 row affected (0.01 sec)

mysql>

加法和减法运算

mysql> select num, num+10, num-10, num+10-5, num-5+10 from yunweijia_1;
+------+--------+--------+----------+----------+
| num | num+10 | num-10 | num+10-5 | num-5+10 |
+------+--------+--------+----------+----------+
| 66 | 76 | 56 | 71 | 71 |
+------+--------+--------+----------+----------+
1 row in set (0.00 sec)

mysql>

从上面可以看到,我们可以对num字段的值进行加法和减法的运算,而且+- 的优先级相同,先加后减或者先减后加的结果是相同的哈。

乘法、除法和求余运算

mysql> select num, num*2, num/2, num%22, num%30 from yunweijia_1;
+------+-------+---------+--------+--------+
| num | num*2 | num/2 | num%22 | num%30 |
+------+-------+---------+--------+--------+
| 66 | 132 | 33.0000 | 0 | 6 |
+------+-------+---------+--------+--------+
1 row in set (0.00 sec)

mysql>

从上面可以看到,对num进行除除法运算的时间,66被2整除之后,小数位也是保留了4位小数的。求余运算的时候,由于66被22整除了,所以余数是0,但是66无法被30整除,所以余数就是6了。

注意点:

在数学运算时,除数为0的除法是没有意义的,因此除法运算中的除数不能为0,如果被0除的话,结果会返回NULL

如下:

mysql> select num, num/0, num%0 from yunweijia_1; +------+-------+-------+ | num | num/0 | num%0 | +------+-------+-------+ | 66 | NULL | NULL | +------+-------+-------+ 1 row in set (0.00 sec) mysql>

比较运算符

一个比较运算符的结果总是1、0或者null。比较运算符经常在select的查询条件子句中使用,用来查询满足指定条件的记录。

等于运算符(=)

如果相等,返回值为1,否则返回值为0;

mysql> select 1=0, '2'=2, 2=2, '0.01'=0, 'a'='a', (1+5)=(8-2), NULL=NULL;
+-----+-------+-----+----------+---------+-------------+-----------+
| 1=0 | '2'=2 | 2=2 | '0.01'=0 | 'a'='a' | (1+5)=(8-2) | NULL=NULL |
+-----+-------+-----+----------+---------+-------------+-----------+
| 0 | 1 | 1 | 0 | 1 | 1 | NULL |
+-----+-------+-----+----------+---------+-------------+-----------+
1 row in set (0.00 sec)

mysql>

从结果可以看到哈,在进行判断时,2=2和'2'=2的返回值是相同的,都是1,这是为啥呢,是因为在进行判断时,mysql自动进行了转换,把字符2转换成了数字2;'a'='a'是相同的字符比较,因此返回值为1;表达式的话就因为等号(=)两边计算结果一致,所以返回值是1,由于(=)不能用于空值NULL的判断,因此返回值为NULL

所以数值比较时有以下规则:

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

mysql中的安全等于运算符和等于运算符类似,不过呢,安全等于运算符可以用来判断NULL值。在两个操作数均为NULL时,其返回值为1,而不是直接返回NULL;反之,当一个操作数为NULL,其返回值为0,而也不是NULL

mysql> select 1<=>0, '2'<=>2, 2<=>2, '0.01'<=>0, 'a'<=>'a', (1+5)<=>(8-2), NULL<=>NULL, 3<=>NULL;
+-------+---------+-------+------------+-----------+---------------+-------------+----------+
| 1<=>0 | '2'<=>2 | 2<=>2 | '0.01'<=>0 | 'a'<=>'a' | (1+5)<=>(8-2) | NULL<=>NULL | 3<=>NULL |
+-------+---------+-------+------------+-----------+---------------+-------------+----------+
| 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
+-------+---------+-------+------------+-----------+---------------+-------------+----------+
1 row in set (0.00 sec)

mysql>

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

'<>'或者'!='用于判断数字、字符串、表达式不相等的判断;如果不相等,返回值为1;否则返回值为0;

注意:

这两个运算符不能用于判断空值NULL

mysql> select 'goot'<>'good', 'good'!='good', 1<>2, 4!=4, 5.5!=5, (9-3)!=(9-5), NULL<>NULL;
+----------------+----------------+------+------+--------+--------------+------------+
| 'goot'<>'good' | 'good'!='good' | 1<>2 | 4!=4 | 5.5!=5 | (9-3)!=(9-5) | NULL<>NULL |
+----------------+----------------+------+------+--------+--------------+------------+
| 1 | 0 | 1 | 0 | 1 | 1 | NULL |
+----------------+----------------+------+------+--------+--------------+------------+
1 row in set (0.00 sec)

mysql>

小于等于运算符(<=)

用来判断左边的操作数是否小于等于右边的操作数。

如果小于等于,返回值为1,否则返回值为0。同样的,<=不能用于判断空值NULL

mysql> select 'good'<='good', 'good'<='goood', 'good'<='god', 1<=2, 3<=2, (4+1)<=(9-8), NULL<=NULL;
+----------------+-----------------+---------------+------+------+--------------+------------+
| 'good'<='good' | 'good'<='goood' | 'good'<='god' | 1<=2 | 3<=2 | (4+1)<=(9-8) | NULL<=NULL |
+----------------+-----------------+---------------+------+------+--------------+------------+
| 1 | 1 | 0 | 1 | 0 | 0 | NULL |
+----------------+-----------------+---------------+------+------+--------------+------------+
1 row in set (0.00 sec)

mysql>

小于运算符(<)

用来判断左边的操作数是否小于右边的操作数;

如果小于,返回值为1,否则返回值为0。<不能用于判断空值NULL

mysql> select 'good'<'good', 'good'<'goodd', 'good'<'god', 1<2, 2<2, 5<3, NULL<NULL;
+---------------+----------------+--------------+-----+-----+-----+-----------+
| 'good'<'good' | 'good'<'goodd' | 'good'<'god' | 1<2 | 2<2 | 5<3 | NULL<NULL |
+---------------+----------------+--------------+-----+-----+-----+-----------+
| 0 | 1 | 0 | 1 | 0 | 0 | NULL |
+---------------+----------------+--------------+-----+-----+-----+-----------+
1 row in set (0.00 sec)

mysql>

大于等于运算符(>=)

用来判断左边的操作数是否大于等于右边的操作数。

如果大于等于,返回值为1;否则返回值为0。不能用于判断空值NULL

mysql> select 'good'>='good', 'good'>='goodd', 'good'>='god', 1>=2, 2>=1, (5+5)>=(6-2), NULL>=NULL;
+----------------+-----------------+---------------+------+------+--------------+------------+
| 'good'>='good' | 'good'>='goodd' | 'good'>='god' | 1>=2 | 2>=1 | (5+5)>=(6-2) | NULL>=NULL |
+----------------+-----------------+---------------+------+------+--------------+------------+
| 1 | 0 | 1 | 0 | 1 | 1 | NULL |
+----------------+-----------------+---------------+------+------+--------------+------------+
1 row in set (0.00 sec)

mysql>

大于运算符(>)

用来判断左边的操作数是否大于右边的操作数。

如果大于,返回值为1;否则返回值为0。不能用于判断空值NULL

mysql> select 'good'>'good', 'good'>'goood', 'good'>'god', 2>1, 3>5, (9+9)>(1+2), NULL>NULL;
+---------------+----------------+--------------+-----+-----+-------------+-----------+
| 'good'>'good' | 'good'>'goood' | 'good'>'god' | 2>1 | 3>5 | (9+9)>(1+2) | NULL>NULL |
+---------------+----------------+--------------+-----+-----+-------------+-----------+
| 0 | 0 | 1 | 1 | 0 | 1 | NULL |
+---------------+----------------+--------------+-----+-----+-------------+-----------+
1 row in set (0.00 sec)

mysql>

IS NULL(ISNULL)和(IS NOT NULL)运算符

is nullisnull用来检验一个值是否为NULL

如果是NULL,返回值为1,否则返回值为0。

is not null用来检验一个值是否为非NULL

如果是非NULL,返回值为1,否则返回值为0。

mysql> select null is null, isnull(null), isnull(99), 99 is not null;
+--------------+--------------+------------+----------------+
| null is null | isnull(null) | isnull(99) | 99 is not null |
+--------------+--------------+------------+----------------+
| 1 | 1 | 0 | 1 |
+--------------+--------------+------------+----------------+
1 row in set (0.00 sec)

mysql>

BETWEEN AND运算符

语法格式:

expr between min and max

如果expr大于等于min且小于等于max,则between的返回值为1,否则返回值为0。

mysql> select 4 between 1 and 5, 4 between 4 and 5, 9 between 1 and 8, 7 between 10 and 12;
+-------------------+-------------------+-------------------+---------------------+
| 4 between 1 and 5 | 4 between 4 and 5 | 9 between 1 and 8 | 7 between 10 and 12 |
+-------------------+-------------------+-------------------+---------------------+
| 1 | 1 | 0 | 0 |
+-------------------+-------------------+-------------------+---------------------+
1 row in set (0.00 sec)

mysql>

LEAST运算符

语法格式:

least (值1,值2,...,值n)

在有两个或者多个参数的情况下,返回最小值。如果任意一个自变量为NULL,则LEAST()返回的值为NULL

mysql> select least(0,1,2,3), least(1.0,5,99), least('a', 'b', 'c'), least(0,null,9);
+----------------+-----------------+----------------------+-----------------+
| least(0,1,2,3) | least(1.0,5,99) | least('a', 'b', 'c') | least(0,null,9) |
+----------------+-----------------+----------------------+-----------------+
| 0 | 1.0 | a | NULL |
+----------------+-----------------+----------------------+-----------------+
1 row in set (0.00 sec)

mysql>

GREATEST(VALUE1, VALUE2,......)

当有两个或者多个参数时,返回最大值。如果任意一个自变量为NULL,则grestest()返回的值为NULL

mysql> select greatest(0,1,2,3), greatest(1.0,5,99), greatest('a', 'b', 'c'), greatest(0,null,9);
+-------------------+--------------------+-------------------------+--------------------+
| greatest(0,1,2,3) | greatest(1.0,5,99) | greatest('a', 'b', 'c') | greatest(0,null,9) |
+-------------------+--------------------+-------------------------+--------------------+
| 3 | 99.0 | c | NULL |
+-------------------+--------------------+-------------------------+--------------------+
1 row in set (0.00 sec)

mysql>

IN、NOT IN 运算符

in运算符用来判断操作数是否为in列表中的其中一个值;

如果是,返回值为1,否则的话返回值为0。

mysql> select 9 in (1,4,9,10,'yunweijia'), 'yunweijia' in (1,4,9,10,'yunweijia'), 1 in (2,4,5);
+-----------------------------+---------------------------------------+--------------+
| 9 in (1,4,9,10,'yunweijia') | 'yunweijia' in (1,4,9,10,'yunweijia') | 1 in (2,4,5) |
+-----------------------------+---------------------------------------+--------------+
| 1 | 1 | 0 |
+-----------------------------+---------------------------------------+--------------+
1 row in set, 1 warning (0.00 sec)

mysql>

not in运算符用来判断表达式是否为in列表中的其中一个值;

如果不是,返回值为1,否则的话返回值为0。

mysql> select 9 not in (1,4,9,10,'yunweijia'), 'yunweijia' not in (1,4,9,10,'yunweijia'), 1 not in (2,4,5);
+---------------------------------+-------------------------------------------+------------------+
| 9 not in (1,4,9,10,'yunweijia') | 'yunweijia' not in (1,4,9,10,'yunweijia') | 1 not in (2,4,5) |
+---------------------------------+-------------------------------------------+------------------+
| 0 | 0 | 1 |
+---------------------------------+-------------------------------------------+------------------+
1 row in set, 1 warning (0.00 sec)

mysql>

in里面存在null值,如果运算符不成立的话,直接返回null

mysql> select 9 in (1,4,9,10, null), 'yunweijia' in (1,4,9,10,'yunweijia', null), 1 in (2,4,5, null);
+-----------------------+---------------------------------------------+--------------------+
| 9 in (1,4,9,10, null) | 'yunweijia' in (1,4,9,10,'yunweijia', null) | 1 in (2,4,5, null) |
+-----------------------+---------------------------------------------+--------------------+
| 1 | 1 | NULL |
+-----------------------+---------------------------------------------+--------------------+
1 row in set, 1 warning (0.00 sec)

mysql>

like运算法

用来匹配字符串;语法格式:

expr like 匹配条件

如果expr满足匹配条件,则返回值为1,否则返回值为0。

expr或匹配条件中任何一个为null,则结果为null

like运算符在进行匹配的时候,可以使用通配符,如下:

mysql> select 'yunweijia' like 'yunweijia', 'ywj' like 'yw_', 'ywj' like 'y%', 'ywj' like 'yunweijia';
+------------------------------+------------------+-----------------+------------------------+
| 'yunweijia' like 'yunweijia' | 'ywj' like 'yw_' | 'ywj' like 'y%' | 'ywj' like 'yunweijia' |
+------------------------------+------------------+-----------------+------------------------+
| 1 | 1 | 1 | 0 |
+------------------------------+------------------+-----------------+------------------------+
1 row in set (0.00 sec)

mysql>

REGEXP运算符

mysql中的正则表达式,用来匹配字符串,语法格式为:

expr regexp 匹配条件

如果expr满足匹配条件,返回1,否则返回0,如果expr或匹配条件任意一个为NULL,则结果为NULL

regexp运算符在进行匹配时,常用的有以下几种通配符:

mysql> select 'yunweijia' regexp '^y', 'ywj' regexp 'j$', 'ywj' regexp 'y*j', 'ywj' regexp "['ywj', 'aa', 'bb']";
+-------------------------+-------------------+--------------------+------------------------------------+
| 'yunweijia' regexp '^y' | 'ywj' regexp 'j$' | 'ywj' regexp 'y*j' | 'ywj' regexp "['ywj', 'aa', 'bb']" |
+-------------------------+-------------------+--------------------+------------------------------------+
| 1 | 1 | 1 | 1 |
+-------------------------+-------------------+--------------------+------------------------------------+
1 row in set (0.00 sec)

mysql>

逻辑运算符

mysql中所有逻辑运算符的求值所得结果均为TRUEFALSENULL

mysql中,他们提现为1(TRUE)、0(FALSE)和NULL

NOT或!

逻辑非运算符not或者!,表示当操作数为0时,所得值为1;

当操作数为非零值时,所得值为0;

当操作数为null时,所得的返回值为null

mysql> select not 10, not (1-1), not -5, not null, not 1+1;
+--------+-----------+--------+----------+---------+
| not 10 | not (1-1) | not -5 | not null | not 1+1 |
+--------+-----------+--------+----------+---------+
| 0 | 1 | 0 | NULL | 0 |
+--------+-----------+--------+----------+---------+
1 row in set (0.00 sec)

mysql>

小提示:

在使用运算符计算时,一定要注意不同运算符的优先级不同。如果不能确定计算顺序,最好使用括号,以保证运算结果的正确。

ADD或者&&

逻辑与运算符add或者&&表示当所有操作数均为非零值,并且不为null时,计算所得结果为1,;

当一个或多个操作数为0时,所得结果为0;

其余情况返回值为null

mysql> select 9 and -9, 1 and 0, 1 and null, 0 and null;
+----------+---------+------------+------------+
| 9 and -9 | 1 and 0 | 1 and null | 0 and null |
+----------+---------+------------+------------+
| 1 | 0 | NULL | 0 |
+----------+---------+------------+------------+
1 row in set (0.01 sec)

mysql> select 9 && -9, 1 && 0, 1 && null, 0 && null;
+---------+--------+-----------+-----------+
| 9 && -9 | 1 && 0 | 1 && null | 0 && null |
+---------+--------+-----------+-----------+
| 1 | 0 | NULL | 0 |
+---------+--------+-----------+-----------+
1 row in set, 4 warnings (0.00 sec)

mysql>

or或者||

逻辑或运算符or或者||表示当两个操作数均为非null值且任意一个操作数为非零值时,结果为1,否则结果为0;

当有一个操作数为null,且另一个操作数为非零值时,则结果为1,否则结果为null

当两个操作数均为null时,则所得结果为null

mysql> select 9 or -9 or 0, 1 or 2, 0 or 0, 1 or null, 0 or null, null or null;
+--------------+--------+--------+-----------+-----------+--------------+
| 9 or -9 or 0 | 1 or 2 | 0 or 0 | 1 or null | 0 or null | null or null |
+--------------+--------+--------+-----------+-----------+--------------+
| 1 | 1 | 0 | 1 | NULL | NULL |
+--------------+--------+--------+-----------+-----------+--------------+
1 row in set (0.00 sec)

mysql> select 9 || -9 || 0, 1 || 2, 0 || 0, 1 || null, 0 || null, null || null;
+--------------+--------+--------+-----------+-----------+--------------+
| 9 || -9 || 0 | 1 || 2 | 0 || 0 | 1 || null | 0 || null | null || null |
+--------------+--------+--------+-----------+-----------+--------------+
| 1 | 1 | 0 | 1 | NULL | NULL |
+--------------+--------+--------+-----------+-----------+--------------+
1 row in set, 7 warnings (0.00 sec)

mysql>

XOR

逻辑异或运算符xor表示当任意一个操作数为null时,返回值为null

对于非null的操作数,如果两个操作数都是非0值或者都是0值,则返回结果为0;

如果一个为0值,另一个为非0值,返回结果为1。

mysql> select 1 xor 1, 0 xor 0, 1 xor 0, 1 xor null, null xor null, 1 xor 1 xor 1;
+---------+---------+---------+------------+---------------+---------------+
| 1 xor 1 | 0 xor 0 | 1 xor 0 | 1 xor null | null xor null | 1 xor 1 xor 1 |
+---------+---------+---------+------------+---------------+---------------+
| 0 | 0 | 1 | NULL | NULL | 1 |
+---------+---------+---------+------------+---------------+---------------+
1 row in set (0.00 sec)

mysql>

位运算符

位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。

位或运算符(||)

位或运算的实质是将参与运算的几个数据按照对应的二进制数作为进行逻辑或运算。对应的二进制位有一个或两个为1则该位的运算结果为1,否则为0。

mysql> select 10 | 15, 9 | 4 | 2;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 |
+---------+-----------+
| 15 | 15 |
+---------+-----------+
1 row in set (0.01 sec)

mysql>

10的二进制数值为1010,15的二进制数值为1111,按位或运算之后,结果为1111,即整数15;

9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010,按位或运算之后,结果为1111,即整数15。

位与运算符(&)

位与运算的实质是将参与运算的几个操作数按照对应的二进制数逐位进行逻辑与运算。对应的二进制位都是1或1则该位的运算结果为1,否则为0。

mysql> select 10 & 15, 9 & 4 & 2;
+---------+-----------+
| 10 & 15 | 9 & 4 & 2 |
+---------+-----------+
| 10 | 0 |
+---------+-----------+
1 row in set (0.00 sec)

mysql>

10的二进制数值为1010,15的二进制数值为1111,按位与运算之后,结果为1010,即整数10;

9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010,按位与运算之后,结果为0000,即整数0。

位异或运算符(^)

位异或运算的实质是将参与运算的两个数据按照对应的二进制数逐位进行逻辑异或运算。

对应位的二进制数不同时,对应位的结果才为1。如果两个对应位数都为0或者都为1,则对应位的结果为0。

mysql> select 10 ^ 5, 1 ^ 2, 3 ^ 6;
+--------+-------+-------+
| 10 ^ 5 | 1 ^ 2 | 3 ^ 6 |
+--------+-------+-------+
| 15 | 3 | 5 |
+--------+-------+-------+
1 row in set (0.00 sec)

mysql>

10的二进制数值为1010,5的二进制数值为101,按位异或运算之后,结果为1111,即整数15;

1的二进制数值为1,2的二进制数值为10,按位异或运算之后,结果为11,即整数为3;

3的二进制数值为11,6的二进制数值为110,按位异或运算之后,结果为101,即整数5。

位左移运算符(<<)

位左移运算符<<使指定的二进制值的所有位都左移指定的位数。

左移指定位数之后,左边高位的数值继续左移,并不会进行丢弃,右边低位空出的位置用0补齐。

语法格式:

expr << n

n指定值expr要移位的位数。

mysql> select 1 << 2, 15 << 6;
+--------+---------+
| 1 << 2 | 15 << 6 |
+--------+---------+
| 4 | 960 |
+--------+---------+
1 row in set (0.00 sec)

mysql>

1的二进制值为1,左移两位之后变成了100,即十进制证书4

15的二进制位1111,左移6位之后变成了1111000000,即十进制整数960。

位右移运算符(>>)

位右移运算符>>使指定的二进制值的所有位都右移指定的位数。

右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出的位置用0补齐。

语法格式为:

expr >> n

n指定值expr要移位的位数。

mysql> select 200 >> 2, 10 >> 6;
+----------+---------+
| 200 >> 2 | 10 >> 6 |
+----------+---------+
| 50 | 0 |
+----------+---------+
1 row in set (0.00 sec)

mysql>

100的二进制为11001000,右移两位之后是110010,即十进制50;

10的二进制为1010,右移6位之后是0,即二进制也是0。

位取反运算符(~)

位取反运算的实质是将参与运算的数据按照对应的二进制数逐位反转,即1取反后变为0、0取反后变为1。

mysql> select 100 & ~1;
+----------+
| 100 & ~1 |
+----------+
| 100 |
+----------+
1 row in set (0.00 sec)

mysql>

在逻辑运算100 & ~1中,由于位取反运算符~的级别高于位与运算符,因此先对1进行取反操作,取反之后,除了最低位为0外,其他位都是1,即1110,然后与十进制数值100进行与运算,结果为1100100,即整数100。

运算符的优先级

运算符的优先级决定了不同的运算符在表达式中计算的先后顺序。我们上面整理了这么多运算符,到底哪些运算符的优先级最高呢,下面我们就将优先级由低到高排列。

每个运算符的优先级都是不同的,一般情况下,级别高的运算符先进行计算,如果级别相同,mysql按表达式的顺序从左到右依次计算。如果无法确定优先级,我们可以使用圆括号()来改变优先级。而且这样子会使我们的sql更加优雅,且计算过程更加清晰。 

加载全部内容

相关教程
猜你喜欢
用户评论