Итак, одну и две таблицы мы опрашивали, а что, если их будет больше? Да, в общем-то можно и больше, хотя я в своей практике более трех таблиц в запросе объединяю редко! :) Нет пока особой нужды, но знать как это делается не помешает. Итак, как обычно записываем наши формулировки запросов и смотрим и разбираем, что же там происходит! :)
Вывести список заказов стоимостью выше $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
Здесь так же используется связь предок/потомок. Теперь мы связали заказ с клиентом клиента - с закрепленным за ним служащим, а служащего с его офисом! Вот так связывается хоть сотня таблиц, главное не получить мозговую травму! :) Пробуйте!