HTML Diff
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 &gt; '2023-01-02' с помощью оператора AND</li>
34 <li>Добавляем условие orders.order_date &gt; '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>