Мы разобрались с обычными запросами к базе данных с помощью оператора SELECT, а так же с подзапросами.
Следующий этап научиться объединять запросы, выполнять над ними операции пересечения и вычитания.
Оператор JOIN
JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.
Для выбора данных из нескольких таблиц необходимо перечислить имена требуемых таблиц в предложении FROM через запятую. В этом случае получим декартово произведение таблиц.
SELECT *
FROM P, PDСуществует два способа соединения таблиц:
1) Условие соединения указывается в предложении WHERE
Пример 1.
Пусть требуется вывести информацию о поставках в виде отношения R(pnum, pname, dnum, volume).
SELECT P.pnum, pname, dnum, volume
FROM P, PD
WHERE P.pnum=PD.pnum2) Условие соединения указывается в предложении FROM
Синтаксис такого соединения следующий:
FROM <таблица1>
INNER JOIN | LEFT [OUTER] JOIN | RIGHT [OUTER] JOIN <таблица2>
ON <таблица_1>.<столбец_1>=<таблица_2><столбец_2>В соответствии с приведенным выше синтаксисом возможны следующие варианты соединения таблиц:
- Внутреннее соединение
- Внешнее соединение(левое, правое и полное)
Внутреннее соединение
С помощью внутреннего соединения выше рассмотренный пример можно записать следующим образом:
SELECT pname, dnum, volume
FROM P INNER JOIN PD ON P.pnum=PD.pnumСоединять можно и более двух таблиц.
Пример 2.
Пусть требуется вывести информацию о поставках в виде отношения R(pname, dname, volume).
SELECT pname, dname, volume
FROM (P INNER JOIN PD ON P.pnum=PD.pnum)
INNER JOIN D ON PD.dnum=D.dnumПример 3.
Пусть требуется вывести информацию о поставках в виде отношения R(pname, dname, dprice, volume, cost), где значения поля стоимость поставки cost определяются как dprice*volume.
| pname | dname | dprice | volume | cost |
|---|---|---|---|---|
| Иванов | Болт | 10 руб. | 100 | 1000 руб. |
SELECT pname, dname, str(dprice)+’руб.’ AS dprice, volume, str(dprice*volume)+’руб.’ AS cost
FROM (P INNER JOIN PD ON P.pnum=PD.pnum)
INNER JOIN D ON PD.dnum=D.dnumПри построении вычисляемых полей для строковых значений может быть использована операция конкатенации (соединения) строк, которая записывается с помощью символа & или +. Эта операция была использована для получения значений вычисляемых полей dprice и cost. Предварительно числовые значения были приведены к строке с помощью функции STR().
Внешние соединение
Различают 3 вида внешних соединений:
- Левое внешнее соединение
- Правое внешнее соединение
- Полное внешнее соединение
Левое внешнее соединение
Левое внешнее соединение отношений А и В отличается от внутреннего тем, что в результирующее отношение добавляются все кортежи из отношения А (левой таблицы), при этом отсутствующие значения полей из отношения В (правой таблицы) будут заполняться NULL-значениями.
Полное внешние соединение
При выполнении полного внешнего соединения в результирующее отношение помещаются все кортежи из обоих отношений, неизвестные значения заполняются NULL-значениями.
Правое внешнее соединение
Правое соединение выполняется аналогично левому, но в результирующее отношение добавляются все кортежи из отношения B (правой таблицы).
Оператор UNION – Объединение
Для объединения запросов используется следующий синтаксис:
<запрос1>
UNION [ALL]
<запрос2>По умолчанию оператор UNION удаляет повторяющиеся строки из результирующего набора. Если указан параметр ALL, то результат будет содержать все строки, в том числе повторяющиеся.
Объединяемые запросы должны быть совместимы между собой. В терминологии SQL это обозначает, что:
- Таблицы должны иметь одинаковое количество столбцов.
- Типы данных в соответствующих столбцах должны быть совместимыми.
Объединяемые запросы должны быть совместимы между собой. В терминологии SQL это обозначает, что:
- Таблицы должны иметь одинаковое количество столбцов.
- Типы данных в соответствующих столбцах должны быть совместимыми.
К результату объединения рекомендуется применять предложение ORDER BY, где можно ссылаться только на имена столбцов левого запроса в операторе UNION.
Пример 4.
Пусть задана таблица P1.
| Номер | Наименование |
|---|---|
| 5 | Орлов |
Определим результат следующего объединения:
SELECT *
FROM P1
UNION
SELECT *
FROM P
WHERE pnum=1
ORDER BY Номер
| Номер | Наименование |
|---|---|
| 1 | Иванов |
| 5 | Орлов |
Пример 5.
Получить номера деталей, цена которых более 20 рублей или суммарное поставляемое количество более 500 штук.
Запрос разбивается на две части:
- Вывод номеров деталей, цена которых более 200 рублей.
- Вывод номеров деталей, которые поставляются в количестве более 500 штук.
Результирующая таблица получается при объединении двух частей запроса.
SELECT dnum
FROM D
WHERE dprice>20
UNION
SELECT dnum
FROM PD
GROUP BY dnum
HAVING sum(volume)>500
ORDER BY dnumПример 6.
Вывести информацию о деталях. В том случае если цена детали не указана вывести ‘цены нет’.
Запрос разбивается на две части:
- Вывод информации о деталях, для которых указана цена.
- Вывод информации о деталях, для которых не указана цена. В этом случае в предложении
SELECTвместо атрибута dprice нужно указывать строковую константу ‘цены нет’.
SELECT dnum, dname, dprice
FROM D
WHERE dprice IS NOT NULL
UNION
SELECT dnum, dname, 'цены нет'
FROM PD
WHERE dprice IS NULL
ORDER BY dnum
Оператор INTERSECT – Пересечение
Пересечение запросов выполняется с помощью оператора INTERSECT, который выполняется аналогично оператору UNION.
Пример 7.
Вывести номера деталей, которые поставляет и поставщик с номером 1, и поставщик с номером 2.
SELECT dnum
FROM PD
WHERE pnum=1
INTERSECT
SELECT dnum
FROM PD
WHERE pnum=2
Оператор EXCEPT – Вычитание
Вычитание выполняется с помощью оператора EXCEPT, который выполняется аналогично оператору UNION.
Пример 8.
Вывести номера поставщиков, которые не поставляют детали в настоящее время.
SELECT pnum
FROM P
EXCEPT
SELECT pnum
FROM PDПример 9.
Вывести номера поставщиков, которые не поставляют деталь № 2.
SELECT pnum
FROM P
EXCEPT
SELECT pnum
FROM PD
WHERE dnum=2Пример 10.
Вывести номера поставщиков, которые поставляют только деталь № 1.
SELECT pnum
FROM PD
WHERE dnum=1
EXCEPT
SELECT pnum
FROM PD
WHERE dnum<>1
Заключение
В заключение, операторы JOIN, UNION, INTERSECT и EXCEPT являются важными инструментами при работе с реляционными базами данных.
Оператор JOIN используется для соединения двух таблиц, а операторы UNION, INTERSECT и EXCEPT используются для объединения, пересечения и вычитания данных из двух или более таблиц.
В целом, знание этих операторов и умение применять их в соответствии с требованиями конкретной задачи может значительно упростить работу с базами данных и обеспечить более эффективный анализ данных.