- •4. Операции над отношениями
- •Выполнение операций над отношениями
- •4.1 Реляционная алгебра
- •Примеры операций реляционной алгебры над отношениями (Рис.4.1)
- •На этом рисунке: а)исходные отношения; б) объединение отношений
- •Где а и в – атрибуты (имена атрибутов) , а .
- •5. Реляционные языки запросов
- •5.1. Язык sql (Structured Query Language)
- •5.2. Операторы манипулирования данными
- •5.3 Выборки
- •Результат: номер поставщикасостояние
- •Результат: номер_деталивес
- •Р6 Шайба Красный 19 Липецк
- •5.4 3Апросы, использующие соединения
- •5.5. Подзапросы
- •Подзапросы с несколькими уровнями вложения Пример 5.16. Выдать имена поставщиков, поставляющих красные детали:
- •5.7. Коррелированный подзапрос.
- •5.8. Квантор существования. Запрос, использующий exists
- •5.9. Стандартные функции
- •5.10. Использование группировок (group by)
- •5.11. Объединение с использованием union
- •5.12. Операции обновления
- •5.13. Встроенный язык sql
- •Динамический sql
- •Вопросы
- •Для чего используется язык sql.
5.8. Квантор существования. Запрос, использующий exists
Пример 5.21. Выдать фамилии поставщиков, которые поставляют деталь Р2:
SELECT ИМЯ
FROM S
WHERE EXISTS
(SELECT *
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = S.НОМЕР_ПОСТАВЩИКА AND НОМЕР_ДЕТАЛИ='Р2')
EXISTS (существует) представляет здесь квантор существования - понятие, заимствованное из формальной логики.
Квантор существования EXISTS (SELECT* FROM… WHERE….) принимает значение истина, если подзапрос выдает непустое множество и наоборот.
Пример 5.22. Запрос, использующий NOT EXISTS. Выдать имена поставщиков, которые не поставляют деталь Р2:
SELECT ИМЯ
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = S.НОМЕР_ПОСТАВЩИКА AND НОМЕР_ДЕТАЛИ = 'P2')
NOT EXISTS (SELECT* FROM… WHERE….)
принимает значение истина, если подзапрос выдает пустое множество и наоборот.
5.9. Стандартные функции
В запросах могут использоваться следующие стандартные функции: COUNT число значений в столбце; SUM сумма значений какого-либо столбца; AVG среднее значение; MAX самое большое значение в столбце; MIN самое малое значение в столбце.
Пример 5.23. Выдать общее количество поставщиков:
SELECT СOUNT (*)
FROM S
Результат: 5
Пример 5.24. Выдать общее количество поставляемых деталей P2:
SELECT SUМ (Количество)
FROM SP
WHERE НОМЕР_ДЕТАЛИ = ‘P2’
Результат: 1000
Пример 5.25 . Функция в подзапросе. Выдать номера поставщиков со значением поля СОСТОЯНИЕ меньшим, чем текущее максимальное состояние в таблице S:
SELECT НОМЕР_ПОСТАВЩИКА
FROM S
WHERE СОСТОЯНИЕ <
(SELECT MAX (СОСТОЯНИЕ)
FROM S)
Результат: НОМЕР ПОСТАВЩИКА
S1
S2
S3
5.10. Использование группировок (group by)
Пример 5.26. Вычислить общий объем поставок для каждой детали:
SELECT НОМЕР_ДЕТАЛИ, SUM (КОЛИЧЕСТВО)
FROM SP
GROUP BY НОМЕР_ДЕТАЛИ
Результат: НОМЕР ДЕТАЛИ
Р1 600
Р2 1000
РЗ 400
Р4 500
Р5 500
Р6 100
Пример 5.27. Запрос с использованием HAVING (Исключение всех групп, для которых не выполняется заданное условие). Выдать номера деталей, поставляемых более чем одним поставщиком:
SELECT НОМЕР_ДЕТАЛИ
FROM SP
GROUP BY НОМЕР_ДЕТАЛИ
HAVING COUNT (*) > 1
Результат: НОМЕР ДЕТАЛИ
Р1
Р2
Р4
Р5