MySQL BETWEEN 用法与实例
BETWEEN 运算符确定一个值是否介于某两个值之间。BETWEEN 运算符常用于比较数字和日期类型的数据。
MySQL BETWEEN 语法
BETWEEN 运算符是一个三目运算符,它需要 3 个操作数。下面 BETWEEN 运算符的语法:
expression BETWEEN min AND max
expression NOT BETWEEN min AND max
使用说明:
expression 可以是一个字段名、值或其他的表达式(比如函数调用、运算等)。
min 是范围的最小值(包含)。
max 是范围的最大值(包含)。
AND 是一个固定的连接词,用来连接 min 和 max。
NOT 是否定运算符,NOT BETWEEN 表达的含义与 BETWEEN 相反。
expression >= min AND expression <= max
NOT BETWEEN 运算符相当于是下面写法的简写形式:
expression < min OR expression > max
MySQL BETWEEN 运算规则
当字段的值或者给定的值介于 min 和 max 两个值之间时,BETWEEN 运算符返回 1。否则,返回 0。
BETWEEN 运算规则如下:
如果左侧的 expression 介于 min 和 max 之间时, BETWEEN 返回 1,否则返回 0。
SELECT
1 BETWEEN 1 AND 3,
2 BETWEEN 1 AND 3,
3 BETWEEN 1 AND 3,
4 BETWEEN 1 AND 3;
+-------------------+-------------------+-------------------+-------------------+
| 1 BETWEEN 1 AND 3 | 2 BETWEEN 1 AND 3 | 3 BETWEEN 1 AND 3 | 4 BETWEEN 1 AND 3 |
+-------------------+-------------------+-------------------+-------------------+
| 1 | 1 | 1 | 0 |
+-------------------+-------------------+-------------------+-------------------+
如果 expression, min, max 至少有一个 NULL 时, BETWEEN 运算符的返回 NULL。
SELECT
NULL BETWEEN 1 AND 3,
1 BETWEEN NULL AND 3,
1 BETWEEN 1 AND NULL;
+----------------------+----------------------+----------------------+
| NULL BETWEEN 1 AND 3 | 1 BETWEEN NULL AND 3 | 1 BETWEEN 1 AND NULL |
+----------------------+----------------------+----------------------+
| NULL | NULL | NULL |
+----------------------+----------------------+----------------------+
MySQL BETWEEN 实例
BETWEEN 运算符常用于数字和日期类型的数据之间的比较。我们看 1 个实际的例子。
在以下实例中,我们使用 Sakila 示例数据库中的 film 表作为演示。
BETWEEN
以下 SQL 语句使用 BETWEEN 运算符检索影片赔偿价格介于 1 和 10 之间的影片:
SELECT film_id,title,replacement_cost FROM film WHERE replacement_cost BETWEEN 1 AND 10;
+---------+------------------------+------------------+
| film_id | title | replacement_cost |
+---------+------------------------+------------------+
| 23 | ANACONDA CONFESSIONS | 9.99 |
| 150 | CIDER DESIRE | 9.99 |
| 182 | CONTROL ANTHEM | 9.99 |
| 203 | DAISY MENAGERIE | 9.99 |
| 221 | DELIVERANCE MULHOLLAND | 9.99 |
| 260 | DUDE BLINDNESS | 9.99 |
| 272 | EDGE KISSING | 9.99 |
| 281 | ENCINO ELF | 9.99 |
| 299 | FACTORY DRAGON | 9.99 |
| 307 | FELLOWSHIP AUTUMN | 9.99 |
| 348 | GANDHI KWAI | 9.99 |
| 389 | GUNFIGHTER MUSSOLINI | 9.99 |
| 409 | HEARTBREAKERS BRIGHT | 9.99 |
| 476 | JASON TRAP | 9.99 |
| 501 | KISSING DOLLS | 9.99 |
| 522 | LIFE TWISTED | 9.99 |
| 551 | MAIDEN HOME | 9.99 |
| 565 | MATRIX SNOWMAN | 9.99 |
| 572 | METROPOLIS COMA | 9.99 |
| 623 | NEWTON LABYRINTH | 9.99 |
| 627 | NORTH TEQUILA | 9.99 |
| 629 | NOTORIOUS REUNION | 9.99 |
| 639 | OPPOSITE NECKLACE | 9.99 |
| 656 | PAPI NECKLACE | 9.99 |
| 662 | PATHS CONTROL | 9.99 |
| 686 | PLUTO OLEANDER | 9.99 |
| 705 | PURPLE MOVIE | 9.99 |
| 747 | ROXANNE REBEL | 9.99 |
| 841 | STAR OPERATION | 9.99 |
| 845 | STEPMOM DREAM | 9.99 |
| 846 | STING PERSONAL | 9.99 |
| 863 | SUN CONFESSIONS | 9.99 |
| 875 | TALENTED HOMICIDE | 9.99 |
| 880 | TELEMARK HEARTBREAKERS | 9.99 |
| 886 | THEORY MERMAID | 9.99 |
| 888 | THIN SAGEBRUSH | 9.99 |
| 912 | TROJAN TOMORROW | 9.99 |
| 915 | TRUMAN CRAZY | 9.99 |
| 931 | VALENTINE VANISHING | 9.99 |
| 953 | WAIT CIDER | 9.99 |
| 996 | YOUNG LANGUAGE | 9.99 |
+---------+------------------------+------------------+
此 SQL 语句与下面不使用 BETWEEN 的语句的结果相同:
SELECT
film_id, title, replacement_cost
FROM
film
WHERE
replacement_cost >= 1 AND replacement_cost <= 10;
NOT BETWEEN
以下 SQL 语句使用 BETWEEN 运算符检索影片赔偿价格不介于 1 和 10 之间的影片:
SELECT film_id,title,replacement_cost FROM film WHERE replacement_cost NOT BETWEEN 1 AND 10;
+---------+------------------------+------------------+
| film_id | title | replacement_cost |
+---------+------------------------+------------------+
| 23 | ANACONDA CONFESSIONS | 9.99 |
| 150 | CIDER DESIRE | 9.99 |
| 182 | CONTROL ANTHEM | 9.99 |
| 203 | DAISY MENAGERIE | 9.99 |
| 221 | DELIVERANCE MULHOLLAND | 9.99 |
| 260 | DUDE BLINDNESS | 9.99 |
| 272 | EDGE KISSING | 9.99 |
| 281 | ENCINO ELF | 9.99 |
| 299 | FACTORY DRAGON | 9.99 |
| 307 | FELLOWSHIP AUTUMN | 9.99 |
| 348 | GANDHI KWAI | 9.99 |
| 389 | GUNFIGHTER MUSSOLINI | 9.99 |
| 409 | HEARTBREAKERS BRIGHT | 9.99 |
| 476 | JASON TRAP | 9.99 |
| 501 | KISSING DOLLS | 9.99 |
| 522 | LIFE TWISTED | 9.99 |
| 551 | MAIDEN HOME | 9.99 |
| 565 | MATRIX SNOWMAN | 9.99 |
| 572 | METROPOLIS COMA | 9.99 |
| 623 | NEWTON LABYRINTH | 9.99 |
| 627 | NORTH TEQUILA | 9.99 |
| 629 | NOTORIOUS REUNION | 9.99 |
| 639 | OPPOSITE NECKLACE | 9.99 |
| 656 | PAPI NECKLACE | 9.99 |
| 662 | PATHS CONTROL | 9.99 |
| 686 | PLUTO OLEANDER | 9.99 |
| 705 | PURPLE MOVIE | 9.99 |
| 747 | ROXANNE REBEL | 9.99 |
| 841 | STAR OPERATION | 9.99 |
| 845 | STEPMOM DREAM | 9.99 |
| 846 | STING PERSONAL | 9.99 |
| 863 | SUN CONFESSIONS | 9.99 |
| 875 | TALENTED HOMICIDE | 9.99 |
| 880 | TELEMARK HEARTBREAKERS | 9.99 |
| 886 | THEORY MERMAID | 9.99 |
| 888 | THIN SAGEBRUSH | 9.99 |
| 912 | TROJAN TOMORROW | 9.99 |
| 915 | TRUMAN CRAZY | 9.99 |
| 931 | VALENTINE VANISHING | 9.99 |
| 953 | WAIT CIDER | 9.99 |
| 996 | YOUNG LANGUAGE | 9.99 |
+---------+------------------------+------------------+
此 SQL 语句与下面不使用 NOT BETWEEN 的语句的结果相同:
SELECT
film_id, title, replacement_cost
FROM
film
WHERE
replacement_cost < 10 OR replacement_cost > 50;
总结
BETWEEN 运算符来测试一个值是否位于一个数值区间或者时间区间内。
BETWEEN min AND max 中 min 是区间的最小值,max 是区间的最大值。
expression BETWEEN min AND max 与 expression >= min AND expression <= max 结果相同。
BETWEEN 运算符可以结合 NOT 运算符进行否定操作。
expression NOT BETWEEN min AND max 与 expression < min OR expression > max 结果相同。
MySQL LIKE 用法与实例
在 MySQL 中, LIKE 运算符可以根据指定的模式过滤数据。LIKE 运算符一般用于模糊匹配字符数据。
MySQL LIKE 语法
LIKE 运算符是一个双目比较运算符,需要两个操作数。 LIKE 运算符语法如下:
expression LIKE pattern
expression 可以是一个字段名、值或其他的表达式(比如函数调用、运算等)。
pattern 是一个字符串模式。MySQL 字符串模式支持两个通配符: % 和 _。
% 匹配零或多个任意字符。
_ 匹配单个任意字符。
如果需要匹配通配符,则需要使用 `` 转义字符,如 % 和 _。
使用通配符匹配文本时,不区分字母大小写。
如果 expression 与 pattern 匹配,LIKE 运算符返回 1,否则返回 0。
a% 匹配以字符 a 开头的任意长度的字符串。
%a 匹配以字符 a 结尾的任意长度的字符串。
%a% 匹配包含字符 a 的任意长度的字符串。
%a%b% 匹配同时包含字符 a 和 b 且 a 在 b 前面的任意长度的字符串。
a_ 匹配以字符 a 开头长度为 2 字符串。
_a 匹配以字符 a 结尾长度为 2 字符串。
MySQL LIKE 运算规则
LIKE 运算符用于模糊匹配字符串数据。它的运算规则如下:
当 LIKE 运算符左侧的操作数与右侧的模式匹配时,返回 1。否则,返回 0。
SELECT 'a' LIKE 'a', 'a' LIKE 'a%', 'ab' LIKE 'a%', 'ab' LIKE '%a';
+--------------+---------------+----------------+----------------+
| 'a' LIKE 'a' | 'a' LIKE 'a%' | 'ab' LIKE 'a%' | 'ab' LIKE '%a' |
+--------------+---------------+----------------+----------------+
| 1 | 1 | 1 | 0 |
+--------------+---------------+----------------+----------------+
SELECT 'a' LIKE 'a_', 'ab' LIKE 'a_', 'abc' LIKE 'a_';
+---------------+----------------+-----------------+
| 'a' LIKE 'a_' | 'ab' LIKE 'a_' | 'abc' LIKE 'a_' |
+---------------+----------------+-----------------+
| 0 | 1 | 0 |
+---------------+----------------+-----------------+
如果 LIKE 运算符的两个操作数中任意一个为 NULL 时,返回 NULL。
SELECT NULL LIKE 'a%', 'a' LIKE NULL;
+----------------+---------------+
| NULL LIKE 'a%' | 'a' LIKE NULL |
+----------------+---------------+
| NULL | NULL |
+----------------+---------------+
MySQL LIKE 实例
在实际开发中,我们会在 SELECT、UPDATE、DELETE 语句中的 WHERE 子句中使用 LIKE 运算符。
在以下实例中,我们使用 Sakila 示例数据库中的 actor 表和 category 表作为演示。
使用 % 匹配开头
以下 SQL 语句使用 LIKE 运算符匹配 first_name 以字符 P 开头的所有演员。比如: PARKER。
SELECT * FROM actor WHERE first_name LIKE 'P%';
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |
| 46 | PARKER | GOLDBERG | 2006-02-15 04:34:33 |
| 54 | PENELOPE | PINKETT | 2006-02-15 04:34:33 |
| 104 | PENELOPE | CRONYN | 2006-02-15 04:34:33 |
| 120 | PENELOPE | MONROE | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
使用 % 匹配结尾
以下 SQL 语句使用 LIKE 运算符匹配 first_name 以字符串 ES 结尾的所有演员。比如: JAMES。
SELECT * FROM actor WHERE first_name LIKE '%ES';
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 48 | FRANCES | DAY-LEWIS | 2006-02-15 04:34:33 |
| 84 | JAMES | PITT | 2006-02-15 04:34:33 |
| 126 | FRANCES | TOMEI | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
使用 % 匹配包含字符
以下 SQL 语句使用 LIKE 运算符匹配 first_name 中包含字符串 AM 的所有演员。比如: JAMES, WILLIAM。
SELECT * FROM actor WHERE first_name LIKE '%AM%';
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 24 | CAMERON | STREEP | 2006-02-15 04:34:33 |
| 63 | CAMERON | WRAY | 2006-02-15 04:34:33 |
| 71 | ADAM | GRANT | 2006-02-15 04:34:33 |
| 84 | JAMES | PITT | 2006-02-15 04:34:33 |
| 111 | CAMERON | ZELLWEGER | 2006-02-15 04:34:33 |
| 132 | ADAM | HOPPER | 2006-02-15 04:34:33 |
| 175 | WILLIAM | HACKMAN | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
使用 _ 匹配单个字符
通配符 _ 匹配任意单个字符。以下 SQL 语句使用 LIKE 运算符查找 first_name 以字符串 AY 结尾的且长度为 3 个字符的所有演员。
SELECT * FROM actor WHERE first_name LIKE '_%AY';
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 55 | FAY | KILMER | 2006-02-15 04:34:33 |
| 64 | RAY | JOHANSSON | 2006-02-15 04:34:33 |
| 147 | FAY | WINSLET | 2006-02-15 04:34:33 |
| 156 | FAY | WOOD | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
NOT LIKE
以下 SQL 使用 NOT 运算符与 LIKE 运算符从 category 表中检索那些名字不以 A 开头的分类。
SELECT * FROM category WHERE name NOT LIKE 'A%';
+-------------+-------------+---------------------+
| category_id | name | last_update |
+-------------+-------------+---------------------+
| 3 | Children | 2006-02-15 04:46:27 |
| 4 | Classics | 2006-02-15 04:46:27 |
| 5 | Comedy | 2006-02-15 04:46:27 |
| 6 | Documentary | 2006-02-15 04:46:27 |
| 7 | Drama | 2006-02-15 04:46:27 |
| 8 | Family | 2006-02-15 04:46:27 |
| 9 | Foreign | 2006-02-15 04:46:27 |
| 10 | Games | 2006-02-15 04:46:27 |
| 11 | Horror | 2006-02-15 04:46:27 |
| 12 | Music | 2006-02-15 04:46:27 |
| 13 | New | 2006-02-15 04:46:27 |
| 14 | Sci-Fi | 2006-02-15 04:46:27 |
| 15 | Sports | 2006-02-15 04:46:27 |
| 16 | Travel | 2006-02-15 04:46:27 |
+-------------+-------------+---------------------+
总结
LIKE 运算符是双目运算符。
LIKE 运算符来文本值是否与指定的文本模式匹配。
% 通配符匹配零个或多个任意字符。
_ 通配符匹配单个任意字符。
使用通配符匹配文本时,不区分字母大小写。
当通配字符想要作为普通字符时,使用转义字符 (``) 进行转义。
使用 NOT 运算符来否定 LIKE 运算符。
借助通配符,可以匹配文本开头、文本结尾、包含字符串等。