Таблиці об’єднання SQLite: внутрішній, природний, лівий зовнішній, перехресний (приклади)

Зміст:

Anonim

SQLite підтримує різні типи об'єднання SQL, такі як INNER JOIN, LEFT OUTER JOIN та CROSS JOIN. Кожен тип JOIN використовується для іншої ситуації, як ми побачимо в цьому посібнику.

У цьому підручнику ви дізнаєтесь-

  • Вступ до речення SQLite JOIN
  • ВНУТРІШНЄ З'ЄДНАННЯ
  • ПРИЄДНАЙТЕСЬ… ВИКОРИСТАННЯ
  • ПРИРОДНЕ ПРИЄДНАННЯ
  • ЛІВО ВНЕШНЄ ПРИЄДНАННЯ
  • ХРЕСТ ПРИЄДНАЙТЕСЬ

Вступ до речення SQLite JOIN

Коли ви працюєте над базою даних з кількома таблицями, вам часто потрібно отримувати дані з цих декількох таблиць.

За допомогою речення JOIN ви можете зв’язати дві або більше таблиці або підзапити, об’єднавши їх. Крім того, ви можете визначити, за яким стовпчиком потрібно пов’язувати таблиці та за якими умовами.

Будь-яке речення JOIN повинно мати такий синтаксис:

Кожне речення об’єднання містить:

  • Таблиця або підзапит, який є лівою таблицею; таблиця або підзапит перед реченням об’єднання (зліва від нього).
  • Оператор JOIN - вкажіть тип об’єднання (ВНУТРІШНЄ СПІЛКУВАННЯ, ВЛІВО ЗОВНІШНЄ ПРИЄДНАННЯ або ПЕРЕКЛЮЧЕННЯ).
  • Об’єднання об’єднання - після того, як ви вказали таблиці або підзапити, які потрібно об’єднати, вам потрібно вказати обмеження об’єднання, яке буде умовою, за якою відповідні рядки, які відповідають цій умові, будуть обрані залежно від типу об’єднання.

Зверніть увагу, що для всіх наступних прикладів вам потрібно запустити sqlite3.exe і відкрити підключення до зразка бази даних як поточне:

Крок 1) На цьому кроці

  1. Відкрийте Мій комп'ютер і перейдіть до наступного каталогу " C: \ sqlite " та
  2. Потім відкрийте " sqlite3.exe ":

Крок 2) Відкрийте базу даних " TutorialsSampleDB.db " за такою командою:

Тепер ви готові до запуску будь-якого типу запиту в базі даних.

SQLite ВНУТРІШНЄ ПРИЄДНАННЯ

INNER JOIN повертає лише ті рядки, які відповідають умові приєднання та усувають усі інші рядки, які не відповідають умові приєднання.

Приклад

У наступному прикладі ми об’єднаємо дві таблиці " Студенти " та " Кафедри " разом із DepartmentId, щоб отримати назву кафедри для кожного студента, як показано нижче:

ВИБЕРІТЬСтуденти.ВідділиВІД студентівВНУТРІШНЄ ПРИЄДНАННЯ Відділів НА Студентів.DepartmentId = Відділів.DepartmentId;

Пояснення коду:

INNER JOIN працює наступним чином:

  • У пункті Вибір ви можете вибрати будь-які стовпці, які ви хочете вибрати, із двох таблиць, на які посилаються.
  • Речення INNER JOIN пишеться після першої таблиці, на яку посилається речення "Від".
  • Потім умова приєднання визначається за допомогою ON.
  • Псевдоніми можна вказати для таблиць, на які посилаються.
  • ВНУТРІШНЕ слово необов’язкове, ви можете просто написати ПРИЄДНАТИСЯ.

Вихід:

  • ВНУТРІШНЄ СПІЛКУВАННЯ створює записи з обох - студентів та таблиць кафедри, які відповідають умові " S tudents.DepartmentId = Departments.DepartmentId ". Нерівні рядки будуть проігноровані та не включені в результат.
  • Ось чому з цього запиту було повернуто лише 8 студентів з 10 студентів з ІТ, математики та фізики. Тоді як студенти "Jena" та "George" не були включені, оскільки вони мають нульовий ідентифікатор відділу, який не збігається зі стовпцем departmentId із таблиці департаментів. Наступне:

SQLite ПРИЄДНАЙТЕСЬ ... ВИКОРИСТАННЯ

INNER JOIN можна записати, використовуючи речення "USING", щоб уникнути надмірності, тому замість того, щоб писати "ON Students.DepartmentId = Departments.DepartmentId", ви можете просто написати "USING (DepartmentID)".

Ви можете використовувати "ПРИЄДНАЙТЕСЬ ... ВИКОРИСТАННЯ", коли стовпці, які ви порівнюватимете в умові приєднання, будуть однакові. У таких випадках немає необхідності повторювати їх, використовуючи умову on, і просто вкажіть імена стовпців, і SQLite виявить це.

Різниця між ВНУТРІШНІМ ПРИЄДНАННЯМ І ПРИЄДНАННЯМ… ВИКОРИСТАННЯ:

З "ПРИЄДНАЙТЕСЬ

... ВИКОРИСТАННЯ "ви не пишете умову об'єднання, ви просто пишете стовпець об'єднання, який є спільним між двома об'єднаними таблицями, замість того, щоб писати table1" INNER JOIN table2 ON table1.cola = table2.cola "ми пишемо це як" таблиця1 ПРИЄДНАЙТЕСЬ до таблиці2 ВИКОРИСТАННЯ (кола) ".

Приклад

У наступному прикладі ми об’єднаємо дві таблиці " Студенти " та " Кафедри " разом із DepartmentId, щоб отримати назву кафедри для кожного студента, як показано нижче:

ВИБЕРІТЬСтуденти.ВідділиВІД студентівВНУТРІШНЄ ПРИЄДНАННЯ Відділи ВИКОРИСТАННЯ (DepartmentId);

Пояснення

  • На відміну від попереднього прикладу, ми не писали " ON Students.DepartmentId = Departments.DepartmentId ". Ми щойно написали " USING (DepartmentId) ".
  • SQLite автоматично визначає умову приєднання та порівнює DepartmentId з обох таблиць - Студенти та Відділи.
  • Ви можете використовувати цей синтаксис, коли два стовпці, які ви порівнюєте, мають однакову назву.

Вихідні дані

  • Це дасть вам такий самий результат, як і в попередньому прикладі:

SQLite НАТУРАЛЬНЕ ПРИЄДНАННЯ

НАТУРАЛЬНИЙ JOIN подібний до JOIN ... USING, різниця полягає в тому, що він автоматично перевіряє рівність між значеннями кожного стовпця, що існує в обох таблицях.

Різниця між ВНУТРІШНЬИМ ПРИЄДНАННЯМ і НАТУРАЛЬНИМ:

  • У ВНУТРІШНЬОМУ СПІЛКУВАННІ потрібно вказати умову об’єднання, яку внутрішнє об’єднання використовує для об’єднання двох таблиць. Тоді як у природному об’єднанні ви не пишете умови об’єднання. Ви просто пишете імена двох таблиць без будь-яких умов. Тоді природне об’єднання автоматично перевірить на рівність значень для кожного стовпця, що існує в обох таблицях. Природне приєднання автоматично визначає умову приєднання.
  • У НАТУРАЛЬНОМУ СПОСІБІ всі стовпці з обох таблиць з однаковою назвою будуть зіставлені один з одним. Наприклад, якщо у нас є дві таблиці із двома спільними іменами стовпців (два стовпці існують з однаковим іменем у двох таблицях), то природне об’єднання об’єднає дві таблиці шляхом порівняння значень обох стовпців, а не лише з одного стовпець.

Приклад

ВИБЕРІТЬСтуденти.ВідділиВІД студентівПриродний ПРИЄДНАЙТЕСЯ

Пояснення

  • Нам не потрібно писати умову приєднання з іменами стовпців (як це було зроблено у ВНУТРІШНІЙ СПИСКУ). Нам навіть не потрібно було один раз писати назву стовпця (як це було зроблено в ПРИЄДНАЙТЕСЬ ДО ВИКОРИСТАННЯ).
  • Натуральне об’єднання сканує обидва стовпці з двох таблиць. Це виявить, що умова повинна складатися з порівняння DepartmentId з обох таблиць Студенти та Департаменти.

Вихідні дані

  • Natural JOIN надасть вам той самий точний результат, що і результат, який ми отримали з прикладів INNER JOIN та JOIN USING. Тому що в нашому прикладі всі три запити еквівалентні. Але в деяких випадках висновок буде відрізнятися від внутрішнього приєднання, а потім від природного приєднання. Наприклад, якщо є більше таблиць з однаковими іменами, то природне об’єднання буде відповідати всім стовпцям один одному. Однак внутрішнє з'єднання буде відповідати лише стовпцям в умові об'єднання (докладніше в наступному розділі; різниця між внутрішнім об'єднанням та природним з'єднанням).

SQLite ЛІВО ВНЕШНЄ ПРИЄДНАННЯ

Стандарт SQL визначає три типи ЗОВНІШНЬОГО СПІЛКУВАННЯ: ВЛІВО, ВПРАВО та ПОВНО, але SQLite підтримує лише ЛІВО ВНЕШНЄ СПОЄДНАННЯ.

У LEFT OUTER JOIN усі значення стовпців, які ви вибрали з лівої таблиці, будуть включені в результат запиту, тому незалежно від того, яке значення відповідає умові приєднання чи ні, воно буде включено в результат.

Отже, якщо в лівій таблиці є "n" рядків, результати запиту матимуть "n" рядків. Однак для значень стовпців, що надходять з правої таблиці, якщо яке-небудь значення, яке не відповідає умові об'єднання, воно буде містити "нульове" значення.

Отже, ви отримаєте кількість рядків, еквівалентну кількості рядків у лівому об’єднанні. Таким чином, ви отримаєте відповідні рядки з обох таблиць (наприклад, результати ВНУТРІШНЄ СПІЛКУВАННЯ), плюс невідповідні рядки з лівої таблиці.

Приклад

У наступному прикладі ми спробуємо "ЛІВО ПРИЄДНАТИСЯ", щоб об’єднати дві таблиці "Студенти" та "Кафедри":

ВИБЕРІТЬСтуденти.ВідділиВІД студентів - це ліва таблицяЛІВО ПРИЄДНАЙТЕСЯ до кафедр НА Студентах.DepartmentId = Кафедрах.DepartmentId;

Пояснення

  • Синтаксис LEFT JOIN такий самий, як INNER JOIN; ви пишете LEFT JOIN між двома таблицями, а потім умова приєднання настає після речення ON.
  • Перша таблиця після речення from - це ліва таблиця. Тоді як друга таблиця, вказана після лівого приєднання, - це права таблиця.
  • Речення OUTER є необов’язковим; LEFT OUTER JOIN - те саме, що LEFT JOIN.

Вихідні дані

  • Як бачите, включені всі рядки таблиці студентів, які складають 10 студентів. Навіть якщо четвертого та останнього студентів, Єни та Джорджа, ідентифікатори кафедри не існують у таблиці Департаментів, вони також включаються.
  • І в цих випадках значення departmentName як для Єни, так і для Джорджа буде "нульовим", оскільки таблиця відділів не має nameName, яке відповідає їх значенню departmentId.

Давайте подамо попередній запит, використовуючи ліве приєднання, більш глибоке пояснення за допомогою діаграм Вана:

LEFT JOIN дасть всім студентам імена з таблиці студентів, навіть якщо у студента є ідентифікатор кафедри, якого немає в таблиці кафедр. Отже, запит не дасть вам лише відповідні рядки як ВНУТРІШНЄ ПРИЄДНАННЯ, але надасть вам додаткову частину, яка має невідповідні рядки з лівої таблиці, яка є таблицею студентів.

Зверніть увагу, що будь-яке ім'я студента, яке не має відповідного відділу, матиме "нульове" значення для імені відділу, оскільки для нього немає відповідного значення, і ці значення є значеннями в невідповідних рядках.

SQLite ХРЕСТ ПРИЄДНАЙТЕСЬ

CROSS JOIN дає декартовий добуток для вибраних стовпців двох об’єднаних таблиць, зіставляючи всі значення з першої таблиці з усіма значеннями з другої таблиці.

Отже, для кожного значення в першій таблиці ви отримаєте збіги 'n' з другої таблиці, де n - кількість рядків другої таблиці.

На відміну від INNER JOIN та LEFT OUTER JOIN, при CROSS JOIN вам не потрібно вказувати умову приєднання, оскільки SQLite це не потрібно для CROSS JOIN.

Результатом SQLite буде логічний результат, комбінуючи всі значення з першої таблиці з усіма значеннями з другої таблиці.

Наприклад, якщо ви вибрали стовпець з першої таблиці (colA) та інший стовпець з другої таблиці (colB). ColA містить два значення (1,2), а colB також містить два значення (3,4).

Тоді результатом ПЕРЕКЛЮЧЕННЯ ПЕРЕКЛЮЧЕННЯ буде чотири рядки:

  • Два рядки, поєднавши перше значення з colA, яке дорівнює 1, з двома значеннями colB (3,4), яке буде (1,3), (1,4).
  • Так само два рядки, поєднуючи друге значення з colA, яке дорівнює 2, з двома значеннями colB (3,4), які є (2,3), (2,4).

Приклад

У наступному запиті ми спробуємо перехресне приєднання між таблицями студентів та кафедр:

ВИБЕРІТЬСтуденти.ВідділиВІД студентівCROSS JOIN Відділи;

Пояснення

  • У пункті вибору ми щойно вибрали два стовпці "ім'я студента" з таблиці студентів та "ім'я відділу" з таблиці відділів.
  • Для перехресного з’єднання ми не вказали жодної умови об’єднання, лише дві таблиці, об’єднані CROSS JOIN в середині.

Вихід:

Як бачите, результат 40 рядків; 10 значень з таблиці студентів співпадали з 4 відділами з таблиці відділів. Наступне:

  • Чотири значення для чотирьох кафедр із таблиці кафедр відповідали першому студенту Мішелю.
  • Чотири значення для чотирьох кафедр із таблиці кафедр відповідали другому студенту Джону.
  • Чотири значення для чотирьох кафедр із таблиці кафедр відповідали третьому студенту Джеку.

    … і так далі.

Резюме

Використовуючи SQLite JOINs, ви можете зв’язати одну або кілька таблиць або підзапитів, щоб вибрати стовпці з обох таблиць або підзапитів.