Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BakalVoprosy - KC-2010_pre_Answers.doc
Скачиваний:
2
Добавлен:
07.07.2019
Размер:
1.01 Mб
Скачать
  1. Вкладені та корельовані підзапити в мові sql, агрегатні функції та квантори.

Коррелированный подзапрос. В SQL возможно выполнение подзапроса, вычисление которого зависит от текущего значения переменных текущего запроса. Внутренний подзапрос не может быть обработан раз и навсегда, прежде чем будет обрабатываться внешний запрос.

Пример : Получить фамилии студентов, сдавших экзамен с кодом 002

SELECT ФИО

FROM студент

WHERE “002” IN (SELECT код_гр FROM экзамен WHERE ном_зач=студент.ном_зач)

В этом случае происходит следующее: система СУБД выбирает первую строку из "Студент" при этом переменные Студент.номер_зч принимает определенное значение

СУБД обрабатывает внутренний подзапрос и находит список предметов который сдавал этот студент. СУБД завершает обработку первой строки внешнего подзапроса.

СУБД выбирает следующую строку из "Студент" и процесс повторяется

В SQL имеется возможность формировать вложенные запросы (структурирование).

Например, запрос 2 можно реализовать и так:

SELECT наименование предмета

FROM предмет

WHERE код_предм IN (SELECT код_предм FROM экзамен WHERE оценка <4)

При обработке всего запроса система обрабатывает вначале вложенный запрос. В результате образуется множество кодов предметов, по которым оценка <4, затем эти значения служат условием для выбора строк из таблицы предмет.

В SQL допускается любая вложенность запросов, однако конкретная реализация ограничивает вложенность. В подзапросе и во внешнем запросе может использоваться одна и та же таблица.

Оператор SELECT позволяет возращать (агрегированные) характеристики, подсчитанные по всем или указанным записям таблицы.

COUNT, DISTINCT, MIN, MAX, AVG, SUM

SUM(колонка) – сумма значений по столбцу

MAX(колонка)– максимальное значение в столбце

MIN(колонка) - минимальное значение в столбце

AVG(колонка) – среднее значение в столбце

COUNT(колонка) – число значений в столбце, можно указать "*" - любая колонка.

Для исключения дубликатов из результата в SQL используют – DISTINCT(исключение).

Пример: Получить перечень предметов по которым сдавали экзамен в 8 семестре.

Select distinct наименование

From предмет

Where код предмета in (select код предмета

From “экзамен”

Where семестр=8)

КВАНТОР СУЩЕСТВОВАНИЯ EXIST В ЯЗЫКЕ SQL.

В логике предикат с навешенным квантором существования Exist[P(x)] принимает значение ИСТИНА, когда существует такое значение Х, при котором предикат, зависящий от х (Р(х)), принимает значение ИСТИНА.

True, если существует х, P(x) = true

Exist[xP(x)] =

False, если не существует х, P(x) = true

X: 1-10

Exists x (x<5) = True

Exists x (x>20) = False

В SQL предикат с квантором существования представляется:

Select…From…Where

Exists(Select*From…Where),

которое следует за фразой Where.

Такое выражение считается истинным, когда результат вычисления подзапроса представляет собой не пустое множество, т.е. существует хотя бы одна запись, возвращаемая подзапросом. На практике подзапрос всегда будет коррелированным подзапросом.

Пример. Получить фамилии студентов, сдавших экзамен с кодом 002

SELECT №зч,ФИО

FROM студент

WHERE EXISTS (SELECT *

FROM экзамен

WHERE ном_зач=студент,.ном_зач AND код предмета = “002”)

Фактически любой запрос, использующий оператор принадлежности IN, можно записать с помощью EXISTS (но не наоборот).

КВАНТОР ОБЩНОСТИ ALL В ЯЗЫКЕ SQL.

Предикат с навешенным квантором общности FORALL x [P(x)] принимает значение ИСТИНА, когда для любого значения х предикат P(x) принимает значение ИСТИНА.

TRUE, P(x) = TRUE – для любого х

FORALL x [P(x)] =

FALSE, P(x) = TRUE - не для всех х

Х: 1-10

FORALL(x<100) = TRUE

FORALL(x<5) = FALSE

Квантор общности в SQL реализуется с помощью ключевого слова ALL, которое употребляется вместе с оператором сравнения. При этом предикат с ALL принимает значение ИСТИНА, если для всех значений, выбранных в подзапросе, выполняется условие, заданное в предикате внешнего запроса.

Пример. Получить список студентов, получивших стипендию большую, чем любой из студентов группы ОМ-962

SELECT *

FROM студент

WHERE стипендия > ALL (SELECT cтипендия

FROM студент

WHERE код_группы=”ОМ-962”)

Особенность предиката с ALL: в случае отсутствия данных в подзапросе весь предикат принимает значение ИСТИНА и в результат попадают все строки из основной таблицы.

Использование фразы ANY (SOME).

В SQL c операторами сравнеиня >,<,=,>=,<=, можно использовать ключевое слово ANY(SOME). Предикат с ANY принимает значение ИСТИНА, если для какого-нибудь значения, полученного в результате выполнения подзапроса, выполняется условие, заданное в предикате внешнего запроса.

Пример: Получить список студентов института, день рождения которых совпадает с днем рождения хотя бы одного из студентов ОМ-962.

SELECT *

FROM студент

WHERE Д_Р=ANY(SELECT Д_Р

FROM студент

WHERE код_группы=”ОМ-962”

AND код_группы “ОМ-962”)

Для исключения результата, условие во внешнем запросе необходимо дополнить < >”ОМ-962”. Если группа”х.х.х”, т.е. при отсутствии значений в подзапросе предикат с ANY автоматически возвращаетзначение ЛОЖЬ (в результат не попадает ни одна строка из внешнего запроса).

Особенности UNION в SQL

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

Таблицы имеют одинаковое число студентов

i – cтолбец первой таблицы и i – ый столбец второй таблицы имеют одинаковый тип данных.

Пример Получить №зч студентов ,имеющих стипендию > 42гр. или сдавших экзамены в 7-ом семестре.

SELECT №зч “повышенная стипендия”

FROM студент

WHERE стипендия > 40

UNION

SELECT №зч, “Сдал экзамен”

FROM экзамен

WHERE семестр = 7

ORDER BY 1

Основные особенности операции UNION.

  • Дубликаты всегда исключаются из результата

  • С помощью UNION можно объединить любое число предложений SELECT

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

  • Если в запросе требуется упорядочивание, то фраза ORDER BY должна входить только в последнее предложение SELECT, причем в ней необходимо указывать порядковые номера столбцов, а не их названия.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]