# Главная
# О библиотеке

# Выбор дистрибутива
преимущества Linux/UNIX | основные дистрибутивы | серверный Linux | BSD | LiveCDs | прочее

# Установка и удаление программ
общие вопросы | каталоги софта | специальные случаи

# Настройка и работа
установка, загрузчики | настройка Linux | консоль | файловые системы | процессы | шеллы, русификация, коммандеры | виртуальные машины, эмуляторы

# X Window и оконные менеджеры
настройка X Window | GNOME | KDE | IceWM и др.

# Работа с текстами
редакторы | офис | шрифты, кодировки и русификация | преобразования текстовых файлов | LaTeX, SGML и др. | словари

# Графика
GIMP | фото | обработка изображений | форматы графических файлов

# Сети, администрирование
общие вопросы | Dialup & PPP | брандмауэры | маршрутизация | работа в Windows-сетях | веб-серверы | Apache | прокси-серверы | сетевая печать | прочее

# Программирование
GCC & GNU make | программирование в UNIX | графические библиотеки | Tcl | Perl | PHP | Java & C# | СУБД | CVS | прочее

# Ядро
# Мультимедиа
# Интернет
# Почта
# Безопасность
# Железо
# Разное

# Linux HowTo (как сделать)
# Книги и руководства
# Материалы на английском языке


MySQL The World's Most Popular Open Source Database # Online shop | Site map |  
CompanyProductsSupport & ConsultingTraining & CertificationDownloadsDocumentation
  BooksArticlesMailing ListsPresentationsOther Sites  
Search the MySQL manual:
MySQL Manual
  • 3 Учебное пособие по MySQL
    • 3.3 Создание и использование базы данных
      • 3.3.4 Выборка информации из таблицы
        • 3.3.4.1 Выборка всех данных
        • 3.3.4.2 Выборка определенных строк
        • 3.3.4.3 Выборка определенных столбцов
        • 3.3.4.4 Сортировка строк
        • 3.3.4.5 Вычисление дат
        • 3.3.4.6 Работа с значениями NULL
        • 3.3.4.7 Сравнение по шаблонам
        • 3.3.4.8 Подсчет строк
        • 3.3.4.9 Использование нескольких таблиц

Buy this Reference Manual in softcover from Barnes & Noble!

MySQL Reference Manual
Previous / Next / Up / Table of Contents

3.3.4.7 Сравнение по шаблонам

В MySQL реализовано стандартное для SQL сравнение по шаблонам, а также особый тип такого сравнения - он основан на использовании выражений, подобных применяющимся в служебных программах Unix (таких, как vi, grep и sed).

В SQL при сравнении по шаблону символ `_' обозначает любой одиночный символ, а `%' - определенное количество символов (включая ноль символов). В MySQL в SQL-шаблонах по умолчанию не учитывается регистр символов. При работе с шаблонами SQL использование операторов = или <> не допускается, вместо этого применяются операторы сравнения LIKE или NOT LIKE.

Найти все имена, начинающиеся с `b', можно следующим образом:

mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

Найти все имена, заканчивающиеся на `fy', можно следующим образом:

mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

Найти все имена, содержащие `w', можно следующим образом:

mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

Найти все имена, содержащие ровно пять символов, можно при помощи шаблонного символа `_':

mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

Во втором типе шаблонов, предусмотренных в MySQL, используются расширенные регулярные выражения. При поиске совпадений на основе такого шаблона шаблоном нужно пользоваться операторами REGEXP и NOT REGEXP (или их синонимами - RLIKE и NOT RLIKE).

Ниже приведены некоторые характеристики расширенных регулярных выражений:

  • `.' обозначает любой символ.
  • Класс символов `[...]' обозначает любой из символов в скобках. Например, `[abc]' обозначает `a', `b' или `c'. Набор символов можно обозначить с помощью дефиса. `[a-z]' обозначает любую букву нижнего регистра, а `[0-9]' - любую цифру.
  • `*' обозначает ноль или более экземпляров символа, стоящего перед ним. Например, `x*' обозначает любое количество символов `x', `[0-9]*' обозначает любое количество цифр, а `.*' - любое количество любых символов.
  • Для шаблона выдается совпадение, если поисковый контекст обнаружен в любой из частей значения, в котором производится поиск (для шаблонов SQL совпадение выдается только в случае, если совпадает все значение).
  • ``Закрепить'' шаблон так, чтобы проверять совпадения с началом или концом значения можно с помощью символов `^' (начало) или `$' (конец), которые располагаются в начале или в конце шаблона соответственно.

Чтобы продемонстрировать работу регулярных выражений, приведенные выше запросы LIKE здесь переписаны с использованием REGEXP.

Найти все имена, начинающиеся с `b', можно при помощи символа `^', привязывающего шаблон к началу имени:

mysql> SELECT * FROM pet WHERE name REGEXP "^b";
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

В версиях MySQL до 3.23.4 REGEXP учитывает регистр символов, и приведенный запрос не возвратит никаких результатов. Для поиска символов `b' верхнего или нижнего регистра воспользуйтесь следующим запросом:

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

Начиная с версии MySQL 3.23.4, заставить REGEXP учитывать регистр символов можно с помощью ключевого слова BINARY. В этом запросе положительный результат поиска будет получен только при обнаружении символа 'b' нижнего регистра в начале имени:

mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";

Найти все имена, заканчивающиеся на `fy', можно при помощи символа `$', привязывающего шаблон к концу имени:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

Найти все имена, содержащие символ `w' любого регистра, можно так:

mysql> SELECT * FROM pet WHERE name REGEXP "w";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

Поскольку регулярное выражение выдает положительный результат при совпадении шаблона с любым фрагментом значения, в приведенном выше примере привязывать поиск к любому из концов имени для сравнения полного значения с шаблоном, как это пришлось бы делать для шаблона SQL, не нужно.

Найти все имена, содержащие ровно пять символов, можно, если привязать поиск к началу и концу имени с помощью символов `^' и `$' и поставить пять символов `.' между ними:

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

Предыдущий запрос можно записать и при помощи оператора `{n}' (``повторить-n-раз''):

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

User Comments

Posted by Jim on Tuesday January 28 2003, @8:07am[Delete] [Edit]

To search for whole words only, such
matching "foo" in
"foo bar", "bar foo", "bar foo bar", or "foo" but
not in "foobar" or "barfoo"
use...
regexp '(^|[^a-zA-Z])foo([^a-zA-Z]|$)'

Posted by [name withheld] on Tuesday July 9 2002, @8:14am[Delete] [Edit]

is there a way of getting mysql to match something
close to a word:
"SELECT * FROM main WHERE lalala LIKE 'bob'"
??
please email americanfirehydrent@hotmail.com with
some answers

Posted by Samuel Fullman on Friday April 19 2002, @5:08pm[Delete] [Edit]

I think it IS an appropriate question to ask
whether mySQL handles strings in a "greedy" or
non-greedy fashion

Posted by jeroen galjee on Wednesday January 29 2003, @2:49pm[Delete] [Edit]

My question is simple:
How can I select the last row of a table?
Please help me.
Gr. Jeroen

Posted by chris rehberg on Tuesday February 25 2003, @9:44pm[Delete] [Edit]

If I remember database classes correctly, there is no such thing as a "last row" of a table. Rows do not have order. (Neither do columns).

Other suggestions: use a "date_created" field, or "date_lastmodified" and sort on that.

Posted by [name withheld] on Friday March 7 2003, @1:52pm[Delete] [Edit]

or sort desc and use limit.

Add your own comment.

Top / Previous / Next / Up / Table of Contents
# MySQL.com home | Site map | Contact us | Press | Jobs | Privacy policy | Trademark info | © 1995-2003 MySQL AB. All rights reserved.