Программирование >>  Формирование связанных подзапросов 

1 2 3 [ 4 ] 5 6 7 ... 15


PROM UNIVERSITY

WHERE CITY = МЬск); 2) SECT *

FROM UNIVERSITY A WHERE NOT EXISTS (LECT * FROM UNIVERSITY В WHERE A.RATING >= B.RATING AND B.CITY = МОсква);

При отсутствии в таблицах NULL оба эти запроса ведут себя совершенно одинаково. Пусть теперь в таблице UNIVERSITY есть строка с NULL-значениями в столбце RATING. В версии запроса с ANY в основном запросе, когда выбирается поле RATING с NULL, предикат принимает значение uNkNOWN и строка не включается в состав вхходнхх даннхх. Во втором же варианте запроса, когда NOT EXISTS выбирает эту строку в основном запросе, NULL-значение используется в предикате подзапроса, присваивая ему значение UNKNOWn. Поэтому в результате выполнения подзапроса не будет получено ни одного значения, и подзапрос примет значение ложь. Это в свою очередь сделает NOT EXISTS истиннхм, и, следовательно, строка с NULL-значением в поле RATING попадет в вхходные данные. По смыслу запроса такой результат является неправильнхм, так как на самом деле рейтинг университета, описываемого данной строкой, может быть и больше рейтинга какого-либо московского университета (он просто неизвестен). Указанная проблема связана с тем, что значение EXISTS всегда принимает значения истина или ложь, и никогда - unknown . Это является доводом для использования в таких случаях оператора ANY вместо EXISTS.

2.14. Использование COUNT вместо EXISTS

При отсутствии NULL-значений оператор EXISTS может быть использован вместо ANY и ALL. Также вместо EXISTS и NOT EXISTS могут быть использованы те же самые подзапросы, но



2.15. Оператор объединения ONION 63

с использованием COUNT(*) в предложении SELECT. Например, запрос

SECCT *

FROM UNIVERSITY A WHERE NOT EXISTS (LECT * FROM UNIVERSITY В WHERE A.RATING > = B.RATING AND B.CITY = Москва); может быть представлен и в следующем виде: SELECT *

FROM UNIVERSITY A WHERE 1 >

(LECT COUNT(*)

FROM UNIVERSITY В

WHERE A.RATING > = B.RATING

AND B.CITY = МЬскв);

Упражнения

1. Напишите запрос, выбирающий данные о названиях университетов, рейтинг которых равен или превосходит рейтинг Воронежского государственного университета.

2. Напишите запрос, использующий ANY или ALL, выполняющий вы-

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

3. Напишите запрос, выбирающий из таблицы EXAMMARKS данные о названиях предметов обучения, для которых значение полученных на экзамене оценок (поле MARK) превышает любое значение оценки для предмета, имеющего идентификатор, равный 105.

4. Напишите этот же запрос с использованием МАХ.

2.15. Оператор объединения UNION

Оператор UNION используется для объединения выходных данньгх двух или более SQL-запросов в единое множество строк



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

SELECT Студент SURNAME, ST0DENT ID

FROM STUDENT

where city = Москва UNION

SELE Преподаватель, SURNAME, LECTURER ID

FROM LECTURER

WHERE CITY = скв;

Обратите внимание на то, что символом ; (точка с запятой) оканчивается только последний запрос. Отсутствие этого символа в конце SELECT-запроса означает, что следующий за ним запрос так же, как и он сам, является частью общего запроса с UNION.

Использование оператора UNION возможно только при объединении запросов, соответствующие столбцы которхх со вместимы по объединению, то есть соответствующие числовые поля должны иметь полностью совпадающие тип и размер, символьные поля должны иметь точно совпадающее количество символов. Если NULL-значения запрещен! для столбца хотя бы одного любого подзапроса объединения, то они должны быть запрещены и для всех соответствующих столбцов в других подзапросах объединения.

2.16. Устранение дублирования в UNION

В отличие от обычных запросов UNION автоматически исключает из выходных данных дубликаты строк, например, в запросе

SECT CITY

FROM STUDENT UNION

SELECT CITY

FROM LECTURER; совпадающие наименования городов будут исключены.



1 2 3 [ 4 ] 5 6 7 ... 15

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика