
- •Лабораторная работа №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.
В PostgreSQL существует четыре фундаментальные SQL-конструкции, требующие четких правил преобразования типов: вызовы функций, применение операторов, присваивание значений при вставке и модифицировании данных, применение конструкций UNION (объединение результатов запросов) и CASE (аналог оператора if..then..else).
В PostgreSQL поддерживаются три варианта синтаксиса явного преобразования (приведения) типов:
для строковых констант
тип 'значение'
'значение'::тип
CAST ('значение' AS тип)
для числових констант
значение: : тип
CAST (значение AS тип)
для полей набора данных, возвращаемых запросом SQL
идентификатор:: тип
CAST (идентификатор AS тип)
Пример:
SELECT ("Остаток"+10)::float * 1.1,
"Цена"::char(8) || char(4) ' UAH', -- конкатенация двух строк
CAST("Цена" AS text)
from "Книги"
Следующий пример демонстрирует использование функций преобразования типов для построения строкового выражения:
SELECT 'От ' || '01/01/2011' || ' до ' || CAST(now() AS varchar(64)) || ' прошло ' || (CAST ( now() AS varchar(64)) :: date - date '01/01/2011') :: text || ' дней'
Возможно также использование преобразования типов в предложении WHERE. Следующий запрос возвратит данные об январских поставках в базе данных BookShop:
SELECT *
FROM "Поставки"
WHERE CAST("Дата" AS varchar) LIKE '%2011-01-%'
Тот же результат получается с помощью стандартной функции extract:
SELECT *
FROM "Поставки"
WHERE extract(month from "Дата") = 1 AND extract(year from "Дата") = 2011
Кроме синтаксических форм преобразования типов существуют некоторые функции, позволяющие добиться практически того же результата. Имена этих функций часто совпадают с именами итоговых типов, например, text() или timeofday().
Задания для самостоятельной работы
Напишите запрос для вывода названия, автора и цену книг из таблицы Книги.
Напишите запрос для вывода всех уникальных имен авторов книг в текущем порядке из таблицы Книги.
Напишите запрос для вывода всех заказов из таблицы Заказы со значениями суммы предоплаты выше 1,000 рублей.
Напишите запрос для вывода всех заказов из таблицы Заказы, для которых сумма предоплаты составляет не менее 30% от стоимости книги.
Напишите запрос к таблице Заказы для вывода всех оплаченных заказов, соответствующих заказчику с именем «Иванов И.».
Напишите запрос для вывода всех строк из таблицы Заказчики, относящихся к заказчикам, проживающим в г.Бресте.
Напишите запрос для вывода кодов всех книг, их цен и кодов поставщиков для книг, поставленных из Москвы.
Что может быть выведено в результате следующего запроса ?
SELECT *
FROM “Книги”
WHERE (“Цена” < 10000 OR NOT (“Автор” IS NULL AND “Остаток” > 50))
Как можно иначе переписать запрос:
SELECT *
FROM ”Заказы”
WHERE (“Дата” > ‘01/01/01’ OR “Дата” < ‘01/03/01)
Напишите запрос для выборки всех заказчиков, чьи имена начинаются с буквы, попадающей в диапазон от A до М.
Напишите запрос для выборки всех книг, в названии которых есть словосочетание «база данных» или «базы данных» или «баз данных».
Напишите запрос для вывода всех поставщиков, данные о которых содержат NULL-значения.
Напишите запрос для подсчета суммы всех заказов на 31 января 2001 года.
Напишите запрос для подсчета числа различных не NULL-значений полей Адрес и Телефон в таблице Поставщики.
Напишите запрос для выборки наименьшей суммы предоплаты для каждого заказчика.
Напишите запрос для выборки заказчиков в алфавитном порядке, чьи имена начинаются с буквы М.
Напишите запрос для подсчета общей суммы заказов за каждый день с 01.02.01 по 01.04.01 .
Напишите запрос к таблице Заказы для определения средней суммы предоплаты за каждый месяц.
Напишите запрос для вывода общей стоимости оплаченных заказов на каждый день в нисходящем порядке.
Напишите запрос для формирования рейтинга авторов в виде упорядоченного по убыванию списка авторов и количества их книг, проданных за некоторый период.