Sql inner join: Оператор SQL INNER JOIN: синтаксис, примеры
Содержание
Оператор SQL INNER JOIN: синтаксис, примеры
Оператор SQL INNER JOIN формирует таблицу из записей двух или нескольких таблиц. Каждая строка из первой (левой) таблицы, сопоставляется с каждой строкой из второй (правой) таблицы, после чего происходит проверка условия. Если условие истинно, то строки попадают в результирующую таблицу. В результирующей таблице строки формируются конкатенацией строк первой и второй таблиц.
Оператор SQL INNER JOIN имеет следующий синтаксис:
SELECT column_names [,... n] FROM Table_1 INNER JOIN Table_2 ON condition
Условие для сравнения задается в операторе ON.
Примеры оператора SQL INNER JOIN. Имеются две таблицы:
Authors — содержит в себе информацию об авторах книг:
AuthorID | AuthorName |
1 | Bruce Eckel |
2 | Robert Lafore |
3 | Andrew Tanenbaum |
Books — содержит в себе информацию о названии книг:
BookID | BookName |
3 | Modern Operating System |
1 | Thinking in Java |
3 | Computer Architecture |
4 | Programming in Scala |
В таблице Books поле BookID являются внешним ключом и ссылаются на таблицу Authors.
Пример 1. Используя оператор SQL INNER JOIN вывести на экран, какими авторами были написаны какие из книг:
SELECT * FROM Authors INNER JOIN Books ON Authors.AuthorID = Books.BookID
В данном запросе оператора SQL INNER JOIN условие сравнения — это равенство полей AuthorID и BookID. В результирующую таблицу не попадет книга под названием Programming in Scala, так как значение ее BookID не найдет равенства ни с одной строкой AuthorID.
Результирующая таблица будет выглядеть следующим образом:
Authors.AuthorID | Authors.AuthorName | Books.BookID | Books.BookName |
3 | Andrew Tanenbaum | 3 | Modern Operating System |
1 | Bruce Eckel | 1 | Thinking in Java |
3 | Andrew Tanenbaum | 3 | Computer Architecture |
Команды JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN — связывание таблиц
Команды JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN используются
для связывания таблиц по определенным полям связи.
Синтаксис
SELECT поля FROM имя_таблицы
LEFT JOIN имя_связанной_таблицы ON условие_связи
WHERE условие_выборки
Примеры
Все примеры будут по таблицам countries и cities, если не сказано иное.
Таблица countries:
id айди | name имя |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
Таблица cities:
id айди | name имя | country_id айди страны |
---|---|---|
1 | Минск | 1 |
2 | Витебск | 1 |
3 | Москва | 2 |
4 | Питер | 2 |
5 | Лондон | 0 |
Пример . LEFT JOIN
В данном примере …:
SELECT
cities.id as city_id, cities.name as city_name, cities.country_id as city_country_id,
countries.id as country_id, countries.name as country_name
FROM cities
LEFT JOIN countries ON countries.id=cities.country_id
SQL запрос выберет следующие строки:
city_id айди города | city_name название города | city_country_id айди страны | country_id айди страны | country_name название страны |
---|---|---|---|---|
1 | Минск | 1 | 1 | Беларусь |
2 | Витебск | 1 | 1 | Беларусь |
3 | Москва | 2 | 2 | Россия |
4 | Питер | 2 | 2 | Россия |
5 | Лондон | 0 | NULL |
Пример . RIGHT JOIN
В данном примере …
Лондон не выберется,
а Украина наоборот
SELECT
cities.id as city_id, cities.name as city_name, cities.country_id as city_country_id,
countries.id as country_id, countries.name as country_name
FROM cities
RIGHT JOIN countries ON countries.id=cities.country_id
SQL запрос выберет следующие строки:
city_id айди города | city_name название города | city_country_id айди страны | country_id айди страны | country_name название страны |
---|---|---|---|---|
1 | Минск | 1 | 1 | Беларусь |
2 | Витебск | 1 | 1 | Беларусь |
3 | Москва | 2 | 2 | Россия |
4 | Питер | 2 | 2 | Россия |
NULL | NULL | NULL | 3 | Украина |
Пример . INNER JOIN
В данном примере …
Лондон и Украина не выберется
SELECT
cities.id as city_id, cities.name as city_name, cities.country_id as city_country_id,
countries.id as country_id, countries.name as country_name
FROM cities
INNER JOIN countries ON countries.id=cities.country_id
SQL запрос выберет следующие строки:
city_id айди города | city_name название города | city_country_id айди страны | country_id айди страны | country_name название страны |
---|---|---|---|---|
1 | Минск | 1 | 1 | Беларусь |
2 | Витебск | 1 | 1 | Беларусь |
3 | Москва | 2 | 2 | Россия |
4 | Питер | 2 | 2 | Россия |
INNER JOIN простыми словами | Techrocks
Перевод статьи «SQL INNER JOIN Explained in Simple Words».
Как известно, база данных хранит данные в таблицах. Скорее всего вы уже умеете писать запросы к одной таблице. Но что если требуется поработать с несколькими таблицами? Чтобы комбинировать данные из двух и более таблиц, нужно воспользоваться оператором JOIN. Сегодня на примерах разберемся, как работает INNER JOIN.
JOIN для двух таблиц
Наша тренировочная база данных будет состоять из двух таблиц: TRAVEL_PACK и CITIES:
Таблица TRAVEL_PACK
PACK_NAME | BEST_SEASON | PRICE | DURATION |
---|---|---|---|
United States: Big Cities | All year | $3500.00 | 10 days |
United States: West Coast | March to May | $3700.00 | 12 days |
South American Tour | August to November | $1850.00 | 18 days |
Beaches of Brazil | December to March | $2200.00 | 7 days |
TRAVEL_PACK
Таблица CITIES
NAME | TYPE_OF_CITY | PACK_NAME | DAYS_STAYING |
---|---|---|---|
San Francisco historica | historical | United States: West Coas | 5 |
Washington | historical | United States: Big Cities | 3 |
New York | business | United States: Big Cities | 7 |
Rio de Janeiro | beach | Beaches of Brazil | 4 |
Ushuaia | mountain | South American Tour | 3 |
Salvador de Bahia | beach | Beaches of Brazil | 3 |
Los Angeles | beach | United States: West Coast | 7 |
CITIES
Оператор JOIN объединяет записи таблиц по общему полю или колонке (т.е. такая колонка должна быть в каждой из таблиц). В нашем случае у нас есть колонка PACK_NAME в таблице TRAVEL_PACK и точно такая же — в таблице CITIES.
Легко заметить, что в обеих таблицах эта колонка называется одинаково. Но это не обязательно, и в других базах данных может быть иначе. Другими словами, при использовании оператора INNER JOIN названия общей колонки в таблицах могут совпадать, но могут и отличаться.
Первый JOIN — найдем путевки по приморским городам
Залог хорошего SQL-запроса — четкое понимание того, где хранятся нужные данные. В нашем случае очевидно, что для поиска названий путёвок понадобится TRAVEL_PACK, а проверить, находится ли город у моря, можно в таблице CITIES.
Комбинировать данные из двух таблиц можно с помощью конструкции JOIN. Она создает связь между таблицами и помогает отобразить данные из них единовременно. Условно говоря, из двух строк отдельных таблиц JOIN создает одну целую. Такой тип соединения называется INNER JOIN (впрочем, он является синонимом для JOIN). Наряду с этим видом часто используют LEFT, RIGHT, OUTER и много других типов JOIN.
Вот как JOIN создаёт соединённые строки с данными:
Синтаксис запроса с JOIN:
FROM table1 INNER JOIN table2 ON common column in table1 = common column in table2
Подставим в эту схему названия таблиц и колонок из тренировочной базы данных:
FROM CITIES INNER JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME FROM CITIES
После секции FROM с INNER JOIN
можно переходить к написанию SELECT
с WHERE
:
SELECT TRAVEL_PACK.PACK_NAME
Обратите внимание, что обращение к колонке PACK_NAME сделано с добавлением названия таблицы (TRAVEL_PACK). Это хорошая практика для случаев, когда в запросе задействовано больше одной таблицы.
При помощи оператора WHERE отфильтруем результаты, чтобы остались только приморские города:
WHERE CITIES.TYPE_OF_CITY = 'beach'
В результате должен получится вот такой запрос:
SELECT TRAVEL_PACK.PACK_NAME FROM CITIES JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME WHERE CITIES.TYPE_OF_CITY = 'beach'
А результатом его выполнения будет такой датасет:
NAME |
---|
Los Angeles |
Salvador de Bahia |
Rio de Janeiro |
Следующий шаг — найти города с путевками дешевле $2500.
По образу и подобию предыдущего запроса можно обратиться к двум известным таблицам CITIES и TRAVEL_PACK и соединить их с помощью INNER JOIN
(далее JOIN
и INNER JOIN
будут использоваться взаимозаменяемо).
По условиям задачи запрос из предыдущего раздела можно оставить почти неизменным — достаточно сделать легкие изменения в SELECT
и WHERE
.
Начнем с SELECT
, в нем обратимся к наименованию города:
SELECT CITY.NAME
В фильтрации WHERE
ограничим набор данных по стоимости:
WHERE TRAVEL_PACK.PRICE <= 2500
Полностью запрос будет выглядеть так:
SELECT CITY.NAME FROM CITIES JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME WHERE TRAVEL_PACK.PRICE <= 2500
А вернёт он такие данные:
NAME |
---|
Rio de Janeiro |
Ushuaia |
Salvador de Bahia |
Глубокое погружение: INNER JOIN для трёх таблиц
JOIN можно использовать не только с двумя, но и с большим числом таблиц. Для соединения каждой пары таблиц необходим один JOIN. Схематический пример:
FROM T1 JOIN T2 ON ...... JOIN T3 ON .......
Обратимся к практическому примеру. Добавим в базу данных новую таблицу STATES, в которой будем хранить данные о государствах, регионах и провинциях разных стран.
Таблица TRAVEL_PACK
PACK_NAME | BEST_SEASON | PRICE | DURATION |
---|---|---|---|
United States: Big Cities | All year | $3500.00 | 10 days |
United States: West Coast | March to May | $3700.00 | 12 days |
South American Tour | August to November | $1850.00 | 18 days |
Beaches of Brazil | December to March | $2200.00 | 7 days |
TRAVEL_PACK
Таблица STATES
NAME | COUNTRY | POPULATION | LANGUAGE |
---|---|---|---|
New York | United States | 17000000 | english |
Tierra del Fuego | Argentina | 190000 | spanish |
California | United States | 13400000 | english |
Rio de Janeiro | Brasil | 15000000 | portuguese |
Bahia | Brasil | 8000000 | portuguese |
STATES
Таблица CITIES
NAME | TYPE_OF CITY | PACK_NAME | DAYS_STAY | STATE |
---|---|---|---|---|
San Francisco | historical | United States: West Coast | 5 | California |
Washington | historical | United States: Big Cities | 3 | Washington |
New York | business | United States: Big Cities | 7 | New York |
Rio de Janeiro | beach | Beaches of Brazil | 4 | Rio de Janeiro |
Ushuaia | mountain | South American Tour | 3 | Tierra del Fuego |
Salvador de Bahia | beach | Beaches of Brazil | 3 | Bahia |
Los Angeles | beach | United States: West Coast | 7 | California |
CITIES
Запросим все туристические города из регионов, говорящих на испанском и португальском. Понятно, что нужно соединить таблицы CITIES и STATES, а затем приджоинить к ним TRAVEL_PACK. Приступим к решению задачи и используем знания из предыдущих частей этой статьи.
Во-первых, сделаем JOIN
для таблиц CITIES и STATES по колонкам CITIES.STATE
и STATE.NAME
:
FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
Сделаем JOIN
с третьей таблицей TRAVEL_PACK:
FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
Отполируем запрос с помощью SELECT
и WHERE
:
SELECT CITIES.NAME, STATES.NAME, TRAVEL_PACK.PACK_NAME, STATES.LANGUAGE FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME WHERE STATES.LANGUAGE IN ('spanish','portuguese')
Результат:
NAME | NAME | PACK_NAME | LANGUAGE |
---|---|---|---|
Salvador | Bahia | Beaches of Brazil | portuguese |
Rio de Janeiro | Rio de Janeiro | Beaches of Brazil | portuguese |
Ushuaia | Tierra del Fuego | South American Tour | spanish |
Итоги
В этой статье мы рассмотрели объединение записей в SQL-таблицах. Оператор JOIN открывает перед вами множество новых возможностей в использовании SQL.
От редакции Techrocks: Если хотите изучить не только INNER JOIN, но и другие виды объединений, обратите внимание на статью “SQL JOIN: руководство по объединению таблиц”.
INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN
Содержание:
Говоря про соединение таблиц в SQL, обычно подразумевают один из видов операции JOIN. Не стоит путать с объединением таблиц через операцию UNION. В этой статье я постараюсь простыми словами рассказать именно про соединение, чтобы после ее прочтения Вы могли использовать джойны в работе и не допускать грубых ошибок.
Соединение – это операция, когда таблицы сравниваются между собой построчно и появляется возможность вывода столбцов из всех таблиц, участвующих в соединении.
Придумаем 2 таблицы, на которых будем тренироваться.
Таблица «Сотрудники», содержит поля:
- id – идентификатор сотрудника
- Имя
- Отдел – идентификатор отдела, в котором работает сотрудник
id | Имя | Отдел |
---|---|---|
1 | Юлия | 1 |
2 | Федор | 2 |
3 | Алексей | NULL |
4 | Светлана | 2 |
Таблица «Отделы», содержит поля:
- id – идентификатор отдела
- Наименование
id | Наименование |
---|---|
1 | Кухня |
2 | Бар |
3 | Администрация |
Давайте уже быстрее что-нибудь покодим.
INNER JOIN
Самый простой вид соединения INNER JOIN – внутреннее соединение. Этот вид джойна выведет только те строки, если условие соединения выполняется (является истинным, т.е. TRUE). В запросах необязательно прописывать INNER – если написать только JOIN, то СУБД по умолчанию выполнить именно внутреннее соединение.
Давайте соединим таблицы из нашего примера, чтобы ответить на вопрос, в каких отделах работают сотрудники (читайте комментарии в запросе для понимания синтаксиса).
SELECT -- Перечисляем столбцы, которые хотим вывести Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел -- выводим наименование отдела и переименовываем столбец через as FROM -- таблицы для соединения перечисляем в предложении from Сотрудники -- обратите внимание, что мы не указали вид соединения, поэтому выполнится внутренний (inner) джойн JOIN Отделы -- условия соединения прописываются после ON -- условий может быть несколько, записанных через and, or и т.п. ON Сотрудники.Отдел = Отделы.id
Получим следующий результат:
id | Имя | Отдел |
---|---|---|
1 | Юлия | Кухня |
2 | Федор | Бар |
4 | Светлана | Бар |
Из результатов пропал сотрудник Алексей (id = 3), потому что условие «Сотрудники.Отдел = Отделы.id» не будет истинно для этой сроки из таблицы «Сотрудники» с каждой строкой из таблицы «Отделы». По той же логике в результате нет отдела «Администрация». Попробую это визуализировать (зеленные линии – условие TRUE, иначе линия красная):
Если не углубляться в то, как внутреннее соединение работает под капотом СУБД, то происходит примерно следующее:
- Каждая строка из одной таблицы сравнивается с каждой строкой из другой таблицы
- Строка возвращается, если условие сравнения является истинным
Если для одной или нескольких срок из левой таблицы (в рассмотренном примере левой таблицей является «Сотрудники», а правой «Отделы») истинным условием соединения будут являться одна или несколько срок из правой таблицы, то строки умножат друг друга (повторятся). В нашем примере так произошло для отдела с id = 2, поэтому строка из таблицы «Отделы» повторилась дважды для Федора и Светланы.
Перемножение таблиц проще ощутить на таком примере, где условие соединения будет всегда возвращать TRUE, например 1=1:
SELECT * FROM Сотрудники JOIN Отделы ON 1=1
В результате получится 12 строк (4 сотрудника * 3 отдела), где для каждого сотрудника подтянется каждый отдел.
Также хочу сразу отметить, что в соединении может участвовать сколько угодно таблиц, можно таблицу соединить даже саму с собой (в аналитических задачах это не редкость). Какая из таблиц будет правой или левой не имеется значения для INNER JOIN (для внешних соединений типа LEFT JOIN или RIGHT JOIN это важно. Читайте далее). Пример соединения 4-х таблиц:
SELECT * FROM Table_1 JOIN Table_2 ON Table_1.Column_1 = Table_2.Column_1 JOIN Table_3 ON Table_1.Column_1 = Table_3.Column_1 AND Table_2.Column_1 = Table_3.Column_1 JOIN Table_1 AS Tbl_1 -- Задаем алиас для таблицы, чтобы избежать неоднозначности -- Если в Table_1.Column_1 хранится порядковый номер какого-то объекта, -- то так можно присоединить следующий по порядку объект ON Table_1.Column_1 = Tbl_1.Column_1 + 1
Как видите, все просто, прописываем новый джойн после завершения условий предыдущего соединения. Обратите внимание, что для Table_3 указано несколько условий соединения с двумя разными таблицами, а также Table_1 соединяется сама с собой по условию с использованием сложения.
Строки, которые выведутся запросом, должны совпасть по всем условиям. Например:
- Строка из Table_1 соединилась со строкой из Table_2 по условию первого JOIN. Давайте назовем ее «объединенной строкой» из двух таблиц;
- Объединенная строка успешно соединилась с Table_3 по условию второго JOIN и теперь состоит из трех таблиц;
- Для объединенной строки не нашлось строки из Table_1 по условию третьего JOIN, поэтому она не выводится вообще.
На этом про внутреннее соединение и логику соединения таблиц в SQL – всё. Если остались неясности, то спрашивайте в комментариях.
Далее рассмотрим отличия остальных видов джойнов.
LEFT JOIN и RIGHT JOIN
Левое и правое соединения еще называют внешними. Главное их отличие от внутреннего соединения в том, что строка из левой (для LEFT JOIN) или из правой таблицы (для RIGHT JOIN) попадет в результаты в любом случае.
Давайте до конца определимся с тем, какая таблица левая, а какая правая.
Левая таблица та, которая идет перед написанием ключевых слов [LEFT | RIGHT| INNER] JOIN, правая таблица – после них:
SELECT * FROM Левая_таблица AS lt LEFT JOIN Правая_таблица AS rt ON lt.c = rt.c
Теперь изменим наш SQL-запрос из самого первого примера так, чтобы ответить на вопрос «В каких отделах работают сотрудники, а также показать тех, кто не распределен ни в один отдел?»:
SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Сотрудники LEFT JOIN Отделы -- добавляем только left ON Сотрудники.Отдел = Отделы.id
Результат запроса будет следующим:
id | Имя | Отдел |
---|---|---|
1 | Юлия | Кухня |
2 | Федор | Бар |
3 | Алексей | NULL |
4 | Светлана | Бар |
Как видите, запрос вернул все строки из левой таблицы «Сотрудники», дополнив их значениями из правой таблицы «Отделы». А вот строка для отдела «Администрация» не показана, т.к. для нее не нашлось совпадений слева.
Это мы рассмотрели пример для левого внешнего соединения. Для RIGHT JOIN будет все тоже самое, только вернутся все строки из таблицы «Отделы»:
id | Имя | Отдел |
---|---|---|
1 | Юлия | Кухня |
2 | Федор | Бар |
4 | Светлана | Бар |
NULL | NULL | Администрация |
Алексей «потерялся», Администрация «нашлась».
Вопрос для Вас. Что надо изменить в последнем приведенном SQL-запросе, чтобы результат остался тем же, но вместо LEFT JOIN, использовался RIGHT JOIN?
Ответ. Нужно поменять таблицы местами:
SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Отделы RIGHT JOIN Сотрудники ON Сотрудники.Отдел = Отделы.id
В одном запросе можно применять и внутренние соединения, и внешние одновременно, главное соблюдать порядок таблиц, чтобы не потерять часть записей (строк).
FULL JOIN
Еще один вид соединения, который осталось рассмотреть – полное внешнее соединение.
Этот вид джойна вернет все строки из всех таблиц, участвующих в соединении, соединив между собой те, которые подошли под условие ON.
Давайте посмотрим всех сотрудников и все отделы из наших тестовых таблиц:
SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Сотрудники FULL JOIN Отделы ON Сотрудники.Отдел = Отделы.id
id | Имя | Отдел |
---|---|---|
1 | Юлия | Кухня |
2 | Федор | Бар |
3 | Алексей | NULL |
4 | Светлана | Бар |
NULL | NULL | Администрация |
Теперь мы видим все, даже Алексея без отдела и Администрацию без сотрудников.
Вместо заключения
Помните о порядке выполнения соединений и порядке таблиц, если используете несколько соединений и используете внешние соединения. Можно выполнять LEFT JOIN для сохранения всех строк из самой первой таблицы, а последним внутренним соединением потерять часть данных. На маленьких таблицах косяк заметить легко, на огромных очень тяжело, поэтому будьте внимательны.
Рассмотрим последний пример и введем еще одну таблицу «Банки», в которой обслуживаются наши придуманные сотрудники:
id | Наименование |
---|---|
1 | Банк №1 |
2 | Лучший банк |
3 | Банк Лидер |
В таблицу «Сотрудники» добавим столбец «Банк»:
id | Имя | Отдел | Банк |
---|---|---|---|
1 | Юлия | 1 | 2 |
2 | Федор | 2 | 2 |
3 | Алексей | NULL | 3 |
4 | Светлана | 2 | 4 |
Теперь выполним такой запрос:
SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел, Банки.Наименование AS Банк FROM Сотрудники LEFT JOIN Отделы ON Сотрудники.Отдел = Отделы.id INNER JOIN Банки ON Сотрудники.Банк = Банки.id
В результате потеряли информацию о Светлане, т.к. для нее не нашлось банка с id = 4 (такое происходит из-за неправильной проектировки БД):
id | Имя | Отдел | Банк |
---|---|---|---|
1 | Юлия | Кухня | Лучший банк |
2 | Федор | Бар | Лучший банк |
3 | Алексей | NULL | Банк Лидер |
Хочу обратить внимание на то, что любое сравнение с неизвестным значением никогда не будет истинным (даже NULL = NULL). Эту грубую ошибку часто допускают начинающие специалисты. Подробнее читайте в статье про значение NULL в SQL.
Пройдите мой тест на знание основ SQL. В нем есть задания на соединения таблиц, которые помогут закрепить материал.
Дополнить Ваше понимание соединений в SQL могут схемы, изображенные с помощью кругов Эйлера. В интернете много примеров в виде картинок.
Если какие нюансы джойнов остались не раскрытыми, или что-то описано не совсем понятно, что-то надо дополнить, то пишите в комментариях. Буду только рад вопросам и предложениям.
Привожу простыню запросов, чтобы Вы могли попрактиковаться на легких примерах, рассмотренных в статье:
-- Создаем CTE для таблиц из примеров WITH Сотрудники AS( SELECT 1 AS id, 'Юлия' AS Имя, 1 AS Отдел, 2 AS Банк UNION ALL SELECT 2, 'Федор', 2, 2 UNION ALL SELECT 3, 'Алексей', NULL, 3 UNION ALL SELECT 4, 'Светлана', 2, 4 ), Отделы AS( SELECT 1 AS id, 'Кухня' AS Наименование UNION ALL SELECT 2, 'Бар' UNION ALL SELECT 3, 'Администрация' ), Банки AS( SELECT 1 AS id, 'Банк №1' AS Наименование UNION ALL SELECT 2, 'Лучший банк' UNION ALL SELECT 3, 'Банк Лидер' ) -- Если надо выполнить другие запросы, то сначала закоментируй это запрос с помощью /**/, -- а нужный запрос расскоментируй или напиши свой. -- Это пример внутреннего соединения SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Сотрудники JOIN Отделы ON Сотрудники.Отдел = Отделы.id /* -- Пример левого джойна SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Сотрудники LEFT JOIN Отделы ON Сотрудники.Отдел = Отделы.id */ /* -- Результат этого запроса будет аналогичен результату запроса выше, хотя соединение отличается SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Отделы RIGHT JOIN Сотрудники ON Сотрудники.Отдел = Отделы.id */ /* -- Правое соединение SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Сотрудники RIGHT JOIN Отделы ON Сотрудники.Отдел = Отделы.id */ /* -- Пример с использованием разных видов JOIN SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Отделы RIGHT JOIN Сотрудники ON Сотрудники.Отдел = Отделы.id LEFT JOIN Банки ON Банки.id = Сотрудники.Банк */ /* -- Полное внешние соединение SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел FROM Сотрудники FULL JOIN Отделы ON Сотрудники.Отдел = Отделы.id */ /* -- Пример с потерей строки из-за последнего внутреннего соединения SELECT Сотрудники.id, Сотрудники.Имя, Отделы.Наименование AS Отдел, Банки.Наименование AS Банк FROM Сотрудники LEFT JOIN Отделы ON Сотрудники.Отдел = Отделы.id INNER JOIN Банки ON Сотрудники.Банк = Банки.id */ /* -- Запрос с условием, которое всегда будет True SELECT * FROM Сотрудники JOIN Отделы ON 1=1 */
- < Назад
- Вперёд >
Если материалы office-menu.ru Вам помогли, то поддержите, пожалуйста, проект, чтобы я мог развивать его дальше.
Добавить комментарий
SQL join в примерах с описанием
Присоединение таблиц в запросах — это базовый инструмент в работе с базами данных. Давайте рассмотрим какие присоединения (JOIN) бывают, и что от этого меняется в результатах запроса.
Для начала создадим две таблицы, над которыми будем проводить опыты. Это таблица с именами сотрудников и словарь с перечнем должностей.
Persons (Сотрудники)
Positions (должности)
Т.е. чтобы узнать должность сотрудника, нужно присоединить соответствующие данные. Далее мы рассмотрим все варианты присоединений. Данные специально подобраны так, чтобы продемонстрировать отличия в результатах разных запросов.
INNER JOIN
Внутреннее присоединение. Равносильно просто JOIN или CROSS JOIN (верно для MYSQL, в стандарте SQL INNER JOIN не эквивалентен синтаксически CROSS JOIN, т.к. используется с выражением ON).
SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
INNER JOIN `positions` ps ON ps.id = p.post_id
| SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p INNER JOIN `positions` ps ON ps.id = p.post_id |
Такое присоединение покажет нам данные из таблиц только если условие связывания соблюдается — т.е. для сотрудника указан существующий в словаре идентификатор должности.
Если поменять порядок соединения таблиц — получим тот же результат.
Условно представим себе эти таблицы, как пересекающиеся множества, где пересечение — это наличие связи между таблицами. Получим картинку:
Далее проследим как получить разные части (подмножества) данного множества.
OUTER JOIN
Внешнее присоединение. Различают LEFT OUTER JOIN и RIGHT OUTER JOIN, и обычно опускают слово «OUTER».
Внешнее присоединение включает в себя результаты запроса INNER и добавляются «неиспользованные» строки из одной из таблиц. Какую таблицу использовать в качестве «добавки» — указывает токен LEFT или RIGHT.
LEFT JOIN
Внешнее присоединение «слева».
SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id
| SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id |
«Левая» таблица persons, содержит строку id#3 — «Александр», где указан идентификатор должности, отсутствующей в словаре.
На картинке это можно показать вот так:
RIGHT JOIN
Присоединение «справа».
SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id
| SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id |
Словарь должностей (правая таблица) содержит неиспользуемую запись с id#3 — «программист». Теперь она попала в результат запроса.
Полное множество
MySQL не знает соединения FULL OUTER JOIN. Что если нужно получить полное множество?
Первый способ — объединение запросов LEFT и RIGHT.
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id)
UNION
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id)
| (SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id) UNION (SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id) |
При таком вызове UNION, после слияния результатов, SQL отсечет дубли (как DISTINCT). Для отсечения дублей SQL прибегает к сортировке. Это может сказываться на быстродействии.
Второй способ — объединение LEFT и RIGHT, но в одном из запросов мы исключаем часть, соответствующую INNER. А объединение задаём как UNION ALL, что позволяет движку SQL обойтись без сортировки.
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id)
UNION ALL
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE p.id IS NULL)
| (SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id) UNION ALL (SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id WHERE p.id IS NULL) |
Этот пример показывает нам как исключить пересечение и получить только левую или правую часть множества.
Левое подмножество
LEFT JOIN ограничиваем проверкой, что данных из второй таблицы нет.
SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE ps.id is NULL
| SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id WHERE ps.id is NULL |
В нашем примере — это специалисты, у которых не задана должность или нет должности с указанным ключом.
Правое подмножество
Точно также выделяем правую часть.
SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE p.id is NULL
| SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id WHERE p.id is NULL |
В нашем случае получим должности, которые никому не назначены.
Всё кроме пересечения
Остался один вариант, тот когда исключено пересечение множеств. Его можно сложить из двух предыдущих запросов через UNION ALL (т.к. подмножества не пересекаются).
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE ps.id is NULL)
UNION ALL
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE p.id is NULL)
| (SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id WHERE ps.id is NULL) UNION ALL (SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность` FROM `persons` p RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id WHERE p.id is NULL) |
Данная запись опубликована в 19.09.2017 20:19 и размещена в mySQL.
Вы можете перейти в конец страницы и оставить ваш комментарий.
SQL оператор JOINS — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
В этом учебном материале вы узнаете, как использовать SQL JOINS с синтаксисом и примерами.
Описание
SQL JOINS используются для извлечения данных из нескольких таблиц. SQL JOIN выполняется всякий раз, когда две или более таблицы перечислены в операторе SQL.
Существует 4 различных типа соединений SQL:
Итак, давайте обсудим синтаксис SQL JOIN, рассмотрим наглядные иллюстрации SQL JOINS и рассмотрим несколько примеров.
SQL INNER JOIN (простое соединение)
Скорее всего, вы уже писали SQL запрос, который использует SQL INNER JOIN. Это наиболее распространенный тип соединения SQL. INNER JOIN возвращает все строки из нескольких таблиц, где выполняется условие соединения.
Синтаксис
Синтаксис INNER JOIN в SQL:
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
Рисунок.
На этом рисунке SQL INNER JOIN возвращает затененную область:
SQL INNER JOIN будет возвращать записи, где пересекаются table1 и table2.
Пример
Давайте рассмотрим пример использования INNER JOIN в запросе.
В этом примере у нас есть таблица customer и следующими данными:
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
5000 | Selena | Gomez | bing.com |
6000 | Mila | Kunis | yahoo.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
9000 | Russell | Crowe | google.com |
И таблица orders со следующими данными:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2019/06/18 |
2 | 5000 | 2019/06/18 |
3 | 8000 | 2019/06/19 |
4 | 4000 | 2019/06/20 |
5 | NULL | 2019/07/01 |
Выполним следующий SQL оператор:
SELECT customers.customer_id,
orders.order_id,
orders.order_date
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
| SELECT customers.customer_id, orders.order_id, orders.order_date FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id ORDER BY customers.customer_id; |
Будет выбрано 4 записи. Вот результаты, которые вы должны получить:
customer_id | order_id | order_date |
---|---|---|
4000 | 4 | 2019/06/20 |
5000 | 2 | 2019/06/18 |
7000 | 1 | 2019/06/18 |
8000 | 3 | 2019/06/19 |
В этом примере будут возвращены все строки из таблиц customers и orders, в которых совпадают значения поля customer_id в обоих таблицах.
Строки, где значение customer_id равен 6000 и 9000 в таблице customers, будут опущены, поскольку они не существуют в обеих таблицах. Строка, в которой значение order_id равно 5 из таблицы orders, будет опущена, поскольку customer_id со значением NULL не существует в таблице customers.
SQL LEFT OUTER JOIN
Другой тип соединения называется LEFT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с левосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны (выполняется условие соединения).
Синтаксис
Синтаксис для LEFT OUTER JOIN в SQL:
SELECT columns
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column = table2.column;
В некоторых базах данных ключевое слово OUTER опущено и записывается просто как LEFT JOIN.
Рисунок
На этом рисунке SQL LEFT OUTER JOIN возвращает затененную область:
SQL LEFT OUTER JOIN возвращает все записи из table1 и только те записи из table2, которые пересекаются с table1.
Пример
Теперь давайте рассмотрим пример, который показывает, как использовать LEFT OUTER JOIN в операторе SELECT.
Используя ту же таблицу customers, что и в предыдущем примере:
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
5000 | Selena | Gomez | bing.com |
6000 | Mila | Kunis | yahoo.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
9000 | Russell | Crowe | google.com |
И таблицу orders со следующими данными:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2019/06/18 |
2 | 5000 | 2019/06/18 |
3 | 8000 | 2019/06/19 |
4 | 4000 | 2019/06/20 |
5 | NULL | 2019/07/01 |
Введите следующий SQL оператор:
SELECT customers.customer_id,
orders.order_id,
orders.order_date
FROM customers
LEFT OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
| SELECT customers.customer_id, orders.order_id, orders.order_date FROM customers LEFT OUTER JOIN orders ON customers.customer_id = orders.customer_id ORDER BY customers.customer_id; |
Будет выбрано 6 записей. Вот результаты, которые вы получите:
customer_id | order_id | order_date |
---|---|---|
4000 | 4 | 2019/06/20 |
5000 | 2 | 2019/06/18 |
6000 | NULL | NULL |
7000 | 1 | 2019/06/18 |
8000 | 3 | 2019/06/19 |
9000 | NULL | NULL |
Этот пример LEFT OUTER JOIN вернул бы все строки из таблицы customers и только те строки из таблицы orders, в которых объединенные поля равны.
Если значение customer_id в таблице customers не существует в таблице orders, все поля таблицы orders будут отображаться как NULL в наборе результатов. Как вы можете видеть, строки, где customer_id равен 6000 и 9000, будут включены в LEFT OUTER JOIN, но поля order_id и order_date отображают NULL.
SQL RIGHT OUTER JOIN JOIN
Другой тип соединения называется SQL RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с правосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны (выполняется условие соединения).
Синтаксис
Синтаксис для RIGHT OUTER JOIN в SQL:
SELECT columns
FROM table1
RIGHT [OUTER] JOIN table2
ON table1.column = table2.column;
В некоторых базах данных ключевое слово OUTER опущено и записывается просто как RIGHT JOIN.
Рисунок
На этом рисунке SQL RIGHT OUTER JOIN возвращает затененную область:
SQL RIGHT OUTER JOIN возвращает все записи из table2 и только те записи из table1, которые пересекаются с table2.
Пример
Теперь давайте рассмотрим пример, который показывает, как использовать RIGHT OUTER JOIN в операторе SELECT.
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
5000 | Selena | Gomez | bing.com |
6000 | Mila | Kunis | yahoo.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
9000 | Russell | Crowe | google.com |
И таблицу orders со следующими данными:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2019/06/18 |
2 | 5000 | 2019/06/18 |
3 | 8000 | 2019/06/19 |
4 | 4000 | 2019/06/20 |
5 | NULL | 2019/07/01 |
Введите следующий SQL оператор:
SELECT customers.customer_id,
orders.order_id,
orders.order_date
FROM customers
RIGHT OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
| SELECT customers.customer_id, orders.order_id, orders.order_date FROM customers RIGHT OUTER JOIN orders ON customers.customer_id = orders.customer_id ORDER BY customers.customer_id; |
Будет выбрано 5 записей. Вот результаты, которые вы должны получить:
customer_id | order_id | order_date |
---|---|---|
NULL | 5 | 2019/07/01 |
4000 | 4 | 2019/06/20 |
5000 | 2 | 2019/06/18 |
7000 | 1 | 2019/06/18 |
8000 | 3 | 2019/06/19 |
Этот пример RIGHT OUTER JOIN вернул бы все строки из таблицы orders и только те строки из таблицы customers, где объединенные поля равны.
Если значение customer_id в таблице orders не существует в таблице customers, то все поля в таблице customers будут отображаться как NULL в наборе результатов. Как видите, строка, где order_id равен 5, будет включена в RIGHT OUTER JOIN, но в поле customer_id отображается NULL.
SQL FULL OUTER JOIN
Другой тип объединения называется SQL FULL OUTER JOIN. Этот тип объединения возвращает все строки из LEFT таблицы и RIGHT таблицы со значениями NULL в месте, где условие соединения не выполняется.
Синтаксис
Синтаксис для SQL FULL OUTER JOIN:
SELECT columns
FROM table1
FULL [OUTER] JOIN table2
ON table1.column = table2.column;
В некоторых базах данных ключевое слово OUTER опускается и записывается просто как FULL JOIN.
Рисунок
На этом рисунке SQL FULL OUTER JOIN возвращает затененную область:
SQL FULL OUTER JOIN возвращает все записи из таблиц table1 и table2.
Пример
Давайте рассмотрим пример, который показывает, как использовать FULL OUTER JOIN в операторе SELECT.
Используя ту же таблицу customers, что и в предыдущем примере:
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
5000 | Selena | Gomez | bing.com |
6000 | Mila | Kunis | yahoo.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
9000 | Russell | Crowe | google.com |
И таблицу orders со следующими данными:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2019/06/18 |
2 | 5000 | 2019/06/18 |
3 | 8000 | 2019/06/19 |
4 | 4000 | 2019/06/20 |
5 | NULL | 2019/07/01 |
Введите следующий SQL оператор:
SELECT customers.customer_id,
orders.order_id,
orders.order_date
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id;
Будет выбрано 7 записей. Вот результаты, которые вы получите:
customer_id | order_id | order_date |
---|---|---|
NULL | 5 | 2019/07/01 |
4000 | 4 | 2019/06/20 |
5000 | 2 | 2019/06/18 |
6000 | NULL | NULL |
7000 | 1 | 2019/06/18 |
8000 | 3 | 2019/06/19 |
9000 | NULL | NULL |
Это пример FULL OUTER JOIN будет возвращать все строки из таблицы orders и все строки из таблицы customers. Всякий раз, когда условие соединения не выполняется, значение NULL будет распространяться на эти поля в наборе результатов. Это означает, что если значение customer_id в таблице customers не существует в таблице orders, то все поля в таблице orders будут отображаться в наборе результатов как NULL Кроме того, если значение customer_id в таблице orders не существует в таблице customers, то все поля в таблице customers будут отображаться в наборе результатов как NULL.
Как видите, строки, где customer_id равен 6000 и 9000, будут включены, но поля order_id и order_date для этих записей содержат значение NULL. Строка, где order_id равен 5, также будет включена, но поле customer_id для этой записи имеет значение NULL.
Руководство по SQL. INNER JOIN. – PROSELYTE
INNER JOIN является наиболее часто встречающимся и наиболее важным видом слияния данных.
Данный вид слияния создаёт новую таблицу, которая комбинирует значения колонок двух таблиц на основе предиката слияния. Запрос сравнивает каждую запись первой таблицы с каждой записью второй таблицы для того, чтобы найти все пары записей, которые соответствуют предикату. Когда предикат верен, значения колонок каждой совпадающей пары комбинируются в результирующую запись.
Данный запрос имеет следующий вид:
SELECT таблица1.колонка1, таблица2.колонка2...
FROM таблица1
INNER JOIN таблицы2
ON таблицы1.общее_поле = таблица2.общее_поле;
Пример:
Предположим, что у нас есть две таблицы:
developers:
+----+-------------------+------------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | JavaScript | 3 | 2500 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
| 6 | Kolya Nikolaev | Javascript | 5 | 3400 |
| 7 | Ivan Ivanov | C# | 1 | 900 |
| 8 | Ludmila Geiko | UI/UX | 2 | 1800 |
+----+-------------------+------------+------------+--------+
tasks:
+---------+-------------+------------------+------------+--------------+
| TASK_ID | TASK_NAME | DESCRIPTION | DEADLINE | DEVELOPER_ID |
+---------+-------------+------------------+------------+--------------+
| 1 | Bug#123 | Fix company list | 2016-06-03 | 1 |
| 2 | Bug#321 | Fix registration | 2016-06-06 | 2 |
| 3 | Feature#777 | Latest actions | 2016-06-25 | 3 |
+---------+-------------+------------------+------------+--------------+
Попробуем выполнить следующий запрос:
mysql> SELECT ID, NAME, TASK_NAME, DEADLINE
FROM developers
INNER JOIN tasks
ON developers.ID = tasks.DEVELOPER_ID;
В результате мы получим следующую таблицу:
+----+-------------------+-------------+------------+
| ID | NAME | TASK_NAME | DEADLINE |
+----+-------------------+-------------+------------+
| 1 | Eugene Suleimanov | Bug#123 | 2016-06-03 |
| 2 | Peter Romanenko | Bug#321 | 2016-06-06 |
| 3 | Andrei Komarov | Feature#777 | 2016-06-25 |
+----+-------------------+-------------+------------+
Как видите, мы получили всех разработчиков, у которых есть задачи в таблице tasks.
На этом мы заканчиваем изучение INNER JOIN.
SQL присоединяется к
SQL JOIN
Предложение JOIN
используется для объединения строк из двух или более таблиц на основе
связанный столбец между ними.
Рассмотрим выборку из таблицы «Заказы»:
Код заказа | Идентификатор клиента | Дата заказа |
---|---|---|
10308 | 2 | 1996-09-18 |
10309 | 37 | 1996-09-19 |
10310 | 77 | 1996-09-20 |
Затем посмотрите на выбор из таблицы «Клиенты»:
Идентификатор клиента | Имя клиента | ContactName | Страна |
---|---|---|---|
1 | Альфредс Футтеркисте | Мария Андерс | Германия |
2 | Ana Trujillo Emparedados y helados | Ана Трухильо | Мексика |
3 | Антонио Морено Такерия | Антонио Морено | Мексика |
Обратите внимание, что столбец «CustomerID» в таблице «Заказы» относится к
«CustomerID» в таблице «Клиенты».Связь между двумя таблицами выше
столбец «CustomerID».
Затем мы можем создать следующий оператор SQL (который содержит
),
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
который выбирает записи, которые имеют совпадающие значения в обеих таблицах:
Пример
ВЫБЕРИТЕ Orders.OrderID, Customers.CustomerName, Orders.OrderDate
ИЗ Orders
ВНУТРЕННЕЕ СОЕДИНЕНИЕ клиентов НА Orders.CustomerID = Customers.CustomerID;
Попробуй сам »
, и он выдаст что-то вроде этого:
Код заказа | Имя клиента | Дата заказа |
---|---|---|
10308 | Ana Trujillo Emparedados y helados | 18.09.1996 |
10365 | Антонио Морено Такерия | 27.11.1996 |
10383 | Вокруг Рога | 16.12.1996 |
10355 | Вокруг Рога | 15.11.1996 |
10278 | Berglunds snabbköp | 12.08.1996 |
Различные типы SQL JOIN
Вот различные типы JOIN в SQL:
-
(INNER) JOIN
: возвращает записи, которые имеют совпадающие значения в обеих таблицах -
LEFT (OUTER) JOIN
: возвращает все записи из левой таблицы и соответствующие записи из правой таблицы -
RIGHT (OUTER) JOIN
: возвращает все записи из правой таблицы и сопоставленных
записи из левой таблицы -
ПОЛНОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ
: возвращает все записи, если есть совпадение в любом из левых
или правый стол
Пошаговое руководство по SQL Inner Join
Организации генерируют и анализируют непревзойденные объемы данных каждую минуту.В этой статье мы продемонстрируем, как мы можем использовать SQL Inner Join для запроса и доступа к данным из нескольких таблиц, которые хранят эти непрерывно растущие данные в базах данных SQL.
SQL присоединяется к
Прежде чем мы начнем с SQL Inner Join, я хотел бы вызвать здесь SQL Join. Присоединиться — это широко используемое предложение в SQL Server, по сути, для объединения и извлечения данных из двух или более таблиц. В реальной реляционной базе данных данные структурированы в виде большого количества таблиц, и поэтому существует постоянная потребность в объединении этих нескольких таблиц на основе логических отношений между ними.В SQL Server существует четыре основных типа объединений — внутреннее, внешнее (левое, правое, полное), самостоятельное и перекрестное соединение. Чтобы получить краткий обзор всех этих объединений, я бы порекомендовал пройти по этой ссылке, обзору типов соединений SQL и руководству.
Эта статья посвящена внутреннему соединению в SQL Server, так что давайте перейдем к ней.
Определение внутреннего соединения SQL
Предложение Inner Join в SQL Server создает новую таблицу (не физическую) путем объединения строк, имеющих совпадающие значения в двух или более таблицах.Это соединение основано на логической связи (или общем поле) между таблицами и используется для извлечения данных, которые появляются в обеих таблицах.
Предположим, у нас есть две таблицы, Таблица A и Таблица B, которые мы хотели бы объединить с помощью SQL Inner Join. Результатом этого соединения будет новый набор результатов, который возвращает совпадающие строки в обеих этих таблицах. В части пересечения, выделенной черным цветом ниже, показаны данные, полученные с помощью внутреннего соединения в SQL Server.
Синтаксис внутреннего соединения SQL Server
Ниже приведен базовый синтаксис Inner Join.
SELECT Column_list
FROM TABLE1
INNER JOIN TABLE2
ON Table1.ColName = Table2.ColName
Синтаксис внутреннего соединения в основном сравнивает строки таблицы 1 с таблицей 2, чтобы проверить, совпадает ли что-либо, на основе условия, указанного в предложении ON. Когда условие соединения выполнено, оно возвращает совпадающие строки в обеих таблицах с выбранными столбцами в предложении SELECT.
Предложение SQL Inner Join аналогично предложению Join и работает таким же образом, если мы не указываем тип (INNER) при использовании предложения Join.Короче говоря, Inner Join — это ключевое слово по умолчанию для Join, и оба могут использоваться взаимозаменяемо.
Примечание. В этой статье мы будем использовать ключевое слово «внутреннее» присоединение для большей ясности. Вы можете опустить его при написании запросов, а также можете использовать только «Присоединиться».
Внутреннее соединение SQL в действии
Давайте попробуем понять концепцию внутреннего соединения с помощью интересной выборки данных, касающейся пиццерии и ее распределения.Сначала я собираюсь создать две таблицы — таблицу PizzaCompany, которая управляет различными филиалами пиццерий в нескольких городах, и таблицу Foods, в которой хранятся данные о распределении продуктов питания в этих компаниях. Вы можете выполнить приведенный ниже код, чтобы создать и заполнить данные в этих двух таблицах. Все эти данные являются гипотетическими и их можно создать в любой из существующих баз данных.
СОЗДАТЬ ТАБЛИЦУ [dbo]. [PizzaCompany] ( [CompanyId] [int] IDENTITY (1,1) PRIMARY KEY CLUSTERED, [CompanyName] [varchar] (50), [CompanyCity] [ varchar] (30) ) УСТАНОВИТЬ IDENTITY_INSERT [dbo].[PizzaCompany] ВКЛ; ВСТАВИТЬ В [dbo]. [PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES (1, ‘Dominos’, ‘Los Angeles’); ВСТАВИТЬ В [dbo]. [PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES (2, «Pizza Hut», «Сан-Франциско»); ВСТАВИТЬ В [dbo]. [PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES (3, ‘Papa johns’, ‘San Diego’); ВСТАВИТЬ В [dbo]. [PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES (4, ‘Ah Pizz’, ‘Fremont’); ВСТАВИТЬ В [dbo].[PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) ЗНАЧЕНИЯ (5, «Нино Пицца», «Лас-Вегас»); ВСТАВИТЬ В [dbo]. [PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES (6, ‘Пиццерия’, ‘Бостон’); ВСТАВИТЬ В [dbo]. [PizzaCompany] ([CompanyId], [CompanyName], [CompanyCity]) VALUES (7, ‘chuck e cheese’, ‘Chicago’); ВЫБРАТЬ * ОТ PizzaКомпания: |
Вот так выглядят данные в таблице PizzaCompany:
Давайте сейчас создадим и заполним таблицу Foods.CompanyID в этой таблице — это внешний ключ, который ссылается на первичный ключ таблицы PizzaCompany, созданной выше.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 14 18 | СОЗДАТЬ ТАБЛИЦУ [dbo].[Foods] ( [ItemId] INT PRIMARY KEY CLUSTERED, [ItemName] Varchar (50), [UnitsSold] int, CompanyID int, FOREIGN KEY (CompanyID) REFERENCES Pizza ) ВСТАВИТЬ [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) ЗНАЧЕНИЯ (1, ‘Large Pizza’, 5,2) INSERT INTO [dbo ]. [Продукты] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES (2, ‘Garlic Knots’, 6,3) ВСТАВИТЬ В [dbo].[Продукты] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) ЗНАЧЕНИЯ (3, ‘Большая пицца’, 3,3) ВСТАВИТЬ [dbo]. [Foods] ([ItemId], [ ItemName], [UnitsSold], [CompanyId]) VALUES (4, ‘Средняя пицца’, 8,4) INSERT INTO [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId ]) VALUES (5, ‘Breadsticks’, 7,1) INSERT INTO [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId] »VALUES (6, ‘Medium Pizza’) , 11,1) INSERT INTO [dbo]. [Foods] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) VALUES (7, ‘Маленькая пицца’, 9,6) INSERT INTO [dbo].[Еда] ([ItemId], [ItemName], [UnitsSold], [CompanyId]) ЗНАЧЕНИЯ (8, ‘Маленькая пицца’, 6,7) ВЫБРАТЬ * ИЗ Foods |
В следующей таблице показаны данные из таблицы «Продукты питания». В этой таблице хранится такая информация, как количество проданных единиц продукта питания, а также точка доставки пиццы (CompanyId), которая ее доставляет.
Теперь, если мы хотим увидеть предметы, а также единицы, проданные каждой пиццерией, мы можем объединить эти две таблицы с помощью предложения внутреннего соединения, используемого в поле CompanyId (в нашем случае это имеет отношение внешнего ключа ).
SELECT pz.CompanyCity, pz.CompanyName, pz.CompanyId AS PizzaCompanyId, f.CompanyID AS FoodsCompanyId, f.ItemName, f.UnitsSold FROM PizzaCompany pz INNER JOIN Foods ON f CompanyId |
Ниже приведен набор результатов указанного выше запроса SQL Inner Join. Для каждой строки в таблице PizzaCompany функция Inner Join сравнивает и находит совпадающие строки в таблице Foods и возвращает все совпадающие строки, как показано ниже.И если вы заметили, CompanyId = 5 исключается из результата запроса, так как он не соответствует в таблице Foods.
С помощью приведенного выше набора результатов мы можем различить товары, а также количество товаров, доставленных пиццериями в разных городах. Например, Dominos доставил в Лос-Анджелес 7 хлебных палочек и 11 средних пицц.
Внутреннее соединение SQL для трех таблиц
Давайте подробнее рассмотрим это объединение и предположим, что в штате открываются три аквапарка (похоже, летом), и эти аквапарки передают еду на аутсорсинг в пиццерии, указанные в таблице PizzaCompany.
Я собираюсь быстро создать таблицу WaterPark и загрузить в нее произвольные данные, как показано ниже.
СОЗДАТЬ ТАБЛИЦУ [dbo]. [WaterPark] ( [WaterParkLocation] VARCHAR (50), [CompanyId] int, FOREIGN KEY (CompanyID) ССЫЛКИ PizzaSCompany (CompanyID) IN [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Улица 14’, 1) ВСТАВИТЬ В [dbo].[WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Boulevard 2’, 2) ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Rogers 54’, 4) ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Street 14’, 3) ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Rogers 54’, 5) ВСТАВИТЬ В [dbo]. [WaterPark] ([WaterParkLocation], [CompanyId]) ЗНАЧЕНИЯ (‘Boulevard 2’, 5) ВЫБРАТЬ * ИЗ WaterPark |
И ниже вывод этой таблицы.
Как говорится, картина стоит тысячи слов. Давайте быстро посмотрим на схему базы данных этих трех таблиц с их взаимосвязями, чтобы лучше понять их.
Теперь мы собираемся включить эту третью таблицу в предложение SQL Inner Join, чтобы увидеть, как это повлияет на набор результатов. Согласно данным в таблице «Аквапарк», три аквапарка передают еду на аутсорсинг всем пиццериям, кроме пиццерии (Id = 6) и Chuck e Cheese (Id = 7).Выполните приведенный ниже код, чтобы увидеть всю раздачу еды в аквапарках возле точек Pizza.
SELECT pz.CompanyId, pz.CompanyCity, pz.CompanyName, f.ItemName, f.UnitsSold, w.WaterParkLocation ОТ PizzaCompany pz INNER JOIN Foodpanys f ON pz.CompanyId = ПРИСОЕДИНЯЙТЕСЬ к аквапарку w.CompanyId = pz.CompanyId ЗАКАЗАТЬ pz.CompanyId |
На основе CompanyId SQL Inner Join сопоставляет строки в обеих таблицах, PizzaCompany (Таблица 1) и Foods (Таблица 2), а затем ищет совпадение в WaterPark (Таблица 3), чтобы вернуть строки.Как показано ниже, с добавлением внутреннего соединения в WaterPark, CompanyId (6,7 (кроме 5)) также исключается из окончательного набора результатов, поскольку условие w.CompanyId = pz.CompanyId не выполняется для идентификаторов (6, 7). Вот как внутреннее соединение SQL помогает возвращать определенные строки данных из нескольких таблиц.
Давайте углубимся в SQL Inner Join, добавив еще несколько предложений T-SQL.
Использование WHERE с внутренним соединением
Мы можем фильтровать записи на основе указанного условия, когда внутреннее соединение SQL используется с предложением WHERE.Предположим, мы хотели бы получить строки, в которых проданных единиц было больше 6.
В следующем запросе предложение WHERE добавляется для извлечения результатов со значением более 6 для проданных единиц.
SELECT pz.CompanyId, pz.CompanyCity, pz.CompanyName, f.ItemName, f.UnitsSold FROM PizzaCompany pz INNER JOIN Foods f ON pz.CompanyId = f.CompanyId WHERE f.U ЗАКАЗАТЬ pz.КомпанияCity |
Выполните приведенный выше код в SSMS, чтобы увидеть результат ниже. Этот запрос возвращает четыре таких записи.
Использование Group By с внутренним соединением
SQL Inner Join позволяет нам использовать предложение Group by вместе с агрегатными функциями для группировки набора результатов по одному или нескольким столбцам. Группировка по обычно работает с внутренним объединением по окончательному результату, возвращаемому после объединения двух или более таблиц. Если вы не знакомы с предложением Group by в SQL, я бы посоветовал пройти через это, чтобы быстро понять эту концепцию.Ниже приведен код, в котором используется предложение Group By с внутренним соединением.
SELECT pz.CompanyCity, pz.CompanyName, SUM (f.UnitsSold) AS TotalQuantitySold FROM PizzaCompany pz INNER JOIN Foods f ON pz.CompanyId = f.CompanyId GROUP BY pz.CompanyCity ЗАКАЗАТЬ pz.CompanyCity |
Здесь мы намерены получить общее количество товаров, проданных каждой пиццерией, присутствующей в городе.Как видно ниже, агрегированный результат в столбце «totalquantitysold» равен 18 (7 + 11) и 9 (6 + 3) для Лос-Анджелеса и Сан-Диего соответственно.
Краткое описание Equi и Theta Join
Прежде чем мы закончим эту статью, давайте быстро рассмотрим термины, которые разработчик SQL может время от времени слышать — Equi и Theta Join.
Equi Присоединиться
Как следует из названия, equi join содержит оператор равенства ‘=’ либо в предложении Join, либо в условии WHERE.SQL Inner, Left, Right — все равнозначные соединения, когда оператор «=» используется в качестве оператора сравнения. Обычно, когда упоминается внутреннее соединение SQL, оно рассматривается как внутреннее равное соединение, только в необычной ситуации оператор равенства не используется.
Чтобы упростить задачу, я собираюсь обратиться к образцу базы данных AdventureWorksDW2017 и запустить запрос к существующим таблицам, чтобы продемонстрировать, как выглядит равное соединение.
ВЫБРАТЬ e.EmployeeKey, e.FirstName, e.Title, e.HireDate, fs.SalesAmountQuota ОТ DimEmployee e INNER JOIN FactSalesQuota fs ON e.EmployeeKey = fs.Employee22Key |
Theta Join (Неравномерное соединение)
Неравномерное соединение в основном противоположно равнозначному соединению и используется, когда мы соединяемся с условием, отличным от оператора «=». На практике этот тип используется редко. Ниже приведен пример, в котором используется тета-соединение с оператором неравенства (<) для оценки прибыли путем оценки себестоимости и продажных цен в двух таблицах.
ВЫБРАТЬ * ИЗ Таблица1 T1, Таблица2 T2 ГДЕ T1.ProductCost |
Заключение
Я надеюсь, что эта статья о «Внутреннем соединении SQL» обеспечивает понятный подход к одному из важных и часто используемых предложений — «Внутреннее соединение» в SQL Server для объединения нескольких таблиц. Если у вас есть какие-либо вопросы, не стесняйтесь задавать их в разделе комментариев ниже.
Чтобы продолжить изучение SQL-соединений, вы можете обратиться к сообщениям ниже:
Гаури является специалистом по SQL Server и имеет более 6 лет опыта работы с международными международными консалтинговыми и технологическими организациями. Она очень увлечена работой над такими темами SQL Server, как База данных SQL Azure, Службы отчетов SQL Server, R, Python, Power BI, ядро базы данных и т. Д. Она имеет многолетний опыт работы с технической документацией и увлекается разработкой технологий.
Она имеет большой опыт в разработке решений для данных и аналитики, а также в обеспечении их стабильности, надежности и производительности. Она также сертифицирована по SQL Server и прошла такие сертификаты, как 70-463: Внедрение хранилищ данных с Microsoft SQL Server.
Посмотреть все сообщения от Gauri Mahajan
Последние сообщения от Gauri Mahajan (посмотреть все)
Внутреннее объединение SQL Server на практических примерах
Резюме : в этом руководстве вы узнаете, как использовать предложение SQL Server INNER JOIN
для запроса данных из нескольких таблиц.
Введение в SQL Server
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Внутреннее соединение — одно из наиболее часто используемых соединений в SQL Server. Предложение внутреннего соединения позволяет запрашивать данные из двух или более связанных таблиц.
См. Следующие продукты Категории
и
таблицы:
Следующий оператор извлекает информацию о продукте из таблицы production.products
:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT наименование товара, список цен, category_id ИЗ производство.продукты СОРТИРОВАТЬ ПО product_name DESC;
Запрос возвратил только список идентификационных номеров категорий, но не названия категорий. Чтобы включить имена категорий в набор результатов, используйте предложение INNER JOIN
следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT наименование товара, category_name, список цен ИЗ production.products p ВНУТРЕННЕЕ СОЕДИНЕНИЕ production.categories c ВКЛ c.category_id = p.category_id СОРТИРОВАТЬ ПО product_name DESC;
В этом запросе:
c
и p
— это псевдонимы таблиц production.categories
и production.products
таблиц . Таким образом, когда вы ссылаетесь на столбец в этой таблице, вы можете использовать псевдоним . Имя_столбца
вместо имя_таблицы.имя_столбца
. Например, в запросе используется c.category_id
вместо production.categories.category_id
. Следовательно, это избавляет вас от набора текста.
Для каждой строки в таблице production.products
предложение внутреннего соединения сопоставляет его с каждой строкой в таблице product.categories
на основе значений столбца category_id
:
- Если в обеих строках есть то же значение в столбце
category_id
, внутреннее соединение формирует новую строку, столбцы которой взяты из строк продукции.категории
иproduction.products
таблиц в соответствии со столбцами в списке выбора и включают эту новую строку в набор результатов. - Если строка в таблице
production.products
не соответствует строке из таблицыproduction.categories
, предложение внутреннего соединения просто вставляет эти строки и не включает их в набор результатов.
SQL Server
INNER JOIN
синтаксис
Ниже показан синтаксис предложения SQL Server INNER JOIN
:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT select_list ИЗ Т1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ T2 ON join_predicate;
В этом синтаксисе запрос извлекает данные из таблиц T1 и T2:
- Сначала укажите основную таблицу (T1) в
FROM
пункт - Во-вторых, укажите вторую таблицу в предложении
INNER JOIN
(T2) и предикате соединения.В набор результатов включаются только строки, которые заставляют предикат соединения оцениваться какИСТИНА
.
Предложение INNER JOIN
сравнивает каждую строку таблицы T1 со строками таблицы T2, чтобы найти все пары строк, которые удовлетворяют предикату соединения. Если предикат соединения оценивается как ИСТИНА
, значения столбцов совпадающих строк T1 и T2 объединяются в новую строку и включаются в набор результатов.
В следующей таблице показано внутреннее соединение двух таблиц T1 (1,2,3) и T2 (A, B, C).Результат включает строки: (2, A) и (3, B), поскольку они имеют одинаковые шаблоны.
Обратите внимание, что ключевое слово INNER
является необязательным, вы можете пропустить его, как показано в следующем запросе:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT select_list ИЗ Т1 ПРИСОЕДИНЯЙТЕСЬ к T2 ON join_predicate;
Дополнительные примеры внутреннего соединения SQL Server
См. Следующие таблицы продуктов , категорий
и брендов
:
В следующем утверждении используются два INNER JOIN
предложений для запроса данных из трех таблиц:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT наименование товара, category_name, имя бренда, список цен ИЗ производство.продукты p ВНУТРЕННЕЕ СОЕДИНЕНИЕ production.categories c ON c.category_id = p.category_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ production.brands b ON b.brand_id = p.brand_id СОРТИРОВАТЬ ПО product_name DESC;
В этом руководстве вы узнали, как использовать предложение SQL Server INNER JOIN
для запроса данных из нескольких таблиц.
SQL INNER JOIN — объединение двух или более таблиц
Сводка : в этом руководстве вы узнаете, как запрашивать данные из нескольких таблиц с помощью оператора SQL INNER JOIN .
В предыдущем руководстве вы узнали, как запрашивать данные из одной таблицы с помощью оператора SELECT. Однако часто требуется запросить данные из нескольких таблиц, чтобы получить полный набор результатов для анализа. Для запроса данных из нескольких таблиц вы используете операторы соединения.
SQL предоставляет несколько типов соединений, таких как внутреннее соединение, внешнее соединение (левое внешнее соединение или левое соединение, правое внешнее соединение или правое соединение и полное внешнее соединение) и самостоятельное соединение. В этом руководстве мы покажем вам, как использовать предложение INNER JOIN
.
Синтаксис SQL INNER JOIN
Ниже показан синтаксис INNER JOIN
для соединения двух таблиц:
SELECT столбец1, столбец2 ИЗ Таблица 1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ table_2 ON условие_соединения;
Давайте рассмотрим синтаксис выше более подробно:
-
table_1
иtable_2
называются соединенными таблицами. - Для каждой строки в
table_1
запрос находит соответствующую строку вtable_2
, которая удовлетворяет условию соединения . Если соответствующая строка найдена, запрос возвращает строку, содержащую данные из обеих таблиц . В противном случае он проверяет следующую строку вtable_1
, и этот процесс продолжается до тех пор, пока не будут проверены все строки вtable_1
.
Для объединения более двух таблиц применяется та же логика.
Примеры SQL INNER JOIN
SQL INNER JOIN — пример запроса данных из двух таблиц
В этом примере мы будем использовать таблицы продуктов
и категорий
в образце базы данных.На следующем рисунке показана схема базы данных.
На диаграмме выше:
- В одной категории может быть много товаров.
- Один товар относится к одной и только одной категории.
Следовательно, между строками в таблице категорий
и строками в таблице продуктов
существует отношение «многие к одному». Связью между двумя таблицами является столбец categoryid
.
Нам нужно запросить следующие данные из обеих таблиц:
-
productID
,productName
из таблицыproducts
. -
categoryName
из таблицыкатегорий
.
Следующий запрос извлекает данные из обеих таблиц:
SELECT productID, productName, categoryName ИЗ продукты ВНУТРЕННЕЕ СОЕДИНЕНИЕ категории НА category.categoryID = products.categoryID;
Условие соединения указывается в предложении INNER JOIN
после ключевого слова ON
в виде выражения:
категорий.categoryID = products.categoryID
Для каждой строки в таблице products
запрос находит соответствующую строку в таблице категорий
с таким же идентификатором категории .
Если есть совпадение между двумя строками в обеих таблицах, он возвращает строку, содержащую столбцы, указанные в предложении SELECT, то есть идентификатор продукта, имя продукта и имя категории; в противном случае он проверяет следующую строку в таблице продуктов
, чтобы найти соответствующую строку в таблице категорий
.Этот процесс продолжается до тех пор, пока не будет исследована последняя строка таблицы продуктов.
SQL INNER JOIN — запрос данных из трех таблиц
Мы можем использовать те же методы для соединения трех таблиц. Следующий запрос выбирает productID
, productName
, categoryName
и поставщик
из продуктов
, категорий
и поставщиков
таблиц:
Язык кода: PHP (php)
SELECT идантификационный номер продукта, наименование товара, categoryName, companyName AS поставщик ИЗ продукты ВНУТРЕННЕЕ СОЕДИНЕНИЕ категории ПО категории.categoryID = products.categoryID ВНУТРЕННЕЕ СОЕДИНЕНИЕ Поставщики ON suppliers.supplierID = products.supplierID
Неявное ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL
Существует еще одна форма INNER JOIN
, называемая неявным внутренним соединением, как показано ниже:
ВЫБРАТЬ столбец1, столбец2 ИЗ Таблица 1, Таблица 2 КУДА join_condition;
В этой форме вы указываете все объединяемые таблицы в предложении FROM
и помещаете условие соединения в предложение WHERE оператора SELECT
.Мы можем переписать приведенный выше пример запроса, используя неявное INNER JOIN
следующим образом:
SELECT productID, productName, categoryName ИЗ товары, категории КУДА products.categoryID = category.categoryID;
Визуализируйте INNER JOIN с помощью диаграммы Венна
Мы можем использовать диаграмму Венна, чтобы проиллюстрировать, как работает INNER JOIN. SQL INNER JOIN возвращает все строки в таблице 1 (левая таблица), которым соответствуют строки в таблице 2 (правая таблица).
В этом руководстве мы показали вам, как использовать предложение SQL INNER JOIN для выбора данных из двух или более таблиц на основе указанного условия соединения.
SQL ВНУТРЕННЕЕ СОЕДИНЕНИЕ — w3resource
Что такое внутреннее соединение в SQL?
INNER JOIN выбирает все строки из обеих участвующих таблиц, пока существует соответствие между столбцами. SQL INNER JOIN аналогичен предложению JOIN, объединяя строки из двух или более таблиц.
Синтаксис:
ВЫБРАТЬ * ИЗ table1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ table2 ON table1.column_name = table2.column_name;
ИЛИ
ВЫБРАТЬ * ИЗ table1 ПРИСОЕДИНЯЙТЕСЬ к таблице2 ON table1.column_name = table2.column_name;
Изображение:
INNER JOIN в SQL объединяет две таблицы в соответствии с совпадением определенных критериев с использованием оператора сравнения.
Синтаксическая диаграмма — INNER JOIN
Пример: SQL INNER JOIN между двумя таблицами
Вот пример внутреннего соединения в SQL между двумя таблицами.
Образец таблицы: продукты
Образец таблицы: компания
Чтобы объединить название товара, столбцы единиц товара из таблицы пищевых продуктов и название компании, столбцы города компании из таблицы компании, со следующим условием —
1. company_id продуктов питания и таблица компании должны совпадать,
можно использовать следующий оператор SQL:
Код SQL:
ВЫБЕРИТЕ foods.item_name, foods.item_unit,
Компания.company_name, company.company_city
Из продуктов
Компания INNER JOIN
НА food.company_id = company.company_id;
Выход:
ITEM_NAME ITEM_ COMPANY_NAME COMPANY_CITY ------------------------- ----- -------------------- ----- -------------- Chex Mix Pcs Akas Foods Дели Cheez-It Pcs Jack Hill Ltd Лондон BN Biscuit Pcs Jack Hill Ltd Лондон Mighty Munch Pcs Foodies.Лондон Pot Rice Pcs Jack Hill Ltd Лондон Jaffa Cakes Pcs Заказать Весь Бостон
Пример SQL INNER JOIN с использованием ключевого слова JOIN
Чтобы получить название товара, столбцы единиц товара из таблицы продуктов и название компании, столбцы города компании из таблицы компании, после объединения этих упомянутых таблиц со следующим условием —
1. идентификатор компании продуктов питания и идентификатор компании таблицы компании должны совпадать,
можно использовать следующий оператор SQL:
Код SQL:
ВЫБЕРИТЕ продукты.item_name, foods.item_unit,
company.com название_компании, company.company_city
Из продуктов
ПРИСОЕДИНЯЙТЕСЬ к компании
НА food.company_id = company.company_id;
Выход:
ITEM_NAME ITEM_ COMPANY_NAME COMPANY_CITY ------------------------- ----- -------------------- ----- ------------- Chex Mix Pcs Akas Foods Дели Cheez-It Pcs Jack Hill Ltd Лондон BN Biscuit Pcs Jack Hill Ltd Лондон Mighty Munch Pcs Foodies.Лондон Pot Rice Pcs Jack Hill Ltd Лондон Jaffa Cakes Pcs Заказать Весь Бостон
Изображение:
SQL INNER JOIN для всех столбцов
Чтобы после присоединения получить все столбцы из таблицы food и company, с условием —
1. идентификатор компании продуктов питания и идентификатор компании таблицы компании должны совпадать,
можно использовать следующий оператор SQL:
Код SQL:
ВЫБРАТЬ *
Из продуктов
ПРИСОЕДИНЯЙТЕСЬ к компании
НА продукты.company_id = company.company_id;
Выход:
ITEM_ID ITEM_NAME ITEM_ COMPAN COMPAN COMPANY_NAME COMPANY_CITY -------- ------------------------- ----- ------ ------ ------------------------- ------------- 1 Chex Mix шт 16 16 Akas Foods Delhi 6 шт. Cheez-It 15 15 Jack Hill Ltd Лондон 2 BN Biscuit Pcs 15 15 Jack Hill Ltd Лондон 3 Mighty Munch Pcs 17 17 Foodies.Лондон Рис 4 шт. 15 15 Jack Hill Ltd Лондон 5 Jaffa Cakes шт 18 18 Заказать весь Бостон
Разница между JOIN и INNER JOIN
JOIN возвращает все строки из таблиц, в которых ключевая запись одной таблицы равна ключевым записям другой таблицы.
INNER JOIN выбирает все строки из обеих участвующих таблиц, пока существует соответствие между столбцами.SQL INNER JOIN аналогичен предложению JOIN, объединяя строки из двух или более таблиц.
Внутреннее соединение A и B дает результат A пересечения B, то есть внутреннюю часть пересечения диаграммы Венна.
Внутренние соединения используют оператор сравнения для сопоставления строк из двух таблиц на основе значений в общих столбцах каждой таблицы. Например, получение всех строк, в которых идентификационный номер студента одинаковый, для таблиц студентов и курсов.
Использование предложения JOIN
ВЫБРАТЬ * ИЗ
Таблица1 JOIN Table2
ВКЛ Таблица1.имя_столбца = Таблица2.имя_столбца;
Использование предложения INNER JOIN
ВЫБРАТЬ *
ИЗ Table1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Table2
ON Table1.column_name = Table2.column_name;
Разница между INNER JOIN и OUTER JOIN
ВНУТРЕННЕЕ СОЕДИНЕНИЕ — это такой тип соединения, которое возвращает все строки из обеих участвующих таблиц, где ключевая запись одной таблицы равна ключевым записям другой таблицы. Для этого типа соединения требуется оператор сравнения для сопоставления строк из участвующих таблиц на основе общего поля или столбца обеих таблиц.
Где, поскольку ВНЕШНЕЕ СОЕДИНЕНИЕ возвращает все строки из участвующих таблиц, которые удовлетворяют условию, а также те строки, которые не соответствуют условию, появятся в этой операции. Этот набор результатов может отображаться в трех типах формата —
Первый — LEFT OUTER JOIN, в это соединение входят все строки из левой таблицы предложения JOIN и несопоставленные строки из правой таблицы со значениями NULL для выбранных столбцов.
Второй — RIGHT OUTER JOIN, в это соединение входят все строки справа от причины JOIN и несопоставленные строки из левой таблицы со значениями NULL для выбранных столбцов.
Последний в FULL OUTER JOIN в этом соединении включает совпадающие строки из левой и правой таблиц предложения JOIN и несопоставленные строки из левой и правой таблицы со значениями NULL для выбранных столбцов.
Пример:
Вот две таблицы tableX и tableY , и в каждой из них нет повторяющихся строк. В tableX значения (A, B) уникальны, а в tableY значения (E, F) уникальны, но значения (C и D) являются общими в обеих таблицах.
Вот ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ВЫБРАТЬ *
ИЗ tableX
ВНУТРЕННЕЕ СОЕДИНЕНИЕ tableY на tableX.X = tableY.Y;
или
ВЫБРАТЬ tableX. *, TableY. *
ИЗ tableX, tableY
ГДЕ tableX.X = tableY.Y;
Выход:
Здесь в наборе результатов появилось только совпадение tableX и tableY .
Вот ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ
ВЫБРАТЬ tableX.*, таблицаY. *
ИЗ tableX, tableY
ГДЕ tableX.X = tableY.Y (+)
или
ВЫБРАТЬ *
ИЗ tableX
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ tableY ON tableX.X = tableY.Y
Выход:
Здесь появились все строки из tableX , которые находятся слева от предложения JOIN, и все строки со значениями NULL для несовпадающих столбцов из tableY , которые находятся справа от предложения JOIN.
Вот ПРАВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ
ВЫБРАТЬ * ИЗ tableX
ПРАВО ВНЕШНЕЕ СОЕДИНЕНИЕ tableY ON tableX.X = таблицаY.Y
Выход:
Здесь появились все строки из tableY , который является правой частью предложения JOIN, и все строки со значениями NULL для несовпадающих столбцов из tableX , который находится слева от предложения JOIN.
Вот ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
ВЫБРАТЬ *
ИЗ tableX
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ tableY ON tableX.X = tableY.Y
Выход:
Здесь появились все совпадающие строки из tableX и tableY и все несопоставленные строки со значениями NULL для обеих таблиц.
INNER JOIN ON vs WHERE clause
Предложение WHERE означает, что все записи, соответствующие условию WHERE, включаются в набор результатов, а INNER JOIN состоит в том, что данные, не соответствующие условию JOIN, исключаются из набора результатов.
Связывание между двумя или более таблицами должно выполняться с помощью предложения INNER JOIN ON, но фильтрация по отдельным элементам данных должна выполняться с помощью предложения WHERE.
INNER JOIN — это синтаксис ANSI, тогда как синтаксис WHERE более ориентирован на реляционную модель.
INNER JOIN обычно считается более читаемым и представляет собой декартово произведение таблиц, особенно когда вы объединяете множество таблиц, но результат объединения двух таблиц может быть отфильтрован по совпадающим столбцам с помощью предложения WHERE.
ВНУТРЕННИЕ СОЕДИНЕНИЯ: реляционные базы данных
Ключевые моменты, которые следует запомнить
Нажмите на следующую ссылку, чтобы просмотреть слайды —
Выходные данные указанного оператора SQL, показанного здесь, получены с помощью Oracle Database 10g Express Edition.
Практика выполнения упражнений SQL
Хотите улучшить статью выше? Публикуйте свои заметки / комментарии / примеры через Disqus.
Предыдущая: SQL NON EQUI JOIN
Следующая: SQL NATURAL JOIN
SQL | Объединение (внутреннее, левое, правое и полное объединение)
Оператор объединения SQL используется для объединения данных или строк из двух или более таблиц на основе общего поля между ними. Различные типы соединений:
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL JOIN
Рассмотрим две таблицы ниже:
Student
912
Самым простым соединением является ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
- INNER JOIN: Ключевое слово INNER JOIN выбирает все строки из обеих таблиц, пока выполняется условие. Это ключевое слово создаст набор результатов путем объединения всех строк из обеих таблиц, которым удовлетворяет условие, т.е. значение общего поля будет таким же.
Синтаксис :ВЫБРАТЬ table1.column1, table1.column2, table2.column1, .... ИЗ table1 INNER JOIN table2 ON table1.matching_column = table2.matching_column; table1 : Первая таблица. table2 : Вторая таблица соответствующий_столбец : столбец, общий для обеих таблиц.
Примечание : мы также можем написать JOIN вместо INNER JOIN. JOIN — это то же самое, что и INNER JOIN.
Примеры запросов (INNER JOIN)
- Этот запрос покажет имена и возраст студентов, обучающихся на разных курсах.
ВЫБЕРИТЕ StudentCourse.COURSE_ID, Student.NAME, Student.AGE ОТ студента INNER JOIN StudentCourse ПО Студент.ROLL_NO = StudentCourse.ROLL_NO;
Выходные данные :
- Этот запрос покажет имена и возраст студентов, обучающихся на разных курсах.
- LEFT JOIN : это соединение возвращает все строки таблицы с левой стороны соединения и соответствующие строки для таблицы с правой стороны соединения. Строки, для которых нет соответствующей строки с правой стороны, набор результатов будет содержать null . LEFT JOIN также известен как LEFT OUTER JOIN. Синтаксис:
SELECT table1.column1, table1.column2, table2.column1 ,.... ИЗ table1 LEFT JOIN table2 ON table1.matching_column = table2.matching_column; table1: Первая таблица. table2: Вторая таблица Match_column: столбец, общий для обеих таблиц.
Примечание : Мы также можем использовать LEFT OUTER JOIN вместо LEFT JOIN, оба они одинаковы.
Примеры запросов (LEFT JOIN) :
SELECT Student.NAME, StudentCourse.COURSE_ID ОТ Студента ВЛЕВО ПРИСОЕДИНЯТЬСЯ к курсу студента ПО StudentCourse.ROLL_NO = Студент.ROLL_NO;
Выход :
- RIGHT JOIN : RIGHT JOIN аналогичен LEFT JOIN. Это соединение возвращает все строки таблицы с правой стороны соединения и соответствующие строки для таблицы с левой стороны соединения. Строки, для которых нет соответствующей строки с левой стороны, набор результатов будет содержать null . RIGHT JOIN также известен как RIGHT OUTER JOIN. Синтаксис:
ВЫБРАТЬ table1.column1, table1.column2, table2.column1, .... ИЗ table1 RIGHT JOIN table2 ON table1.matching_column = table2.matching_column; table1: Первая таблица. table2: Вторая таблица Match_column: столбец, общий для обеих таблиц.
Примечание : Мы также можем использовать RIGHT OUTER JOIN вместо RIGHT JOIN, оба они одинаковы.
Примеры запросов (RIGHT JOIN) :
SELECT Student.NAME, StudentCourse.COURSE_ID ОТ Студента ПРАВО ПРИСОЕДИНИТЬСЯ к курсу ПО StudentCourse.ROLL_NO = Студент.ROLL_NO;
Выход:
- FULL JOIN: FULL JOIN создает набор результатов путем объединения результатов LEFT JOIN и RIGHT JOIN. Набор результатов будет содержать все строки из обеих таблиц. Строки, для которых нет соответствия, набор результатов будет содержать значений NULL . Синтаксис:
ВЫБРАТЬ table1.column1, table1.column2, table2.column1, .... ИЗ table1 FULL JOIN table2 НА table1.match_column = table2.matching_column; table1: Первая таблица. table2: Вторая таблица Match_column: столбец, общий для обеих таблиц.
Примеры запросов (ПОЛНОЕ СОЕДИНЕНИЕ) :
SELECT Student.NAME, StudentCourse.COURSE_ID ОТ Студента FULL JOIN StudentCourse НА StudentCourse.ROLL_NO = Student.ROLL_NO;
Выход:
Левое СОЕДИНЕНИЕ (видео)
Правое СОЕДИНЕНИЕ (видео)
Полное СОЕДИНЕНИЕ (видео)
SQL | JOIN (декартово соединение, самосоединение)
Автор статьи: Harsh Agarwal .Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарий, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.
Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями теории CS для собеседований SDE с курсом CS Theory Course по приемлемой для студентов цене и будьте готовы к отрасли.
SQL INNER JOIN | Средний уровень SQL
Начиная с этого места? Этот урок является частью полного руководства по использованию SQL для анализа данных. Проверьте начало.
В этом уроке мы рассмотрим:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
На предыдущем уроке вы изучили основы SQL-соединений, используя данные об игроках в американский футбол. Все игроки в таблице игроков
соответствуют одной школе в таблице команд
.Но что, если данные не такие чистые? Что делать, если в таблице команд
есть несколько школ с одинаковым названием? Или если игрок ходит в школу, которой нет в таблице команд
?
Если в таблице команд
есть несколько школ с одинаковым именем, каждая из этих строк будет объединена с соответствующими строками в таблице игроков
. Возвращаясь к предыдущему примеру с Майклом Кампанаро, если бы было три строки в таблице команд
, где school_name = 'Wake Forest'
, запрос соединения выше вернул бы три строки с Майклом Кампанаро.
Часто бывает, что одна или обе объединяемые таблицы содержат строки, не совпадающие с другой таблицей. Способ обработки зависит от того, делаете ли вы внутренним соединением или внешним соединением .
Начнем с внутренних объединений, которые можно записать как JOIN benn.college_football_teams team
или INNER JOIN benn.college_football_teams team
. Внутренние соединения удаляют строки из обеих таблиц, которые не удовлетворяют условию соединения, изложенному в операторе ON
.С математической точки зрения внутреннее соединение — это пересечение двух таблиц.
Следовательно, если игрок идет в школу, которой нет в таблице команд
, этот игрок не будет включен в результат внутреннего соединения. Точно так же, если есть школы в таблице команд
, которые не соответствуют ни одной школе в таблице игроков
, эти строки также не будут включены в результаты.
Объединение таблиц с одинаковыми именами столбцов
При объединении двух таблиц может случиться так, что в обеих таблицах будут столбцы с одинаковыми именами.В приведенном ниже примере в обеих таблицах есть столбцы с именем school_name
:
.
ВЫБРАТЬ игроков. *,
команды. *
ОТ игроков benn.college_football_players
ПРИСОЕДИНЯЙТЕСЬ к командам benn.college_football_teams
ON team.school_name = player.school_name
Результаты могут поддерживать только один столбец с заданным именем — когда вы включаете 2 столбца с одинаковым именем, результаты будут просто отображать один и тот же набор результатов для обоих столбцов , даже если эти два столбца должны содержать разные данные .Вы можете избежать этого, назвав столбцы индивидуально. Бывает, что эти два столбца фактически содержат одни и те же данные, потому что они используются для ключа соединения, но следующий запрос технически позволяет этим столбцам быть независимыми:
ВЫБРАТЬ player.school_name AS player_school_name,
team.school_name AS team_school_name
ОТ игроков benn.college_football_players
ПРИСОЕДИНЯЙТЕСЬ к командам benn.college_football_teams
ON team.school_name = player.school_name
Отточите свои навыки работы с SQL
Практическая задача
Напишите запрос, который отображает имена игроков, названия школ и конференции для школ в дивизионе «FBS (Division I-A Teams)».