Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
work_2.doc
Скачиваний:
9
Добавлен:
09.11.2019
Размер:
291.84 Кб
Скачать
  1. Использование select для соединения двух и более таблиц. Декартово произведение таблиц

Соединения таблиц  это подмножества их декартова произведения. Так как декартово произведение n таблиц  это таблица, содержащая все возможные строки r, такие, что r является сцеплением какой-либо строки из первой таблицы, строки из второй таблицы, ... ,строки из n-й таблицы (с помощью SELECT можно получить любое подмножество реляционной таблицы), то осталось лишь выяснить, можно ли с помощью SELECT получить декартово произведение. Для получения декартова произведения нескольких таблиц надо указать во фразе FROM перечень перемножаемых таблиц, а во фразе SELECT – все их столбцы:

SELECT ”Заказы”.*, “Заказчики”.*

FROM “Заказы”, “Заказчики”

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

Эквисоединение таблиц

Если из декартова произведения убрать ненужные строки и столбцы, то можно получить вполне осмысленный результат, соответствующий любому из соединений. Например, если к предыдущему запросу добавить предложение WHERE:

SELECT “Заказы”.*, “Заказчики”.*

FROM “Заказы”, “Заказчики”

WHERE “Заказы”.”Код_заказчика” = “Заказчики”.”Код_заказчика”

то получим таблицу  эквисоединение двух таблиц, в которой останутся только строки с одинаковыми значениями в столбцах Код_заказчика, но таких столбцов будет два и они будут дублировать друг друга.

Естественное соединение таблиц

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

SELECT “Код_заказа”, “Код_книги”, “ Дата”, “Оплачен”, “Заказчики”.*

FROM “Заказы”, “Заказчики”

WHERE “Заказы”.”Код_заказчика” = “Заказчики”.”Код_заказчика”

Композиция таблиц

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

SELECT “Код_заказа”, “Код_книги”, “Дата”, “Оплачен”, “Имя”, “Адрес”, “Телефон”

FROM “Заказы”, “Заказчики”

WHERE “Заказы”.”Код_заказчика” = “Заказчики”.”Код_заказчика”

При формировании соединения создается рабочая таблица, к которой применимы все операции, рассмотренные ранее: отбор нужных строк соединения (WHERE), упорядочение получаемого результата (ORDER BY) и агрегатирование данных (SQL-функции и GROUP BY). Например, следующий запрос позволит произвести выборку всех оплаченных заказов за период времени между двумя датами, упорядоченных по Код_книги:

SELECT “Код_заказа”, “Код_книги”, “Дата”, “Оплачен”, “Код_заказчика”

FROM “Заказы”, “Заказчики”

WHERE (“Заказы”.”Код_заказчика” = “Заказчики”.”Код_заказчика”)

AND (“Дата” BETWEEN ‘03/01/2001’ AND ‘04/30/2001’)

AND (“Оплачен” LIKE ‘%да%’)

ORDER BY “Код_книги”

Соединение таблицы со своей копией

В ряде приложений возникает необходимость одновременной обработки данных какой-либо таблицы и одной или нескольких ее копий, создаваемых на время выполнения запроса. Например, при добавлении записи в таблицу Заказчики возможен повторный ввод данных о каком-либо заказчике с присвоением ему другого кода. Для выявления таких ошибок можно соединить таблицу Заказчики с ее временной копией, установив в предложении WHERE равенство значений всех одноименных столбцов этих таблиц, кроме столбцов с кодом заказчика (для последних надо установить условие неравенства значений). Временные копии таблицы можно сформировать с помощью псевдонимов, указав их за именем таблицы в предложении FROM. Так, если ввести

FROM “Заказчики” AS A, “Заказчики” AS “B”

или просто

FROM “Заказчики” A, “Заказчики” B

то будут сформированы две копии таблицы Заказчики с именами A, B. Тогда, чтобы узнать, есть ли в базе данных два разных заказчика с одинаковыми телефонами, надо ввести запрос:

SELECT A.*, B.*

FROM “Заказчики” A, “Заказчики” B

WHERE A.”Телефон” = B.”Телефон” AND A.”Код_заказчика” != B.”Код_заказчика”

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