JOIN
До сих пор мы работали с одной таблицей. Но данные обычно лежат в нескольких таблицах, и JOIN соединяет их. Это главная сила SQL. В этом уроке работаем с таблицами benn.college_football_players и benn.college_football_teams.
Зачем нужны JOIN
Заголовок раздела «Зачем нужны JOIN»Реляционная база хранит разные сущности в разных таблицах. Так данные не повторяются.
- В таблице игроков есть школа игрока, но нет конференции школы.
- В таблице команд есть конференция, но нет игроков.
- Школа (
school_name) есть в обеих таблицах. Это ключ для связи.
Чтобы узнать, в какой конференции игроки тяжелее всех, нужны обе таблицы.
Устройство JOIN
Заголовок раздела «Устройство JOIN»SELECT teams.conference AS conference, AVG(players.weight) AS average_weightFROM benn.college_football_players playersJOIN benn.college_football_teams teams ON teams.school_name = players.school_nameGROUP BY teams.conferenceORDER BY AVG(players.weight) DESC;Разберём запрос по частям:
| Часть | Что делает |
|---|---|
FROM ... players | Первая (левая) таблица |
JOIN ... teams | Вторая таблица |
ON teams.school_name = players.school_name | Условие: какие строки соединять |
GROUP BY, ORDER BY | Как обычно: группируют и сортируют результат |
Псевдонимы таблиц
Заголовок раздела «Псевдонимы таблиц»Имя benn.college_football_players длинное. Дайте таблице короткое имя: напишите его через пробел после имени таблицы.
SELECT players.player_name, players.school_nameFROM benn.college_football_players playersLIMIT 5;После этого столбцы указывают через псевдоним: players.player_name. Это то же самое, что benn.college_football_players.player_name.
JOIN и ON
Заголовок раздела «JOIN и ON»ON говорит базе, как сопоставить строки двух таблиц. Обычно это равенство ключей. Каждая строка слева ищет подходящие строки справа.
SELECT players.player_name, players.school_name, teams.conferenceFROM benn.college_football_players playersJOIN benn.college_football_teams teams ON teams.school_name = players.school_nameLIMIT 5;Какой именно тип соединения выбрать, расскажут следующие уроки: INNER JOIN, LEFT JOIN и другие.
Практика
Заголовок раздела «Практика»Решайте сами, без AI. Сначала напишите запрос, потом сверьтесь с проверкой, и только потом открывайте решение.
Задание 1
Заголовок раздела «Задание 1»Напишите запрос, который вернёт школу, имя игрока, позицию и вес каждого игрока из штата Georgia (GA). Отсортируйте по весу от самого тяжёлого к самому лёгкому. Дайте таблице псевдоним и указывайте все столбцы через него.
Проверка: 335 строк. Первая строка: Auburn, Brian Barnes, DL, 331.
Решение
SELECT players.school_name, players.player_name, players.position, players.weightFROM benn.college_football_players playersWHERE players.state = 'GA'ORDER BY players.weight DESC;Задание 2
Заголовок раздела «Задание 2»Посчитайте число игроков в каждой конференции. Для этого соедините игроков с командами. Сначала конференция с наибольшим числом игроков.
Проверка: первая строка: Southeastern, 799.
Решение
SELECT teams.conference, COUNT(*) AS playersFROM benn.college_football_players playersJOIN benn.college_football_teams teams ON teams.school_name = players.school_nameGROUP BY teams.conferenceORDER BY players DESC;