Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Для Белаш / Лекции / 5 - Языки манипулирования реляционными данными.doc
Скачиваний:
0
Добавлен:
07.08.2024
Размер:
273.41 Кб
Скачать

3). Подчиненные запросы.

  • Создаются путем включения одного запроса в другой запрос.

(Будут рассмотрены позже).

4). Запросы объединения.

  • Осуществляется поочередное выполнение двух и более запросов и объединение их результатов с помощью предложения UNION.

Пример: Вывести номера всех планировавшихся рейсов и плановую дату их вылетов, а также вылетов, на которые продавались билеты.

SELECT [Номер рейса], [Плановая дата]

FROM Вылет

UNION

SELECT [Номер рейса], [Дата вылета]

FROM Пассажир

Замечания:

1). Число полей и их типы данных в предложениях SELECT должны совпадать.

2). При использовании UNION повторяющихся записей нет. Чтобы возвращались все записи, надо использовать UNION ALL.

3). В конце каждого запроса, входящего в запрос объединения, можно включать предложения WHERE.

4). Предложение ORDER BY можно включить только в конце последнего запроса.

Вычисляемые поля.

Предложение SELECT может содержать не только поля из таблиц, но и вычисляемые поля.

Вычисляемые поля позволяют:

  • комбинировать значения в текстовых полях;

  • рассчитывать числовые значения и даты;

  • рассчитывать значения итоговых полей с помощью групповых функций;

  • создавать подчиненные запросы.

1). Комбинирование значений в текстовых полях.

Пример: Вывести расписание рейсов, соединив в одно поле поля Время вылета и Время прибытия.

SELECT [Номер рейса], [Пункт назначения], [Время вылета] & “ - “ & [Время прибытия] AS Время

FROM Рейс

Ответ:

Номер рейса

Пункт назначения

Время

12345

Москва

10:13 – 12:55

……..

……..

………

2). Расчет числовых значений и дат.

Пример: На сколько дней опоздал каждый вылет?

SELECT [Номер рейса], [Плановая дата], [Реальная дата] - [Плановая дата] AS [Опоздание (в днях)]

FROM Вылет

Замечания:

1). Ввод данных в вычисляемые поля или их изменение в результирующем наборе невозможны.

2). При изменении значений полей, используемых в выражении, значение вычисляемого поля обновляется автоматически.

3). Вычисление итоговых значений.

А). Вычисление итогов для всех записей.

  • К полю, по которому производится вычисление, применяется групповая (итоговая) функция.

Типы групповых функций:

  • Sum – сумма значений поля.

  • Avg – среднее от значений поля.

  • Min – наименьшее значение поля.

  • Max – наибольшее значение поля.

  • Count – количество значений поля.

Пример: Определить количество рейсов авиакомпании.

SELECT Count ([Номер рейса]) AS [Число рейсов]

FROM Вылет

Ответ:

Число рейсов

5

Замечание:

1). Вместо Count ([Номер рейса]) можно было указать Count (*).

2). Если не переименовывать поле, к которому применена групповая функция, то ему будет дано стандартное имя, которое зависит от реализации в конкретной СУБД.

В одном запросе можно применить несколько групповых функций для различных полей.

Пример: Определить количество рейсов авиакомпании и общее число мест.

SELECT Count ([Номер рейса]) AS [Число рейсов],

Sum ([Число мест] AS [Общее число мест]

FROM Вылет

Ответ:

Число рейсов

Общее число мест

5

495

Возможно совместное использование групповых функций для одного поля.

Пример: Определить диапазон числа мест в самолетах авиакомпании.

SELECT Min ([Число мест]) & “ – “ & Max ([Число мест]) AS [Диапазон мест]

FROM Рейс

Ответ:

Диапазон мест

60 - 120

Б). Вычисление итогов по группам записей.

GROUP BY – выполняет группировку записей.

– указывает поле, по которому должны объединяться записи с одинаковыми значениями в этом поле;

– для каждой такой записи вычисляется итоговое значение с помощью групповой функции.

Пример: Определить количество плановых вылетов для каждого рейса.

SELECT [Номер рейса], Count ([Плановая дата]) AS [Количество вылетов]

FROM Вылет

GROUP BY [Номер рейса]

Ответ:

Номер рейса

Количество вылетов

12345

3

67890

2

77777

2

89898

1

Замечание:

1). При использовании GROUP BY все поля в предложении SELECT должны быть либо включены в предложение GROUP BY, либо использоваться в качестве аргументов групповой функции.

Пример: Определить количество пассажиров и среднюю цену билетов на каждый из вылетов.

SELECT [Номер рейса], [Дата вылета],

Count ([Паспортные данные]) AS [Число пассажиров],

Avg ([Цена билета]) AS [Средняя цена билета]

FROM пассажир

GROUP BY [Номер рейса], [Дата вылета]

Если убрать группировку по дате вылета, то будет число пассажиров и средняя цена билетов на каждый тип рейса.

Задание условий отбора при расчете итоговых полей.

А). Ограничение числа выводящихся групп.

HAVING – отбор уже сгруппированных записей;

– условие отбора задается для поля, по которому производится группировка.

Пример: Каково общее число мест рейсов в Москву и в Киев?

Ответ:

Пункт назначения

Общее число мест

Киев

100

Москва

160

SELECT [Пункт назначения], Sum ([Число мест]) AS [Общее число мест]

FROM Рейс

GROUP BY [Пункт назначения]

HAVING [Пункт назначения] = ‘Москва’ OR [Пункт назначения] = ‘Киев’

Б). Ограничение числа записей перед выполнением группирования.

  • Условие отбора задается в предложении WHERE.

SELECT [Пункт назначения], Sum ([Число мест]) AS [Общее число мест]

FROM Рейс

WHERE [Пункт назначения] = ‘Москва’ OR [Пункт назначения] = ‘Киев’

GROUP BY [Пункт назначения]

WHERE – для отбора записей перед группированием.

HAVING – для отбора записей после группирования.

Ответ может различаться в случаях использования WHERE и HAVING.

В). Отбор итоговых значений, удовлетворяющих определенным условиям.

  • Условие отбора формируется для того поля, по которому применяется групповая функция.

Пример: Вывести города, в которые потенциальное число перевозимых пассажиров не ниже 120.

Ответ:

Пункт назначения

Общее число мест не ниже 120

Владивосток

120

Москва

160

SELECT [Пункт назначения], Sum ([Число мест]) AS [Общее число мест не ниже 120]

FROM Рейс

GROUP BY [Пункт назначения]

HAVING Sum ([Число мест]) >=120

Замечание:

1). Если бы условие отбора по числу мест было выполнено до группирования (с помощью WHERE), то ответом было бы: Владивосток, 120.