Mysql教程

12.3 比较运算符

比较运算符是査询数据时最常用的一类运算符。SELECT语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。下面是各 种比较运算符的符号、作用和表达式的形式,如表12.2所示。

表 12.2 MySQL的比较运算符

符号 表达式的形式 作用
= x1=x2 判断x1是否等于x2
<>或!= x1<>x2或x1!=x2 判断x1是否不等于x2
<=> x1<=>x2 判断x1是否等于x2
> x1>x2 判断x1是否大于X2
>= x1>=x2 判断x1是否大于等于X2
< x1<x2< td=""> 判断x1是否小于X2
<= x1<=x2 判断x1是否小于等于X2
IS NULL x1 IS NULL 判断x1是否等于NULL
IS NOT NULL x1 IS NOT NULL 判断x1是否不等于NULL
BETWEEN AND x1BETWEEN 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)不能使用“=”来判断。

【示例12-4】下面使用“=”的例子:

mysql>SELECT a,a=24,a=20 FROM t1;
+---+----+----+
|a  |a=24|a=20|
+---+----+----+
|20 |1   |0   |
1 row set(0.00 sec)
mysql> SELECT 'b'='b''b'='c',NULL=NULL
|'b'='b'|'b'='c'| NULL=NULL |
+-------+-------+-----------+
|   1   |  01   |    NULL   |
+-------+-------+-----------+
1 row in set (0.03 sec)

结果显示,t1表中的a字段取值为24;判断a=24时,返回值是1,这说明等号两边的值相等;判断a=23时,返回值为0,这说明等号两边的值不相等;判断“'b'=’b'”时,返回值是1,因为这两个字符是一样的;判断“'b'='c'”时,返回值是0,因为这两个字符不一样;判断"'NULL'='NULL'"时,返回值NULL,这是因为“=”不能用来判断空值。

说明:“=”可以用来判断两个字符是否相同,如果相同就返回1,否则返回0。判断字符时,数据库系统都是根据字符的ASCII码进行判断的如果ASCII码相等,则表示这两个字符相同。如果ASCII码不相等,则表示两个字符不同。

2.运算符“<>”和“!=”

“<>”和“!= ”可以用来判断数字、字符串、表达式等是否不相等。如果不相等,结果返回1。如果相等,结果返回0。这两个符号也不能用来判断空值(NULL)。


【示例12-5】下面是使用“0”和“!= ”的例子:

mysql> SELECT a,a<>23,a!=23,a!=24,a!=NULL FROM t1;
+--+-----+-----+------+-------+
|a |a<>23|a!=23|a!=24 |a!=NULL|
+--+-----+-----+------+-------+
|24| 1   |  1  |  0   |  NULL |
+--+-----+-----+------+-------+
1 row in set (0.00 sec)
mysql> SELECT 'b'<>'b','b'!=*c';
+----------+----------+
| 'b'<>'b' | 'b'!='c' |
|    0     |    1     |
+----------+----------+
1 row in set (0.00 sec)

结果显示,两个操作数不相等时返回1,两个操作数相等时返回0。用来判断NULL, 结果返回NULL。

3.运算符“<=>”

“<=>”的作用与“=”是一样的,也是用来判断操作数是否相等。不同的是,“<=>” 可以用来判断NULL。

【示例12-6】下面是使用“<=>”的例子:

mysql> SELECT a,a<=>24,a<=>20 FROM t1;
+-----+----------+----------+
|  a  |  a<=>24  |  a<=>20  |
+-----+----------+----------+
|  24 |     1    |     0    |
+-----+----------+----------+
1 row in set(0.00 sec)
mysql>SELECT  'b'<=>'b','b'<='c', NULL<=>NULL;
+------------+-----------+---------------+
| 'b'<=>'b'  | 'b'<='c'  |  NULL<=>NULL  |
+------------+-----------+---------------+
|     1      |     0     |      1        |
+------------+-----------+---------------+
1row in set(0.00 sec)

结果显示,两个操作数相等时返回1,两个操作数不相等时返回0。判断“NULL<=>NULL”时,结果返回1,因为两者是相等的。

技巧:“=”只能用来判断数字是否相等、字符是否相同,不能用来判断是否为空值(NULL )。而“ <=> ’’可以用来判断是否为空值(NULL )。如果判断"NULL<=>NULL",结果会返回1。“<=>”可以实现“=”的所有功能。但是通常情况一般很少使用“<=>”。

4.运算符“>”

“>”用来判断左边的操作数是否大于右边的操作数。如果大于,返回1;如果不大于 1,返回0。空值(NULL)不能使用“>”来判断.

【示例12-7】下面是使用“>”的例子: mysql> SELECT a,a>24,a>23 FROM t1;

+------+------+------+
|  a   | a>24 | a>23 |
+------+------+------+
|   24 |    0 |   1  |
+------+------+------+
1 row in set (0.00 sec)
mysql> SELECT 'b'>'c','bc'>'bb',NULL>NULL;
+-----------+-------------+-------------+
|  'b'>'c'  |  'bc'>'bb'  |  NULL>NULL  |
+-----------+-------------+-------------+
|    0      |	   1      |  NULL       |
+-----------+-------------+-------------+
1 row in set (0.00 sec)

结果显示,左边的操作数大于右边的操作数时,返回1,否则,返回0。判断“'b'>'c'” 时返回0,因为字母ASCII码值比字母0小。判断“'bc'>'bb'”时,先判断第一个字母谁的ASCII码值大。第一个字母相等时,再判断第二个字母。判断NULL>NULL时结果 返回NULL,这是因为“>”不能用来判断NULL.

5.运算符“>=”

“>=”用来判断左边的操作数是否大于或等于右边的操作数。如果大于或者等于,则 返回1。如果小于,返回0。空值(NULL)不能使用“>=”来判断。

【示例12-8】下面是使用“>=”的例子:

mysql> SELECT a,a>=23,a>=25 FROM t1;
+------+-------+-------+
|  a   | a>=23 | a>=25 |
+------+------+------+
|   24 |    1 |   0  |
+------+------+------+
1 row in set (0.00 sec)
mysql> SELECT 'b'>='c','bc'>='bb',NULL>=NULL;
+-----------+-------------+-------------+
|  'b'>'c'  |  'bc'>'bb'  |  NULL>NULL  |
+-----------+-------------+-------------+
|    0      |	   1      |  NULL       |
+-----------+-------------+-------------+
1 row in set (0.00 sec)

结果显示,左边的操作数大于或等于右边的操作数时,结果返回1。左边的操作数小 于右边的操作数时,结果返回0。判断NULL时,结果返回NULL。

6. 运算符“<”

“<”用来判断左边的操作数是否小于右边的操作数。如果小于,返回1;如果不小于1,则返回0。空值(NULL)不能使用“<”来判断。

【示例12-9】下面是使用“<”的例子:

mysql> SELECT a,a<25,a<23 FROM t1;
+------+-------+-------+
|  a   | a<25  | a<23  |
+------+-------+-------+
|   24 |    1  |   0   |
+------+------+------+
1 row in set (0.00 sec)
mysql> SELECT 'b'>='c','bc'>='bb',NULL>=NULL;
+-----------+-------------+-------------+
|  'b'<'c'  |  'bc'<'bb'  |  NULL<NULL  |
+-----------+-------------+-------------+
|    1      |	   0      |  NULL       |
+-----------+-------------+-------------+
1 row in set (0.00 sec)

7. 运算符“<=”

“<=”用来判断左边的操作数是否小于或等于右边的操作数。如果小于或者等于,返回1。如果大于,返回0。空值(NULL)不能使用“<=”来判断。

【示例12-10】下面是使用“<=”的例子:

mysql> SELECT a,a<=23,a<=25 FROM t1;
+------+-------+-------+
|  a   | a<=23 | a<=25 |
+------+------+------+
|   24 |    0 |   1  |
+------+------+------+
1 row in set (0.00 sec)
mysql> SELECT 'b'<='c','bc'<='bb',NULL<=NULL;
+------------+--------------+--------------+
|  'b'<='c'  |  'bc'<='bb'  |  NULL<=NULL  |
+------------+--------------+--------------+
|     1      |	    0       |    NULL       |
+------------+--------------+--------------+
1 row in set (0.00 sec)

结果显示,左边的操作数小于或等于右边的操作数时,结果返回1。左边的操作数大 于右边的操作数时,结果返回0。判断NULL时,结果返回NULL。

8.IS NULL

“ISNULL”用来判断操作数是否为空值(NULL)。操作数为NULL时,结果返回1; 操作数不为NULL时,结果返回0。IS NULL刚好与IS NOT NULL相反。

【示例12-11】下面是使用“IS NULL”和“IS NOT NULL”的例子:

mysql>SELECT  a,a IS NULL ,a  IS NOT NULL  FROM t1;
+-----+--------------+-----------------+
|  a  |  a  IS NULL  |  a IS NOT NULL  |
+-----+--------------+-----------------+
|  24 |      0       |        1        |
+-----+--------------+-----------------+
1 row in set(0.00 sec)
mysql> SELECT NULL IS NULL ,NULLL IS NOT NULL;
+----------------+---------------------+
|  NULL IS NULL  |  NULLL IS NOT NULL  |
+----------------+---------------------+
|          1     |         0           |
+----------------+---------------------+
1 row in set(0.00 sec)

结果显示,使用IS NULL和IS NOT NULL可以用来判断操作数是否为空值。

注意:“=”、<>”、“!= ”、“>”、“>=”、“<”和“<=”等操作数都不能用来判断空值 (NULL)。一旦使用,结果将返回NULL。如果需要判断一个值是否为空值,可以使用“<=>”、IS NULL和IS NOT NULL来判断。NULL 和‘NULL’是不一样的。后者表示一个有4个字母组成的字符串。

9.运算符“BETWEEN AND”

BETWEEN AND”可以判断操作数是否落在某个取值范围内。在表达式 xl BETWEEN m AND n中,如果X1大于等于m而且小于等n结果将返回1,如果不是,结果将返回0。

【示例12-12】下面是使用“BETWEE NAND”的例子:

mysql>SELECT  a  ,a BETWEEN 20 AND 28 ,a  BETWEEN 25 AND 28 FROM t1;
+-----+-----------------------+------------------------+
|  a  |  a BETWEEN 20 AND 28  |  a  BETWEEN 25 AND 28  |
+-----+-----------------------+------------------------+
|  14 |            1          |           0            |
+-----+-----------------------+------------------------+
1 row in set(0.00 sec)
mysql>SELECT 'b' BETWEEN 'a' AND 'd' ,z  BETWEEN 'a' AND 'd' FROM t1;
+-----------------------+------------------------+
|'b' BETWEEN 'a' AND 'd'| z  BETWEEN 'a' AND 'd' |
+-----------------------+------------------------+
|            1          |           0            |
+-----------------------+------------------------+
1 row in set(0.00 sec)

结果显示,a的取值在20~28之间,所以结果返回1; a的取值小于25,不在25~28 之间,所以结果返回0;字母b是在字母a~d之间,所以结果返回1;字母z是不在字母a~d之间,所以结果返回0;

10.运算符“IN”

“IN”可以判断操作数是否落在某个集合中。表达式X1取(值1,值2,...,值n)”中, 如果xl等于值l到值n中的任何一个值,结果将返回1。如果不是,结果将返回0。

【示例12-13】下面是使用“IN”的例子:

mysql>SELECT a,a IN(2,20,24,28),a IN(3,7,9) FROM t1;
+-----+--------------------+---------------+
|  a  |  a IN(2,20,24,28)  |  a IN(3,7,9)  |
+-----+--------------------+---------------+
|  24 |         1          |       0       |
+-----+--------------------+---------------+
1 row in set(0.00 sec)
mysql>SELECT 'a' IN('a','c','e'),'a' IN('b','c','d') FROM t1;
|-----------------------+-----------------------+
|  'a' IN('a','c','e')  |  'a' IN('b','c','d')  |
|-----------------------+-----------------------+
|             1         |           0           |
|-----------------------+-----------------------+
1 row in set(0.00 sec)

结果显示,3的取值为24,正好集合(2,20, 24, 28)中有24,所以结果返回1;集合(3, 7, 9)中没有24,所以结果返回0;字母3正好在集合('a','c','e')中,所以结果返 回1;字母3不在集合('b','c','d')中,所以结果返回0。

11.运算符“LIKE”

“LIKE”用来匹配字符串。在表达式x1 LIKE sl中,如果x1与字符串sl匹配,结果将返回1。如果不匹配,结果将返回0。

【示例12-14】下面是使用“LIKE”的例子:

mysql> SELECT s,s LIKE 'beijing',s LIKE '_ _ _ing',s LIKE 'b%',s LIKE 's%' FROM t2;\
+-------+--------------------+---------------------+---------------+---------------+
|  s    |  s LIKE 'beijing'  |  s LIKE '_ _ _ing'  |  s LIKE 'b%'  |  s LIKE 's%'  |
+-------+--------------------+---------------------+---------------+---------------+
|beijing|          1         |            1        |       1       |       0       |
+-------+--------------------+---------------------+---------------+---------------+
1 row in set (0.00 sec)

结果显示,t2表中s字段取值为beijing; s的值与字符串'beijing'匹配时,匹配成功, 结果返回1; S的值与字符串“_ _ _jing”匹配时,匹配长度为7且最后4个字母为“jing” 的字符串,结果返回1; s的值与字符串“b%”匹配时,匹配以字母b开头的字符串,结果返回1; s的值与字符串“s%”匹配时,匹配以字母s开头的字符串,结果返回0。这里的LIKE运算符与第10章介绍的LIKE关键字是同一个意思。第10章中已经介绍了LIKE关键字在SELECT语句中的使用,请读者参照第10.2.6小节。

技巧:LIKE关键字经常和通配符“_”和“%” 一起使用。“_”代表单个字符,“%”代 表任意长度的字符。只配置字符串开头或者末尾的几个字符,可以使用“%”来 替代字符串中不需要匹配的字符。这样就不用关心那些字符的个数,因为“%” 可以匹配任意长度的字符。

12.运算符 “REGEXP”

““REGEXP””也用来匹配字符串,但其是使用正则表达式进行匹配的。表达式“X1 REGEXP '匹配方式’”中,如果X1满足匹配方式,结果将返回1。如果不满足,结果将返回0。<、p>

【示例12-15】下面是使用“REGEXP”的例子:

mysql> SELECT s,s REGEXP ,'^b',s REGEXP 'g$',s REGEXP 'y' FROM t2;
+-------+---------------+---------------+--------------+
| s     | s REGEXP '^b' | s REGEXP 'g$' | s REGEXP 'y' |
|beijing|      1        |       1       |       0      |
+-------+---------------+---------------+--------------+
1 row in set (0.00 sec)

结果显示,s字段的取值为beijing;字段s的取值是以字母b开头的,结果返回1;字段s的取值是以字母g结束的,结果返回1;因为‘beijing”中不包含字母y,所以结果返回0。这里的REGEXP运算符与第10章介绍的REGEXP关键字是同一个意思。第10章 中已经介绍了 REGEXP关键字在SELECT语句中的使用,请读者参照第10.8小节。

技巧:使用REGEXP关键字可以匹配字符串,其使用方法非常灵活。REGEXP关键字经常与“^”、“$”和“.” 一起使用。“^”用来匹配字符串的开始部分,如“^L” 可以匹配任何以字母L开头的字符串。“$”用来匹配字符串的末尾部分。“.” 用来代表字符串中的一个字符。


关注微信获取最新动态