Инструкция 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_idWHERE— затем применяется фильтрация строк с условием:books.language = 'русский' AND authors.origin != 'Россия'- Отбрасываются все столбцы кроме
author_nameиtitle
В реальности СУБД может изменить порядок операций, чтобы получить такой же результат, но быстрее.
Выводы
В этом уроке мы изучили, как применять фильтрацию в запросах с соединением таблиц. Операторы WHERE и INNER JOIN обогащают возможности друг друга. Совмещая их, мы можем точнее описать желаемый набор данных.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.