SQL: Join

Теория: INNER JOIN и WHERE

Инструкция WHERE фильтрует данные в SELECT запросе. А INNER JOIN позволяется связывать данные из разных таблиц. В этом уроке мы научимся совместному использованию соединений и фильтрации.

Используем INNER JOIN вместе с WHERE

Рассмотрим пример с книгами и их авторами.

Таблица authors хранит имя и происхождение автора:

authors

author_idauthor_nameorigin
1Alexander PushkinRussia
2Mark TwainUSA
3Jules VerneFrance

Таблица books хранит название, ссылку на автора и язык, на котором издана книга. Разные переводы книги — это разные сущности в таблице:

books

book_idauthor_idtitlelanguage
5001Евгений ОнегинRussian
5011Eugene OneginEnglish
5022Приключения Тома СоераRussian
5032The Adventures of Tom SawyerEnglish
5043Вокруг света за восемьдесят днейRussian
5053Le tour du monde en quatre-vingts joursFrench

С помощью INNER JOIN мы можем связать каждую книгу с ее автором, а оператор WHERE позволяет отфильтровать строки по заданному условию.

Например, нам нужно получить список книг и их авторов — книги должны быть изданы на русском языке, а авторы должны быть иностранными. Следующий запрос решает нашу задачу:

SELECT
    authors.author_name,
    books.title
FROM books
INNER JOIN authors
    ON
        books.author_id = authors.author_id -- связываем книги с их авторами
WHERE
    books.language = 'Russian' -- издание на русском языке
    AND authors.origin != 'Russia' -- иностранный автор

Результат выполнения запроса:

author_nametitle
Mark TwainПриключения Тома Соера
Jules VerneВокруг света за восемьдесят дней

View on DB Fiddle

Логически СУБД выполняет запрос в следующем порядке:

  1. INNER JOIN — сначала выполняется соединение двух таблиц по условию: books.author_id = authors.author_id
  2. WHERE — затем применяется фильтрация строк с условием: books.language = 'русский' AND authors.origin != 'Россия'
  3. Отбрасываются все столбцы кроме author_name и title

В реальности СУБД может изменить порядок операций, чтобы получить такой же результат, но быстрее.

Выводы

В этом уроке мы изучили, как применять фильтрацию в запросах с соединением таблиц. Операторы WHERE и INNER JOIN обогащают возможности друг друга. Совмещая их, мы можем точнее описать желаемый набор данных.

Рекомендуемые программы