标签:
算术运算符是MySQL中最常用的一类运算符。MySQL支持的算术运算符包括加、减、乘、除、求作。
符号 表达式的形式 作用
+ x1+x2+...+xn 加法运算
- x1-x2-...-xn 减法运算
* x1*x2*...*xn 乘法运算
/ x1/x2 除法运算,返回x1除以x2的商
DIV x1 DIV x2 除法运算,返回商。同"/"
% x1%x2 求余运算,返回x2除以x2的余数
MOD MOD(x1,x2) 求余运算,返回余数。同"%"
实例一:
USE example;
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES(24);
SELECT a,a+5, a-5, a*5*2 FROM t1;
SELECT a, a/3, a DIV 3, a%3, MOD(a,3) FROM t1;
SELECT 5/0, 5 DIV 0, 5%0, MOD(5,0);
12.3 比较运算符
比较运算符是查询数据时最常用的一类运算符。
SELECT语句中的条件语句经常要使用的比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件。
比较运算符
符号 表达式的形式 作用
= X1=X2 判断x1是否等于x2
<>或!= X1<>X2或x1!=x2 判断x1是否不等于x2
> x1>x2 判断x1是否大于x2
>= x1>=x2 判断x1是否大于等于x2
< x1<x2 判断x1是否小于x2
<= x1<=x2 判断x2是否小于等于x2
IS NULL x1 IS NULL 判断x1是否等于NULL
IS NOT NULL x1 IS NOT NULL 判断x1是否不等于NULL
BETWEEN AND x1 BETWEEN M and n 判断x1的取值是否在m和n之间
IN x1 IN(值1,值2,...值n) 判断x1的取值是否值1到值n中的一个
LIKE x1 LIKE 表达式 判断x1是否与表达式匹配
REGEXP x1 REGEXP 正则表达式 判断x1是否与正则表达式匹配
实例一:
1. 运算符‘=‘
‘=‘可以用来判断数字、字符串、表达式等是否相等。如果相等,结果返回1,如果不相等,结果返回0.空值(NULL)不能使用‘=‘来判断。
SELECT a, a=24, a=20 FROM t1;
2. 运算符‘<>‘和‘!=‘
’<>‘和‘!=‘可以用来判断数字、字符串、表达式等是否相等。如果不相等,结果返回1,如果相等,结果返回0。这两个符号也不能用来判断空值(NULL)。
SELECT a, a<>23, a!=23, a!=24, a!=NULL FROM t1;
3. 运算符‘<=>‘
‘<=>‘的作用与‘=‘是一样的,也是用来判断操作数是否相等。不同的是,‘<=>‘可以用来判断NULL。
SELECT a, a<=>24, a<=>20 FROM t1;
SELECT ‘b‘<=>‘b‘, ‘b‘<=>‘c‘, NULL<=>NULL;
4. 运算符‘>‘
‘>‘用来判断左边的操作数是否大于右边的操作数。如果大于返回1。如果不大于返回0.空值(NULL)不能使用‘>‘来判断。
SELECT a,a>24,a>23 FROM t1;
SELECT ‘b‘>‘c‘, ‘bc‘>‘bb‘, NULL>NULL;
5. 运算符‘>=‘
‘>=‘用来判断左边的操作数是否大于等于右边的操作数。如果大于等于返回1。如果不小于返回0.空值(NULL)不能使用‘>=‘来判断。
SELECT a,a>=24,a>=23 FROM t1;
SELECT ‘b‘>=‘c‘, ‘bc‘>=‘bb‘, NULL>=NULL;
6. 运算符‘<‘
‘<‘用来判断左边的操作数是否小于右边的操作数。如果小于返回1。如果不小于返回0.空值(NULL)不能使用‘<‘来判断。
SELECT a,a<24,a<23 FROM t1;
SELECT ‘b‘<‘c‘, ‘bc‘<‘bb‘, NULL<NULL;
7. 运算符‘<=‘
‘<=‘用来判断左边的操作数是否小于等于右边的操作数。如果小于等于返回1。如果不大于返回0.空值(NULL)不能使用‘<=‘来判断。
SELECT a,a<=24,a<=23 FROM t1;
SELECT ‘b‘<=‘c‘, ‘bc‘<=‘bb‘, NULL<=NULL;
8. 运算符‘IS NULL‘
‘IS NULL‘用来判断操作数是否为空值(NULL)。操作数为NULL时,结果返回1.操作数不为NULL时,结果返回0.‘IS NOT NULL‘刚好与‘IS NULL‘相反。
SELECT a, a IS NULL, a IS NOT NULL FROM t1;
9. 运算符‘BETWEEN m and n‘
‘BETWEEN AND‘可以判断操作数是否在某个取值范围之内。表达式‘x1 BETWEEN m AND n‘中,如果x1大于m,而且小于等于n,结果将返回1。如果不是,结果将返回0.
SELECT a, a BETWEEN 20 AND 28, a BETWEEN 25 AND 28 FROM t1;
10. 运算符‘IN‘
‘IN‘可以判断操作数是否在某个集合中。表达式‘x1 IN(值1,值2,...,值n)‘中,如果x1等于值1到值n中的任何一个值,结果将返回1.如果不是,结果将返回0。
SELECT a, a IN(2,20,24,28), a IN(3,7,9) FROM t1;
SELECT ‘a‘ IN(‘a‘,‘c‘,‘e‘), ‘a‘ IN(‘b‘,‘c‘,‘d‘);
11. 运算符‘LIKE‘
‘LIKE‘用来匹配字符串。表达式‘x1 LIKE s1‘中,如果x1与字符串s1匹配,结果将返回1.如果不匹配,结果将返回0.\。
CREATE TABLE t2(s VARCHAR(20));
INSERT INTO t2 VALUES(‘beijing‘);
SELECT s, s LIKE ‘beijing‘,s LIKE ‘___jing‘, s LIKE ‘b%‘, s LIKE ‘s%‘ FROM t2;
12. 运算符‘REGEXP‘
‘REGEXP‘也用来匹配字符串,但其是使用正则表达式进行匹配的。表达式‘x1 REGEXP 正则表达式‘中,如果x1满足正则表达式,结果将返回1。如果不满足,结果将返回0.
SELECT s, s REGEXP ‘^b‘, s REGEXP ‘g$‘, s REGEXP ‘y‘ FROM t2;
12.4 逻辑运算符
逻辑运算符用来判断表达式的真假。逻辑运算符的返回结果只有1和0。如果表达式是真,结果返回1。如果表达式是假,结果返回0。逻辑运算符又称为布尔运算符。
MySQL中支持四种逻辑运算符。这四种逻辑运算符分别是与、或、非和异或。
符号 名称
&&或者AND 与
||或者OR 或
!或者NOT 非
XOR 异或
1. 与运算
"&&"或者AND表示与运算。所有操作数不为且不为空值(NULL)时,结果返回1;存在任何一个操作数为0时,结果返回0;存在一个操作数为NULL且没有操作数为0时,结果返回NULL。与运算符"&&"可以有多个操作数同时进行与运算,其基本形式为"x1&&x2&&...&&xn"
SELECT -1 && 2&&3, 0&&3, 0&&NULL, 3&&NULL;
与运算符AND 可以有多个操作数同时进行与进行,其基本形式为"x1 AND x2 AND ... AND xn"。但是多操作数与"AND"之间要用空格隔开。
SELECT -1 AND 2 AND 3, 0 AND 3, 0 AND NULL, 3 AND NULL;
2. 或运算
‘||‘或者OR表示或运算。所有操作数中存在任何一个操作数不为非0的数字时,结果返回1;如果操作数中不包含非0的数字,但包含NULL时,结果返回NULL;如果操作数中只有0时,结果返回0.或运算符‘||‘可以有多人操作数同时进行或运算,其基本形式为‘x1||x2||...||xn‘。
SELECT 1 || -1 || NULL || 0, 3 || NULL, 0 || NULL, NULL | NULL, 0||0;
或运算符OR可以有多个操作数现时进行或运算。其基本形式为‘x1 OR x2 OR...OR xn‘。
SELECT 1 OR -1 OR NULL OR 0, 3 OR NULL, 0 OR NULL, NULL OR NULL, 0 OR 0;
3. 非运算
‘!‘或者NOT表示非运算。通过非运算,将返回与操作数相反的结果。如果操作数是非0的数字,结果返回0;如果操作数是0,结果返回1;如果操作数是NULL,结果返回NULL。或运算符‘!‘只能有一个操作数进行非运算,其基本形式为‘!x1‘。
SELECT !1, !0.3, !-3, !NULL;
下面使用‘NOT‘的例子:
SELECT NOT 1, NOT 0.3, NOT -3, NOT NULL;
4. 异或运算
XOR表示异或运算。异或运算符XOR的基本形式为‘x1 XOR x2‘。只要其中任何一个操作数为NULL时,结果返回NULL;如果x1和x2都是非0的数字或者都是0时,结果返回0;如果x1和x2中一个是非0,另一个是0时,结果返回1。
SELECT NULL XOR 1, NULL XOR 0, 3 XOR 1, 1 XOR 0, 0 XOR 0, 3 XOR 2 XOR 0 XOR 1;
12.5 位运算符
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,然后进行位运算。然后再计算结果从二进制数变回十进制数。MySQL中支持六种位运算符。这六种位运算符分别是按位与、接位或、接位取反、接位异或、接位左移和接位右移。
位运算符
符号 名称
& 按位与
| 按位或
~ 按位取反
^ 按位异或
<< 按位左移
>> 按位右移
1. 按位与
‘&‘表示按位与。进行该运算时,数据库系统会先将十进制数据转换为二进制的数。然后对应操作数的每个二进制数位上进行与运算。1和1相与得1,与0相与得0.运算完成后再将二进制数变回十进制数。
SELECT 5&6, 5&6&7;
2. 按位或
‘|‘表示按位或。将操作数化为二进制数后,每位都进行或运算。1和任何数进行或运算结果都是1,0与0或运算结果为0。
SELECT 5|6, 5|6|7;
3. 按位取反
‘~‘表示按位取反。将操作数化为二进制数后,每位都进行取反运算。1取反后变成0,0取反后变成1.
SELECT ~1;
下面使用BIN()函数来查看常数1取反结果的二进制数
SELECT BIN(~1);
4. 按位异或
‘^‘表示按位异或。将操作数化为二进制数后,每位都进行或运算。相同的数异或之后结果是0,不同的数异或之后结果为1.
SELECT 5^6;
5. 按位左移与按位右移
‘<<‘表示按位左移。‘m‘<<‘n‘表示m的二进制数向左移n位,右边补上n个0。例如,二进制数001左移1位后将变成0010。‘>>‘表示按位右移。‘m>>n‘表示m的二进制数向右移n位,左边补上n个0。二进制数011右移1位后变成001,最后一个被移出去了,直接就不要了。
SELECT 5<<2 5="">>2;
12.6 运算符的优先级
由于在实际应用中可能需要同时使用多个运算符。这就必须考虑运算符的运算顺序。到底谁先运算,谁后运算。MySQL表达式都是从左到右开始运算,哪个运算符的优先级别高,哪个运算符先进行计算。
优先级 运算符
1 !
2 ~
3 ^
4 % / DIV % MOD
5 + -
6 >> <<
7 &
8 |
9 = <=> < <= > >= != <> IN IS NULL, is NOT NULL, LIKE, REGEXP
10 BETWEEN AND, CASE, WHEN, THEN, ELSE
11 NOT
12 &&, AND
13 || OR XOR
14 =
实际使用的时候()来将优先级计算内容括起来,这样用起来更加简单,而且可读性更强。
12.7 本章实例
1. 在t表上使用算术运算符和比较运算符进行运算
2. 将数字2,0和NULL之间的任意两个进行逻辑运算
3. 按下列要求进行位运算
(1)t表上只包含两个字段。分别是字段num和字段str,两者分别是INT类型和VARCHAR类型。
CREATE TABLE t(num INT, str VARCHAR(2));
(2)向t表中插入一条记录。num值为30,str值为‘mysql‘。
INSERT INTO t VALUES(30, ‘mysql‘);
(3)从t表中取出num的值与数字4进行加法、减法、乘法、除法和求余运算。
SELECT num, num+4, num-4, num*4, num DIV 4, num%4 FROM t;
(4)使用比较运算符将num的值与20进行比较。
SELECT num, num=20, num<>20, num>20, num>=20, num<20, num<=20, num<=>20 FROM t;
(5)判断num的值是否在26到33之间,并且判断num的值是否在(3, 28, 30, 33)这个集合中。
SELECT num, num BETWEEN 26 AND 33, num IN(3, 28, 33) FROM t;
(6)判断t表的str字段值是否为空;用LIKE来判断是否是以‘my‘这两个字母开头;用REGEXP来判断是否第一字母是m,最后一个字母是y。
SELECT str, str IS NULL, str LIKE ‘my%‘, str REGEXP ‘^my‘, str REGEXP ‘y$‘ FROM t;
SELECT !2, !0, NOT NULL, 2 XOR 0, 2 XOR NULL, 0 XOR NULL;
1. 将数字4和6进行按位与、接位或。并将4按位取反。
SELECT 4&6, 4|6, ~4;
2. 将数字6分别左移两位和右移两位。
SELECT 6<<2 6="">>2;
12.8 上机实践
(1)的MySQL中执行下面的表达式:4+3-1, 3*2+7, 8、3, 9%2
(2)在MySQL中执行下面的表达式:30>28, 17>=16, 30<28, 17<=16, 17=17, 16<>17, 7<=>NULL, NULL<=>NULL
(3)判断字符串‘mybok‘是否为空,是否以字母m开头,以字母k结尾。
(4)在MySQL中执行下列逻辑运算:2&&0&&NULL, 1.5&&2, 3||NULL, NOT NULL, 3 XOR 2, 0 XOR NULL
(5)在MySQL中执行下列位运算:3&5, 3|5, 3^5, ~5
(6)将12左移两位,将9右移三位。
SELECT 4+3-1, 3*2+7, 8/3, 8 DIV 3, 9%2, MOD(9,2);
SELECT 30>28, 17>=16, 30<28, 17<=16, 17=17, 16<>17, 7<=>NULL, NULL<=>NULL;
SELECT ‘mybook‘ IS NULL, ‘mybook‘ LIKE ‘m%‘, ‘mybook‘ REGEXP ‘k$‘;
SELECT 2&&0&&NULL, 1.5&&2, 3||NULL, NOT NULL, 3 XOR 2, 0 XOR NULL;
SELECT 3&5, 3|5, 3^5, ~5;
SELECT 12<<2 9="">>3;
set profiling=1;
select * from t;
show profiles;
12.9 常见问题及解答
1. 比较比较运算符结果只能是0和1吗?
答:MySQL中,比较运算符用来判断运算符两边的操作数的大小关系。例如a>b就是用来判断a是否大于b。如果大于则返回真;如果不大于则返回假。MySQL中,真是用1来表示的,假是用0来表示的。所以,比较运算符的运算结果只有0和1.不仅比较运算符是如此,逻辑运算符的运算结果也只有0和1。
2. 哪种运算符的优先级别最高?
答:非运算(!)的级别最高,赋值符号(:=)的级别最低。但是,通常情况下可以使用括号来设定运算符的先后顺序。使用括号可以使运算的层次更加清晰,而且可以不必局限于各种运算符的优先级别。
3. 十进制数也可以直接使用位运算符吗?
答:在进行位运算时,数据库系统会先将所有的操作数转换为二进制数。然后将这些二进制数进行位运算,然后将这些运算结果转换为二进制数。所以,位运算符的操作数是十进制数。十进制数与二进制数之间的互换是数据库系统实现的。因此,位运算的操作数必须是十进制数,否则计算的结果就会是错误的。在使用位运算符时,如果操作数是二进制数、八进制数、十六进制数,要先通过CONV()函数将操作数转换为十进制数。然后,才能进行相应的位运算
算术运算符
标签:
原文地址:http://www.cnblogs.com/songjy2116/p/5220663.html