
- •Лабораторная работа №2 sql: выборка данных.
- •Знакомство с Query Tool pgAdmin
- •Синтаксис инструкции select.
- •Выборка без использования предложения where. Простая выборка данных
- •Выборка null-значений
- •Выборка c использованием предложения where.
- •Использование between
- •Использование in
- •Использование like
- •Выборка null-значений
- •Ограничение максимального размера выборки
- •Использование данных типа timestamp
- •Выборка с упорядочением
- •Выборка и агрегирование данных.
- •Преобразование типов данных в инструкции select.
- •Задания для самостоятельной работы
- •Использование select для соединения двух и более таблиц. Декартово произведение таблиц
- •Соединение таблицы со своей копией
- •Вложенные подзапросы.
- •Простые вложенные подзапросы
- •Коррелированные вложенные подзапросы
- •Запросы, использующие exists в предложении where
- •Подзапросы c any и all
- •Использование with
- •Объединение двух или более запросов
- •Реализация операций реляционной алгебры c помощью предложения select.
- •Задания для самостоятельной работы
- •Контрольное задание
- •Требования к отчету:
- •Контрольные вопросы:
Использование 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.”Код_заказчика”