MySQL BETWEEN 和 LIKE 用法与实例

106 阅读9分钟

MySQL BETWEEN 用法与实例

BETWEEN 运算符确定一个值是否介于某两个值之间。BETWEEN 运算符常用于比较数字和日期类型的数据。

MySQL BETWEEN 语法

BETWEEN 运算符是一个三目运算符,它需要 3 个操作数。下面 BETWEEN 运算符的语法:

expression BETWEEN min AND max
expression NOT BETWEEN min AND max

使用说明:

expression 可以是一个字段名、值或其他的表达式(比如函数调用、运算等)。

min 是范围的最小值(包含)。

max 是范围的最大值(包含)。

AND 是一个固定的连接词,用来连接 minmax

NOT 是否定运算符,NOT BETWEEN 表达的含义与 BETWEEN 相反。

expression >= min AND expression <= max

NOT BETWEEN 运算符相当于是下面写法的简写形式:

expression < min OR expression > max

MySQL BETWEEN 运算规则

当字段的值或者给定的值介于 minmax 两个值之间时,BETWEEN 运算符返回 1。否则,返回 0

BETWEEN 运算规则如下:

如果左侧的 expression 介于 minmax 之间时, 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 运算符检索影片赔偿价格介于 110 之间的影片:

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 运算符检索影片赔偿价格不介于 110 之间的影片:

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 maxmin 是区间的最小值,max 是区间的最大值。

expression BETWEEN min AND maxexpression >= min AND expression <= max 结果相同。

BETWEEN 运算符可以结合 NOT 运算符进行否定操作。

expression NOT BETWEEN min AND maxexpression < min OR expression > max 结果相同。

MySQL LIKE 用法与实例

在 MySQL 中, LIKE 运算符可以根据指定的模式过滤数据。LIKE 运算符一般用于模糊匹配字符数据。

MySQL LIKE 语法

LIKE 运算符是一个双目比较运算符,需要两个操作数。 LIKE 运算符语法如下:

expression LIKE pattern

expression 可以是一个字段名、值或其他的表达式(比如函数调用、运算等)。

pattern 是一个字符串模式。MySQL 字符串模式支持两个通配符: %_

% 匹配零或多个任意字符。

_ 匹配单个任意字符。

如果需要匹配通配符,则需要使用 `` 转义字符,如 %_

使用通配符匹配文本时,不区分字母大小写。

如果 expressionpattern 匹配,LIKE 运算符返回 1,否则返回 0

a% 匹配以字符 a 开头的任意长度的字符串。

%a 匹配以字符 a 结尾的任意长度的字符串。

%a% 匹配包含字符 a 的任意长度的字符串。

%a%b% 匹配同时包含字符 abab 前面的任意长度的字符串。

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 实例

在实际开发中,我们会在 SELECTUPDATEDELETE 语句中的 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 运算符。

借助通配符,可以匹配文本开头、文本结尾、包含字符串等。