|
Программирование >> Формирование связанных подзапросов
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; совпадающие наименования городов будут исключены.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |