1 added
1 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Не всегда аналитику достаточно самых базовых возможностей SQL. Иногда нужно составлять более сложные аналитические запросы, объединять информацию из разных источников, проводить анализ данных на основе связанных данных.</p>
1
<p>Не всегда аналитику достаточно самых базовых возможностей SQL. Иногда нужно составлять более сложные аналитические запросы, объединять информацию из разных источников, проводить анализ данных на основе связанных данных.</p>
2
<p>В таких случаях аналитики используют оператор JOIN - один из ключевых инструментов для объединения таблиц в SQL. Именно его мы изучим в этом уроке.</p>
2
<p>В таких случаях аналитики используют оператор JOIN - один из ключевых инструментов для объединения таблиц в SQL. Именно его мы изучим в этом уроке.</p>
3
<h2>Оператор JOIN</h2>
3
<h2>Оператор JOIN</h2>
4
<p>Оператор JOIN комбинирует строки из двух или более таблиц на основе заданных условий связи между ними. Он использует значения ключевых столбцов, чтобы найти связи между таблицами и создать новую результирующую таблицу.</p>
4
<p>Оператор JOIN комбинирует строки из двух или более таблиц на основе заданных условий связи между ними. Он использует значения ключевых столбцов, чтобы найти связи между таблицами и создать новую результирующую таблицу.</p>
5
<p>В SQL есть несколько видов объединений. Для наглядности возьмем таблицы, которые мы планируем объединить и представим в виде фигур на листе бумаги. В таком случае все виды объединений можно графически изобразить так:</p>
5
<p>В SQL есть несколько видов объединений. Для наглядности возьмем таблицы, которые мы планируем объединить и представим в виде фигур на листе бумаги. В таком случае все виды объединений можно графически изобразить так:</p>
6
<p>На схеме выше мы видим четыре оператора, которые используются для объединения данных разными способами:</p>
6
<p>На схеме выше мы видим четыре оператора, которые используются для объединения данных разными способами:</p>
7
<ol><li>INNER JOIN - возвращает строки, которые имеют совпадения в обеих таблицах по заданным условиям. Это самый распространенный тип объединения</li>
7
<ol><li>INNER JOIN - возвращает строки, которые имеют совпадения в обеих таблицах по заданным условиям. Это самый распространенный тип объединения</li>
8
<li>LEFT JOIN или LEFT OUTER JOIN - возвращает все строки из левой таблицы, а также соответствующие строки из правой таблицы по заданным условиям. Если в правой таблице нет соответствующих строк, то в результате будут отображаться NULL-значения. Это аналогично области левой таблицы</li>
8
<li>LEFT JOIN или LEFT OUTER JOIN - возвращает все строки из левой таблицы, а также соответствующие строки из правой таблицы по заданным условиям. Если в правой таблице нет соответствующих строк, то в результате будут отображаться NULL-значения. Это аналогично области левой таблицы</li>
9
<li>RIGHT JOIN или RIGHT OUTER JOIN - возвращает все строки из правой таблицы, а также соответствующие строки из левой таблицы по заданным условиям. Если в левой таблице нет соответствующих строк, то в результирующем наборе будут отображаться NULL-значения. Это аналогично области правой таблицы</li>
9
<li>RIGHT JOIN или RIGHT OUTER JOIN - возвращает все строки из правой таблицы, а также соответствующие строки из левой таблицы по заданным условиям. Если в левой таблице нет соответствующих строк, то в результирующем наборе будут отображаться NULL-значения. Это аналогично области правой таблицы</li>
10
<li>FULL JOIN или FULL OUTER JOIN - возвращает все строки из обеих таблиц и соответствующие строки по заданным условиям. Если в одной из таблиц нет соответствующих строк, то в результирующем наборе будут отображаться NULL-значения.</li>
10
<li>FULL JOIN или FULL OUTER JOIN - возвращает все строки из обеих таблиц и соответствующие строки по заданным условиям. Если в одной из таблиц нет соответствующих строк, то в результирующем наборе будут отображаться NULL-значения.</li>
11
</ol><h2>Синтаксис объединений и INNER JOIN</h2>
11
</ol><h2>Синтаксис объединений и INNER JOIN</h2>
12
<p>Итак, для объединения данных из разных таблиц мы будем использовать операторы объединений:</p>
12
<p>Итак, для объединения данных из разных таблиц мы будем использовать операторы объединений:</p>
13
<ul><li>INNER JOIN</li>
13
<ul><li>INNER JOIN</li>
14
<li>LEFT JOIN</li>
14
<li>LEFT JOIN</li>
15
<li>RIGHT JOIN</li>
15
<li>RIGHT JOIN</li>
16
<li>FULL JOIN</li>
16
<li>FULL JOIN</li>
17
</ul><p>Синтаксис объединений в SQL выглядит так:</p>
17
</ul><p>Синтаксис объединений в SQL выглядит так:</p>
18
<p>В этом запросе после оператора FROM мы указываем название левой таблицы - то есть той таблицы, к которой присоединяем данные. После INNER JOIN указываем название правой таблицы - то есть присоединяемой таблицы. В качестве условий объединения указываем показатели, которые связывают обе эти таблицы.</p>
18
<p>В этом запросе после оператора FROM мы указываем название левой таблицы - то есть той таблицы, к которой присоединяем данные. После INNER JOIN указываем название правой таблицы - то есть присоединяемой таблицы. В качестве условий объединения указываем показатели, которые связывают обе эти таблицы.</p>
19
<p>Для примера возьмем<a>нашу базу данных</a>, в которую мы добавили новую таблицу orders.</p>
19
<p>Для примера возьмем<a>нашу базу данных</a>, в которую мы добавили новую таблицу orders.</p>
20
<p>Таблица customers</p>
20
<p>Таблица customers</p>
21
<p>Tаблица orders</p>
21
<p>Tаблица orders</p>
22
<p>Выполним следующий запрос:</p>
22
<p>Выполним следующий запрос:</p>
23
<p>Итоговая таблица будет выглядеть так:</p>
23
<p>Итоговая таблица будет выглядеть так:</p>
24
<p>Этот запрос соединяет таблицы customers и orders с помощью INNER JOIN. Оператор INNER JOIN возвращает только те строки, где значения в столбце customer_id совпадают в обеих таблицах.</p>
24
<p>Этот запрос соединяет таблицы customers и orders с помощью INNER JOIN. Оператор INNER JOIN возвращает только те строки, где значения в столбце customer_id совпадают в обеих таблицах.</p>
25
<p>В результате этого запроса получим:</p>
25
<p>В результате этого запроса получим:</p>
26
<ul><li>Имена клиентов - customer_name</li>
26
<ul><li>Имена клиентов - customer_name</li>
27
<li>Даты заказов - order_date</li>
27
<li>Даты заказов - order_date</li>
28
</ul><p>Эти данные мы получим только для тех заказов, которые имеют соответствующие значения customer_id в обеих таблицах.</p>
28
</ul><p>Эти данные мы получим только для тех заказов, которые имеют соответствующие значения customer_id в обеих таблицах.</p>
29
<p>Иными словами, мы получим список имен клиентов и дат заказов для существующих связей между клиентами и заказами. Это помогает нам проанализировать поведение клиентов.</p>
29
<p>Иными словами, мы получим список имен клиентов и дат заказов для существующих связей между клиентами и заказами. Это помогает нам проанализировать поведение клиентов.</p>
30
<p>Допишем в этот запрос оператор AND после ON. Таким образом мы добавим дополнительное условие для объединения таблиц. Оно должно выполняться одновременно с условием объединения таблиц в операторе ON:</p>
30
<p>Допишем в этот запрос оператор AND после ON. Таким образом мы добавим дополнительное условие для объединения таблиц. Оно должно выполняться одновременно с условием объединения таблиц в операторе ON:</p>
31
<p>Мы получим:</p>
31
<p>Мы получим:</p>
32
<p>В этом случае мы:</p>
32
<p>В этом случае мы:</p>
33
<ul><li>Проверяем равенство customer_id в таблицах customers и orders</li>
33
<ul><li>Проверяем равенство customer_id в таблицах customers и orders</li>
34
<li>Добавляем условие orders.order_date > '2023-01-02' с помощью оператора AND</li>
34
<li>Добавляем условие orders.order_date > '2023-01-02' с помощью оператора AND</li>
35
</ul><p>Таким образом, запрос вернет имена клиентов customer_name и даты заказов order_date после указанной даты.</p>
35
</ul><p>Таким образом, запрос вернет имена клиентов customer_name и даты заказов order_date после указанной даты.</p>
36
<p>С помощью оператора AND можно добавить дополнительные условия для фильтрации данных при объединении таблиц - и таким образом получить более точный и специфический результат.</p>
36
<p>С помощью оператора AND можно добавить дополнительные условия для фильтрации данных при объединении таблиц - и таким образом получить более точный и специфический результат.</p>
37
<h2>Отношения в таблицах</h2>
37
<h2>Отношения в таблицах</h2>
38
<p>В SQL существуют три основных типа связей между таблицами:</p>
38
<p>В SQL существуют три основных типа связей между таблицами:</p>
39
<ul><li>"Один-ко-многим" (<em>One-to-Many</em>)</li>
39
<ul><li>"Один-ко-многим" (<em>One-to-Many</em>)</li>
40
<li>"Один-к-одному" (<em>One-to-One</em>)</li>
40
<li>"Один-к-одному" (<em>One-to-One</em>)</li>
41
<li>"Многие-ко-многим" (<em>Many-to-Many</em>)</li>
41
<li>"Многие-ко-многим" (<em>Many-to-Many</em>)</li>
42
</ul><p>Умение отличать эти связи друг от друга помогает правильно использовать оператор JOIN при объединении таблиц в SQL.</p>
42
</ul><p>Умение отличать эти связи друг от друга помогает правильно использовать оператор JOIN при объединении таблиц в SQL.</p>
43
<p>Для начала рассмотрим самый распространенный тип связи -<strong>"Один-ко-многим"</strong>(<em>One-to-Many</em>). При таком типе связи одна запись в одной таблице связана с несколькими записями в другой таблице.</p>
43
<p>Для начала рассмотрим самый распространенный тип связи -<strong>"Один-ко-многим"</strong>(<em>One-to-Many</em>). При таком типе связи одна запись в одной таблице связана с несколькими записями в другой таблице.</p>
44
<p>Например, у нас на складе есть десять ноутбуков одной и той же модели. Если мы продадим все ноутбуки разным людям, то эта модель будет входить в десять разных заказов.</p>
44
<p>Например, у нас на складе есть десять ноутбуков одной и той же модели. Если мы продадим все ноутбуки разным людям, то эта модель будет входить в десять разных заказов.</p>
45
<p>Это означает, что каждая запись в таблице products может быть связана с несколькими записями в таблице sales.</p>
45
<p>Это означает, что каждая запись в таблице products может быть связана с несколькими записями в таблице sales.</p>
46
<p>Посмотрим на примере такого запроса:</p>
46
<p>Посмотрим на примере такого запроса:</p>
47
<p>Выполнив этот запрос, мы увидим список товаров и количество продаж:</p>
47
<p>Выполнив этот запрос, мы увидим список товаров и количество продаж:</p>
48
<p>Рассмотрим еще один вид связи - <strong>"Один-к-одному"</strong>(<em>One-to-One</em>). При такой связи каждая запись в одной таблице имеет только одну связанную запись в другой таблице.</p>
48
<p>Рассмотрим еще один вид связи - <strong>"Один-к-одному"</strong>(<em>One-to-One</em>). При такой связи каждая запись в одной таблице имеет только одну связанную запись в другой таблице.</p>
49
<p>Например, каждый клиент в таблице customers может иметь только один заказ в таблице orders. Пример SQL-запроса с такой связью выглядит так:</p>
49
<p>Например, каждый клиент в таблице customers может иметь только один заказ в таблице orders. Пример SQL-запроса с такой связью выглядит так:</p>
50
<p>И вот такой результат мы получим:</p>
50
<p>И вот такой результат мы получим:</p>
51
<p>Рассмотрим третий вид связи -<strong>"Многие-ко-многим"</strong>(<em>Many-to-Many</em>). Этот тип связи возникает, когда множество записей в одной таблице связано с множеством записей в другой таблице. Для реализации такой связи нужна<strong>таблица-связь</strong>- это вспомогательная таблица, которая содержит связи между записями из обеих таблиц.</p>
51
<p>Рассмотрим третий вид связи -<strong>"Многие-ко-многим"</strong>(<em>Many-to-Many</em>). Этот тип связи возникает, когда множество записей в одной таблице связано с множеством записей в другой таблице. Для реализации такой связи нужна<strong>таблица-связь</strong>- это вспомогательная таблица, которая содержит связи между записями из обеих таблиц.</p>
52
<p>Рассмотрим эту связь в наших данных. Именно таким образом связаны товары и магазины - ведь множество товаров может быть связано с множеством магазинов. Для этого используется таблица-связь sales, которая содержит информацию о связи между продуктами и магазинами.</p>
52
<p>Рассмотрим эту связь в наших данных. Именно таким образом связаны товары и магазины - ведь множество товаров может быть связано с множеством магазинов. Для этого используется таблица-связь sales, которая содержит информацию о связи между продуктами и магазинами.</p>
53
<p>SQL-запрос может выглядеть так:</p>
53
<p>SQL-запрос может выглядеть так:</p>
54
<p>Такой результат мы получим при выполнении этого запроса:</p>
54
<p>Такой результат мы получим при выполнении этого запроса:</p>
55
<h2>Выводы</h2>
55
<h2>Выводы</h2>
56
<p>Сделаем краткие выводы:</p>
56
<p>Сделаем краткие выводы:</p>
57
<ul><li>Чтобы работать с аналитическими запросами в SQL, часто нужно объединять данные из нескольких таблиц</li>
57
<ul><li>Чтобы работать с аналитическими запросами в SQL, часто нужно объединять данные из нескольких таблиц</li>
58
<li>Оператор JOIN позволяет объединять строки из разных таблиц на основе заданных условий связи</li>
58
<li>Оператор JOIN позволяет объединять строки из разных таблиц на основе заданных условий связи</li>
59
<li>В SQL существуют различные типы объединений - INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN</li>
59
<li>В SQL существуют различные типы объединений - INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN</li>
60
<li>Связь "Один-ко-многим" (<em>One-to-Many</em>) означает, что одна запись в одной таблице может быть связана с несколькими записями в другой таблице</li>
60
<li>Связь "Один-ко-многим" (<em>One-to-Many</em>) означает, что одна запись в одной таблице может быть связана с несколькими записями в другой таблице</li>
61
<li>Связь "Один-к-одному" (<em>One-to-One</em>) означает, что каждая запись в одной таблице имеет только одну связанную запись в другой таблице</li>
61
<li>Связь "Один-к-одному" (<em>One-to-One</em>) означает, что каждая запись в одной таблице имеет только одну связанную запись в другой таблице</li>
62
<li>Связь "Многие-ко-многим" (<em>Many-to-Many</em>) означает, что каждая запись в одной таблице может быть связана с несколькими записями в другой таблице, и наоборот. Для реализации такой связи используется дополнительная таблица-связка</li>
62
<li>Связь "Многие-ко-многим" (<em>Many-to-Many</em>) означает, что каждая запись в одной таблице может быть связана с несколькими записями в другой таблице, и наоборот. Для реализации такой связи используется дополнительная таблица-связка</li>
63
</ul><p>В следующем уроке мы продолжим изучать разные способы объединения нескольких таблиц.</p>
63
</ul><p>В следующем уроке мы продолжим изучать разные способы объединения нескольких таблиц.</p>
64
<h3>Примечание</h3>
64
<h3>Примечание</h3>
65
<p>Вы можете подключиться к базе из лекции как:</p>
65
<p>Вы можете подключиться к базе из лекции как:</p>
66
-
<ul><li><em>Host</em>65.108.223.44</li>
66
+
<ul><li><em>Host</em>db.hexlet.app</li>
67
<li><em>Database</em>webinarsdb</li>
67
<li><em>Database</em>webinarsdb</li>
68
<li><em>Login</em>student</li>
68
<li><em>Login</em>student</li>
69
<li><em>Password</em>student</li>
69
<li><em>Password</em>student</li>
70
</ul>
70
</ul>