INNER JOIN
INNER JOIN оставляет только строки, у которых нашлась пара в обеих таблицах. Это тип соединения по умолчанию. В уроке работаем с benn.college_football_players и benn.college_football_teams.
Как работает INNER JOIN
Заголовок раздела «Как работает INNER JOIN»Запись JOIN и INNER JOIN — одно и то же.
SELECT players.player_name, teams.conferenceFROM benn.college_football_players playersINNER JOIN benn.college_football_teams teams ON teams.school_name = players.school_name;Правила:
- Игрок, чьей школы нет в таблице команд, не попадёт в результат.
- Команда, у которой нет игроков, тоже не попадёт.
- Это пересечение двух таблиц.
Если в таблице команд три строки с одним названием школы, каждый игрок этой школы появится три раза. Строки умножаются.
В наших данных у каждого игрока есть команда. Поэтому INNER JOIN вернёт все 6935 строк.
Одинаковые имена столбцов
Заголовок раздела «Одинаковые имена столбцов»В обеих таблицах есть столбец school_name. Если взять players.* и teams.*, в результате будет два столбца с одним именем. Это неудобно.
SELECT players.*, teams.*FROM benn.college_football_players playersJOIN benn.college_football_teams teams ON teams.school_name = players.school_nameLIMIT 5;Чтобы избежать путаницы, называйте столбцы через AS:
SELECT players.school_name AS players_school_name, teams.school_name AS teams_school_nameFROM benn.college_football_players playersJOIN benn.college_football_teams teams ON teams.school_name = players.school_nameLIMIT 5;Практика
Заголовок раздела «Практика»Решайте сами, без AI. Сначала напишите запрос, потом сверьтесь с проверкой, и только потом открывайте решение.
Задание 1
Заголовок раздела «Задание 1»Напишите запрос, который покажет имена игроков, названия школ и конференции для школ из дивизиона FBS (Division I-A Teams).
Проверка: 5089 строк. Среди строк есть: Jamal Sullivan, Alabama, Southeastern.
Решение
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_nameWHERE teams.division = 'FBS (Division I-A Teams)';Задание 2
Заголовок раздела «Задание 2»Посчитайте игроков в каждом дивизионе.
Проверка: 2 строки: FBS (Division I-A Teams) — 5089, FCS (Division I-AA Teams) — 1846.
Решение
SELECT teams.division, COUNT(*) AS playersFROM benn.college_football_players playersINNER JOIN benn.college_football_teams teams ON teams.school_name = players.school_nameGROUP BY teams.divisionORDER BY teams.division;