WHERE city <> ALL (SELECT city FROM publisher);
Аналогичный результат можно получить, заменив сравнение оператором NOT IN.
Пример. Отобразить список книг, которые продаются лучше, чем книги конкретного автора. (запрос Book-Sales#More)
SELECT title_id, title_name
FROM title
WHERE sales > ALL
(SELECT sales
FROM title_authors ta
INNER JOIN title t ON t.title_id = ta.title_id
WHERE ta.au_id ='a06'
AND sales IS NOT NULL);
Выполняется сравнение с продажами книг автора a06. Внутренний запрос применяет внутренне соединение, чтобы можно было выполнить выборку по автору. Не рекомендуется сравнивать со значением NULL, поэтому используется соответствующее условие. В Access значения NULL не учитываются оператором сравнения (см. пример Book-Sales#More#1). Ключевое слово ALL можно заменить функцией MAX (см. пример Book-Sales#More#3).
Ключевое слово ALL применяется в операторах WHERE либо HAVING.
Пример. Отобразить типы книг, максимальный уровень продаж которых выше среднего более чем в два раза. (запрос Sales-Type_Book#More)
SELECT t1.type, MAX(t1.sales) AS MAX_Sale, ROUND(AVG(t1.sales)) AS AVG_sale
FROM title AS t1
GROUP BY t1.type
HAVING MAX(t1.sales) >= ALL
(SELECT 2.0*AVG(t2.sales)
FROM title t2
WHERE t1.type = t2.type);
Используется сложный подзапрос, рассчитывающий средние продажи книг соответствующего типа.
В операторе сравнения можно применять ключевое слово ANY. Выражение имеет вид:
значение_выражения оператор_сравнения ANY (запрос)
Если хотя бы одно значение, выбранное запросом, удовлетворяет условию сравнения, то результат условия считается истинным. Условие, содержащее ANY. считается ложным, если все результаты запроса не удовлетворяют условию сравнения либо запрос выдал пустой результат.
Ключевое слово ANY эквивалентно оператору IN, но выражение <> ANY не эквивалентно NOT IN. Если результат запроса {знач1, знач2, … }, то NOT IN равносильно условию <> знач1 AND <> знач2…, а выражение <> ANY – <> знач1 OR <> знач2…
Оператор EXISTS (NOT EXISTS) проверяет, что результат запроса содержит хотя бы одно значение. Оператор обычно применяется с запросами сложного типа. Если результат запроса – строка с пустыми значениями (NULL), то результат оператора EXISTS – истина (NOT EXISTS – ложь).
Пример. Отобразить список авторов, написавших не менее 3-х книг. (запрос Author-Book#Some)
SELECT a.au_id, a.au_fname, a.au_lname
FROM authors AS a
WHERE EXISTS (SELECT ta.au_id
FROM title_authors ta
WHERE ta.au_id = a.au_id
GROUP BY ta.au_id
HAVING COUNT(*) >=3);
Оператор EXISTS предпочтительнее использовать, чем условие COUN(*) > 0. СУБД перестает обрабатывать оператор EXISTS, когда считывает хотя бы одну строку подзапроса. В случае функции CONT запрос выполняется полностью, поэтому исполняется медленнее.
Контрольное задание. Объяснить смысл и механизм выполнения запроса.
База данных ЖУРНАЛЬНОЕ АГЕНСТВО состоит из 7-х отношений:
1) ЖУРНАЛЫ (Код_журнала, Наименование, Тематика, Код_Целевой_категории, Число_номеров_в_году),
2) ЧИТАТЕЛИ (Код_Целевой_категории, Возраст, Род_занятий, Семейный_статус),
3) АВТОРЫ (Код_Автора, Фамилия, Имя, Отчество, Адрес, Телефон, Код_региона, Дата_рождения),
4) СТАТЬИ (Код_журнала, Номер_выпуска, Код_статьи, Название_статьи),
5) ИЗДАНИЯ (Код_журнала, Номер_выпуска, Тираж, Продажи, Цена_комплекта),
6) РАСЧЕТЫ_АВТОРЫ (Код_статьи, Аванс, Процент_отчислений),
7) ПУБЛИКАЦИИ (Код_статьи, Код_Автора, Номер_в_списке_авторов, Доля_гонорара).
ЗАПРОС:
SELECT TOP 1 MAX(номер_выпуска) AS [Последний номер], наименование
FROM ЖУРНАЛЫ AS жур INNER JOIN ИЗДАНИЯ AS изд ON жур.код_журнала=изд.код_журнала
GROUP BY наименование
ORDER BY 1;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.