MYSQL JOIN — быстро, легко, просто. Join sql примеры


Команды 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 Россия

code.mu

Oracle PL/SQL •MySQL •SQL Server

Это учебное пособие Oracle объясняет, как использовать JOINS (INNER и OUTER) в Oracle с синтаксисом и примерами.

Описание

Oracle JOINS используются для извлечения данных из нескольких таблиц. JOIN выполняется всякий раз, когда две или более таблиц объединяются в SQL предложении.

Есть 4 различных типа присоединения Oracle:

Рассмотрим синтаксис Oracle JOIN, а также изучим примеры Oracle JOIN.

INNER JOIN (простое соединение)

Скорее всего, вы уже писали запросы в которых используются Oracle INNER JOIN. Это наиболее распространенный тип соединения. Oracle INNER JOINS возвращает все строки из нескольких таблиц, где выполняется условия соединения.

Синтаксис

Синтаксис INNER JOIN в Oracle/PLSQL:

SELECT columnsFROM table1INNER JOIN table2ON table1.column = table2.column;

В этом рисунке, Oracle INNER JOIN возвращает затененную область:

Oracle INNER JOIN будет возвращать записи, где table1 и table2 будут пересекаться.

Пример

Ниже приведен пример Oracle INNER JOIN:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date

FROM suppliers

INNER JOIN orders

ON suppliers.supplier_id = orders.supplier_id;

Этот пример Oracle INNER JOIN возвращает все строки из таблиц suppliers и orders, где имеются соответствующие значение поля supplier_id в обоих таблицах.

Рассмотрим некоторые данные, чтобы понять, как работает INNER JOIN:

У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит следующие данные:

supplier_id supplier_name
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA

У нас есть еще одна таблица orders с тремя полями (order_id, supplier_id и order_date). Она содержит следующие данные:

order_id supplier_id order_date
500125 10000 05.05.2015
500126 10001 08.02.2016
500127 10004 06.01.2017

Если мы выполним Oracle оператор SELECT (который содержит INNER JOIN) ниже:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date

FROM suppliers

INNER JOIN orders

ON suppliers.supplier_id = orders.supplier_id;

Наш результирующий набор будет выглядеть следующим образом:

supplier_id name order_date
10000 IBM 05.05.2015
10001 Hewlett Packard 08.02.2016

Строки для Microsoft и NVIDIA из таблицы suppliers будут опущены, так как значения supplier_id 10002 и 10003 не существует в обеих таблицах. Строка order_id 500127 из таблицы orders будет опущена, так как supplier_id 10004 не существует в таблице suppliers.

Старый Синтаксис

В качестве последнего примечания, стоит отметить, что приведенный выше пример Oracle INNER JOIN можно переписать, используя старый неявный синтаксис следующим образом (но рекомендуется использовать синтаксис INNER JOIN):

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_dateFROM suppliers, ordersWHERE suppliers.supplier_id = orders.supplier_id;

LEFT OUTER JOIN

Другой тип соединения называется Oracle LEFT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с левосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны.

Синтаксис

Синтаксис для Oracle LEFT OUTER JOIN:

SELECT columnsFROM table1LEFT [OUTER] JOIN table2ON table1.column = table2.column;

В некоторых базах данных LEFT OUTER JOIN заменяется на LEFT JOIN.

На этом рисунке, Oracle LEFT OUTER JOIN возвращает затененную область:

Oracle LEFT OUTER JOIN возвратит все записи из table1 и только те записи из table2, которые пересекаются с table1.

Пример

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date

FROM suppliers

LEFT OUTER JOIN orders

ON suppliers.supplier_id = orders.supplier_id;

Этот пример LEFT OUTER JOIN возвратит все строки из таблицы suppliers, и только те строки из таблицы orders, где объединяемые поля равны.

Если значение supplier_id в таблице suppliers не существует в таблице orders, все поля таблицы orders будут отображаться в результирующем наборе как NULL.

Рассмотрим некоторые данные, чтобы понять, как работает LEFT OUTER JOIN:

У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит следующие данные:

supplier_id supplier_name
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA

У нас есть еще одна таблица orders с тремя полями (order_id, supplier_id и order_date). Она содержит следующие данные:

order_id supplier_id order_date
500125 10000 05.05.2015
500126 10001 08.02.2016

Если мы выполним Oracle оператор SELECT (который содержит LEFT OUTER JOIN) ниже:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date

FROM suppliers

LEFT OUTER JOIN orders

ON suppliers.supplier_id = orders.supplier_id;

Результирующий набор будет выглядеть следующим образом:

supplier_id name order_date
10000 IBM 05.05.2015
10001 Hewlett Packard 08.02.2016
10002 Microsoft null
10003 NVIDIA null

Строки для Microsoft и NVIDIA будут включены, так как был использован LEFT OUTER JOIN. Тем не менее, вы заметите, что поле order_date для этих записей содержит значение NULL.

RIGHT OUTER JOIN

Другой тип соединения называется Oracle RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с правосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны.

Синтаксис

Синтаксис Oracle RIGHT OUTER JOIN:

SELECT columnsFROM table1RIGHT [OUTER] JOIN table2ON table1.column = table2.column;

В некоторых базах данных, RIGHT OUTER JOIN заменяется на RIGHT JOIN.

На этом рисунке, Oracle RIGHT OUTER JOIN возвращает затененную область:

Oracle RIGHT OUTER JOIN возвратит все записи из table2 и только те записи из table1, которые пересекаются с table2.

Пример

Ниже приведен пример Oracle RIGHT OUTER JOIN:

SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT orders.order_id, orders.order_date, suppliers.supplier_name

FROM suppliers

RIGHT OUTER JOIN orders

ON suppliers.supplier_id = orders.supplier_id;

Этот пример RIGHT OUTER JOIN возвращает все строки из таблицы orders и только те строки из таблицы suppliers, где объединяемые поля равны.

Если значение supplier_id в таблице orders не существует в таблице suppliers, все поля в таблице suppliers будут отображаться в результирующем наборе как NULL.

Рассмотрим некоторые данные, чтобы понять, как работает RIGHT OUTER JOIN:

У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит следующие данные:

supplier_id supplier_name
10000 Apple
10001 Google

У нас есть вторая таблица orders с тремя полями (order_id, supplier_id и order_date). Она содержит следующие данные:

order_id supplier_id order_date
500125 10000 12.05.2016
500126
10001
14.05.2016
500127 10002 18.05.2016

Если мы выполним Oracle оператор SELECT (который содержит RIGHT OUTER JOIN) ниже:

SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT orders.order_id, orders.order_date, suppliers.supplier_name

FROM suppliers

RIGHT OUTER JOIN orders

ON suppliers.supplier_id = orders.supplier_id;

Результирующий набор будет выглядеть следующим образом:

order_id order_date supplier_name
500125 12.05.2016 Apple
500126 14.05.2016 Google
500127 18.05.2016 null

Строка для order_id 500127 будет включена, так как был использован RIGHT OUTER JOINS. Тем не менее, вы заметите, что поле supplier_name для этой записи содержит значение NULL.

FULL OUTER JOIN

Другой тип соединения называется Oracle FULL OUTER JOIN. Этот тип соединения возвращает все строки из левой таблицы и правой таблицы с NULL — значениями в месте, где условие объединения не выполняется.

Синтаксис

Синтаксис для Oracle FULL OUTER JOIN:

SELECT columnsFROM table1FULL [OUTER] JOIN table2ON table1.column = table2.column;

В некоторых базах данных, FULL OUTER JOIN заменяются FULL JOIN.

На этом рисунке, FULL OUTER JOIN возвращает затененную область:

Oracle FULL OUTER JOIN будет возвращать все записи из обеих таблиц table1 и table2.

Пример

Ниже приведен пример Oracle FULL OUTER JOIN:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers FULL OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date

FROM suppliers

FULL OUTER JOIN orders

ON suppliers.supplier_id = orders.supplier_id;

Этот пример FULL OUTER JOIN возвратит все строки из таблицы suppliers и все строки из таблицы orders и всякий раз, когда условие соединения не выполняется, то поля в результирующем наборе будут принимать значения NULL.

Если значение поля supplier_id в таблице suppliers не существует в таблице orders, то все поля в таблице orders будут отображаться в результирующем наборе как NULL. Если значение supplier_id в таблице orders не существует в таблице suppliers, то все поля в таблице suppliers будут отображаться результирующем наборе как NULL .

Рассмотрим некоторые данные, чтобы понять, как работает FULL OUTER JOIN:

У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name). Она содержит следующие данные:

supplier_id supplier_name
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA

У нас есть вторая таблица orders с тремя полями (order_id, supplier_id и order_date), которая содержит следующие данные:

order_id supplier_id order_date
500125 10000 12.05.2016
500126 10001 14.05.2016
500127 10004 18.05.2016

Если мы выполним Oracle оператор SELECT (который содержит FULL OUTER JOIN) ниже:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers FULL OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date

FROM suppliers

FULL OUTER JOIN orders

ON suppliers.supplier_id = orders.supplier_id;

Результирующий набор будет выглядеть следующим образом:

supplier_id supplier_name order_date
10000 IBM 12.05.2016
10001 Hewlett Packard 14.05.2016
10002 Microsoft null
10003 NVIDIA null
null null 18.05.2016

Строки для Microsoft и NVIDIA будут включены, так как используется FULL OUTER JOIN. Тем не менее, вы заметите, что поле order_date для этих записей содержит значение NULL.

Строка для supplier_id 10004 также будет включена, так как используется FULL OUTER JOIN. Тем не менее, вы заметите, что supplier_id и поле supplier_name для этих записей содержат значение NULL.

oracleplsql.ru

sql join наглядное объяснение с примерами

Предположим у нас есть две таблицы: слева таблица A и справа таблица B. Заполним каждую из них 4 записями.

id name id name -- ---- -- ---- 1 Pirate 1 Rutabaga 2 Monkey 2 Pirate 3 Ninja 3 Darth Vader 4 Spaghetti 4 Ninja

Теперь объединим эти таблицы с помощью оператора join по колонке Name несколькими способами и посмотрим как это будет выглядеть на диаграммах Эйлера.

1. INNER JOIN

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- 1 Pirate 2 Pirate 3 Ninja 4 Ninja

С помощью inner join мы выбираем только те записи, которые одновременно есть в двух таблицах: таблице A и таблице B.

2. FULL OUTER JOIN

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader

 

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null id name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader

 

 

3. LEFT OUTER JOIN

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null

 

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null id name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null

 

www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

 

Читайте также:

coders.ask-ru.net

Язык SQL – объединение JOIN | Info-Comp.ru

Продолжаем изучать основы SQL, и пришло время поговорить о простых объединениях JOIN. И сегодня мы рассмотрим, как объединяются данные по средствам операторов Left join, Right join, Cross join и Inner join, другими словами научимся писать запросы, которые объединяют данные, и как обычно изучать все это будем на примерах.

Объединения JOIN очень важны в sql, так как без умения писать запросы с объединением данных разных объектов, просто не обойтись программисту SQL, да и просто админу который время от времени выгружает какие-то данные из базы данных, поэтому это относится к основам SQL и каждый человек, который имеет дело с SQL, должен иметь представление, что это такое.

Примечание! Все примеры будем писать в Management Studio SQL Server 2008.

Мы с Вами уже давно изучаем основы SQL, и если вспомнить начинали мы с оператора select, и вообще было уже много материала на этом сайте по SQL, например:

И много другого, даже уже рассматривали объединения union и union all, но, так или иначе, более подробно именно об объединениях join мы с Вами не разговаривали, поэтому сегодня мы восполним этот пробел в наших знаниях.

И начнем мы как обычно с небольшой теории.

Объединения JOIN - это объединение двух или более объектов базы данных по средствам определенного ключа или ключей или в случае cross join и вовсе без ключа. Под объектами здесь подразумевается различные таблицы, представления (views), табличные функции или просто подзапросы sql, т.е. все, что возвращает табличные данные.

Объединение SQL Left и Right join

Left join – это объединение данных по левому ключу, т.е. допустим, мы объединяем две таблицы по left join, и это значит что все данные из второй таблицы подтянутся к первой, а в случае отсутствия ключа выведется NULL значения, другими словами выведутся все данные из левой таблицы и все данные по ключу из правой таблицы.

Right join – это такое же объединение как и Left join только будут выводиться все данные из правой таблицы и только те данные из левой таблицы в которых есть ключ объединения.

Теперь давайте рассматривать примеры, и для начала создадим две таблицы:

CREATE TABLE [test_table]( [number] [numeric](18, 0) NULL, [text] [varchar](50) NULL ) ON [PRIMARY] GO CREATE TABLE [test_table_2]( [number] [numeric](18, 0) NULL, [text] [varchar](50) NULL ) ON [PRIMARY] GO

Вот такие простенькие таблицы, И я для примера заполнил их вот такими данными:

Теперь давайте напишем запрос с объединением этих таблиц по ключу number, для начала по LEFT:

Код:

select t1.number as t1_number,t1.text as t1_text, t2.number as t2_number, t2.text as t2_text from test_table t1 left join test_table_2 t2 on t1.number=t2.number

Как видите, здесь данные из таблицы t1 вывелись все, а данные из таблицы t2 не все, так как строки с number = 4 там нет, поэтому и вывелись NULL значения.

А что будет, если бы мы объединяли по средствам right join, а было бы вот это:

Код:

select t1.number as t1_number,t1.text as t1_text, t2.number as t2_number, t2.text as t2_text from test_table t1 right join test_table_2 t2 on t1.number=t2.number

Другими словами вывелись все строки из таблицы t2 и соответствующие записи из таблицы t1, так как все те ключи, которые есть в таблице t2, есть и в таблице t1, и поэтому у нас нет NULL значений.

Объединение SQL Inner join

Inner join – это объединение когда выводятся все записи из одной таблицы и все соответствующие записи из другой таблице, а те записи которых нет в одной или в другой таблице выводиться не будут, т.е. только те записи которые соответствуют ключу. Кстати сразу скажу, что inner join это то же самое, что и просто join без Inner. Пример:

Код:

select t1.number as t1_number,t1.text as t1_text, t2.number as t2_number, t2.text as t2_text from test_table t1 inner join test_table_2 t2 on t1.number=t2.number

А теперь давайте попробуем объединить наши таблицы по двум ключам, для этого немного вспомним, как добавлять колонку в таблицу и как обновить данные через update, так как в наших таблицах всего две колонки, и объединять по текстовому полю как-то не хорошо. Для этого добавим колонки:

ALTER TABLE test_table ADD number2 int ALTER TABLE test_table_2 ADD number2 int

Обновим наши данные, просто проставим в колонку number2 значение 1:

update test_table set number2 = 1 update test_table_2 set number2 = 1

И давайте напишем запрос с объединением по двум ключам:

select t1.number as t1_number,t1.text as t1_text, t2.number as t2_number, t2.text as t2_text from test_table t1 inner join test_table_2 t2 on t1.number=t2.number and t1.number2=t2.number2

И результат будет таким же, как и в предыдущем примере:

Но если мы, допустим во второй таблице в одной строке изменим, поле number2 на значение скажем 2, то результат будет уже совсем другой.

Обновим:

update test_table_2 set number2 = 2 where number=1

Запрос тот же самый, а вот результат:

Как видите, по второму ключу у нас одна строка не вывелась.

Объединение SQL Cross join

Cross join – это объединение SQL по которым каждая строка одной таблицы объединяется с каждой строкой другой таблицы. Лично у меня это объединение редко требуется, но все равно иногда требуется, поэтому Вы также должны уметь его использовать. Например, в нашем случае получится, конечно, не понятно что, но все равно давайте попробуем, тем более синтаксис немного отличается:

Код:

select t1.number as t1_number,t1.text as t1_text, t2.number as t2_number, t2.text as t2_text from test_table t1 cross join test_table_2 t2

Здесь у нас каждой строке таблицы test_table соответствует каждая строка из таблицы test_table_2, т.е. в таблице test_table у нас 4 строки, а в таблице test_table_2 3 строки 4 умножить 3 и будет 12, как и у нас вывелось 12 строк.

И напоследок, давайте покажу, как можно объединять несколько таблиц, для этого я, просто для примера, несколько раз объединю нашу первую таблицу со второй, смысла в  объединение в данном случае, конечно, нет но, Вы увидите, как можно это делать и так приступим:

Код:

select t1.number as t1_number, t1.text as t1_text, t2.number as t2_number, t2.text as t2_text, t3.number as t3_number, t3.text as t3_text, t4.number as t4_number, t4.text as t4_text from test_table t1 left join test_table_2 t2 on t1.number=t2.number right join test_table_2 t3 on t1.number=t3.number inner join test_table_2 t4 on t1.number=t4.number

Как видите, я здесь объединяю и по left и по right и по inner просто, для того чтобы это было наглядно.

С объединениями я думаю достаточно, тем более ничего сложного в них нет. Но на этом изучение SQL не закончено в следующих статьях мы продолжим, а пока тренируйтесь и пишите свои запросы. Удачи!

Похожие статьи:

info-comp.ru

MYSQL JOIN - строим сложные запросы: INNER JOIN, LEFT JOIN, RIGHT JOIN

Оператор JOIN является одним из самых распространенных для построения сложных запросов в языке SQL. Понятие сложное, но если разобраться с ним, вы получите мощный инструмент в свое распоряжение.

Данный пост рассчитан на начинающих вебмастеров, которые хотят развиваться дальше. Без освоения оператора JOIN нормально строить сайты достаточно сложно.

Если Вы не умеете работать с псевдонимами в SQL, настоятельно рекомендую прочитать мой пост о псевдонимах в MYSQL перед прочтением данной темы. Нормально работать с JOIN без понимания псевдонимов — невозможно. Тема достаточно объемная, я ставлю целью в данном посте дать начальное понимание процесса объединения таблиц. Это должно дать мощный толчок к дальнейшему пониманию MYSQL.

Итак, что такое JOIN, зачем он нужен.

Оператор JOIN позволяет объединять две и более таблиц в одну (временную) таблицу для извлечения данных одним запросом. Для избегания избыточности и дублирования данные в базе хранятся в разных таблицах. Получить их одним запросом без объединения таблиц невозможно. А использование нескольких запросов — не вариант — значительно увеличивает время загрузки страницы. Кроме того, усложняет процесс обработки полученных данных.

Синтаксис запроса с использованием JOIN:

SELECT field_1, field_2, field_3 FROM tbl_1 {INNER, LEFT, RIGHT} JOIN tbl_2 ON {условие объединения} WHERE {условие выборки}
    Что мы делаем:
  • SELECT field_1, field_2, field_3 — получаем в результирующую таблицу значение полей field_1, field_2, field_3. Причем любое из этих полей может быть как в tbl_1, так и в tbl_2
  • FROM tbl_1 — первая таблица, из которой выбираем данные
  • {INNER, LEFT, RIGHT} — тип объединения, ниже рассмотрим подробнее
  • JOIN tbl_2 ON {условие объединения} — присоединяем вторую таблицу используя условие. Присоединять таблицу можно и без условий, но такое объединение редко имеет смысл. Что такое {условие объединения} рассмотрим в следующем абзаце.
  • WHERE {условие выборки} — стандартное ограничение выборки для запросов SELECT

 

В {условие объединения} мы определяем соответствие данных tbl_1 и tbl_2. Как правило, мы выбираем данные из связанных таблиц — соответственно, в этом условии мы прописываем эту связь. При этом, зачастую, названия полей совпадают в обеих таблицах — соответственно, мы должны использовать псевдонимы для таблиц.

Рассмотрим пример. У нас есть две таблицы:tbl1 — | user_id | user_name | — имя пользователяtbl1 — | user_id | user_age | — возраст пользователяНам надо получить одним запросом имя пользователя и его возраст. Составляем запрос:

SELECT user_name, user_age FROM tbl_1 JOIN tbl_2 ON tbl_1.user_id = tbl_2.user_id

В данном примере имена таблиц tbl_1 и tbl_2 короткие, можно обойтись без псевдонимов. Но если они длинные — используйте псевдонимы!В результате данного запроса мы получим таблицу | user_name | user_age | — она будет содержать и возраст и имя пользователя.

Теперь расскажу о типах {INNER, LEFT, RIGHT}

INNER JOIN — внутреннее объединение

При данном типе объединения в результирующую выборку будут включены только те строки, для которых есть записи и в первой и во второй таблице. То есть, в результат попадут пользователи для которых в первой таблице прописано имя, а во второй — возраст. Если или то или то отсутствует, то пользователь в результат не попадет. Если мы в запросе опускаем тип объединения, то используется, как раз, INNER. То есть, JOIN и INNER JOIN — одно и то-же.

LEFT JOIN — внешнее левостороннее объединение

Внешним оно называется потому, что полный синтаксис LEFT OUTER JOIN. Как правило слово OUTER опускают — оно необязательно. При данном типе объединения в результирующую таблицу будут включены ВСЕ данные из первой таблицы. Из второй таблицы будет выбран возраст всех пользователей, user_id которых есть и в первой таблице. Если же во второй таблице отсутствует возраст какого-то пользователя, то в соответствующую ячейку будет записан NULL.

RIGHT JOIN — внешнее правостороннее объединение

Используется значительно реже. Фактически, это то-же самое, что и левостороннее объединение, только таблицы меняются местами. То есть, будут выбраны все данные из таблицы с возрастами и дополнены данными из таблицы с именами. Результирующая таблица будет иметь такую-же структуру — | user_name | user_age |, только возрасты будут все, а отсутствующие имена будут заменены на NULL.

Еще есть один момент. Если в выборке или в  {условие выборки} есть совпадающие поля , то необходимо полная запись имени поля в формате {table.field}.

Вот, пожалуй и все. Это далеко не все возможности JOIN, но если вы поймете данную статью — дальже дело пойдет значительно проще. В заключение, приведу знаменитую картинку, которая отображает возможности использования JOIN в графическом виде.

aktual.com.ua

JOIN в SQL

Вы здесь: Главная - MySQL - SQL - JOIN в SQL

Команда JOIN в SQL-запросе служит для объединения выборки из нескольких таблиц в один результирующий набор, причём в результирующей выборке находятся все поля всех таблиц, участвующих в запросе. Давайте с Вами разберём подробнее использование JOIN в SQL.

Существует несколько вариантов запроса JOIN, начнём мы с самого популярного, а именно INNER JOIN:

SELECT * FROM `users` INNER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email`

Подобным запросом я извлёк все записи, где в выборку попадут все пользователи сайта, которые также являются подписчиками.

Особенностью INNER JOIN является то, что в результат входят все поля со всеми значениями. Количество записей ровно столько, сколько удовлетворили условиям у обеих таблиц.

Теперь давайте перейдём к следующей разновидности JOIN, а точнее к LEFT OUTER JOIN:

SELECT * FROM `users` LEFT OUTER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email`

Особенностью данного запроса является то, что результат выборки содержит записи, удовлетворяющие левой таблице. Если они ещё и удовлетворяют условиям правой таблицы, то это идентично INNER JOIN, иначе вместо значений в правой таблице будет NULL.

Теперь перейдём к RIGHT OUTER JOIN:

SELECT * FROM `users` RIGHT OUTER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email`

Зеркальная противоположность LEFT OUTER JOIN, теперь NULL присутствуют в первой таблице, то есть слева.

И, наконец, последний тип JOIN - это CROSS JOIN:

SELECT * FROM `users` CROSS JOIN `subscribers`

Данный запрос выдаёт всевозможные сочетания двух таблиц. В данном запросе результирующее число записей - это перемножение количества записей в обеих таблицах.

Я ещё не рассказал о FULL OUTER JOIN, который не поддерживается MySQL. Но, на мой взгляд, он и не нужен. Его особенностью является то, что он выводит строку, в которой есть хотя бы одно совпадение с любой из таблиц. Соответственно, в другой таблице (в которой нет совпадения с условием) идут NULL. Фактически, это объединение LEFT OUTER JOIN и RIGHT OUTER JOIN:

SELECT * FROM `users` LEFT OUTER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email` UNION SELECT * FROM `users` RIGHT OUTER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email`

Вот я и рассказал обо всех разновидностях JOIN в SQL. Стоит отметить, что тема очень сложная, и её редко понимают с первого раза. Поэтому я Вам рекомендую обязательно посмотреть, как работают данные запросы на примере Ваших каких-нибудь таблиц (если их нет, то создайте). Проверьте все разновидности JOIN и посмотрите, чем они отличаются.

  • Создано 21.01.2013 10:22:31
  • Михаил Русаков
Предыдущая статья Следующая статья

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка: <a href="https://myrusakov.ru" target="_blank"><img src="https://myrusakov.ru//images/button.gif" alt="Как создать свой сайт" /></a>

    Она выглядит вот так:

  2. Текстовая ссылка:<a href="https://myrusakov.ru" target="_blank">Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи): [URL="https://myrusakov.ru"]Как создать свой сайт[/URL]

myrusakov.ru

Запросы sql inner join на объединение данных из разных таблиц

На уроке будут рассмотрены запросы SQL INNER JOIN на объединение таблиц. Будут разобраны конкретные примеры запросов

Выборка из нескольких таблиц (неявная операция соединения)

В sql выборка из нескольких таблиц или неявная операция соединения допускается в предложении FROM, но при этом перечисление таблиц, как правило, сопровождается условием соединения записей из разных таблиц.

Рассмотрим пример неявной операции соединения:

Пример: БД Компьютерные курсы. Необходимо выбрать имена преподавателей, учебную группу и курс, на котором они преподают. Условием отбора должно являться одинаковое значение полей Учебная группа в таблицах Список и Группы.✍ Решение: 
1 2 3 4 5 SELECT DISTINCT группы.`Преподаватель` , список.`Учебная группа` , список.`курс` FROM группы, список WHERE группы.`Учебная группа` = список.`Учебная группа` AND курс <3

SELECT DISTINCT группы.`Преподаватель` , список.`Учебная группа` , список.`курс` FROM группы, список WHERE группы.`Учебная группа` = список.`Учебная группа` AND курс <3

✍ Решение: 
1 2 3 4 SELECT DISTINCT pc.Номер, Производитель FROM pc, product WHERE pc.Номер = product.Номер AND Цена <30000

SELECT DISTINCT pc.Номер, Производитель FROM pc, product WHERE pc.Номер = product.Номер AND Цена <30000

Sql tables 1. БД Компьютерный магазин. Укажите производителя и скорость для тех компьютеров, которые имеют жесткий диск объемом не менее 1000 Гб.

Иногда в предложении FROM требуется указать одну и ту же таблицу несколько раз. В таком случае для таблицы потребуется псевдоним. Рассмотрим пример:

Пример: БД Компьютерные курсы. Вывести номера курсов студентов, имеющих одинаковый год рождения, но при этом курс у них разный.

✍ Решение: 

1 2 3 4 5 SELECT DISTINCT A.`Курс` AS номер_курса1, B.`Курс` AS номер_курса2 FROM список AS A, список AS B WHERE A.`Год рождения` = B.`Год рождения` AND A.Курс < B.Курс LIMIT 0 , 30

SELECT DISTINCT A.`Курс` AS номер_курса1, B.`Курс` AS номер_курса2 FROM список AS A, список AS B WHERE A.`Год рождения` = B.`Год рождения` AND A.Курс < B.Курс LIMIT 0 , 30

Результат:Здесь условие A.Курс используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой курса.В общем случае можно использовать условие A.Курс B.Курс!

✍ Решение: 
1 2 3 4 SELECT DISTINCT A.Номер AS модель1, B.Номер AS модель2 FROM pc AS A, pc AS B WHERE A.Цена = B.Цена AND A.Номер < B.Номер

SELECT DISTINCT A.Номер AS модель1, B.Номер AS модель2 FROM pc AS A, pc AS B WHERE A.Цена = B.Цена AND A.Номер < B.Номер

Здесь условие A.Номер используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой номера:

Sql tables 2. Вывести номера учителей (tid), которые ведут уроки по одинаковым курсам (таблица lessons)

Задание 3_1. БД "Компьютерные курсы". 1. Вывести все сведения из таблиц Личные данные и Список, совпадающие по полям Код и Код студента 2. Вывести фамилии, адреса и оценки по word из таблиц Личные данные и Список, совпадающие по полям Код и Код студентаЗадание 3_2. БД "Компьютерные курсы". Вывести курс и год рождения студентов, учащихся на одном курсе, но имеющих разный год рождения. При этом рассмотреть все курсы, кроме первого.

Результат:

Запросы sql INNER JOIN

В предложении FROM может использоваться явная операция соединения двух и более таблиц.

Разберем пример. Имеем две таблицы: teachers (учителя) и lessons (уроки):

teachers lessons

Пример: Выбрать имена учителей и проведенные уроки по курсам, которые они ведут

✍ Решение:  Для этого необходимы обе таблицы:  
SELECT t.name,t.code,l.course FROM teachers t INNER JOIN lessons l ON t.id=l.tid

SELECT t.name,t.code,l.course FROM teachers t INNER JOIN lessons l ON t.id=l.tid

Результат:

В запросе буквы l и t являются псевдонимами таблиц lessons (l) и teachers (t).

Inner Join - это внутреннее объединение (JOIN - с англ. "объединение", ключевое слово INNER можно опустить).

При внутреннем объединении выбираются только совпадающие данные из объединяемых таблиц.

Важно: Inner Join - выбираются значения только в случае присутствия в обеих таблицах

Важно: Соединение таблиц может быть либо внутренним (INNER), либо одним из внешних (OUTER). Служебное слово INNER можно опускать, тогда при использовании просто слова JOIN имеется в виду внутреннее соединение (INNER)

Sql left inner join 1. БД Институт. Вывести фамилии всех преподавателей, названия и длительность курсов, которые они ведут (name, title, length) из таблиц teachers и courses. Использовать внутреннее объединение

Запросы sql OUTER JOIN

При использовании внутреннего объединения inner join выбираются только совпадающие данные из объединяемых таблиц. Для того чтобы получить данные, которые подходят по условию частично, необходимо использовать внешнее объединение.

OUTER JOIN - внешнее объединение, которое возвращает данные из обеих таблиц (совпадающие по условию объединения), ПЛЮС выборка дополнится оставшимися данными из внешней таблицы, которые по условию не подходят, заполнив недостающие данные значением NULL.

Существует два типа внешнего объединения - LEFT OUTER JOIN ("внешней" таблицей будет находящаяся слева) и RIGHT OUTER JOIN ("внешней" таблицей будет находящаяся справа).

Рисунок относится к объединению типа Left Outer Join:

Важно: Ключевое слово OUTER можно опустить. Запись LEFT JOIN эквивалентна записи LEFT OUTER JOIN.

Пример БД Институт: Выбрать имена всех учителей и курсы, которые они ведут. Если учитель не прикреплен к курсу, его фамилию все равно необходимо вывести

✍ Решение: 
SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t.id = l.tid

SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t.id = l.tid

Результат:

Важно: Таким образом, соединение LEFT JOIN означает, что помимо строк, для которых выполняется условие, в результирующий набор попадут все остальные строки из левой таблицы. При этом отсутствующие значения из правой таблицы будут заполнены NULL-значениями.

С тем же примером (выбрать имена учителей и курсы, которые они ведут) фильтрация по RIGHT OUTER JOIN вернет полный список уроков по курсам (правая таблица) и сопоставленных учителей. Но так как нет таких уроков, которые бы не соответствовали определенным учителям, то выборка будет состоять только из двух строк:

SELECT t.name, t.code, l.course FROM teachers t RIGHT OUTER JOIN lessons l ON t.id = l.tid

SELECT t.name, t.code, l.course FROM teachers t RIGHT OUTER JOIN lessons l ON t.id = l.tid

Важно: Left Outer Join - после основной выборки, удовлетворяющей условиям, выбираются оставшиеся данные левой таблицы (внешней), которые по условию не подходят

Задание 3_5: БД Компьютерные курсы. Для выполнения задания необходимо добавить в таблицу Личные данные сведения для нового студента, у которого пока отсутствуют оценки (остальные данные заполнить). Этого же студента добавить в таблицу список (с тем же кодом).

Выбрать фамилии студентов и их оценки по Word. В случае отсутствия оценки, все равно выводить фамилию.

Sql left outer join 1. Вывести фамилии всех преподавателей, названия и длительность курсов, которые они ведут (name, title, length) из таблиц teachers и courses. Использовать внешнее объединение

В приведенных примерах можно вводить фильтры для более точной фильтрации:

Пример БД Институт: выводить только тех учителей, которые не проводили/не будут проводить уроков

✍ Решение: 
SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t.id = l.tid WHERE l.tid IS NULL

SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t.id = l.tid WHERE l.tid IS NULL

Объединение с подзапросом

При использовании объединения часто бывает необходимо, чтобы результирующая выборка содержала данные только по одной конкретной строке

Синтаксис:

SELECT t1.*, t2.* FROM left_table t1 LEFT JOIN (SELECT * FROM right_table WHERE some_column = 1 LIMIT 1) t2 ON t1.id = t2.join_id

SELECT t1.*, t2.* from left_table t1 left join (select * from right_table where some_column = 1 limit 1) t2 ON t1.id = t2.join_id

или

SELECT t1.*, t2.* FROM left_table t1 INNER JOIN (SELECT * FROM right_table WHERE some_column = 1 LIMIT 1) t2 ON t1.id = t2.join_id

SELECT t1.*, t2.* from left_table t1 inner join (select * from right_table where some_column = 1 limit 1) t2 ON t1.id = t2.join_id

Пример БД Институт: Выбрать данные по учителям и проведенным ими урокам, только для уроков по курсу "php"

✍ Решение: 
SELECT t1.*, t2.* FROM teachers t1 INNER JOIN (SELECT * FROM lessons WHERE course = "php" LIMIT 1) t2 ON t1.id = t2.tid

SELECT t1.*, t2.* from teachers t1 inner join (select * from lessons where course = "php" limit 1) t2 ON t1.id = t2.tid

Результат:

Разберем еще один пример:

✍ Решение: 
1 2 3 4 5 6 7 SELECT t1.производитель, t1.Тип, t2 . * FROM pc t2 INNER JOIN ( SELECT * FROM product WHERE Тип = "Компьютер" ) t1 ON t2.Номер = t1.Номер

SELECT t1.производитель, t1.Тип, t2 . * FROM pc t2 INNER JOIN ( SELECT * FROM product WHERE Тип = "Компьютер" ) t1 ON t2.Номер = t1.Номер

Так как в таблице product находятся данные не только по компьютерам, то мы использовали подзапрос, при этом сохранив внутреннее соединение таблиц.Результат:

Задание 3_6: БД Компьютерные курсы. Отобразить фамилии и оценки студентов, у которых по дисциплине Word оценка "отлично".

labs.org.ru