русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Декартово произведение


Дата добавления: 2015-07-09; просмотров: 2952; Нарушение авторских прав


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

Так, запрос вида:

select … from таблица1, таблица2

возвратит количество строк, равное произведению количества строк первой таблицы на количество строк второй таблицы, поскольку склеит каждую строку таблицы1 с каждой строкой таблицы2. Если не выполнять операцию отбора столбцов, в результат войдут все столбцы таблицы1 и таблицы2, т.е. количество столбцов равно сумме количеств столбцов таблицы1 и таблицы2. В общем, размеры таблицы-результата оказываются весьма внушительными.

На практике декартово произведение таблиц используется крайне редко. Например, для нашей демонстрационной базы данных выполнять соединение всех студентов со всеми предметами (т.е. выполнять декартово произведение таблиц students и subjects) разумно только в том случае, если все учатся по единому плану и сдают экзамены по всем предметам, занесенным в таблицу subjects. Соединять всех студентов или все предметы со всеми оценками – вообще полная бессмыслица.

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

На практике декартовы произведения иногда возникают из-за ошибки в записи текста запроса. Основным способом соединения таблиц является операция внутреннего или естественного соединения.



2. Внутреннее (естественное) соединение таблиц

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

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

а) выборка из декартового произведения

Начнем с примеров. Пусть требуется вывести фамилии всех студентов и их оценки. Текст запроса будет выглядеть так:


select students.name_st, marks.mark

from students, marks

where students.cod_st=marks.cod_st

б) операция соединения [inner] join

Тот же самый запрос, соединяющий студентов с их оценками, будет записан несколько по-другому:


select students .name_st, marks.mark

from students join marks

on students.cod_st=marks.cod_st

 

Результаты запросов (а, б) будут абсолютно аналогичны и могут выглядеть примерно так:

name_st mark
Иванов Иванов … Петров Петров Петров…  

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

Обратим внимание на некоторые особенности приведенных выше примеров.

Во-первых, в тексте запросов используются составные имена столбцов, записанные с использованием точечной нотации:

имя_таблицы.имя_столбца

Использование составных имен позволяет избежать неоднозначности в записи имени столбца, поскольку разные таблицы могут содержать одноименные столбцы. В принципе, если имя какого-либо столбца уникально в пределах тех таблиц, которые указаны во фразе FROM, можно ограничиться и простым именем, но использование составных имен везде является более грамотным. Такие запросы и компилируются быстрее.

Во-вторых, в обоих приведенных выше запросах явно задано условие соединения в виде равенства столбцов связи (students.cod_st=marks.cod_st). Казалось бы, можно сократить текст запроса, ведь в таблицах students и marks только один общий столбец cod_st. Однако соединение двух таблиц вовсе не обязательно должно выполняться только по первичному и внешнему ключу. Любые два столбца, совпадающие по типу, могут быть использованы в условии соединения таблиц.

Разумеется, связывать строки, используя неключевые столбцы для связи, нужно с предельной осторожностью. Допустим, запрос, в котором устанавливается связь с помощью условия students.cod_st=marks.cod_sub, будет синтаксически правильным (он даже исполнится и возвратит результаты), но абсолютно бессмысленным. Будьте предельно внимательны при записи условий соединения!



<== предыдущая лекция | следующая лекция ==>
Условия отбора групп | Использование псевдонимов таблиц в запросах с соединением


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 3.409 сек.