Оператор SELECT. Выбор данных из таблицы. Псевдонимы столбцов. Удаление повторяющихся строк, страница 15

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. считается ложным, если все результаты запроса не удовлетворяют условию сравнения либо запрос выдал пустой результат.

Ключевое слово ANY эквивалентно оператору IN, но выражение <> ANY не эквивалентно NOT IN. Если результат запроса {знач1, знач2, … }, то NOT IN равносильно условию <> знач1 AND <> знач2…, а выражение <> ANY – <> знач1 OR <> знач2…

Оператор EXIST

Оператор 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;