Page 135 - 4636
P. 135

(перехресне  з'єднання).  Такий  тип  з’єднання  ще  називають  повною  сполукою  (full  join)або
        декартовим добутком (Cartesian product) таблиць. Це означає таке:  “Взяти зазначені таблиці  і
        зробити  з  них  одну  велику.  Велика  таблиця  повинна  містити  рядок  для  будь-якої  можливої
        комбінації рядків з кожної зазначеної в списку таблиці, незалежно від того мають вони сенс чи
        ні”. Іншими словами, ми отримуємо таблицю, в якій кожен рядок таблиці customers зіставляється
        кожному рядку таблиці orders незалежно від того, які закази були зробили конкретні клієнти.
              У  більшості  випадків  таке  з'єднання  не  має  великого  змісту.  Як  правило,  нам  потрібні
        рядки,  які  дійсно  збігаються,  тобто  коли  конкретні  замовлення  відповідають  клієнтам,  якими
        вони були зроблені.
              Це досягається шляхом поміщення в конструкцію WHERE умови з'єднання. Це особливий
        тип  умовного  оператора,  який  пояснює,  які  атрибути  показують  відношення  між  двома
        таблицями. Уданому випадку умова з'єднання була такою:
              customers, customerid = orders, customerid
              що наказує MySQL поміщати у результуючу таблицю тільки ті рядки, для яких customerid з
        таблиці customers збігається з customerid з таблиці orders.
              Внісши цю умову в запит, ми, посуті, отримали з'єднання іншого типу - з'єднання з рівності
        (equi-join).
              Зверніть  увагу на позначення, яким ми скористалися для  уточнення конкретного стовпця
        конкретної  таблиці.  Так,  customers  .customerid  відноситься  до  стовпця  customerid  з  таблиці
        клієнтів customers, a orders .'customerid - стовпця customerid з таблиці замовлень orders.
              Потреба в такому позначенні виникає, коли імена стовпців неоднозначні, що трапляється,
        якщо одні й ті ж імена зустрічається в кількох таблицях.Розширивши цю концепцію, точкового
        позначення можна застосовувати для розрізнення імен стовпців з різних баз даних. У наведеному
        прикладі використовується запис у формі таблиці. стовпець. А за допомогою запису база_даних.
        таблиця, стовпець можна вказати базу даних, наприклад, для перевірки умови зразок:
              books, orders, customer id = other_db. orders, customer id
              Взагалі кажучи, точкову позначення можна застосовувати і для всіх посилань на стовпці в
        запиті.  Часто  це  може  виявитися  доцільним,  особливо  в  складних  запитах.  MySQL  цього  не
        вимагає, але така запис робить запити значно більше читабель-вими та зручними у використанні.
        Ми дотримувалися цієї угоди в іншій частині раніше наведеного запиту, наприклад, при вказівці
        наступної умови:
              customers.name = 'Саша Валентей'
              Стовпець  name  наявний  тільки  у  таблиці  customers,  тому  його  обов'язково  вказувати.
        MySQL нічого не наплутає. Але це прояснює значення запиту для людей, які його читають.
              2 Об'єднання трьох і більше таблиць
              Поєднання  більшої  кількості  таблиць  не  складніше  від  з'єднання  двох  таблиць.  Головне
        правило таке: таблиці необхідно об'єднувати попарно, враховуючи  умови з'єднання. Це можна
        представити у вигляді відносин між таблицями в кожній такій парі.
              Наприклад,  якщо  потрібно  дізнатися,  хто  з  клієнтів  замовив  книги  за  Java  (можливо,
        надіслати  їм  інформацію  про  нові  книги  цієї  тематики),  потрібно  відстежити  ці  відносини  в
        межах порівняно невеликої кількості таблиць.
              Необхідно  відшукати  клієнтів,  які  розмістили,  принаймні,  одне  замовлення,  що  містить
        order_item, відповідно до книзи за Java. Щоб з таблиці customers перейти до таблиці orders, можна
        скористатися полем customerid, як це робилося раніше. Щоб з таблиці orders перейти в таблицю
        order_items, можна скористатися полем orderid. Щоб з таблиці order_items перейти до конкретної
        книзі в таблиці books, можна використовувати поле ISBN. Після того, як всі зв'язки встановлені,
        можна запитати книги зі словом “Java” в назві та отримати імена клієнтів, які купили якусь із цих
        книг.
              Давайте подивимося на запит, виконує всі тільки що описані дії:
              select customers.name
              from customers, orders, order_items, books where customers.
              customerid = order s. customer id and orders. orderid =
                                                            132
   130   131   132   133   134   135   136   137   138   139   140