Учебники

8) Присоединяйтесь

SQLite поддерживает различные типы соединений SQL , такие как INNER JOIN, LEFT OUTER JOIN и CROSS JOIN. Каждый тип JOIN используется для разных ситуаций, как мы увидим в этом уроке.

В этом уроке вы узнаете

Введение в SQLite JOIN

Когда вы работаете с базой данных с несколькими таблицами, вам часто нужно получать данные из этих нескольких таблиц.

С помощью предложения JOIN вы можете связать две или более таблиц или подзапросов, присоединившись к ним. Также вы можете определить, по какому столбцу нужно связать таблицы и по каким условиям.

Любое предложение JOIN должно иметь следующий синтаксис:

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

Каждое предложение объединения содержит:

  • Таблица или подзапрос, который является левой таблицей; таблица или подзапрос перед предложением объединения (слева от него).
  • Оператор JOIN — укажите тип соединения (INNER JOIN, LEFT OUTER JOIN или CROSS JOIN).
  • JOIN-ограничение — после того, как вы указали таблицы или подзапросы для объединения, вам необходимо указать ограничение объединения, которое будет условием, при котором соответствующие строки, соответствующие этому условию, будут выбраны в зависимости от типа объединения.

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

Шаг 1) На этом этапе

  1. Откройте Мой компьютер и перейдите в следующий каталог » C: \ sqlite » и
  2. Затем откройте « sqlite3.exe »:

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

Шаг 2) Откройте базу данных « TutorialsSampleDB.db » с помощью следующей команды:

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

Теперь вы готовы выполнить любой тип запроса к базе данных.

SQLite INNER JOIN

INNER JOIN возвращает только те строки, которые соответствуют условию соединения, и удаляет все остальные строки, которые не соответствуют условию соединения.

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

пример

В следующем примере мы объединим две таблицы « Студенты » и « Отделы » с DepartmentId, чтобы получить название отдела для каждого студента следующим образом:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Объяснение кода:

ВНУТРЕННЕЕ СОЕДИНЕНИЕ работает следующим образом:

  • В предложении Select вы можете выбрать любые столбцы, которые хотите выбрать из двух ссылочных таблиц.
  • Предложение INNER JOIN записывается после первой таблицы, на которую ссылается предложение From.
  • Тогда условие соединения указывается с помощью ON.
  • Псевдонимы могут быть указаны для ссылочных таблиц.
  • ВНУТРЕННЕЕ слово не является обязательным, вы можете просто написать JOIN.

Вывод:

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

  • ВНУТРЕННЕЕ СОЕДИНЕНИЕ создает записи из таблиц студентов и факультетов, которые соответствуют условию « S tudents.DepartmentId = Departments.DepartmentId ». Несоответствующие строки будут игнорироваться и не включаться в результат.
  • Вот почему только 8 студентов из 10 были возвращены по этому запросу на факультеты информационных технологий, математики и физики. Принимая во внимание, что студенты «Йена» и «Джордж» не были включены, потому что они имеют нулевой идентификатор отдела, который не соответствует столбцу отдела в таблице отделов. Следующим образом:

    SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

SQLite ПРИСОЕДИНЯЙТЕСЬ… ИСПОЛЬЗУЯ

ВНУТРЕННЕЕ СОЕДИНЕНИЕ можно записать с помощью предложения «ИСПОЛЬЗОВАНИЕ», чтобы избежать избыточности, поэтому вместо записи «ON Students.DepartmentId = Departments.DepartmentId» можно просто написать «USING (DepartmentID)».

Вы можете использовать «JOIN .. USING», если столбцы, которые вы сравниваете в условии соединения, имеют одно и то же имя. В таких случаях нет необходимости повторять их, используя условие on, и просто указывайте имена столбцов, и SQLite обнаружит это.

Разница между INNER JOIN и JOIN .. ИСПОЛЬЗОВАНИЕ:

С «JOIN… USING» вы не пишете условие соединения, вы просто пишете столбец соединения, который является общим для двух соединенных таблиц, вместо записи table1 «INNER JOIN table2 ON table1.cola = table2.cola», которую мы пишем это как «table1 JOIN table2 USING (cola)».

пример

В следующем примере мы объединим две таблицы « Студенты » и « Отделы » с DepartmentId, чтобы получить название отдела для каждого студента следующим образом:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments USING(DepartmentId);

объяснение

  • В отличие от предыдущего примера, мы не написали « ON Students.DepartmentId = Departments.DepartmentId ». Мы просто написали « ИСПОЛЬЗОВАНИЕ (DepartmentId) ».
  • SQLite автоматически выводит условие соединения и сравнивает DepartmentId из обеих таблиц — Студенты и Отделы.
  • Вы можете использовать этот синтаксис, когда сравниваемые два столбца имеют одинаковые имена.

Вывод

  • Это даст вам тот же точный результат, что и в предыдущем примере:

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

SQLite NATURAL JOIN

ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ похоже на СОЕДИНЕНИЕ … ИСПОЛЬЗОВАНИЕ, отличие состоит в том, что оно автоматически проверяет равенство между значениями каждого столбца в обеих таблицах.

Разница между ВНУТРЕННИМ И СОЕДИНЕНИЕМ:

  • В INNER JOIN необходимо указать условие соединения, которое внутреннее соединение использует для соединения двух таблиц. В то время как в естественном соединении вы не пишете условие соединения. Вы просто пишете имена двух таблиц без каких-либо условий. Тогда естественное объединение автоматически проверит на равенство значений для каждого столбца, существующего в обеих таблицах. Естественное соединение автоматически определяет условие соединения.
  • В ЕСТЕСТВЕННОМ СОЕДИНЕНИИ все столбцы из обеих таблиц с одинаковыми именами будут сопоставляться друг с другом. Например, если у нас есть две таблицы с двумя общими именами столбцов (два столбца существуют с одинаковыми именами в двух таблицах), то естественное объединение объединит две таблицы, сравнивая значения обоих столбцов, а не только одного колонка.

пример

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
Natural JOIN Departments;

объяснение

  • Нам не нужно писать условие соединения с именами столбцов (как мы это делали в INNER JOIN). Нам даже не нужно было писать имя столбца один раз (как мы это делали в JOIN USING).
  • При естественном объединении будут сканироваться оба столбца из двух таблиц. Он обнаружит, что условие должно состоять из сравнения DepartmentId из обеих таблиц «Студенты» и «Отделы».

Вывод

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

  • Natural JOIN даст вам тот же самый вывод, что и выходные данные INNER JOIN и примеры JOIN USING. Потому что в нашем примере все три запроса эквивалентны. Но в некоторых случаях выходные данные будут отличаться от внутреннего объединения, чем в естественном соединении. Например, если имеется больше таблиц с одинаковыми именами, то естественное объединение сопоставит все столбцы друг с другом. Однако внутреннее соединение будет соответствовать только столбцам в условии соединения (более подробная информация приведена в следующем разделе; разница между внутренним соединением и естественным соединением).

SQLite оставил внешнее соединение

Стандарт SQL определяет три типа OUTER JOIN: LEFT, RIGHT и FULL, но SQLite поддерживает только LEFT OUTER JOIN.

В LEFT OUTER JOIN все значения столбцов, выбранных в левой таблице, будут включены в результат запроса, поэтому независимо от того, соответствует ли значение условию соединения или нет, оно будет включено в результат.

Таким образом, если в левой таблице есть «n» строк, в результатах запроса будет «n» строк. Однако для значений столбцов из правой таблицы, если любое значение не соответствует условию соединения, оно будет содержать нулевое значение.

Таким образом, вы получите количество строк, эквивалентное количеству строк в левом соединении. Таким образом, вы получите совпадающие строки из обеих таблиц (например, результаты INNER JOIN), а также несовпадающие строки из левой таблицы.

пример

В следующем примере мы попробуем «LEFT JOIN» объединить две таблицы «Студенты» и «Факультеты»:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students             -- this is the left table
LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

объяснение

  • Синтаксис LEFT JOIN такой же, как INNER JOIN; вы записываете LEFT JOIN между двумя таблицами, и затем условие ON приходит после предложения ON.
  • Первая таблица после предложения from является левой таблицей. Тогда как вторая таблица, указанная после левого соединения, является правой таблицей.
  • Предложение OUTER является необязательным; LEFT OUTER JOIN — то же самое, что LEFT JOIN.

Вывод

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

  • Как вы можете видеть, все строки из таблицы учеников включены, всего 10 учеников. Даже если четвертого и последнего студента, Jena и George DepartmentIds не существует в таблице Департаментов, они также включены.
  • И в этих случаях значение DepartmentName для Джены и Джорджа будет равно «null», поскольку в таблице департаментов нет кафедры, соответствующей их значению департамента.

Давайте дадим предыдущий запрос, используя левое соединение, более глубокое объяснение, используя диаграммы Ван:

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

LEFT JOIN сообщит имена всех учеников из таблицы учеников, даже если у ученика есть идентификатор отдела, которого нет в таблице отделов. Таким образом, запрос не даст вам только совпадающие строки в качестве INNER JOIN, но даст дополнительную часть, в которой есть несопоставимые строки из левой таблицы, которая является таблицей студентов.

Обратите внимание, что любое имя учащегося, у которого нет соответствующего отдела, будет иметь нулевое значение для названия отдела, поскольку для него нет соответствующего значения, и эти значения являются значениями в несоответствующих строках.

SQLite CROSS JOIN

CROSS JOIN дает декартово произведение для выбранных столбцов двух соединенных таблиц путем сопоставления всех значений из первой таблицы со всеми значениями из второй таблицы.

Таким образом, для каждого значения в первой таблице вы получите ‘n’ совпадений из второй таблицы, где n — количество строк второй таблицы.

В отличие от INNER JOIN и LEFT OUTER JOIN, с CROSS JOIN вам не нужно указывать условие соединения, потому что SQLite не нуждается в этом для CROSS JOIN.

SQLite приведет к логическому набору результатов, объединив все значения из первой таблицы со всеми значениями из второй таблицы.

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

Тогда результатом CROSS JOIN будет четыре строки:

  • Две строки путем объединения первого значения из colA, которое равно 1, с двумя значениями colB (3,4), которые будут (1,3), (1,4).
  • Аналогично, две строки объединяют второе значение из colA, равное 2, с двумя значениями colB (3,4), которые равны (2,3), (2,4).

пример

В следующем запросе мы попробуем CROSS JOIN между таблицами студентов и отделов:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
CROSS JOIN Departments;

объяснение

  • В предложении select мы только что выбрали два столбца «имя студента» из таблицы студентов и «имя отдела» из таблицы отделов.
  • Для перекрестного соединения мы не указали никаких условий соединения, только две таблицы, объединенные с CROSS JOIN в середине.

Вывод:

SQLite Join - ВНУТРЕННЯЯ, ЕСТЕСТВЕННАЯ, ЛЕВАЯ НАРУЖНАЯ, КРЕСТНАЯ

Как видите, результат составляет 40 строк; 10 значений из таблицы студентов совпали с 4 отделами из таблицы отделов. Следующим образом:

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

    .. и так далее.

Резюме

Используя SQLite JOIN, вы можете связать одну или несколько таблиц или подзапросов, чтобы выбрать столбцы из обеих таблиц или подзапросов.