Итак, одну и две таблицы мы опрашивали, а что, если их будет больше? Да, в общем-то можно и больше, хотя я в своей практике более трех таблиц в запросе объединяю редко! :) Нет пока особой нужды, но знать как это делается не помешает. Итак, как обычно записываем наши формулировки запросов и смотрим и разбираем, что же там происходит! :)
Вывести список заказов стоимостью выше $700, включая имя служащего, принявшего заказ и имя клиента сделавшего его.
SELECT ORDER_NUM, AMOUNT, COMPANY, NAME FROM ORDERS, CUSTOMERS, SALESREPS WHERE CUST = CUST_NUM AND REP = EMPL_NUM AND AMOUNT > 700 /
Получаем следующее:
SQL> SELECT ORDER_NUM, AMOUNT, COMPANY, NAME
2 FROM ORDERS, CUSTOMERS, SALESREPS
3 WHERE CUST = CUST_NUM AND
4 REP = EMPL_NUM AND
5 AMOUNT > 700
6 /
ORDER_NUM AMOUNT COMPANY NAME
------------- ---------- ------------------------------ --------------
112983 702 Крупное предприятие Вася Пупкин
112922 760 Просто Балбесы Игорь Петров
113049 710 Просто Балбесы Игорь Петров
3 rows selected
А, теперь посмотрим на рисунок:

Из рисунка видно, что запрос построен по равенству столбцов и использует в запросе три(!) таблицы. Как видно, столбец CUST таблицы ORDERS является внешним ключом для таблицы CUSTOMERS, а столбец REP той же таблицы ORDERS является внешним ключом для таблицы SALESREPS! Иначе говоря, запрос связывает каждый заказ с соответствующим клиентом и служащим. Вот так и получился, запрос к трем таблицам.
Давайте для более полного, понимания, выполним еще вот такой запрос: Вывести список заказов стоимостью выше $700, включая имя клиента разместившего заказ и имя служащего закрепленного за этим клиентом.
SELECT ORDER_NUM, AMOUNT, COMPANY, NAME FROM ORDERS, CUSTOMERS, SALESREPS WHERE CUST = CUST_NUM AND CUST_REP = EMPL_NUM AND AMOUNT > 700 /
Соответственно получаем:
SQL> SELECT ORDER_NUM, AMOUNT, COMPANY, NAME
2 FROM ORDERS, CUSTOMERS, SALESREPS
3 WHERE CUST = CUST_NUM AND
4 CUST_REP = EMPL_NUM AND
5 AMOUNT > 700
6 /
ORDER_NUM AMOUNT COMPANY NAME
------------- ---------- ------------------------------ --------------
112983 702 Крупное предприятие Вася Пупкин
112922 760 Просто Балбесы Игорь Петров
113049 710 Просто Балбесы Игорь Петров
3 rows selected
Как-то странно, но предыдущий запрос дал тот же результат! Да и бог с ним, здесь поменялись роли столбцов. Теперь столбец CUST работает как внешний ключ для таблицы CUSTOMERS, а столбец CUST_REP срабатывает внешним ключом для таблицы SALESREPS. Теперь логика запроса несколько поменялась. Данный запрос связывает каждый заказ с клиентом, а каждого клиента с закрепленным за ним служащим. Надеюсь, что не слишком запутал вас и разобраться как все это работает в общем-то не сложно! :)
Так же в промышленных масштабах иногда выполняют запросы к трем и более таблицам, вот где нужно иметь полное представление о связях в таблицах БД! И мы с вами можем проделать нечто подобное на нашей учебной БД.
Давайте попробуем, дать вот такой запрос: Вывести список заказов стоимостью выше $700, включая имя клиента, разместившего заказ и имя служащего, закрепленного за этим клиентом, а так же офис, в котором работает этот служащий.
SELECT ORDER_NUM, AMOUNT, COMPANY, NAME, CITY FROM ORDERS, CUSTOMERS, SALESREPS, OFFICES WHERE CUST = CUST_NUM AND CUST_REP = EMPL_NUM AND REP_OFFICE = OFFICE AND AMOUNT > 700 /
Четыре(!) таблицы! Получаем:
SQL> SELECT ORDER_NUM, AMOUNT, COMPANY, NAME, CITY
2 FROM ORDERS, CUSTOMERS, SALESREPS, OFFICES
3 WHERE CUST = CUST_NUM AND
4 CUST_REP = EMPL_NUM AND
5 REP_OFFICE = OFFICE AND
6 AMOUNT > 700
7 /
ORDER_NUM AMOUNT COMPANY NAME CITY
---------- ---------- ------------------------------ ------------------------------ ------------------------------
112983 702 Крупное предприятие Вася Пупкин Бубурино
112922 760 Просто Балбесы Игорь Петров Котрогайка
113049 710 Просто Балбесы Игорь Петров Котрогайка
3 rows selected
Здесь так же используется связь предок/потомок. Теперь мы связали заказ с клиентом клиента - с закрепленным за ним служащим, а служащего с его офисом! Вот так связывается хоть сотня таблиц, главное не получить мозговую травму! :) Пробуйте!