- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри
Шрифт:
Интервал:
Закладка:
Об агрегатных запросах см. главу 23.
Потоки и реки для соединенийКогда столбцы одной таблицы связываются со столбцами другой таблицы для формирования соединенных наборов (join), наборы входных столбцов называются потоками. Вывод двух соединенных потоков называется рекой. Когда соединения включают более двух таблиц, потоки и реки становятся входом для дальнейших соединений потоков и рек, пока финальная река не станет выходом для запроса.
Группа подпрограмм ядра Firebird, называемая оптимизатором, проверяет спецификацию запроса соединения и доступные индексы на предмет стоимости обработки запроса. Этот процесс называется оптимизацией. Оптимизатор генерирует план, являющийся "лучшей по стоимости" картой, которую выбирает сервер для генерации финальной "выходной реки" в последующих выполнениях этого оператора.
Синтаксис соединения (JOIN) обсуждается в главе 22. См. разд. "Тема оптимизации" главы 22, где обсуждается оптимизатор и планы запроса.
Наборы курсора
Оператор SELECT может объявлять набор, который вовсе не является выходным для клиента, но остается на сервере, чтобы работать как курсор на стороне сервера. Сам курсор является указателем; приложение дает ему указание по запросу читать по порядку строки одну за другой на основании подготовленного (prepared) оператора SELECT.
Объявление именованного курсора, который должен быть вначале скомпилирован в ESQL или задан в структуре API в DSQL, включает переменную оператора клиентской стороны, которая указывает на этот оператор. Клиентское приложение является ответственным за то, что подготовленный оператор доступен для назначения соответствующему указателю при выполнении программы.
PSQL имеет языковое расширение, которое принимает следующую форму:
FOR SELECT <любая допустимая спецификация выборки>
INTO <список предварительно объявленных локальных переменных> DO
BEGIN
Необязательные действия над переменными>;
SUSPEND;
END
Это синтаксис неименованного курсора[65].
Целью операций с курсором является использование данных из набора курсора и последовательное "действие" с каждой строкой набора курсора. Это может быть эффективным для наборов пакетных процессов, где выполняется одна или более задач над текущей строкой курсора в рамках одной итерации в цикле над набором курсора. Например, в каждой итерации элемент данных должен быть получен из текущей строки набора курсора и использован для добавления новой строки в указанный входной набор.
Другой оператор может быть связан с открытым курсором при использовании WHERE CURRENT OF <имя-курсора> вместо условия поиска для выполнения позиционированного изменения или удаления строк, "отмеченных" набором курсора.
Реализация курсоровFirebird предоставляет несколько методов для реализации курсоров.
* Встраиваемый SQL (ESQL) предоставляет оператор DECLARE CURSOR[66] для реализации предварительно компилированного объявления именованного курсора.
* Для использования курсора динамическое приложение должно предварительно объявить его в функции isc_dsqi_set_cursor_name[67]. Только некоторые компоненты реализуют такой интерфейс, большинство других - нет.
* Язык PSQL предоставляет синтаксис для работы с именованными и неименованными курсорами локально внутри хранимой процедуры или триггера. Подробную информацию см. в главе 29.
! ! !
ПРИМЕЧАНИЕ. За исключением техник работы с курсорами в PSQL сами курсоры выходят за пределы темы настоящей книги. Подробную информацию см. в главе 30.
. ! .
Вложенные наборы
Вложенные наборы формируются с использованием синтаксиса специального вида выражений SQL, называемых подзапросами. Этот вид выражений принимает форму вложенного оператора SELECT, который может быть включен в список спецификаций столбцов главного запроса для получения одного значения строки, или в предложение WHERE как часть условия поиска. Допустимый синтаксис SELECT изменяется в зависимости от контекста, в котором используется подзапрос.
В следующем простом примере запрос к таблице TABLEA использует вложенный подзапрос для включения в выходной набор на время выполнения столбца с именем DESCRIPTION, наследующего значение из столбца COLA таблицы TABLEB:
SELECT COL1, COL2, COL3,
(SELECT COLA FROM TABLEB WHERE COLX='Espagnol')
AS DESCRIPTION
FROM TABLEA
WHERE ... ;
Обратите внимание на использование ключевого слова AS для присваивания имени (DESCRIPTION) наследуемому столбцу. Это делать необязательно, но рекомендуется для ясности кода.
Очень часто включенный запрос является коррелированным с главным запросом. Коррелированный запрос - это запрос, чье предложение WHERE связано с одним или более значениями выходного списка внешнего запроса или с другими значениями таблиц из внешнего запроса. Коррелированный подзапрос похож по своему действию на INNER JOIN и иногда может быть использован для повышения производительности вместо JOIN.
Темы подзапросов подробно обсуждаются в следующих двух главах, особенно в главе 22.
Привилегии
Чтение из таблиц и запись в таблицы являются привилегиями базы данных, управляемыми объявлениями, выполненными с помощью операторов GRANT и REVOKE (см. главу 35).
Оператор SELECT
Оператор SELECT является для клиентов фундаментальным методом поиска наборов данных в базе данных. Он имеет следующую основную форму:
SELECT
[FIRST (m)] [SKIP (n)] [[ALL] | DISTINCT]
<список-столбцов> [, [имя-столбца] | выражение | константа ]
AS имя-алиаса]
FROM <таблица-или-процедура-или-просмотр>
[{[[INNER] | [{LEFT | RIGHT | FULL} [OUTER]] JOIN}]
<таблица-или-процедура-или-просмотр>
ON <условия-соединения> [{JOIN...}]
[WHERE <условия-поиска>]
[GROUP BY <список-группируемых-столбцов>]
[HAVING <предикат-группирования>]
[UNION <выражение-выбора> [ALL]]
[PLAN <выражение-плана>]
[ORDER BY <список-столбцов>]
[FOR UPDATE [OF столбец1 [, столбец2...]] [WITH LOCK]]
Предложения в операторе SELECT
В следующих подразделах мы предварительно рассмотрим каждое доступное в операторе SELECT предложение. Большинство предложений является необязательным, при этом важно их использование в правильном порядке.
Необязательные режимы выборкиЗа ключевым словом SELECT может следовать режим выборки для управления включением строк в выходной набор, когда они соответствуют всем другим условиям.
ALLЭто значение по умолчанию режима выборки для выходного списка и обычно опускается. Оно возвращает все строки, соответствующие условиям в спецификации.
DISTINCTЭтот режим выборки подавляет вывод всех дубликатов строк в выходной набор. Например, таблица EMPLOYEE_PROJECT хранит пересекающиеся записи для каждой комбинации служащего (EMP_NO) и проекта (PROJ_ID), поддерживая отношение многие-ко- многим. Конкатенация EMP NO + PROJ_ID образует первичный ключ. Оператор
SELECT DISTINCT EMP_NO, PROJ_ID FROM EMPLOYEE_PROJECT;
вернет 28 строк - т. е. все строки, это является тем же самым, что и SELECT [ALL], потому что каждое появление (EMP_NO + PROJ_ID) является по своей природе уникальным, отличным от других.
Операторы
SELECT DISTINCT EMP_NO FROM EMPLOYEE_PROJECT;
и
SELECT DISTINCT PROJ_ID FROM EMPLOYEE_PROJECT;
вернут, соответственно, 22 и 5 строк.
Вычисление отличий применяется ко всем выходным столбцам, что делает оператор DISTINCT полезным в некоторых запросах, которые используют соединения для получения ненормализованного набора. Тщательно тестируйте этот режим для проверки, что он создает тот результат, который вы ожидаете[68].
FIRST(m) SKIP(n)Необязательные ключевые слова FIRST(m) и/или SKIP(n), если присутствуют, предшествуют всем другим спецификациям. Они задают режим выбора первых m строк в упорядоченном наборе и игнорирования первых n строк в упорядоченном наборе, соответственно. Не имеет смысла использовать эту конструкцию в неупорядоченном наборе[69]. Очевидно, нужно предложение ORDER BY для использования условия упорядочения, которое сделает осмысленным выбор кандидатов строк.
Эти два ключевых слова могут быть использованы вместе или индивидуально. Аргументы m и n должны быть целыми или выражениями, дающими целые числа. Круглые скобки вокруг значений тип требуются для выражений и не обязательны для простых целых аргументов.
Поскольку FIRST и SKIP выполняются над набором, полученным на основании остальной части спецификации, не следует ожидать, что они сделают выполнение запроса более быстрым. Преимущества в производительности получаются от сокращения сетевого трафика[70].
Следующий пример вернет пять строк, начиная со строки 101 упорядоченного набора:
SELECT FIRST 5 SKIP 100 MEMBER_ID, MEMBERSHIP_TYPE, JOIN_DATE
FROM MEMBERS
ORDER BY JOIN DATE;
! ! !
СОВЕТ. Для получения n строк с самыми большими значениями столбцов в соответствии с условиями упорядочения установите порядок сортировки DESC[ENDING].

