- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри
Шрифт:
Интервал:
Закладка:
CONTAINING
Строковое значение содержит указанную строку. Сравнение является независимым от регистра
IN
Значение присутствует в указанном наборе*
LIKE
Равенство указанной строке с шаблонными подстановками
STARTING WITH
Строковое значение начинается с указанной строки
* Наиболее эффективной является ситуация, когда набор содержит небольшое количество констант. Набор не может превышать 1500 элементов. (См. разд. "Предикаты существования".)
BETWEEN использует два аргумента совместимых типов, разделенных ключевым словом AND. Меньшее значение должно быть первым аргументом, если нет, не найдет ни одной строки, соответствующей предикату. Поиск является включающим - то есть значения, соответствующие обоим аргументам, будут включены в возвращаемый набор, например:
SELECT * FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '01.01.1992' AND CURRENT_TIMESTAMP;
BETWEEN будет использовать возрастающий индекс по искомому столбцу, если таковой доступен.
CONTAINING ищет строку или тип, подобный строке, отыскивая последовательность символов, которая соответствует его аргументу. Он может быть использован для алфавитно-цифрового (подобного строковому) поиска в числах и датах. Поиск CONTAINING является чувствительным к регистру.
Следующий пример
SELECT * FROM PROJECT
WHERE PROJ_NAME CONTAINING ' Map ' ;
возвращает две строки проекта: 'AutoMap' и 'MapBrowser port'. Следующий пример
SELECT * FROM SALARY_HISTORY
WHERE CHANGE_DATE CONTAINING 93;
возвращает все строки, где датой является год 1993.
! ! !
ВНИМАНИЕ! В некоторых релизах CONTAINING является непредсказуемым, когда используется для BLOB, чей размер больше 1024 байт. Это определено как ошибка и будет вскоре исправлено в следующем после 1.5 релизе.
. ! .
IN принимает в качестве аргумента список значений и возвращает все строки, где значение столбца в левой части равно любому значению в множестве, например:
SELECT * FROM EMPLOYEE
WHERE FIRST_NAME IN('Pete', 'Ann', 'Roger');
NULL не может быть включен в множество поиска.
Список аргументов в IN о может быть представлен в виде подзапроса, который возвращает строки, состоящие из одного столбца. Подробности см. в разд. "Предикаты существования" далее в этой главе.
! ! !
ВНИМАНИЕ! Общей ошибкой "чайников" является трактовка предиката IN (<значение>) как если бы он был эквивалентным предикату =<значение>, потому что оба предиката логически эквивалентны в том смысле, что оба возвращают один и тот же результат. При этом IN не использует индексы. Поскольку среди равных поисков обычно лучшим является тот, который оптимизирован по индексу, использование IN является плохим решением с точки зрения производительности.
. ! .
LIKE является чувствительным к регистру шаблоном оператора поиска. Это довольно тупой инструмент, выполняющий сравнение с шаблоном поиска в обычном выражении. Он распознает два шаблонных символа: % и _ (символ подчеркивания), которые работают следующим образом.
* Символ % может быть подставлен в строку поиска для представления любого количества любых символов, в том числе и нулевого количества, например:
LIKE '%mit%'
вернет истину для таких строк, как 'blacksmith', 'mitgenommen', а также и 'mit'.
* Символ подчеркивания (_) может быть вставлен в строку поиска для представления одного неопределенного символа. Например, следующее условие задает поиск записей, где фамилия может быть 'Smith', 'Smyth' или другой, похожей на шаблон:
LIKE 'Sm_th'
Если вам нужно отыскать строку, которая содержит один или оба шаблонных символа в литерале шаблона, вы можете "отменить" символ литерала- то есть отметить его символом, который предшествует специальному отменяемому символу.
Например, скажем, вам нужно использовать оператор LIKE для поиска всех имен системных таблиц. Предположим, что все имена системных таблиц содержат, по меньшей мере, один символ подчеркивания- а это почти правда! Вы решили использовать символ # в качестве символа отмены. Вот что вам нужно сделать:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME LIKE '%#_%' ESCAPE '#';
Поиски LIKE не используют индекс. При этом предикат, использующий LIKE 'ваша строка%', будет преобразован в предикат STARTING WITH, который будет использовать индекс, если тот доступен.
Предикаты STARTING WITH являются чувствительными к регистру. Они используют правила соответствия байтов применяемого набора символов и последовательности сортировки. При необходимости они могут использовать аргумент COLLATION для поиска с применением конкретной последовательности сортировки.
Следующий пример
SELECT LAST_NAME, FIRST_NAME FROM EMPLOYEE
WHERE LAST_NAME STARTING WITH 'Jo';
вернет строки, где фамилиями будут ' Johnson', ' Jones ', ' Joabim' и др.
В базе данных, хранящей в строковых столбцах тексты на немецком языке, где набор символов по умолчанию ISO8859_1, вам может понадобиться преобразовать последовательность сортировки, например:
SELECT FAM_NAME, ERSTE_NAME FROM ARBEITNEHMER
WHERE COLLATE DE_DE FAM_NAME STARTING WITH ' Schmi ' ;
STARTING WITH будет использовать индекс, если он доступен.
Логические операторы
Firebird предоставляет три логических оператора, которые могут работать с другими предикатами разными способами.
* NOT задает отрицание условия поиска, к которому он применяется. Он имеет наивысший приоритет.
* AND создает сложный предикат, объединяет два или более предикатов, каждый из которых должен быть истинным, чтобы был истинным и весь предикат. Он следующий по приоритету.
* OR создает сложный предикат, объединяет два или более предикатов, из которых хотя бы один должен быть истинным, чтобы был истинным весь предикат. Является последним по приоритету. По умолчанию Firebird 1.5 использует сокращенную булеву логику для определения значения предиката OR. Как только один из внутренних предикатов вернет истину, вычисления останавливаются, и весь предикат вернет истину[75].
Вот пример логического предиката:
COLUMN_l = COLUMN_2
OR ( (COLUMN_1 > COLUMN_2 AND COLUMN_3 < COLUMN_1)
AND NOT (COLUMN_4 = CURRENT_DATE) )
Опишем результат такого предиката. Если COLUMN_1 и COLUMN_2 будут равны, то вычисление останавливается, и предикат возвращает истину.
В противном случае проверяется следующий предикат - с двумя вложенными предикатами. Первый вложенный предикат сам имеет два вложенных предиката, оба из которых должны быть истинными, чтобы этот предикат был истинным. Если COLUMN_1 меньше, чем COLUMN_2, то вычисление останавливается, и весь предикат вернет ложь.
Если COLUMN_1 больше, то COLUMN_3 сравнивается с COLUMN_1. Если значение COLUMN_3 больше или равно COLUMN_1, то вычисление останавливается, и весь предикат вернет ложь.
Иначе производится вычисление последнего предиката. Если COLUMN_4 равно текущей дате, то весь предикат вернет ложь, в противном случае он вернет истину.
Включающее ИЛИ в сравнении с исключающимОператор OR В Firebird является включающим ИЛИ (одно условие или все условия должны быть истинными). Исключающее или (которое дает истину, только когда ровно одно условие является истинным, а все остальные ложными) не поддерживается.
Предикат IS [NOT] NULL
IS NULL и его противоположность IS NOT NULL являются парой предикатов, которые не используют группирование. Поскольку NULL не является значением, эти операторы не являются операторами сравнения. Они проверяют утверждение, что объект в левой части имеет значение (IS NOT NULL) или не имеет значения (IS NULL).
Если значение имеется, то IS NOT NULL возвращает истину независимо от содержимого, размера или типа данных значения.
Новички в SQL иногда путают ограничение NOT NULL с предикатами is [NOT] NULL. Общая ошибка считать, что IS NULL и IS NOT NULL проверяют, был ли определен столбец с ограничением NOT NULL. Это не так. Они тестируют текущее содержимое столбца на наличие или отсутствие значения.
Предикат is [NOT] NULL может быть использован для проверки входных данных, помещаемых в столбцы таблиц базы данных, имеющих ограничения NOT NULL. Обычно эти предикаты применяются в триггерах BEFORE INSERT (до добавления).
Более подробную информацию о NULL см. В разд. "Рассмотрение NULL".
Предикаты существования
Последняя группа предикатов включает предикаты, которые используют подзапросы для передачи значений для различного вида утверждений в условиях поиска. Ключевые слова для этих предикатов ALL, ANY, EXISTS, IN, SINGULAR и SOME. Они называются предикатами существования, потому что все они используются в предикатах поиска, которые разными способами проверяют существование значения в левой части предиката в выходных результатах включенных запросов к другим таблицам.
Все эти предикаты- описанные в табл. 21.6- используют в том или ином виде подзапросы. Тема подзапросов подробно рассматривается в главе 22.
Таблица 21.6. Предикаты существования
Предикат
Назначение
ALL

