HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В предыдущем уроке мы немного затронули четыре разных типа соединений в SQL:</p>
1 <p>В предыдущем уроке мы немного затронули четыре разных типа соединений в SQL:</p>
2 <p>В этом уроке мы углубимся в эту тему. Мы продолжим знакомиться с темой разных соединений и уделим больше внимания FULL OUTER JOIN, а также LEFT JOIN и RIGHT JOIN.</p>
2 <p>В этом уроке мы углубимся в эту тему. Мы продолжим знакомиться с темой разных соединений и уделим больше внимания FULL OUTER JOIN, а также LEFT JOIN и RIGHT JOIN.</p>
3 <h2>INNER JOIN</h2>
3 <h2>INNER JOIN</h2>
4 <p>В прошлом уроке мы подробно рассмотрели INNER JOIN. Он возвращает только те строки, которые имеют совпадения в обеих таблицах по заданным условиям связи. Тип INNER JOIN чаще всего встречается при соединении таблиц. Например, он позволяет получить список всех клиентов, которые совершали заказы:</p>
4 <p>В прошлом уроке мы подробно рассмотрели INNER JOIN. Он возвращает только те строки, которые имеют совпадения в обеих таблицах по заданным условиям связи. Тип INNER JOIN чаще всего встречается при соединении таблиц. Например, он позволяет получить список всех клиентов, которые совершали заказы:</p>
5 <p>При таком соединении двух таблиц мы теряем записи по тем клиентам, которые присутствуют в таблице customers, но не совершали заказов.</p>
5 <p>При таком соединении двух таблиц мы теряем записи по тем клиентам, которые присутствуют в таблице customers, но не совершали заказов.</p>
6 <p>Чтобы не потерять эти записи, нам нужны другие типы соединений.</p>
6 <p>Чтобы не потерять эти записи, нам нужны другие типы соединений.</p>
7 <h2>LEFT JOIN и RIGHT JOIN</h2>
7 <h2>LEFT JOIN и RIGHT JOIN</h2>
8 <p>Чтобы не потерять записи, нам нужно объединить таблицы customers и orders так, чтобы нам вернулись все записи из customers и сопоставленные записи из orders.</p>
8 <p>Чтобы не потерять записи, нам нужно объединить таблицы customers и orders так, чтобы нам вернулись все записи из customers и сопоставленные записи из orders.</p>
9 <p>Для этого мы используем оператор LEFT JOIN. Если соответствия между customers и orders не будет найдено, мы вернем NULL на стороне таблицы orders.</p>
9 <p>Для этого мы используем оператор LEFT JOIN. Если соответствия между customers и orders не будет найдено, мы вернем NULL на стороне таблицы orders.</p>
10 <p>В контексте предыдущего запроса, мы можем использовать оператор LEFT JOIN следующим образом:</p>
10 <p>В контексте предыдущего запроса, мы можем использовать оператор LEFT JOIN следующим образом:</p>
11 <p>Как мы видим, синтаксис запроса ничем не отличается от предыдущего, кроме самого оператора JOIN. Сам запрос вернет такую таблицу:</p>
11 <p>Как мы видим, синтаксис запроса ничем не отличается от предыдущего, кроме самого оператора JOIN. Сам запрос вернет такую таблицу:</p>
12 <p>Появилась строка с клиентом по имени<em>Sarah</em>. При этом показатель order_date по этому клиенту содержит NULL - то есть Сара не совершала никаких заказов.</p>
12 <p>Появилась строка с клиентом по имени<em>Sarah</em>. При этом показатель order_date по этому клиенту содержит NULL - то есть Сара не совершала никаких заказов.</p>
13 <p>Теперь мы можем отделить этого клиента от других, задав специальный фильтр после оператора WHERE:</p>
13 <p>Теперь мы можем отделить этого клиента от других, задав специальный фильтр после оператора WHERE:</p>
14 <p>Как видите, WHERE order_date IS NULL помогает отфильтровать результаты и вывести только строки, в которых значение order_date равно NULL.</p>
14 <p>Как видите, WHERE order_date IS NULL помогает отфильтровать результаты и вывести только строки, в которых значение order_date равно NULL.</p>
15 <p>В контексте этого запроса NULL в поле order_date означает, что у клиента не было ни одного заказа. Другими словами, запрос возвращает имена клиентов, которые пока ничего не заказывали:</p>
15 <p>В контексте этого запроса NULL в поле order_date означает, что у клиента не было ни одного заказа. Другими словами, запрос возвращает имена клиентов, которые пока ничего не заказывали:</p>
16 <p>В SQL LEFT JOIN выбирает все записи из левой таблицы и соответствующие записи из правой. Так же работает и RIGHT JOIN, только в обратную сторону - выбирает все записи из правой таблицы и соответствующие записи из левой. Если соответствий там нет, результат будет NULL на стороне левой таблицы.</p>
16 <p>В SQL LEFT JOIN выбирает все записи из левой таблицы и соответствующие записи из правой. Так же работает и RIGHT JOIN, только в обратную сторону - выбирает все записи из правой таблицы и соответствующие записи из левой. Если соответствий там нет, результат будет NULL на стороне левой таблицы.</p>
17 <p>В нашем случае можно получить список всех заказов и соответствующих клиентов. Чтобы это сделать, присоединим таблицу orders (как правую) к таблице customers (как к левой) по полю customer_id:</p>
17 <p>В нашем случае можно получить список всех заказов и соответствующих клиентов. Чтобы это сделать, присоединим таблицу orders (как правую) к таблице customers (как к левой) по полю customer_id:</p>
18 <p>Этот запрос аналогичен тому, что мы делали ранее для LEFT JOIN, но таблицы поменялись местами.</p>
18 <p>Этот запрос аналогичен тому, что мы делали ранее для LEFT JOIN, но таблицы поменялись местами.</p>
19 <p>Обратите внимание на заказ с датой 2023-01-04 в правой таблице orders. Мы не нашли соответствующего имени клиента customer_name в таблице customers и поэтому вместо имени вернули NULL.</p>
19 <p>Обратите внимание на заказ с датой 2023-01-04 в правой таблице orders. Мы не нашли соответствующего имени клиента customer_name в таблице customers и поэтому вместо имени вернули NULL.</p>
20 <h2>FULL JOIN</h2>
20 <h2>FULL JOIN</h2>
21 <p>В SQL FULL JOIN или FULL OUTER JOIN помогает объединить две таблицы так, чтобы мы получили все записи из обеих таблиц, даже если для них нет соответствующих записей из другой таблицы.</p>
21 <p>В SQL FULL JOIN или FULL OUTER JOIN помогает объединить две таблицы так, чтобы мы получили все записи из обеих таблиц, даже если для них нет соответствующих записей из другой таблицы.</p>
22 <p>Если нет соответствующих записей, то значения в этих полях будут NULL:</p>
22 <p>Если нет соответствующих записей, то значения в этих полях будут NULL:</p>
23 <p>На примере все того же соединения данных по клиентам из таблицы customers и заказов из таблицы orders, мы можем с помощью FULL JOIN найти, какие клиенты еще не делали заказов, или какие заказы были сделаны клиентами не из нашей базы. Для этого используем фильтрацию WHERE … is NULL по показателю order_date:</p>
23 <p>На примере все того же соединения данных по клиентам из таблицы customers и заказов из таблицы orders, мы можем с помощью FULL JOIN найти, какие клиенты еще не делали заказов, или какие заказы были сделаны клиентами не из нашей базы. Для этого используем фильтрацию WHERE … is NULL по показателю order_date:</p>
24 <p>Также можно отфильтровать по параметру customer_name:</p>
24 <p>Также можно отфильтровать по параметру customer_name:</p>
25 <p>Практическая польза FULL JOIN в анализе данных заключается в том, что с его помощью аналитик может получить полный набор данных из обеих таблиц, включая записи, которые есть только в одной из таблиц.</p>
25 <p>Практическая польза FULL JOIN в анализе данных заключается в том, что с его помощью аналитик может получить полный набор данных из обеих таблиц, включая записи, которые есть только в одной из таблиц.</p>
26 <h2>Выводы</h2>
26 <h2>Выводы</h2>
27 <p>Кратко рассмотрим основные выводы из этого урока:</p>
27 <p>Кратко рассмотрим основные выводы из этого урока:</p>
28 <ol><li>INNER JOIN используется для соединения двух таблиц по общему полю так, что в результат попадают только те записи, для которых найдены совпадения в обеих таблицах. Так можно найти взаимосвязи между двумя наборами данных</li>
28 <ol><li>INNER JOIN используется для соединения двух таблиц по общему полю так, что в результат попадают только те записи, для которых найдены совпадения в обеих таблицах. Так можно найти взаимосвязи между двумя наборами данных</li>
29 <li>LEFT JOIN и RIGHT JOIN выбирают все записи из одной таблицы (левой или правой соответственно) и соответствующие записи из другой. Если соответствующих записей нет, вместо них вставляется NULL. Так мы можем увидеть все данные из одной таблицы независимо от наличия сопоставлений в другой</li>
29 <li>LEFT JOIN и RIGHT JOIN выбирают все записи из одной таблицы (левой или правой соответственно) и соответствующие записи из другой. Если соответствующих записей нет, вместо них вставляется NULL. Так мы можем увидеть все данные из одной таблицы независимо от наличия сопоставлений в другой</li>
30 <li>FULL JOIN возвращает все записи из обеих таблиц, даже если нет совпадений. Это полезно для получения полного набора данных из обеих таблиц и идентификации записей, которые есть только в одной из них</li>
30 <li>FULL JOIN возвращает все записи из обеих таблиц, даже если нет совпадений. Это полезно для получения полного набора данных из обеих таблиц и идентификации записей, которые есть только в одной из них</li>
31 </ol>
31 </ol>