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