SQL: подзапросы против JOIN
Подзапросы и соединения — две важные концепции в SQL, стандартном языке программирования для управления базами данных и манипулирования ими. В этом блоге мы рассмотрим, что такое подзапросы и соединения, чем они отличаются и когда использовать каждый из них в ваших SQL-запросах.
Что такое подзапросы?
Подзапрос — это запрос внутри запроса. Это способ вложить оператор SELECT в другой оператор SELECT, INSERT, UPDATE или DELETE или в оператор CREATE VIEW. Подзапросы могут использоваться для выполнения различных задач, таких как:
- Фильтрация строк по условию
- Вычисление значений для использования во внешнем запросе
- Возврат одного значения или нескольких значений как часть внешнего запроса
Соединение — это способ объединения строк из двух или более таблиц на основе связанного столбца между ними. Существует несколько типов соединений, включая INNER JOIN, OUTER JOIN и CROSS JOIN.
INNER JOIN возвращает только те строки, которые соответствуют условию соединения.
ВНЕШНЕЕ СОЕДИНЕНИЕ возвращает все строки из обеих таблиц, включая те, которые не соответствуют условию соединения. Существует два типа внешних соединений: LEFT JOIN и RIGHT JOIN. LEFT JOIN возвращает все строки из левой таблицы (первая таблица в запросе) и любые совпадающие строки из правой таблицы. ПРАВОЕ СОЕДИНЕНИЕ возвращает все строки из правой таблицы (вторая таблица в запросе) и любые совпадающие строки из левой таблицы.
ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ возвращает декартово произведение двух таблиц, которое представляет собой комбинацию всех строк из обеих таблиц.
Практический пример:
В этом сценарии у нас есть база данных Хогвартса, и ниже перечислены следующие таблицы:
- Course_table: эта таблица содержит данные о названиях курсов и идентифицируется с помощью уникального первичного ключа.
- student_table: эта таблица содержит данные об именах учащихся, которые идентифицируются уникальным первичным ключом.
- enrollment_table: эта таблица является таблицей JOIN, которая устанавливает отношения между студентами и курсами. Каждый раз, когда студент записывается на курс, создается новая запись. id_курса — это внешний ключ для идентификации курса из таблицы_курсов, а ИД_студента — внешний ключ для идентификации учащегося из таблицы_студентов.
course:
+─────+────────────────────────────────+
| id | course |
+─────+────────────────────────────────+
| 1 | Defense against the dark arts |
| 2 | Potions |
| 3 | History of magic |
+─────+────────────────────────────────+
student:
+─────+────────────────────────────────+
| id | student |
+─────+────────────────────────────────+
| 1 | Harry Potter |
| 2 | Hermione Granger |
| 3 | Ron Weasly |
| 4 | Voldemort |
| 5 | Draco Malfoy |
+─────+────────────────────────────────+
enrollment:
+─────+────────────+─────────────+
| id | course_id | student_id |
+─────+────────────+─────────────+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 3 | 2 |
| 4 | 2 | 3 |
| 5 | 3 | 4 |
| 6 | 1 | 5 |
| 7 | 3 | 1 |
| 8 | 1 | 4 |
+─────+────────────+─────────────+
Ниже приведен пример подхода с подзапросом.
SELECT * FROM enrollment
WHERE enrollment.course_id IN (SELECT * FROM courses WHERE course_id = 1);
ПРИСОЕДИНИТЬСЯ
Ниже приведен подход Join.
SELECT * FROM course AS c
LEFT JOIN enrollment AS e ON c.id = e.course_id
WHERE e.course_id = 1
Когда использовать подзапросы и соединения
Подзапросы и соединения могут использоваться для извлечения данных из нескольких таблиц, но они имеют разные варианты использования. Подзапросы обычно используются, когда вы хотите использовать результаты внутреннего запроса в предложении WHERE или HAVING внешнего запроса. Они также полезны, когда вы хотите вернуть одно значение или несколько значений как часть внешнего запроса.
Соединения обычно используются, когда вы хотите получить данные из нескольких таблиц на основе связанного столбца между ними. Они также полезны, когда вы хотите вернуть все строки из обеих таблиц, включая те, которые не соответствуют условию соединения.
Как правило, подзапросы более эффективны, когда вам нужно вернуть только несколько строк, а соединения более эффективны, когда вам нужно вернуть большое количество строк. Однако разница в производительности между ними может варьироваться в зависимости от размера таблиц и сложности запросов.
В заключение, подзапросы и соединения являются двумя важными инструментами для получения данных из нескольких таблиц в SQL. Подзапросы полезны для фильтрации строк и возврата значений как части внешнего запроса, а соединения полезны для объединения строк из нескольких таблиц на основе связанного столбца. Оба могут использоваться для достижения схожих целей, но выбор того, какой из них использовать, зависит от конкретных требований вашего запроса.

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































