Додавання або об'єднання запитів
Що саме спробуєте?) 1. Ви використовуєте агрегатну функцію по всій таблиці - від якого рядка ви очікуєте point, predprijatie ? Чому ви думаєте що вони будуть саме від цього рядка? . це буде значення з останнього рядка, що аналогічно до деякої не існуючої функції LAST_VAL( column ) ), але в даному випадку (вся таблиця -> в один рядок) це зовсім не ясна мета.
Як поєднати SELECT?
У попередніх статтях описувалася робота тільки з однією таблицею бази даних.
Наприклад, якщо ми хочемо отримати інформацію про витрати на покупки, ми можемо її отримати так:
SELECT family_member, amount * unit_price AS price FROM Payments
| family_member | price |
|---|
| 1 | 2000 |
| 2 | 2100 |
| 3 | 100 |
| 4 | 350 |
| 4 | 300 |
| 5 | 100 |
| 2 | 120 |
| 2 | 5500 |
| 5 | 230 |
| 3 | 2200 |
| 2 | 66000 |
| 1 | 40 |
| 3 | 100 |
| 3 | 1200 |
У полі family_member отриманої вибірки відображаються ідентифікатори записів з таблиці Payments , але вони мало що означають.
Замість цих ідентифікаторів було набагато наочніше виводити імена тих, хто купував (поле member_name з таблиці FamilyMember ) Рівне для цього і існує об'єднання таблиць і оператор JOIN .
SELECT поля_таблиць FROM таблиця_1 [INNER]
|
[[LEFT
|
RIGHT
|
FULL][OUTER]]
JOIN таблиця_2 ON умова_з'єднання [[INNER]
|
[[LEFT
|
RIGHT
|
FULL][OUTER]]
JOIN таблиця_n ON умова_з'єднання]
Як можна побачити структурою, з'єднання буває:
- внутрішнім INNER (за замовчуванням)
- зовнішнім OUTER, при цьому зовнішнє з'єднання ділиться на ліве LEFT, праве RIGHT та повне FULL
З більш докладними деталями, ніж відрізняється внутрішнє з'єднання від зовнішнього і як вони працюють, ми познайомимося в наступних статтях.
Поки нам достатньо лише знати, що для вищеописаного прикладу із запитом на покупки нам знадобиться саме запит із внутрішнім з'єднанням, який виглядатиме так:
SELECT family_member, member_name, amount * unit_price AS price FROM Payments INNER
JOIN FamilyMembers ON Payments.family_member = FamilyMembers.member_id
| family_member | member_name | price |
|---|
| 1 | Headley Quincey | 2000 |
| 2 | Flavia Quincey | 2100 |
| 3 | Andie Quincey | 100 |
| 4 | Lela Quincey | 350 |
| 4 | Lela Quincey | 300 |
| 5 | Annie Quincey | 100 |
| 2 | Flavia Quincey | 120 |
| 2 | Flavia Quincey | 5500 |
| 5 | Annie Quincey | 230 |
| 3 | Andie Quincey | 2200 |
| 2 | Flavia Quincey | 66000 |
| 1 | Headley Quincey | 40 |
| 3 | Andie Quincey | 100 |
| 3 | Andie Quincey | 1200 |
У цьому запиті ми зіставляємо записи з таблиці Payments та записи з таблиці FamilyMembers.
Щоб зіставлення працювало, ми вказуємо, як саме записи з двох різних таблиць повинні знаходити один одного. Ця умова вказується після ON:
ON Payments.family_member = FamilyMembers.member_id
У нашому випадку поле family_member вказує на ідентифікатор у таблиці FamilyMembers і, таким чином, допомагає однозначному зіставленню.
У більшості випадків умовою з'єднання є рівність стовпців таблиць (таблиця_1.поле = таблиця_2.поле), проте так само можна використовувати й інші оператори порівняння.
Раніше, коли всі запити виконувались на одній таблиці, було достатньо вказати символ *, щоб вивести всі поля цієї таблиці. Тепер, коли таблиць може бути кілька, * означатиме " вивести всі стовпці з таблиць, перелічених у виразі FROM " .
У деяких випадках нам може знадобитися вивести стовпці, що належать лише до певної таблиці. Наприклад, дано з'єднання таблиць Payments і FamilyMembers і в підсумкову вибірку необхідно вивести тільки поля з таблиці FamilyMembers. Як це зробити? Все дуже просто! Перед символом необхідно додати назву таблиці:
SELECT FamilyMembers.*
FROM Payments INNER
JOIN FamilyMembers ON Payments.family_member = FamilyMembers.member_id
Запам'ятайте цю можливість, вона вам знадобиться у наступних завданнях 😉
Так само можна вивести всі стовпці з кількох таблиць:
SELECT Payments.*, FamilyMembers.*
FROM Payments INNER
JOIN FamilyMembers ON Payments.family_member = FamilyMembers.member_id
В даному випадку замість Payments.*, FamilyMembers.* можна використовувати *, т.к. у FROM перераховані лише ці дві таблиці. Висновок буде однаковий в обох випадках.
А що, коли треба вивести кілька стовпців з однієї таблиці та всі з іншої? Це також можливо! Виведемо поля payment_id і family_member з Payments, а також усі поля з FamilyMembers:
SELECT payment_id, family_member, FamilyMembers.*
FROM Payments INNER
JOIN FamilyMembers ON Payments.family_member = FamilyMembers.member_id