Инструкция WHERE
фильтрует данные в SELECT
запросе. А INNER JOIN
позволяется связывать данные из разных таблиц. В этом уроке мы научимся совместному использованию соединений и фильтрации.
Используем INNER JOIN
вместе с WHERE
Рассмотрим пример с книгами и их авторами.
Таблица authors
хранит имя и происхождение автора:
authors
author_id | author_name | origin |
---|---|---|
1 | Alexander Pushkin | Russia |
2 | Mark Twain | USA |
3 | Jules Verne | France |
Таблица books
хранит название, ссылку на автора и язык, на котором издана книга. Разные переводы книги — это разные сущности в таблице:
books
book_id | author_id | title | language |
---|---|---|---|
500 | 1 | Евгений Онегин | Russian |
501 | 1 | Eugene Onegin | English |
502 | 2 | Приключения Тома Соера | Russian |
503 | 2 | The Adventures of Tom Sawyer | English |
504 | 3 | Вокруг света за восемьдесят дней | Russian |
505 | 3 | Le tour du monde en quatre-vingts jours | French |
С помощью 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_name | title |
---|---|
Mark Twain | Приключения Тома Соера |
Jules Verne | Вокруг света за восемьдесят дней |
View on DB Fiddle
Логически СУБД выполняет запрос в следующем порядке:
INNER JOIN
— сначала выполняется соединение двух таблиц по условию:books.author_id = authors.author_id
WHERE
— затем применяется фильтрация строк с условием:books.language = 'русский' AND authors.origin != 'Россия'
- Отбрасываются все столбцы кроме
author_name
иtitle
В реальности СУБД может изменить порядок операций, чтобы получить такой же результат, но быстрее.
Выводы
В этом уроке мы изучили, как применять фильтрацию в запросах с соединением таблиц. Операторы WHERE
и INNER JOIN
обогащают возможности друг друга. Совмещая их, мы можем точнее описать желаемый набор данных.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.