Более сложные шаблоны вы можете создавать с помощью регулярных выражений. Регулярные выражения представляют собой универсальный язык описания текстов. Информацию о синтаксисе регулярных выражений вы можете найти на веб-странице http://ru.wikipedia.org/wiki/Регулярные_выражения. Для сравнения строки с шаблоном, содержащим регулярные выражения, необходимо вместо оператора LIKE использовать оператор REGEXP.
Следующий оператор проверяет несоответствие первого операнда шаблону, который является вторым операндом.
Оператор x NOT LIKE y
Оператор NOT LIKE возвращает результат, противоположный результату выполнения оператора LIKE:
• значение 0 (FALSE) – если х соответствует шаблону у;
• значение 1 (TRUE) – если х не соответствует шаблону;
• значение NULL – если х или у равен NULL.
Например, следующий запрос выводит данные о тех клиентах, чьи имена не содержат кавычек:
SELECT * FROM Customers WHERE name NOT LIKE \'%»%\
Результат этого запроса представлен в табл. 3.15. Таблица 3.15.Результат выполнения запроса
К операторам сравнения близка функция STRCMP(), которую мы также рассмотрим в этом разделе, несмотря на то что она может возвращать, помимо значений 1 (TRUE), 0 (FALSE) и NULL, значение – 1 (TRUE).
Оператор STRCMP(x,y)
Функция STRCMP() сравнивает строки х и у в соответствии с текущими правилами сравнения и возвращает:
• – 1 – если х предшествует у в алфавитном порядке;
• 0 – если х и у совпадают;
• 1 – если х следует после у в алфавитном порядке;
• NULL – если по крайней мере один из аргументов равен NULL.
Например, зададим для таблицы Customers (Клиенты) правило сравнения, не учитывающее регистр:
ALTER TABLE Customers CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
В этом случае запрос
SELECT name, STRCMP(name,\'крылов\') FROM Customers;
возвращает результат, представленный в табл. 3.16. Таблица 3.16.Результат выполнения запроса
Зададим для таблицы Customers правило сравнения, учитывающее регистр:
ALTER TABLE Customers
CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_cs;
SELECT name, STRCMP(name,\'крылов\') FROM Customers;
В итоге тот же самый запрос вернет уже другой результат (табл. 3.17): Таблица 3.17.Результат выполнения запроса
Различие результатов объясняется тем, что без учета регистра строки «Крылов» и «крылов» эквивалентны, а с учетом регистра – различны.
При использовании сравнения по числовым кодам символов мы получим третий результат, отличающийся от первых двух.
ALTER TABLE Customers
CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_bin;
SELECT name, STRCMP(name,\'крылов\') FROM Customers;
Результат этого запроса представлен в табл. 3.18. Таблица 3.18.Результат выполнения запроса
Наконец, рассмотрим оператор полнотекстового поиска.
Оператор MATCH (<���Список столбцов>) AGAINST (<���Критерий поиска>)
Оператор MATCH… AGAINST… выполняет поиск по заданным ключевым словам в значениях указанных столбцов. При этом для столбцов должен быть создан полнотекстовый индекс (о полнотекстовых индексах вы узнали из главы 2). Для каждой строки таблицы оператор MATCH. AGAINST. возвращает величину релевантности, которая характеризует степень соответствия строки критерию поиска. Если оператор используется в параметре WHERE команды SELECT, то результатом запроса будут строки с отличной от нуля релевантностью, упорядоченные по убыванию релевантности (подобно результату поиска в интернете с помощью поисковых систем).
Например, создадим полнотекстовый индекс для столбца description (наименование) таблицы Products (Товары). Полнотекстовый индекс можно создать только для таблиц с типом MyISAM, который не поддерживает связи между таблицами. Поэтому вначале удалим связь между таблицами Products и Orders (Заказы), удалив внешний ключ из таблицы Orders:
ALTER TABLE Orders DROP FOREIGN KEY orders_ibfk_1;
Затем изменим тип таблицы Products на MyISAM:
ALTER TABLE Products ENGINE MyISAM;
И наконец, создадим полнотекстовый индекс для столбца description:
ALTER TABLE Products ADD FULLTEXT (description);
После этого можно выполнять полнотекстовый поиск по столбцу description. Например, запрос
SELECT * FROM Products WHERE MATCH (description) AGAINST (\'Чайник Мосбытприбор\');
возвращает единственную строку (табл. 3.19). Таблица 3.19.Результат выполнения запроса
В других наименованиях товаров также присутствует ключевое слово «Мосбытприбор», однако программа MySQL игнорирует те слова из критерия поиска, которые встречаются более чем в половине строк. Игнорируются также слишком короткие слова (из трех и менее символов) и общеупотребительные слова (список этих слов – стоп-лист – приводится на веб-странице http://dev.mysql.com/doc/ refman/5.0/en/fulltext-stopwords.html).
Читать дальше
Конец ознакомительного отрывка
Купить книгу