MySQL 5.0. Библиотека программиста
Шрифт:
SELECT * FROM Customers WHERE name NOT BETWEEN \'КРЫЛОВ\' AND \'ООО «Кускус»;
возвращает следующие строки таблицы Customers (Клиенты) (табл. 3.12). Таблица 3.12. Результат выполнения запроса
Следующий оператор проверяет наличие первого операнда в списке значений, который является вторым операндом.
Оператор x IN (<Список значений>)Оператор «содержится в списке» возвращает следующие значения:
• 1 (TRUE) – если х совпадает с одним из элементов списка;
• 0 (FALSE) – если х не совпадает ни с одним из элементов списка;
• NULL – если х равен NULL, а также в тех случаях, когда в списке присутствует значение NULL и при этом х не совпадает ни с одним из элементов списка.
Например,SELECT * FROM Customers WHERE rating IN (500,1500,2500);
возвращает результат, представленный в табл. 3.12.
Оператор IN позволяет также сравнивать составные значения, то есть значение х и элементы списка могут представлять собой наборы из нескольких величин (количество компонентов во всех наборах должно быть одинаковым).
Например, запросSELECT * FROM Orders WHERE (date,product_id) IN
((\'2007-12-12\',1),(\'2007-12-12\',2),
(\'2007-12-13\',1),(\'2007-12-13\',2));сравнивает каждую пару, состоящую из даты заказа (date) и номера товара (customer_id), со списком пар, и если оба компонента в паре совпадают с соответствующими компонентами какой-либо пары из списка, то строка таблицы Orders (Заказы) будет включена в результат запроса. Таким образом, запрос отбирает заказы товаров № 1 и № 2, сделанные 12 и 13 декабря 2007 г. (табл. 3.13). Таблица 3.13. Результат выполнения запроса
В отличие от функций LEAST, GREATEST, INTERVAL и COALESCE, списком значений для оператора IN может быть не только фиксированный перечень аргументов, но и результат подзапроса (соответствующий пример мы рассматривали в подразделе «Вложенные запросы» главы 2).
Следующий оператор проверяет отсутствие первого операнда в списке значений, который является вторым операндом.
Оператор x NOT IN (<Список значений>)Оператор «не содержится в списке» возвращает результат, противоположный результату оператора IN:
• 1 (TRUE), если х не совпадает ни с одним из элементов списка;
• 0 (FALSE) – если х совпадает с одним из элементов списка;
• NULL, если х равен NULL, а также в тех случаях, когда в списке присутствует значение NULL и при этом х не совпадает ни с одним из элементов списка.
Например, запросSELECT * FROM Customers WHERE rating NOT IN (500,1500);
возвращает результат, представленный в табл. 3.11.
Этот оператор, как и оператор IN, может работать с составными значениями, а также со списком, полученным в результате подзапроса.
Следующий оператор проверяет соответствие первого операнда шаблону, который является вторым операндом.
Оператор x LIKE yОператор сравнения с шаблоном возвращает следующие значения:
• 1 (TRUE) – если х соответствует шаблону у;
• 0 (FALSE) – если х не соответствует шаблону у;
• NULL – если х или у равен NULL.
В шаблоне можно использовать два специальных подстановочных символа:
• % – на месте знака процента может быть любое количество произвольных символов операнда х;
• _ – на месте знака подчеркивания может быть ровно один произвольный символ операнда х.
Например, следующий запрос выводит данные о тех клиентах, чьи имена содержат кавычки:SELECT * FROM Customers WHERE name LIKE \'%\'\'%\'\'%\
Результат этого запроса представлен в табл. 3.14. Таблица 3.14. Результат выполнения запроса
Если требуется включить в шаблон знак процента или подчеркивания, которые должны рассматриваться не как подстановочные, а как обычные символы, перед ними нужно поставить обратную косую черту («\%», «\_»). Если же шаблон должен содержать символ обратной косой черты, то ее нужно удвоить («\\»). Например, значение выражения \_% LIKE \\\_\% истинное.
По умолчанию сравнение с помощью оператора LIKE выполняется без учета регистра символов (то есть заглавная и строчная буквы рассматриваются как одинаковые). Для сравнения с учетом регистра (чтобы заглавная и строчная буквы рассматривались как разные) необходимо указать ключевое слово BINARY или правило сравнения (COLLATE). Например, выражение \'Крылов\' LIKE \'крылов\' истинно, а выражения \'Крылов\' LIKE BINARY \'крылов\' и \'Крылов\' LIKE \'крылов\' COLLATE utf8_bin ложны (правило сравнения должно соответствовать кодировке, в которой работает ваше клиентское приложение; правила сравнения мы рассмотрели в разделе «Создание базы данных» главы 2).Примечание
Более
Следующий оператор проверяет несоответствие первого операнда шаблону, который является вторым операндом.
Оператор 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. Результат выполнения запроса
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: