Чтение онлайн

на главную - закладки

Жанры

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:

В этой главе мы рассмотрим три метода динамического поиска данных в нескольких таблицах [77] в контексте одного оператора и одной базы данных: соединения, подзапросы и объединения.

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

77

Программная логика в комбинации с техниками DSQL, описываемые

в данной главе, могут быть использованы в модулях PSQL, которые возвращают клиентам виртуальные таблицы, а также в других модулях PSQL. См. часть VII. Просмотры, рассматриваемые в главе 24, обеспечивают другие способы получения наборов данных из нескольких таблиц.

Виды многотабличных запросов

Три метода поиска данных во множестве таблиц довольно сильно отличаются друг от друга и, как правило, выполняют различные виды поисковых задач. Поскольку соединения и подзапросы используют слияние потоков данных из строк различных таблиц, их роли частично совпадают при некоторых условиях. Коррелированный подзапрос, который может создавать относительные связи между колонками главной таблицы, иногда может содержать спецификации для получения того же результата, что и соединение, без использования самого соединения. С другой стороны, объединения запросов не используют слияние потоков; напротив, они "собирают" строки. Их роль никогда не совпадает с ролью запросов соединения или подзапросов.

Соединения, подзапросы и объединения не являются взаимоисключающими, несмотря на то, что результат объединения не может быть соединен один с другим или с другими результатами. Спецификации соединения и объединения могут включать подзапросы, и некоторые подзапросы могут содержать соединения.

Соединения

Соединение является одним из наиболее мощных средств реляционной базы данных по причине его способности поиска абстрактных нормализованных данных в хранилище и в контексте передачи приложениям ненормализованных наборов данных. В операторах JOIN две или более связанные таблицы комбинируются для связывания соответствующих колонок из каждой таблицы. С помощью этих связей генерируется виртуальная таблица, которая содержит колонки из всех этих таблиц.

Операции соединения создают наборы данных только для чтения, для которых не могут применяться операции INSERT, UPDATE или DELETE. Интерфейс некоторых приложений содержит средства, позволяющие сделать поведение соединенных наборов данных таким, как если бы они были изменяемыми.

Подзапросы

Подзапросом является оператор SELECT, включенный в другой запрос. Внедренный запрос, встроенный запрос, вложенный запрос являются синонимами для подзапроса. Подзапросы используются с различными условиями для чтения данных из других таблиц в основной (внешний для подзапроса) запрос. Правила составления подзапросов изменяются в соответствии с целью подзапроса. Прочитанные данные всегда являются данными только для чтения.

Запросы UNION

Запросы объединения дают возможность выбрать строки соответствующих форматов из различных наборов данных в объединенный набор данных, который приложения могут использовать так, как если бы он был одной таблицей только для чтения. Подмножества, найденные в таблицах, не обязательно должны быть связаны друг с другом - просто они должны соответствовать друг другу структурно.

Соединения

Соединение используется в операторах SELECT для генерации ненормализованных наборов, содержащих столбцы из нескольких таблиц, которые хранят связанные данные. Множества столбцов, выбранных из каждой таблицы, называются потоками. Процесс соединения объединяет выбранные столбцы в единый выходной набор данных. Простейшим случаем является соединение двух таблиц, которые связаны

соответствием элементов ключа, встречающихся в обеих таблицах.

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

Тем не менее условия соединения не ограничены столбцами первичного и внешнего ключей; сервер допускает в выходном наборе данных дубликаты строк. Дублированные строки могут стать причиной нежелательного результата. По этому вопросу обратитесь к замечаниям в разд. "Темы оптимизации".

Внутреннее соединение

Следующий оператор соединяет две таблицы, которые связаны через внешний ключ FK правой таблицы (Table2) и первичный ключ PK таблицы Table1:

SELECT

Таblе1.PK,

Table1.COL1,

Table2.PKX,

Table2.COLX

FROM Table1 INNER JOIN Table2

ON Table1.PK = Table2.FK

WHERE... условия-поиска

Это спецификация внутреннего соединения. Вскоре мы рассмотрим внешнее соединение. На рис. 22.1 показаны два потока, как они существуют в таблицах, и генерируемый набор данных.

Рис. 22.1. Внутреннее соединение

Как показывает диаграмма, внутреннее соединение объединяет два потока таким образом, что несоответствующие строки в любом из потоков отбрасываются. Другое название внутреннего соединения - исключающее соединение, поскольку его правила означают, что несоответствующие пары обоих потоков исключаются из выходного набора данных.

Стандарты SQL описывают два варианта синтаксиса внутреннего соединения. Предыдущий пример использует более современный синтаксис SQL-92, отличающийся от более старого, более ограниченного SQL-89, указывая явное соединение, потому что в примере используется явное предложение JOIN для задания условий соединения.

Синтаксис неявного INNER JOIN в SQL-89

В стандарте SQL-89 таблицы, участвующие в соединении, задаются списком с разделяющими запятыми в предложении FROM запроса SELECT. Условия для связи таблиц задаются среди условий поиска предложения WHERE. Не существует специального синтаксиса для указания, какие условия используются для поиска, а какие - для соединения. Предполагается, что условия соединения самоочевидны. Обратившись назад, к введению в предложение JOIN, можно назвать старый синтаксис неявным соединением.

Синтаксис неявного соединения может осуществлять только внутреннее соединение - реализация SQL, которая не поддерживает предложение JOIN, не может выполнять внешнее соединение.

Вот предыдущий пример, который переписан как неявное соединение:

SELECT

Table1.PK,

Table1.COL1,

Table2.PKX,

Table2.COLX

FROM Table1, Table2

WHERE Table1.PK = Table2.FK

AND <условия-поиска>

Неявное соединение поддерживается в Firebird для совместимости с кодом существующих приложений. Оно не рекомендуется для новых приложений, потому что оно несовместимо с синтаксисом других видов соединений и делает поддержку и само- документируемость довольно неуклюжей. Некоторые программы доступа к данным, включая драйверы, могут не обрабатывать правильно синтаксис SQL-89 по причине проблем при синтаксическом анализе в различении условий соединения и условий поиска. Можно предположить, что в будущем стандарте этот синтаксис будет отсутствовать.

Поделиться:
Популярные книги

Бастард Императора. Том 3

Орлов Андрей Юрьевич
3. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 3

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Адвокат Империи 2

Карелин Сергей Витальевич
2. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 2

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10

Котенок. Книга 3

Федин Андрей Анатольевич
3. Котенок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Котенок. Книга 3

Империя Хоста 3

Дмитрий
3. Империя Хоста
Фантастика:
боевая фантастика
попаданцы
5.50
рейтинг книги
Империя Хоста 3

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Вадбольский

Никитин Юрий Александрович
1. Вадбольский
Фантастика:
попаданцы
5.00
рейтинг книги
Вадбольский

Воспитание бабочек

Карризи Донато
Детективы:
триллеры
прочие детективы
5.00
рейтинг книги
Воспитание бабочек

Никчёмная Наследница

Кат Зозо
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Никчёмная Наследница

Имперский Курьер. Том 3

Бо Вова
3. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 3