Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
521
Добавлен:
06.03.2016
Размер:
2.95 Mб
Скачать

Отбор данных из нескольких таблиц

Пример 6. Для естественного соединения таблиц явно указываются условия соединения и в силу важности этой операции для нее в реляционной алгебре определено имяJOIN:

SELECT Студент.Фамилия, Обучение.Оценка

FROM Студент, Обучение

WHERE Студент.Код студента=Обучение.Код студента;

Аналогичный запрос на языке QBEприведен на рис. 2.20.

Рис. 2.17. Запрос на языкеQBEдля примера 6

В результате получим новую таблицу, в которой строки с данными о студентах (фамилии) соединены со строками с данными об их оценках.

Замечание. Соединяемые таблицы перечислены в разделе FROMоператора, условие соединения приведено в разделеWHERE. РазделWHERE, помимо условия соединения таблиц, может также содержать и условия отбора строк (например, выбрать только студентов, получивших отличные оценки).

Пример 7. Получить общее количество дисциплин (ключевое словоCOUNT):

SELECT COUNT(*) AS N FROM Дисциплина;

Аналогичный запрос на языке QBEприведен на рис. 2.21.

Рис. 2.18. Запрос на языкеQBEдля примера 7

В результате получим таблицу с одним столбцом и одной строкой, содержащей количество строк из таблицы Дисциплины:

.

Пример 8. Получить максимальный, минимальный и средний балл, полученный студентами (ключевые словаMAX,MIN,AVG):

SELECT

MAX(Обучение.Оценка) AS MX,

MIN(Обучение.Оценка) AS MN,

AVG(Обучение.Оценка) AS AV

FROM Обучение;

Аналогичный запрос на языке QBEприведен на рис. 2.22.

Рис. 2.19. Запрос на языкеQBEдля примера 8

В результате получим следующую таблицу с одной строкой:

Пример 9. Для каждого студента получить средний балл (ключевое словоGROUP BY…):

SELECT

Обучение.Код студента,

AVG(Обучение.Оценка) AS AV GROUP BY Обучение.Код студента;

Аналогичный запрос на языке QBEприведен на рис. 2.23.

Рис. 2.20. Запрос на языкеQBEдля примера 9

Этот запрос будет выполняться следующим образом. Сначала строки исходной таблицы будут сгруппированы так, чтобы в каждую группу попали строки с одинаковыми значениями поля Код студента. Затем внутри каждой группы будет найдено среднее значение поляОценка. От каждой группы в результирующую таблицу будет включена одна строка. Например:

Замечание 1. В списке отбираемых полей оператора SELECT, содержащего разделGROUP BY, можно включать только агрегатные функции и поля, которые входят в условие группировки. Следующий запрос выдаст синтаксическую ошибку:

SELECT Обучение.Код студента, Обучение.Код дисциплины, AVG(Обучение.Оценка) AS AV GROUP BY Обучение.Код студента;

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

Замечание 2. Некоторые диалекты SQL не считают это за ошибку. Запрос будет выполнен, но предсказать, какие значения будут внесены в поле Код дисциплины в результирующей таблице, невозможно.

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