Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_dlya_laboratornykh_rabot_BD.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
2.57 Mб
Скачать

1.2 Работа с значениями null

Обработка NULL-значений, т.е. таких полей, которые содержат отсутствующее или неизвестное значение, производится специальным образом.. Например, проверить некоторое поле на равенство значению NULL с помощью обычных арифметических операторов сравнения (=, < или <>) невозможно. Это отлично иллюстрирует результат выполнения следующего запроса:

SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;

Вместо этого нужно воспользоваться логическими операторами: IS

NULL и IS NOT NULL:

SELECT 1 IS NULL, 1 IS NOT NULL;

Отметим, что в MySQL значения 0 или NULL приравнивается к логическому значению FALSE, а все остальные - к TRUE. По умолчанию значение "истина" для булевого оператора равно 1. Два NULL-значения считаются одинаковыми при вычислениях в условии GROUP BY в соотвествующем операторе SELECT. При выполнении условия ORDER BY с опцией ASC (по возрастанию) NULL-значения идут в первую очередь, и в последнюю - если используется условие ORDER BY ... DESC (упорядочить по убыванию) .

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

В MySQL реализовано стандартное для SQL сравнение по шаблонам, а также особый тип такого сравнения - он основан на использовании выражений, подобных применяющимся в служебных программах операционной системы Unix (таких, как vi, grep и sed). В SQL при сравнении по шаблону символ ‘_’ обозначает любой одиночный символ, а ‘%’ - определенное количество символов (включая ноль символов). В MySQL в SQL-шаблонах по умолчанию не учитывается регистр символов. При работе с шаблонами SQL использование операторов = или <> не допускается, вместо этого применяются логические операторы сравнения LIKE или NOT LIKE.

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

SELECT * FROM Patient WHERE name LIKE "%1";

Найти все имена, содержащие ‘p’, можно следующим образом:

SELECT * FROM Patient WHERE name LIKE "%р%";

Найти все имена, содержащие ровно пять символов, можно при помощи

шаблонного символа ‘_’:

SELECT * FROM pet WHERE name LIKE "_____";

В нашем случае будет возвращен пустой набор записей.

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

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

  • ‘.’ обозначает любой символ.

  • Класс символов '[...]' обозначает любой из символов в скобках. Например, '[abc]' обозначает ‘a’, ‘b’ или ‘c’. Набор символов можно обозначить с помощью дефиса. '[a-z]' обозначает любую букву нижнего регистра, а '[0-9]' - любую цифру.

  • ‘*’обозначает ноль или более экземпляров символа, стоящего перед ним. Например, 'x*' обозначает любое количество символов ‘x’, '[0-9]*' обозначает любое количество цифр, а '.*' - любое количество любых символов.

Для шаблона выдается совпадение, если поисковый контекст обнаружен в любой из частей значения, в котором производится поиск (для шаблонов SQL совпадение выдается только в случае, если совпадает все значение).

``Закрепить'' шаблон так, чтобы проверять совпадения с началом или концом значения можно с помощью символов ‘^’ (начало) или ‘$’ (конец), которые располагаются в начале или в конце шаблона соответственно. Чтобы продемонстрировать применение механизма регулярных выражений, приведенные выше запросы LIKE здесь переписаны с использованием REGEXP.

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

  • SELECT * FROM Patient WHERE name REGEXP "1$";

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

SELECT * FROM Patient WHERE name REGEXP BINARY "^p";

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]