Отбор данных из нескольких таблиц
Пример 13. Естественное соединение таблиц (способ 1 - явное указание условий соединения):
SELECT P.PNUM, P.PNAME, PD.DNUM, PD.VOLUME FROM P, PD WHERE P.PNUM = PD.PNUM;
В результате получим новую таблицу, в которой строки с данными о поставщиках соединены со строками с данными о поставках деталей:
1 | Иванов | 1 | 100 |
1 | Иванов | 2 | 200 |
1 | Иванов | 3 | 300 |
2 | Петров | 1 | 150 |
2 | Петров | 2 | 250 |
3 | Сидоров | 1 | 1000 |
Замечание. Соединяемые таблицы перечислены в разделе FROM оператора, условие соединения приведено в разделе WHERE. Раздел WHERE, помимо условия соединения таблиц, может также содержать и условия отбора строк.
Пример 14. Естественное соединение таблиц (способ 2 - ключевые слова JOIN… USING…):
SELECT P.PNUM, P.PNAME, PD.DNUM, PD.VOLUME FROM P JOIN PD USING PNUM;
Замечание. Ключевое слово USING позволяет явно указать, по каким из общих колонок таблиц будет производиться соединение.
Пример 15. Естественное соединение таблиц (способ 3 - ключевое слово NATURAL JOIN):
SELECT P.PNUM, P.PNAME, PD.DNUM, PD.VOLUME FROM P NATURAL JOIN PD;
Замечание. В разделе FROM не указано, по каким полям производится соединение. NATURAL JOIN автоматически соединяет по всем одинаковым полям в таблицах.
Пример 16. Естественное соединение трех таблиц:
SELECT P.PNAME, D.DNAME, PD.VOLUME FROM P NATURAL JOIN PD NATURAL JOIN D;
В результате получим следующую таблицу:
Иванов | Болт | 100 |
Иванов | Гайка | 200 |
Иванов | Винт | 300 |
Петров | Болт | 150 |
Петров | Гайка | 250 |
Сидоров | Болт | 1000 |
Пример 17. Прямое произведение таблиц:
SELECT P.PNUM, P.PNAME, D.DNUM, D.DNAME FROM P, D;
В результате получим следующую таблицу:
1 | Иванов | 1 | Болт |
1 | Иванов | 2 | Гайка |
1 | Иванов | 3 | Винт |
2 | Петров | 1 | Болт |
2 | Петров | 2 | Гайка |
2 | Петров | 3 | Винт |
3 | Сидоров | 1 | Болт |
3 | Сидоров | 2 | Гайка |
3 | Сидоров | 3 | Винт |
Замечание. Т.к. не указано условие соединения таблиц, то каждая строка первой таблицы соединится с каждой строкой второй таблицы.
Пример 18. Соединение таблиц по произвольному условию. Рассмотрим таблицы поставщиков и деталей, которыми присвоен некоторый статую (см. пример 8 из предыдущей главы):
1 | Иванов | 4 |
2 | Петров | 1 |
3 | Сидоров | 2 |
1 | Болт | 3 |
2 | Гайка | 2 |
3 | Винт | 1 |
Ответ на вопрос "какие поставщики имеют право поставлять какие детали?" дает следующий запрос:
SELECT P.PNUM, P.PNAME, P.PSTATUS, D.DNUM, D.DNAME, D.DSTATUS FROM P, D WHERE P.PSTATUS >= D.DSTATUS;
В результате получим следующую таблицу:
1 | Иванов | 4 | 1 | Болт | 3 |
1 | Иванов | 4 | 2 | Гайка | 2 |
1 | Иванов | 4 | 3 | Винт | 1 |
2 | Петров | 1 | 3 | Винт | 1 |
3 | Сидоров | 2 | 2 | Гайка | 2 |
3 | Сидоров | 2 | 3 | Винт | 1 |