Мені цікаво, як розмежувати всі ці різні приєднання ...
Мені цікаво, як розмежувати всі ці різні приєднання ...
Відповіді:
Простий приклад . Скажімо, у вас є Students
таблиця та Lockers
стіл. У SQL перша таблиця, яку ви вказуєте при з'єднанні, Students
- це таблиця ВЛЕВО , а друга Lockers
, - ПРАВА .
Кожен учень може бути призначений до шафки, тому LockerNumber
в Student
таблиці є стовпець . У одному шафці потенційно може бути більше одного учня, але особливо на початку навчального року у вас можуть бути учні, які надходять, без шаф, а також шафки, яким не призначено учнів.
Заради цього прикладу скажемо, що у вас є 100 учнів , 70 з яких мають шафки. У вас всього 50 шаф , 40 з яких мають щонайменше 1 учня, а 10 шаф не мають студента.
ВНУТРІШНЯ ПРИЄДНАЙТЕ - це " показати мені всіх студентів з шафками ".
Будь-які студенти без шаф або будь-які шафки без учнів відсутні.
Повертає 70 рядів
ЛЕВІШНІЙ ПРИЄДНАЙТЕСЬ було б " покажіть мені всіх студентів із відповідним шафкою, якщо вони мають ".
Це може бути загальний список студентів, або він може бути використаний для ідентифікації студентів, які не мають шафки.
Повертає 100 рядків
ПРАВА ПРИЄДНАЙТЕСЬ ПРИЄДНАЙТЕСЬ буде: " покажи мені всі шафки та учнів, призначених для них, якщо такі є ".
Це може бути використано для виявлення шаф, у яких не призначено студентів, або шаф, у яких занадто багато студентів.
Повертає 80 рядків (список 70 учнів у 40 шафках, плюс 10 шаф без студента)
Повна зовнішня приєднання була б нерозумною і, мабуть, не дуже корисною.
Щось на кшталт " покажіть мені всіх студентів та всі шафки, і підберіть їх там, де ви можете "
Повертає 110 рядків (усі 100 учнів, у тому числі без шаф. Плюс 10 шаф, що не мають студента)
CROSS JOIN також досить глупо в цьому сценарії.
Він не використовує пов'язане lockernumber
поле в таблиці студентів, тож ви, в основному, складаєте великий список усіх можливих спарювань «студент до шафки», незалежно від того, чи існує він.
Повертається 5000 рядків (100 учнів х 50 шаф). Може бути корисним (з фільтруванням) як відправна точка для узгодження нових учнів із порожніми шафками.
SELECT * FROM students RIGHT OUTER JOIN lockers...
це призведе до іншого результату, ніж SELECT * FROM lockers RIGHT OUTER JOIN students...
. Відмінна відповідь, але хотілося б побачити його оновленим повним SQL
запитом
Існує три основні типи приєднання:
INNER
join порівнює дві таблиці і повертає результати лише там, де існує відповідність. Записи з 1-ї таблиці дублюються, коли вони відповідають декільком результатам у 2-й. INNER приєднується, як правило, зменшує набір результатів, але, оскільки записи можна дублювати, це не гарантується.CROSS
join порівнює дві таблиці і повертає всі можливі комбінації рядків з обох таблиць. Ви можете отримати багато результатів від такого типу приєднання, який може навіть не бути значущим, тому використовуйте з обережністю.OUTER
join порівнює дві таблиці і повертає дані, коли відповідність доступна або значення NULL в іншому випадку Як і при INNER приєднанні, це буде дублювати рядки в одній таблиці, коли вона збігається з декількома записами в іншій таблиці. OUTER приєднання, як правило, збільшує набір результатів, тому що вони самі не видалять жодного запису з набору. Ви також повинні встановити приєднання OUTER, щоб визначити, коли і куди додати значення NULL:
LEFT
означає зберігати всі записи з 1-ї таблиці незалежно від того, що і вставляти значення NULL, коли 2-а таблиця не збігається. RIGHT
означає навпаки: зберігайте всі записи з 2-ї таблиці незалежно від того, що і вставляти значення NULL, якщо він 1-й таблиці не відповідає. FULL
означає зберігати всі записи з обох таблиць і вставляти значення NULL в будь-яку таблицю, якщо немає відповідності.Часто ви бачите, чи буде OUTER
ключове слово, опущене з синтаксису. Натомість це буде просто "ВЛІТТЕ ПРИЄДНАЙТЕСЬ", "ПРАВИЛЬНА ПРИЄДНАЙТЕСЬ" або "ПОЛІНЕ ПРИЄДНАЙТЕСЬ". Це робиться тому, що з'єднання INNER та CROSS не мають жодного значення щодо лівого, правого або повного, і тому їх цілком достатньо, щоб однозначно вказати на зовнішнє приєднання.
Ось приклад, коли ви можете використовувати кожен тип:
INNER
: Ви хочете повернути всі записи з таблиці "Рахунок-фактура" разом з відповідними їм "InvoiceLines". Це передбачає, що кожен дійсний рахунок-фактура матиме принаймні один рядок.OUTER
: Ви хочете повернути всі записи "InvoiceLines" для певної рахунки-фактури разом з відповідними записами "InventoryItem". Це бізнес, який також продає послуги, такі, що не всі InvoiceLines матимуть IventoryItem.CROSS
: У вас є таблиця цифр з 10 рядками, кожен з яких містить значення '0' до '9'. Ви хочете створити таблицю діапазонів дат, до якої слід приєднатись, щоб у кінцевому підсумку було записано один запис на кожен день у межах діапазону. Завдяки повторному приєднанню цієї таблиці до себе таблиці ви можете створити стільки послідовних цілих чисел, скільки вам потрібно (якщо ви починаєте з 10 до 1-ї потужності, кожен приєднання додає 1 до експонента). Потім скористайтеся функцією DATEADD (), щоб додати ці значення до базової дати для діапазону.Існує лише 4 види:
NULL
для кожного значення в таблиці праворуч. Це означає, що кожен рядок із таблиці зліва з’явиться принаймні один раз у висновку. "Перехресне з'єднання" або "декартовий приєднання" - це просто внутрішнє з'єднання, для якого не було визначено жодних умов приєднання, в результаті чого виходять усі пари рядків.
Дякую RusselH за те, що він вказав ПОВНІ приєднання, які я опустив.
Різниця в SQL JOINS:
Дуже просто запам'ятати:
INNER JOIN
показувати лише записи, спільні для обох таблиць.
OUTER JOIN
весь вміст обох таблиць об'єднаний разом, або вони збігаються, або ні.
LEFT JOIN
- це те саме, що LEFT OUTER JOIN
- (Виберіть записи з першої (лівішої) таблиці з відповідними записами правої таблиці.)
RIGHT JOIN
такий же, як RIGHT OUTER JOIN
- (Виберіть записи з другої (найправішої) таблиці з відповідними записами лівої таблиці.)
Перевірте приєднання (SQL) у Вікіпедії
лівий / правий (зовнішній) приєднання - з огляду на дві таблиці повертає всі рядки, що існують у лівій або правій таблиці вашої спілки, плюс рядки з іншої сторони будуть повернуті, коли стаття приєднання збігається, або нуль буде повернуто для ці стовпці
Повна зовнішня - За даними двох таблиць повертає всі рядки і повертає нулі, коли ні лівого, ні правого стовпця немає
Перехресні з'єднання - декартові приєднання і можуть бути небезпечними, якщо не використовувати їх обережно
Зробити це більш помітним може допомогти. Один приклад:
Таблиця 1:
ID_STUDENT STUDENT_NAME
1 Raony
2 Diogo
3 Eduardo
4 Luiz
Таблиця 2:
ІНДУКЦІОННИЙ ЗАМОК
3 l1
4 l2
5 l3
Що я отримую, коли роблю:
-Inner join of Table 1 and Table 2:
- Inner join returns both tables merged only when the key
(ID_STUDENT) exists in both tables
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
-Left join of Table 1 and Table 2:
- Left join merges both tables with all records form table 1, in
other words, there might be non-populated fields from table 2
ID_ESTUDANTE NOME_ESTUDANTE LOCKER
1 Raony -
2 Diogo -
3 Eduardo l1
4 Luiz l2
-Right join of table 1 and table 2:
- Right join merges both tables with all records from table 2, in
other words, there might be non-populated fields from table 1
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
5 - l3
-Outter join of table 1 and table 2:
- Returns all records from both tables, in other words, there
might be non-populated fields either from table 1 or 2.
ID_STUDENT STUDENT_NAME LOCKER
1 Raony -
2 Diogo -
3 Eduardo l1
4 Luiz l2
5 - l3
Внутрішнє приєднання : Показуйте лише рядки, коли є дані з обох таблиць.
Зовнішнє об'єднання : (вліво / вправо) : Показати весь результат з лівої / правої таблиці з парними рядами ( з ), якщо вона існує , чи ні.
Спочатку ви повинні зрозуміти, що робить приєднання? Ми підключаємо кілька таблиць і отримуємо конкретний результат від об'єднаних таблиць. Найпростіший спосіб зробити це з'єднання хрестовини .
Скажімо, таблиця A має два стовпчики A і B. А tableB має три стовпці C і D. Якщо ми застосуємо перехресне з'єднання, це створить багато безглуздих рядків. Тоді нам потрібно зіставити первинний ключ, щоб отримати фактичні дані.
Зліва: він поверне всі записи з лівої таблиці та відповідні записи з правої таблиці.
Праворуч: повернеться навпроти з’єднання зліва. Він поверне всі записи з правої таблиці та відповідні записи з лівої таблиці.
Внутрішня: Це як перехрестя. Він поверне лише відповідні записи з обох таблиць.
Зовнішній: І це як союз. Він поверне всі наявні записи з обох таблиць.
Інколи нам не потрібні всі дані, а також нам потрібні лише загальні дані або записи. ми можемо легко отримати його за допомогою цих методів приєднання. Пам'ятайте, що лівий і правий з'єднання також є зовнішнім з'єднанням.
Ви можете отримати всі записи лише за допомогою перехресного з'єднання. Але це може бути дорогим, якщо мова йде про мільйони записів. Тому зробіть це простим, використовуючи лівий, правий, внутрішній або зовнішній з'єднання.
Дякую