SQL INNER JOIN: Полное руководство
Оператор SQL INNER JOIN возвращает строки с точными значениями в двух столбцах двух таблиц. Вы можете объединить таблицу по одному или нескольким столбцам. Операторы JOIN соединяют две таблицы базы данных и сравнивают их содержимое.
Бывают случаи, когда вы хотите получить данные из двух или более таблиц одновременно и объединить результат.
Например, вы можете получить список продуктов и имена поставщиков, которые поставили эти продукты. Информация о названиях продуктов и названиях поставщиков находится в двух таблицах.
Здесь на помощь приходят соединения SQL. Используя условие соединения, вы можете объединить информацию из нескольких таблиц в следующее: один набор результатов. SQL INNER JOIN — это тип соединения, которое возвращает записи, которые имеют совпадающие значения столбцов в двух таблицах. В этом руководстве мы собираемся обсудить, как использовать INNER JOIN.
Содержание
- SQL INNER JOIN
- Пример SQL INNER JOIN
- Вывод
SQL INNER JOIN
SQL INNER JOIN извлекает все записи со значениями столбцов, которые появляются в двух указанных таблицах. Оператор INNER JOIN использует ключевое слово ON для сопоставления данных в двух таблицах.
INNER JOIN является наиболее распространённым типом SQL присоединиться. Оператор возвращает записи, которые совпадают в обеих таблицах.
Давайте посмотрим на синтаксис ключевого слова INNER JOIN :
- SELECT name
- FROM customers
- INNER JOIN plans
- ON customers.plan_id = plans.id;
Этот запрос объединяет строки из таблиц «клиенты» и «планы». Он возвращает список всех клиентов с «plan_id», равным любому идентификатору в таблице «планы».
Мы используем предложение INNER JOIN для объединения наших таблиц. Ключевое слово ON идёт после имени таблицы, к которой мы присоединяемся. Вы можете указать несколько условий после ключевого слова ON, разделив их запятыми.
Пример SQL INNER JOIN
Прямо сейчас у нас есть база данных сотрудников, в которой хранятся идентификаторы отдела каждого сотрудника в таблице сотрудников. Мы создали эту таблицу с помощью оператора SQL CREATE TABLE. Имена отделов хранятся в отдельной таблице под названием company_departments.
Вот таблица сотрудников:
сотрудники | ||
имя | заглавие | Department_id |
Люк | Сотрудник по продажам | 1 |
Майк | Сотрудник по продажам | 1 |
Ханна | Сотрудник по продажам | 1 |
Джефф | Старший специалист по продажам | 1 |
Алексис | Сотрудник по продажам | 1 |
Иона | Вице-президент по продажам | 3 |
Эмма | Директор по маркетингу | 2 |
(7 рядов)
Это таблица отделов:
company_departments | |
Department_id | имя |
1 | продажи |
2 | маркетинг |
3 | исполнительный |
(3 ряда)
Допустим, мы хотели получить имена, должности и названия отделов для всех сотрудников. Эти данные содержатся в двух таблицах: имена и должности сотрудников находятся в таблице сотрудников. Названия отделов находятся в таблице company_departments.
Как мы получаем информацию, которую ищем?
В таблице сотрудников есть столбец с именем Department_id. В этом столбце содержится идентификатор отдела, в котором работает каждый сотрудник.
А также в таблице company_departments каждый отдел также имеет идентификатор (который является первичным ключом в таблице). Это означает, что мы можем соответствовать сотруднику department_id со списком отделов. Это позволит нам узнать название отдела, в котором работает этот сотрудник.
Давайте напишем запрос, который извлекает имя сотрудника, его должность и название отдела, в котором они работают:
SELECT Employees.Name, Employees.Title, Company_Departments.Name
FROM Employees
INNER JOIN Company_Departments
ON Employees.Department_ID = Company_Departments.Department_ID;
Наш запрос возвращает следующие совпадающие строки:
имя | заглавие | имя |
Алексис | Сотрудник по продажам | Продажи |
Джефф | Старший специалист по продажам | Продажи |
Ханна | Сотрудник по продажам | Продажи |
Майк | Сотрудник по продажам | Продажи |
Люк | Сотрудник по продажам | Продажи |
Эмма | Директор по маркетингу | Маркетинг |
Иона | Вице-президент по продажам | Исполнительный |
В первой строке мы говорим базе данных получить имя и должность сотрудника из таблицы сотрудников. Мы также получаем название отдела компании из таблицы company_departments.
Во второй строке мы указываем, что хотим получить информацию о сотрудниках из таблицы сотрудников. Затем мы используем наше ВНУТРЕННЕЕ СОЕДИНЕНИЕ, чтобы связать нашу таблицу сотрудников с таблицей company_departments, которая включает названия отделов.
Наконец, наша последняя линия связи как сотрудников и company_departments таблицы вместе по их общих полей, в этом случае department_id.
Вывод
Оператор SQL INNER JOIN извлекает записи с двумя совпадающими значениями столбцов в двух таблицах. Оператор ON позволяет вам указать условия, при которых выполняется ваше внутреннее соединение.
Освоение объединений — важная часть запросов к базам данных SQL, и это понимание приблизит вас на один шаг к тому, чтобы стать экспертом по SQL.QL.
что это, как работает, виды соединений таблиц, отличия LEFT, RIGHT JOIN, операторы и синтаксис
SQL — Simple Query Language, то есть «простой язык запросов». Его создали, чтобы работать с реляционными базами данных. В таких базах данные представлены в виде таблиц. Зависимости между несколькими таблицами задают с помощью связующих — реляционных столбцов.
Когда запрашиваем данные из одной таблицы, работа со связующими столбцами не нужна. Но если нужно агрегировать данные из нескольких, стоит описать правила: как будут связаны строки на основе значений связующих столбцов. Тогда на помощь и приходит оператор join.
Что такое оператор join в SQL
Join — оператор, который используют, чтобы объединять строки из двух или более таблиц на основе связующего столбца между ними. Такой столбец еще называют ключом.
Предположим, что у нас есть таблица заказов — Orders:
OrderID | CustomerID | OrderDate |
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
И таблица клиентов — Customers:
CustomerID | CustomerName | ContactName |
21 | Балалайка Сервис | Иван Иванов |
22 | Рога и копыта | Семён Семёнов |
23 | Редиска Менеджмент | Пётр Петров |
Столбец CustomerID в таблице заказов соотносится со столбцом CustomerID в таблице клиентов.
</p> <p>SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate </p> <p>FROM Orders </p> <p>JOIN Customers </p> <p>ON Orders.CustomerID=Customers.CustomerID;</p> <p>
Результат запроса будет выглядеть так:
OrderID | CustomerName | OrderDate |
304101 | Балалайка Сервис | 10-05-2021 |
304103 | Редиска Менеджмент | 25-07-2021 |
Общий синтаксис оператора join:
JOIN <Название таблицы для присоединения> ON <Условие присоединения на основе связующих столбцов>
Соединять можно и больше двух таблиц: к запросу добавьте еще один оператор join. Например, в дополнение к предыдущим двум таблицам у нас есть таблица продавцов — Managers:
OrderID | ManagerName | ContactDate |
304101 | Артём Лапин | 05-05-2021 |
304102 | Егор Орлов | 15-06-2021 |
304103 | Евгений Соколов | 20-07-2021 |
Таблица продавцов связана с таблицей заказов столбцом OrderID. Чтобы в дополнение к предыдущему запросу узнать, какой продавец обслуживал заказ, составьте следующий запрос:
</p> <p>SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate, Managers.ManagerName </p> <p>FROM Orders </p> <p>JOIN Customers </p> <p>ON Orders.CustomerID=Customers.CustomerID </p> <p>JOIN Managers </p> <p>ON Orders.OrderId=Managers.OrderId</p> <p>
Результат:
OrderID | CustomerName | OrderDate | ManagerName |
304101 | Балалайка Сервис | 10-05-2021 | Артём Лапин |
304103 | Редиска Менеджмент | 25-07-2021 | Евгений Соколов |
Внутреннее соединение INNER JOIN
Если использовать оператор INNER JOIN, в результат запроса попадут только те записи, для которых выполняется условие объединения. Еще одно условие — записи должны быть в обеих таблицах. В финальный результат из примера выше не попали записи с CustomerID=23 и OrderID=304102: для них нет соответствия в таблицах.
Общий синтаксис запроса INNER JOIN:
</p> <p>SELECT column_name(s)</p> <p>FROM table1</p> <p>INNER JOIN table2</p> <p>ON table1.column_name = table2.column_name;</p> <p>
Иллюстрация работы INNER JOIN
Слово INNER в запросе можно опускать, тогда общий синтаксис запроса будет выглядеть так:
</p> <p>SELECT column_name(s)</p> <p>FROM table1</p> <p>INNER JOIN table2</p> <p>ON table1.column_name = table2.column_name;</p> <p>
Внешние соединения OUTER JOIN
Если использовать внешнее соединение, то в результат запроса попадут не только записи с совпадениями в обеих таблицах, но и записи одной из таблиц целиком. Этим внешнее соединение отличается от внутреннего.
Указание таблицы, из которой нужно выбрать все записи без фильтрации, называется направлением соединения.
LEFT OUTER JOIN / LEFT JOIN
В финальный результат такого соединения попадут все записи из левой, первой таблицы. Даже если не будет ни одного совпадения с правой. И записи из второй таблицы, для которых выполняется условие объединения.
Иллюстрация работы LEFT JOIN
Синтаксис:
</p> <p>SELECT column_name(s)</p> <p>FROM table1</p> <p>LEFT JOIN table2</p> <p>ON table1.column_name = table2.column_name;</p> <p>
Пример:
Таблица Orders:
OrderID | CustomerID | OrderDate |
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Таблица Customers:
CustomerID | CustomerName | ContactName |
21 | Балалайка Сервис | Иван Иванов |
22 | Рога и копыта | Семён Семёнов |
23 | Редиска Менеджмент | Пётр Петров |
Запрос:
</p> <p>SELECT Orders. OrderID, Customers.CustomerName, Orders.OrderDate </p> <p>FROM Orders </p> <p>LEFT JOIN Customers </p> <p>ON Orders.CustomerID=Customers.CustomerID;</p> <p>
Результат:
OrderID | CustomerName | OrderDate |
304101 | Балалайка Сервис | 10-05-2021 |
304102 | null | 20-06-2021 |
304103 | Редиска Менеджмент | 25-07-2021 |
RIGHT OUTER JOIN / RIGHT JOIN
В финальный результат этого соединения попадут все записи из правой, второй таблицы. Даже если не будет ни одного совпадения с левой. И записи из первой таблицы, для которых выполняется условие объединения.
Иллюстрация работы RIGHT JOIN
Синтаксис:
</p> <p>SELECT column_name(s)</p> <p>FROM table1</p> <p>RIGHT JOIN table2</p> <p>ON table1. column_name = table2.column_name;</p> <p>
Пример:
Таблица Orders:
OrderID | CustomerID | OrderDate |
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Таблица Customers:
CustomerID | CustomerName | ContactName |
21 | Балалайка Сервис | Иван Иванов |
22 | Рога и копыта | Семён Семёнов |
23 | Редиска Менеджмент | Пётр Петров |
Запрос:
</p> <p>SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate </p> <p>FROM Orders </p> <p>RIGHT JOIN Customers </p> <p>ON Orders. CustomerID=Customers.CustomerID;</p> <p>
Результат:
OrderID | CustomerName | OrderDate |
304101 | Балалайка Сервис | 10-05-2021 |
null | Рога и копыта | null |
304103 | Редиска Менеджмент | 25-07-2021 |
FULL OUTER JOIN / FULL JOIN
В финальный результат такого соединения попадут все записи из обеих таблиц. Независимо от того, выполняется условие объединения или нет.
Иллюстрация работы FULL JOIN
Синтаксис:
</p> <p>SELECT column_name(s)</p> <p>FROM table1</p> <p>FULL JOIN table2</p> <p>ON table1.column_name = table2.column_name;</p> <p>
Пример:
Таблица Orders
OrderID | CustomerID | OrderDate |
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Таблица Customers:
CustomerID | CustomerName | ContactName |
21 | Балалайка Сервис | Иван Иванов |
22 | Рога и копыта | Семён Семёнов |
23 | Редиска Менеджмент | Пётр Петров |
Запрос:
</p> <p>SELECT Orders. OrderID, Customers.CustomerName, Orders.OrderDate </p> <p>FROM Orders </p> <p>FULL JOIN Customers </p> <p>ON Orders.CustomerID=Customers.CustomerID;</p> <p>
Результат:
OrderID | CustomerName | OrderDate |
304101 | Балалайка Сервис | 10-05-2021 |
304102 | null | 20-06-2021 |
304103 | Редиска Менеджмент | 25-07-2021 |
null | Рога и копыта | null |
Перекрестное соединение CROSS JOIN
Этот оператор отличается от предыдущих операторов соединения: ему не нужно задавать условие объединения (ON table1.column_name = table2.column_name). Записи в таблице с результатами — это результат объединения каждой записи из левой таблицы с записями из правой. Такое действие называют декартовым произведением.
Иллюстрация работы CROSS JOIN
Синтаксис:
</p> <p>SELECT column_name(s)</p> <p>FROM table1</p> <p>CROSS JOIN table2;</p> <p>
Пример:
Таблица Orders:
OrderID | CustomerID | OrderDate |
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Таблица Customers:
CustomerID | CustomerName | ContactName |
21 | Балалайка Сервис | Иван Иванов |
22 | Рога и копыта | Семён Семёнов |
23 | Редиска Менеджмент | Пётр Петров |
Запрос:
</p> <p>SELECT Orders. OrderID, Customers.CustomerName, Orders.OrderDate </p> <p>FROM Orders </p> <p>CROSS JOIN Customers;</p> <p>
Результат:
OrderID | CustomerName | OrderDate |
304101 | Балалайка Сервис | 10-05-2021 |
304101 | Рога и копыта | 10-05-2021 |
304101 | Редиска Менеджмент | 10-05-2021 |
304102 | Балалайка Сервис | 20-06-2021 |
304102 | Рога и копыта | 20-06-2021 |
304102 | Редиска Менеджмент | 20-06-2021 |
304103 | Балалайка Сервис | 25-07-2021 |
304103 | Рога и копыта | 25-07-2021 |
304103 | Редиска Менеджмент | 25-07-2021 |
Соединение SELF JOIN
Его используют, когда в запросе нужно соединить несколько записей из одной и той же таблицы.
В SQL нет отдельного оператора, чтобы описать SELF JOIN соединения. Поэтому, чтобы описать соединения данных из одной и той же таблицы, воспользуйтесь операторами JOIN или WHERE.
Учтите, что в одном запросе нельзя дважды использовать имя одной и той же таблицы: иначе запрос вернет ошибку. Поэтому, чтобы выполнить соединение таблицы SQL с самой собой, в запросе ей присваивают два разных временных имени — алиаса.
Синтаксис соединения SELF JOIN при использовании оператора JOIN:
</p> <p>SELECT column_name(s)</p> <p>FROM table1 a1</p> <p>JOIN table1 a2</p> <p>ON a1.column_name = a2.column_name;</p> <p>
Оператор JOIN может быть любым: используйте LEFT JOIN, RIGHT JOIN. Результат будет таким же, как когда объединяли две разные таблицы.
Синтаксис соединения SELF JOIN при использовании оператора WHERE:
</p> <p>SELECT column_name(s)</p> <p>FROM table1 a1, table1 a2</p> <p>WHERE a1. common_col_name = a2.common_col_name;</p> <p>
Пример:
Талица Students:
StudentID | Name | CourseID | Duration |
1 | Артём | 1 | 3 |
2 | Пётр | 2 | 4 |
1 | Артём | 2 | 4 |
3 | Борис | 3 | 2 |
2 | Ирина | 3 | 5 |
Запрос с оператором WHERE:
</p> <p>SELECT s1.StudentID, s1.Name</p> <p>FROM Students AS s1, Students s2</p> <p>WHERE s1.StudentID = s2.StudentID</p> <p>AND s1.CourseID <> s2.CourseID;</p> <p>
Результат:
StudentID | Name |
1 | Артём |
2 | Ирина |
1 | Артём |
2 | Пётр |
Запрос с оператором JOIN:
</p> <p>SELECT s1. StudentID, s1.Name</p> <p>FROM Students s1</p> <p>JOIN Students s2</p> <p>ON s1.StudentID = s2.StudentID</p> <p>AND s1.CourseID <> s2.CourseID</p> <p>GROUP BY StudentID;</p> <p>
Результат:
StudentID | Name |
1 | Артём |
2 | Ирина |
Главное о join в SQL
- В SQL используют операторы соединения join, чтобы объединять данные из нескольких таблиц. Когда результат должен содержать только данные двух таблиц с общим ключом, применяют INNER JOIN или просто JOIN.
- Если нужен полный список записей одной из таблиц, объединенных с данными из другой, используют операторы LEFT и RIGHT JOIN.
- Если результат должен содержать полный список записей обеих таблиц, где некоторые записи объединены, применяют оператор FULL JOIN.
- Если нужно декартово произведение двух таблиц, используют оператор CROSS JOIN. Хотите соединить данные из одной и той же таблицы между собой — нужен SELF JOIN.
Научитесь писать SQL-запросы на курсе «Аналитик данных» Skypro. Изучите агрегатные функции, подзапросы и WITH, JOIN, оконные функции и многое другое, а еще — решите бизнес-задачу с помощью SQL.
Еще в программе: базовые формулы Excel, работа в Power Pivot и Power Query, Python для анализа данных. Справитесь и без опыта в IT: учим с азов, ведем до диплома и помогаем найти работу.
SQL INNER JOIN (с примерами)
В этом руководстве мы узнаем о SQL INNER JOIN с помощью примеров.
SQL INNER JOIN
объединяет две таблицы на основе общего столбца и выбирает записи с совпадающими значениями в этих столбцах.
Пример
ВЫБЕРИТЕ Customers.customer_id, Customers.first_name, Orders.amount ОТ клиентов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders. customer;
Вот как работает этот код:
Пример: SQL INNER JOINЗдесь команда SQL выбирает столбцы customer_id и first_name (из таблицы Customers ) и столбец amount (из таблицы Orders ).
И результирующий набор будет содержать те строки, в которых есть совпадение между customer_id (из таблицы Customers ) и customer (из таблицы Orders ).
Синтаксис ВНУТРЕННЕГО СОЕДИНЕНИЯ
Синтаксис INNER JOIN
:
SELECT столбцы ИЗ таблицы1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблица2 ON table1.column_name = table2.column_name;
INNER JOIN с предложением WHERE
Вот пример INNER JOIN
с предложением WHERE:
SELECT Customers.customer_id, Customers.first_name, Orders.amount ОТ клиентов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders. customer ГДЕ Orders.amount >= 500;
Здесь команда SQL объединяет две таблицы и выбирает строки, в которых Сумма на больше или равна 500 .
SQL INNER JOIN с псевдонимом AS
Мы можем использовать псевдонимы AS внутри INNER JOIN
, чтобы сделать наш фрагмент коротким и чистым. Например,
SELECT C.cat_name, P.prod_title ИЗ Категории КАК С ВНУТРЕННЕЕ СОЕДИНЕНИЕ Продукты AS P ON C.cat_id= P.cat_id;
Здесь команда SQL выбирает общие строки между таблицей Категория и Продукты .
ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL с тремя таблицами
Мы также можем объединить более двух таблиц, используя INNER JOIN
. Например,
ВЫБРАТЬ C.customer_id, C.first_name, O.amount, S.status ОТ клиентов AS C ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы AS O ВКЛ C.customer_id = O.клиент ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доставка AS S ON C.customer_id = S.customer;
Здесь команда SQL
- объединяет таблицы Customers и Orders на основе customer_id
- и присоединяется к Клиентам и Таблица состояния на основе customer_id
Команда возвращает те строки, в которых есть совпадение между значениями столбцов в обоих условиях соединения.
Примечание: Для запуска этой команды в каждой отдельной таблице должен быть столбец customer_id .
Внутреннее соединение и другие соединения
Мы также можем использовать JOIN
вместо INNER JOIN
. По сути, эти два пункта одинаковы.
Значит,
ВЫБЕРИТЕ Customers.customer_id, Customers.first_name, Orders.amount ОТ клиентов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders.customer;
аналогично
ВЫБЕРИТЕ Customers.customer_id, Customers.first_name, Orders.amount ОТ клиентов ПРИСОЕДИНЯЙТЕСЬ к заказам ON Customers.customer_id = Orders.customer;
INNER JOIN
выбирает общие строки между двумя таблицами. Принимая во внимание, что LEFT JOIN
выбирает общие строки, а также все остальные строки из левой таблицы.
Давайте рассмотрим пример,
INNER JOIN
SELECT Customers.customer_id, Customers. first_name, Orders.amount ОТ клиентов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders.customer;
Вывод
Пример: SQL INNER JOIN ВыводLEFT JOIN
SELECT Customers.customer_id, Customers.first_name, Orders.amount ОТ клиентов ЛЕВОЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders.customer;
Вывод
Пример: SQL LEFT JOIN Вывод INNER JOIN
выбирает общие строки между двумя таблицами. Принимая во внимание, что RIGHT JOIN
выбирает общие строки, а также все остальные строки из правой таблицы.
Давайте рассмотрим пример,
INNER JOIN
SELECT Customers.customer_id, Customers.first_name, Orders.amount ОТ клиентов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders.customer;
Вывод
Пример: SQL INNER JOIN ВыводПРАВОЕ СОЕДИНЕНИЕ
SELECT Customers. customer_id, Customers.first_name, Orders.amount ОТ клиентов ПРАВОЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders.customer_id;
Вывод
Пример: SQL RIGHT JOIN Вывод INNER JOIN
выбирает общие строки между двумя таблицами. В то время как FULL OUTER JOIN
выбирает все строки из обеих таблиц.
Давайте посмотрим на пример,
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ВЫБЕРИТЕ Customers.customer_id, Customers.first_name, Orders.amount ОТ клиентов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders.customer;
Вывод
Пример: SQL INNER JOIN ВыводПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
SELECT Customers.customer_id, Customers.first_name, Orders.amount ОТ клиентов ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Заказы ON Customers.customer_id = Orders.customer;
Вывод
Пример: SQL FULL OUTER JOIN ВыводРекомендуемые показания
- SQL JOIN
- SQL ЛЕВОЕ СОЕДИНЕНИЕ
- SQL ПРАВОЕ СОЕДИНЕНИЕ
- SQL ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
Содержание
SQL Inner Join
В этой статье представлен обзор INNER JOIN
в SQL, а также несколько основных примеров.
SQL INNER JOIN
возвращает строки, если в обеих таблицах есть хотя бы одна строка, соответствующая условию соединения. Он отбрасывает несопоставленные строки из обеих таблиц. Это тип соединения по умолчанию.
Синтаксис
Существует два способа указать внутреннее соединение: в предложении FROM
(с использованием синтаксиса INNER JOIN
) или в предложении WHERE
.
Чтобы указать внутреннее соединение в предложении FROM
:
SELECT * ИЗ Таблицы 1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица 2 ON Таблица1.Столбец = Таблица2.Столбец;
Чтобы указать внутреннее соединение в предложении WHERE
:
SELECT * ИЗ Таблица1, Таблица2 ГДЕ Таблица1.Столбец = Таблица2.Столбец;
Ниже приведены примеры каждого из них.
Примеры
Здесь у нас есть примеры для каждого метода определения внутреннего соединения.
Sample Data
Во-первых, вот таблицы, которые мы будем использовать для примеров.
Таблица PetTypes
:
+-------------+------------+ | Идентификатор типа питомца | Тип питомца | |-------------+------------| | 1 | Птица | | 2 | Кот | | 3 | Собака | | 4 | Кролик | +-------------+-----------+ (затронуты 4 ряда)
Домашние животные
стол:
+---------+-------------+-----------+--- --------+------------+ | Идентификатор домашнего животного | Идентификатор типа питомца | Идентификатор владельца | Имя питомца | Дата рождения | |---------+--------------+-----------+------------+- -----------| | 1 | 2 | 3 | Пушистый | 20.11.2020 | | 2 | 3 | 3 | Получить | 2019-08-16 | | 3 | 2 | 2 | Скретч | 2018-10-01 | | 4 | 3 | 3 | Виляние | 2020-03-15 | | 5 | 1 | 1 | Твитнуть | 2020-11-28 | | 6 | 3 | 4 | Пушистый | 2020-09-17 | | 7 | 3 | 2 | Кора | NULL | | 8 | 2 | 4 | Мяу | NULL | +---------+-------------+-----------+------------+- -----------+ (затронуты 8 строк)
Таблица Владельцы
:
+------------+-------------+-------- ----+-+-------------------+ | Идентификатор владельца | Имя | Фамилия | Телефон | Электронная почта | |-----------+-------------+-------------+---------- ------+-------------------| | 1 | Гомер | Коннери | (308) 555-0100 | [электронная почта защищена] | | 2 | Барт | Питт | (231) 465-3497 | [электронная почта защищена] | | 3 | Нэнси | Симпсон | (489) 591-0408 | NULL | | 4 | Борис | Трамп | (349) 611-8908 | NULL | +-----------+-------------+------------+---------- ------+-------------------+
Обратите внимание, что:
- Столбец
PetTypeId
таблицыPets
является внешним ключомPetTypeId
таблицыPetTypes
(которая является первичным ключом этой таблицы). - Столбец
OwnerId
таблицыPets
является внешним ключом столбцаOwnerId
таблицыOwners
.
Пример с использованием синтаксиса INNER JOIN
Вот базовый пример указания внутреннего соединения с использованием синтаксиса INNER JOIN
.
ВЫБЕРИТЕ п.имя питомца, pt.PetType ОТ Pets p ВНУТРЕННЕЕ СОЕДИНЕНИЕ PetTypes pt ON p.PetTypeId = pt.PetTypeId;
Результат:
-----------+-----------+ | Имя питомца | Тип питомца | |-----------+------------| | Пушистый | Кот | | Получить | Собака | | Скретч | Кот | | Виляние | Собака | | Твитнуть | Птица | | Пушистый | Собака | | Кора | Собака | | Мяу | Кот | +-----------+------------+ (затронуто 8 рядов)
Чтобы указать внутреннее соединение в предложении FROM
, мы используем INNER JOIN
. Мы также используем ключевое слово ON
, чтобы определить предикат, который будет оцениваться для каждой пары соединенных строк.
Независимо от типа соединения мы уточняем имена наших столбцов с именами таблиц. Мы делаем это, чтобы избежать двусмысленности в отношении имен столбцов между таблицами. Обе таблицы могут иметь столбцы с одинаковыми именами (как в нашем примере), и в таких случаях СУБД не будет знать, на какой столбец вы ссылаетесь. Префикс имен столбцов с их именами таблиц гарантирует, что вы ссылаетесь на правильный столбец, и предотвращает любые ошибки, которые могут возникнуть из-за любой двусмысленности в отношении того, на какой столбец вы ссылаетесь.
В этом примере обе таблицы имеют столбец PetTypeId
. Столбец Pets.PetTypeId
является внешним ключом для столбца PetTypes.PetTypeId
, который является первичным ключом для этой таблицы.
В этом примере мы видим, что возвращаются все домашние животные, но возвращаются не все типы домашних животных. В таблице Pets
нет кроликов, поэтому тип питомца Rabbits
не возвращается.
Причина, по которой тип Rabbits
не возвращается, заключается в том, что INNER JOIN
возвращает строки только в том случае, если в обеих таблицах есть хотя бы одна строка, соответствующая условию соединения. В данном случае Rabbits
есть только в одной таблице (таблица PetTypes
).
Тип соединения не является обязательным
Обратите внимание, что тип соединения является необязательным. Поэтому большинство (если не все) СУБД позволяют опустить ключевое слово INNER
. Когда вы опускаете это (т.е. указываете только JOIN
), предполагается, что это внутреннее соединение.
Таким образом, мы могли бы переписать приведенный выше пример следующим образом:
ВЫБОР Pets.PetName, PetTypes.PetType ОТ домашних животных ПРИСОЕДИНЯЙТЕСЬ ON Pets.PetTypeId = PetTypes.PetTypeId;
Форматирование
Как и в любом операторе SQL, вы можете использовать пробелы, отступы и т. д. для форматирования запросов.
Например, предложение FROM
может быть на одной строке, если хотите:
SELECT Pets.PetName, PetTypes.PetType ОТ Pets ПРИСОЕДИНЯЙТЕСЬ к PetTypes ON Pets.PetTypeId = PetTypes.PetTypeId;
Когда вы пишете большие таблицы, объединяющие несколько таблиц, отступы могут сильно помочь.
Пример с использованием пункта WHERE
Вышеприведенное соединение также может называться эквивалентным соединением . Эквивалентное соединение — это соединение, содержащее только сравнения на равенство в предикате соединения.
Вот пример указания внутреннего соединения с использованием предложения WHERE
:
SELECT п.имя питомца, pt.PetType ИЗ Домашние животные р, PetTypes pt ГДЕ p.PetTypeId = pt.PetTypeId;
Результат:
+-----------+-----------+ | Имя питомца | Тип питомца | |-----------+------------| | Пушистый | Кот | | Получить | Собака | | Скретч | Кот | | Виляние | Собака | | Твитнуть | Птица | | Пушистый | Собака | | Кора | Собака | | Мяу | Кот | +-----------+------------+ (затронуто 8 рядов)
Результат тот же, что и в предыдущем примере.