Что такое INNER JOIN в SQL?

Ответ

INNER JOIN — это операция соединения таблиц в SQL, которая возвращает только те строки, для которых условие соединения (ON) выполняется в обеих таблицах. Строки без соответствия исключаются из результирующего набора.

Пример:

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

В этом запросе в результат попадут только заказы, для которых существует соответствующий клиент в таблице Customers. Заказы без клиента или клиенты без заказов будут отфильтрованы.

Ключевые особенности и best practices:

  • Производительность: Обычно выполняется быстрее, чем OUTER JOIN, так как результирующий набор меньше. Для оптимизации важно иметь индексы на полях, используемых в условии ON.
  • Явное указание типа JOIN: Всегда используйте ключевое слово INNER для ясности, хотя JOIN по умолчанию во многих СУБД является внутренним.
  • Соединение нескольких таблиц: Можно последовательно соединять множество таблиц.
  • Альтернативный синтаксис: Эквивалентом является перечисление таблиц в FROM с условием в WHERE (старый синтаксис):
    SELECT Orders.OrderID, Customers.CustomerName
    FROM Orders, Customers
    WHERE Orders.CustomerID = Customers.CustomerID;

    Однако современный синтаксис с INNER JOIN считается более читаемым и явным.

Ответ 18+ 🔞

Давай разберем этот ваш INNER JOIN, а то некоторые думают, что это какая-то высшая математика. На самом деле всё просто, как три копейки, если не проще.

Представь, что у тебя есть две таблицы. Одна — список заказов, другая — список клиентов. И тебе надо вытащить заказы, но так, чтобы рядом было имя клиента, который этот заказ сделал. Вот тут-то он и пригождается, наш INNER JOIN.

Как это работает, на пальцах: Он берет строку из первой таблицы (заказы), смотрит на поле для связи (например, CustomerID) и идет искать ТОЧНО ТАКОЙ ЖЕ CustomerID во второй таблице (клиенты). Нашел — отлично, строка попадает в результат. Не нашел — ну, извини, братан, прощай. Никаких тебе компромиссов. Нет пары — нет строки в выдаче. Жестко, но честно.

Вот смотри на код, тут всё наглядно:

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

Перевод на человеческий: «Дай мне номера заказов и имена клиентов, но только для тех случаев, где айдишник клиента в заказе совпадает с айдишником клиента в справочнике клиентов». Всё. Клиенты без заказов нахуй не нужны, заказы с битым айди клиента — тоже в топку. Только строгое соответствие.

На что смотреть, чтобы не облажаться:

  • Скорость: Обычно он шустрый, потому что результат-то меньше. Но если таблицы — как шкафы в «Икее», а индексов на полях для связи нет, то жди. Он будет тупо каждую строку из одной таблицы со всеми строками из другой сравнивать. Это пиздец как долго. Индексы — твои лучшие друзья тут.
  • Читаемость: Пиши INNER JOIN всегда. Да, можно по-старинке в FROM через запятую таблицы перечислить, а условие в WHERE засунуть, но это выглядит как говнокод образца 90-х. Современный синтаксис с JOIN и ON — это красиво и понятно, как день.
  • Много таблиц: А если надо три таблицы соединить? Да хуй с ним, не проблема! Цепляй второй JOIN, потом третий. Главное, чтобы логика связей была ясна, а то можно такое наворотить, что сам потом не разберёшься.

Короче, INNER JOIN — это базовый, но охуенно важный инструмент. Понимаешь его — уже полдела сделано. Не понимаешь — ну, что ж, придется разбираться, иначе далеко не уедешь.