- •Лабораторная работа №2 sql: выборка данных.
- •Знакомство с Query Tool pgAdmin
- •Синтаксис инструкции select.
- •Выборка без использования предложения where. Простая выборка данных
- •Выборка null-значений
- •Выборка null-значений
- •Выборка c использованием предложения where.
- •Использование between
- •Использование in
- •Использование like
- •Ограничение максимального размера выборки
- •Использование данных типа timestamp
- •Выборка с упорядочением
- •Выборка и агрегирование данных.
- •Преобразование типов данных в инструкции select.
- •Задания для самостоятельной работы
- •Использование select для соединения двух и более таблиц. Декартово произведение таблиц
- •Соединение таблицы со своей копией
- •Вложенные подзапросы.
- •Простые вложенные подзапросы
- •Коррелированные вложенные подзапросы
- •Запросы, использующие exists в предложении where
- •Подзапросы c any и all
- •Использование with
- •Объединение двух или более запросов
- •Реализация операций реляционной алгебры c помощью предложения select.
- •Задания для самостоятельной работы
- •Контрольное задание
- •Требования к отчету:
- •Контрольные вопросы:
Реализация операций реляционной алгебры c помощью предложения select.
С помощью инструкции SELECT можно реализовать любую операцию реляционной алгебры:
Селекция (горизонтальное подмножество) таблицы создается из тех ее строк, которые удовлетворяют заданным условиям, например:
SELECT *
FROM ”Книги”
WHERE “Издательство” = 'BHV' AND “Остаток” > 0
Проекция (вертикальное подмножество) таблицы создается из указанных ее столбцов (в заданном порядке) с последующим исключением избыточных дубликатов строк, например:
SELECT DISTINCT “Автор”, “Название”,” Издательство”, “Цена”
FROM “Книги”
Объединение двух таблиц содержит те строки, которые есть либо в первой, либо во второй, либо в обеих таблицах, например:
SELECT “Автор”, “Название”,” Издательство”, “Цена”
FROM “Книги”
WHERE “Название” LIKE ‘%SQL%’'
UNION
SELECT “Автор”, “Название”,” Издательство”, “Цена”
FROM “Книги”
WHERE “Цена” BETWEEN 10 AND 100
Исходные отношения или их объединяемые проекции должны быть совместимыми по объединению. Для SQL это означает, что две таблицы можно объединять тогда и только тогда, когда они имеют одинаковое число столбцов, например, m и для всех i (i = 1, 2, ..., m) i-й столбец первой таблицы и i-й столбец второй таблицы имеют в точности одинаковый тип данных.
Пересечение двух таблиц содержит только те строки, которые есть и в первой, и во второй, например:
WITH _table_1 AS (
SELECT “Код_заказчика”
FROM “Заказчики”)
WITH _table_2 AS (
SELECT “Код_заказчика”
FROM “Заказы”)
SELECT *
FROM _table_1
WHERE “Код_заказчика” IN (SELECT*FROM _table_2)
Разность двух таблиц содержит только те строки, которые есть в первой, но отсутствуют во второй, например:
WITH _table_1 AS (
SELECT “Код_заказчика”
FROM “Заказчики”)
WITH _table_2 AS (
SELECT “Код_заказчика”
FROM “Заказы”)
SELECT *
FROM _table_1
WHERE “Код_заказчика” NOT IN (SELECT * FROM _table_2)
Задания для самостоятельной работы
Напишите запрос, который бы выводил все заказы с величиной предоплаты выше средней. Выведите код заказа, дату, имя заказчика и величину предоплаты.
Напишите запрос, который вычислил бы суммарные остатки количества книг, поставленных каждым поставщиком. Выведите код поставщика, количество видов книг и суммарный остаток.
Напишите запрос, который бы вывел все заказы, сделанные за первый квартал 2001 года заказчиками из г. Бреста, и подсчитал количество оплаченных и неоплаченных заказов.
Напишите запрос, который вывел бы имена всех заказчиков, проживающих в том же городе, что и заказчик, имеющий на данный момент времени максимальную сумму всех оплаченных заказов.
Напишите запрос для получения списка книг, цены которых превысят 10000 руб. в случае повышения цен на 12%.
Напишите запрос, который бы выбрал общую сумму всех приобретений для каждого заказчика, у которого эта общая сумма больше средней по всем заказчикам.
Напишите запрос с использованием коррелированного подзапроса для выборки имен и кодов всех заказчиков, у которых наибольшая общая стоимость приобретенных книг среди заказчиков, проживающих в данном городе.
Напишите два запроса которые выберут всех заказчиков (по их имени и коду), для которых есть поставщики приобретенных ими книг, проживающие в тех же городах, что и заказчики. Один запрос – с использованием естественного соединения, а другой – с коррелированным подзапросом.
Напишите запрос для выборки данных о книгах, которые в данный момент заказаны по крайней мере одним заказчиком, а также тех книг, которые к данному моменту времени ни разу не были заказаны.
Напишите запрос, использующий ANY или ALL, который бы находил всех заказчиков, которые не оплатили ни одного заказа.
Создайте объединение из двух запросов, которое вывело бы коды и имена всех заказчиков. Те из них, для которых суммы приобретенных книг выше средней, должны, кроме того, иметь комментарий "Высокий Рейтинг", а остальные – " Низкий Рейтинг ".
