Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Банки и базы данных.doc
Скачиваний:
20
Добавлен:
25.09.2019
Размер:
656.9 Кб
Скачать

13.8.5. Многократное сравнение (any, all)

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

Синтаксис:

<выражение> <операция сравнения> ANY|ALL (<вложенный запрос>)

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

Проверка ANY возвращает TRUE (Истина), если любое (хотя бы одно) из этих сравнений дает результат TRUE.

Проверка ALL возвращает TRUE (Истина), если все сравнения дают результат TRUE.

Пример 50. Вывести список групп, количество контактов в которых не самое большое.

SELECT G.NAZV, COUNT(*)

FROM GRUPPY G, KONT_GR KG

WHERE G.ID=KG.GR_ID

GROUP BY G.ID, G.NAZV

HAVING COUNT(*) < ANY (SELECT COUNT(*) FROM KONT_GR GROUP BY GR_ID)

Пример 51. Вывести список групп, количество контактов в которых самое большое.

SELECT G.NAZV, COUNT(*)

FROM GRUPPY G, KONT_GR KG

WHERE G.ID=KG.GR_ID

GROUP BY G.ID, G.NAZV

HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM KONT_GR GROUP BY GR_ID)

Вариант без многократного сравнения:

SELECT G.NAZV, COUNT(*)

FROM GRUPPY G, KONT_GR KG

WHERE G.ID=KG.GR_ID

GROUP BY G.ID, G.NAZV

HAVING COUNT(*) = (SELECT MAX(KOLVO)

FROM (SELECT COUNT(*) AS KOLVO

FROM KONT_GR

GROUP BY GR_ID))

Пример 52. Вывести тип вызова, зафиксированный с наибольшим количеством контактов.

Не работает в Microsoft Access:

SELECT T.NAZV, COUNT(DISTINCT N.KONT_ID)

FROM TIPY_VYZ T, VYZOVY V, NOMERA N

WHERE (T.ID=V.TIP_ID) AND (V.NOMER_ID=N.ID)

GROUP BY T.ID, T.NAZV

HAVING COUNT(DISTINCT N.KONT_ID)>=ALL

(SELECT COUNT(DISTINCT N1.KONT_ID)

FROM VYZOVY V1, NOMERA N1

WHERE V1.NOMER_ID=N1.ID

GROUP BY V1.TIP_ID)

Работает в Microsoft Access:

SELECT Q.NAZV, COUNT(*)

FROM ( SELECT DISTINCT T.NAZV, N.KONT_ID

FROM TIPY_VYZ T, VYZOVY V, NOMERA N

WHERE (T.ID=V.TIP_ID) AND (V.NOMER_ID=N.ID)) AS Q

GROUP BY Q.NAZV

HAVING COUNT(*) >= ALL

(SELECT COUNT(*)

FROM (SELECT DISTINCT V1.TIP_ID, N1.KONT_ID

FROM VYZOVY V1, NOMERA N1

WHERE V1.NOMER_ID=N1.ID) AS Q1

GROUP BY Q1.TIP_ID)

13.9. Объединение результатов нескольких запросов

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

Рис. 13.2. Синтаксическая диаграмма объединения результатов запросов

Как видно из представленной синтаксической диаграммы, количество объединяемых запросов не ограничено. Если в операции объединения указано слово ALL, то в таблицу результатов включаются все копии абсолютно одинаковых строк, возвращенных объединяемыми запросами. Если же слово ALL не указано, копии строк удаляются.

Объединяемые запросы должны подчиняться следующим правилам:

- количество столбцов, возвращаемых предложениями SELECT объединяемых запросов должно быть одинаковым;

- возвращаемые столбцы, расположенные на одинаковых позициях в предложениях SELECT объединяемых запросов, должны иметь совместимые типы данных;

- предложение ORDER BY может быть записано только после последнего из объединяемых запросов и может содержать в качестве столбцов сортировки только порядковые номера столбцов и ключевое слово DESC.

Пример 53. Вывести список мелодий, уже назначенных какому-либо контакту или группе.

SELECT M.NAZV

FROM MELODII M, GRUPPY G

WHERE G.MEL_ID=M.ID

UNION

SELECT M.NAZV

FROM MELODII M, KONTAKTY K

WHERE K.MEL_ID=M.ID

58