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开头的字符串。“$”用来匹配字符串的末尾部分。“.” 用来代表字符串中的一个字符。