Sql left join
Содержание:
- SQL Справочник
- Полное множество
- Рассматривать мы будем:
- MySQL LEFT JOIN clause examples
- Анимированная версия
- SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour NOT IN («Зеленый», «Синий»)
- SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour
- SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL
- SELECT A.Colour, B.Colour FROM A RIGHT OUTER JOIN B ON A.Colour = B.Colour
- SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON A.Colour = B.Colour
- SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON 1 = 0
- Внешнее соединение
- Introduction to MySQL join clauses
- What is the difference between Left Join and Left Outer Join in SQL?
- SQL FULL OUTER JOIN
- SQL RIGHT OUTER JOIN
SQL Справочник
SQL Ключевые слова
ADD
ADD CONSTRAINT
ALTER
ALTER COLUMN
ALTER TABLE
ALL
AND
ANY
AS
ASC
BACKUP DATABASE
BETWEEN
CASE
CHECK
COLUMN
CONSTRAINT
CREATE
CREATE DATABASE
CREATE INDEX
CREATE OR REPLACE VIEW
CREATE TABLE
CREATE PROCEDURE
CREATE UNIQUE INDEX
CREATE VIEW
DATABASE
DEFAULT
DELETE
DESC
DISTINCT
DROP
DROP COLUMN
DROP CONSTRAINT
DROP DATABASE
DROP DEFAULT
DROP INDEX
DROP TABLE
DROP VIEW
EXEC
EXISTS
FOREIGN KEY
FROM
FULL OUTER JOIN
GROUP BY
HAVING
IN
INDEX
INNER JOIN
INSERT INTO
INSERT INTO SELECT
IS NULL
IS NOT NULL
JOIN
LEFT JOIN
LIKE
LIMIT
NOT
NOT NULL
OR
ORDER BY
OUTER JOIN
PRIMARY KEY
PROCEDURE
RIGHT JOIN
ROWNUM
SELECT
SELECT DISTINCT
SELECT INTO
SELECT TOP
SET
TABLE
TOP
TRUNCATE TABLE
UNION
UNION ALL
UNIQUE
UPDATE
VALUES
VIEW
WHERE
MySQL Функции
Функции строк
ASCII
CHAR_LENGTH
CHARACTER_LENGTH
CONCAT
CONCAT_WS
FIELD
FIND_IN_SET
FORMAT
INSERT
INSTR
LCASE
LEFT
LENGTH
LOCATE
LOWER
LPAD
LTRIM
MID
POSITION
REPEAT
REPLACE
REVERSE
RIGHT
RPAD
RTRIM
SPACE
STRCMP
SUBSTR
SUBSTRING
SUBSTRING_INDEX
TRIM
UCASE
UPPER
Функции чисел
ABS
ACOS
ASIN
ATAN
ATAN2
AVG
CEIL
CEILING
COS
COT
COUNT
DEGREES
DIV
EXP
FLOOR
GREATEST
LEAST
LN
LOG
LOG10
LOG2
MAX
MIN
MOD
PI
POW
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SUM
TAN
TRUNCATE
Функции дат
ADDDATE
ADDTIME
CURDATE
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURTIME
DATE
DATEDIFF
DATE_ADD
DATE_FORMAT
DATE_SUB
DAY
DAYNAME
DAYOFMONTH
DAYOFWEEK
DAYOFYEAR
EXTRACT
FROM_DAYS
HOUR
LAST_DAY
LOCALTIME
LOCALTIMESTAMP
MAKEDATE
MAKETIME
MICROSECOND
MINUTE
MONTH
MONTHNAME
NOW
PERIOD_ADD
PERIOD_DIFF
QUARTER
SECOND
SEC_TO_TIME
STR_TO_DATE
SUBDATE
SUBTIME
SYSDATE
TIME
TIME_FORMAT
TIME_TO_SEC
TIMEDIFF
TIMESTAMP
TO_DAYS
WEEK
WEEKDAY
WEEKOFYEAR
YEAR
YEARWEEK
Функции расширений
BIN
BINARY
CASE
CAST
COALESCE
CONNECTION_ID
CONV
CONVERT
CURRENT_USER
DATABASE
IF
IFNULL
ISNULL
LAST_INSERT_ID
NULLIF
SESSION_USER
SYSTEM_USER
USER
VERSION
SQL Server функции
Функции строк
ASCII
CHAR
CHARINDEX
CONCAT
Concat with +
CONCAT_WS
DATALENGTH
DIFFERENCE
FORMAT
LEFT
LEN
LOWER
LTRIM
NCHAR
PATINDEX
QUOTENAME
REPLACE
REPLICATE
REVERSE
RIGHT
RTRIM
SOUNDEX
SPACE
STR
STUFF
SUBSTRING
TRANSLATE
TRIM
UNICODE
UPPER
Функции чисел
ABS
ACOS
ASIN
ATAN
ATN2
AVG
CEILING
COUNT
COS
COT
DEGREES
EXP
FLOOR
LOG
LOG10
MAX
MIN
PI
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SQUARE
SUM
TAN
Функции дат
CURRENT_TIMESTAMP
DATEADD
DATEDIFF
DATEFROMPARTS
DATENAME
DATEPART
DAY
GETDATE
GETUTCDATE
ISDATE
MONTH
SYSDATETIME
YEAR
Функции расширений
CAST
COALESCE
CONVERT
CURRENT_USER
IIF
ISNULL
ISNUMERIC
NULLIF
SESSION_USER
SESSIONPROPERTY
SYSTEM_USER
USER_NAME
MS Access функции
Функции строк
Asc
Chr
Concat with &
CurDir
Format
InStr
InstrRev
LCase
Left
Len
LTrim
Mid
Replace
Right
RTrim
Space
Split
Str
StrComp
StrConv
StrReverse
Trim
UCase
Функции чисел
Abs
Atn
Avg
Cos
Count
Exp
Fix
Format
Int
Max
Min
Randomize
Rnd
Round
Sgn
Sqr
Sum
Val
Функции дат
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
Format
Hour
Minute
Month
MonthName
Now
Second
Time
TimeSerial
TimeValue
Weekday
WeekdayName
Year
Другие функции
CurrentUser
Environ
IsDate
IsNull
IsNumeric
SQL ОператорыSQL Типы данныхSQL Краткий справочник
Полное множество
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)
1 |
(SELECTp.id,p.name`Имясотрудника`,ps.id`pos.id`,ps.name`Должность` FROM`persons`p LEFT OUTER JOIN`positions`ps ON ps.id=p.post_id) UNION (SELECTp.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)
1 |
(SELECTp.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 (SELECTp.id,p.name`Имясотрудника`,ps.id`pos.id`,ps.name`Должность` FROM`persons`p RIGHT OUTER JOIN`positions`ps ON ps.id=p.post_id WHEREp.id ISNULL) |
Этот пример показывает нам как исключить пересечение и получить только левую или правую часть множества.
Рассматривать мы будем:
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- OUTER JOIN
- LEFT JOIN EXCLUDING INNER JOIN
- RIGHT JOIN EXCLUDING INNER JOIN
- OUTER JOIN EXCLUDING INNER JOIN
Отдельно стоит отметить пункты 5,6 и 7. На самом деле эти запросы не соединяют две таблицы, а наоборот исключают из одной таблицы столбцы присутствующие в другой. На деле это может оказать очень полезным.
Inner JOIN
Один из самых распространенных запросов, встречается предельно часто. Этот запрос вернет все записи из левой таблицы (таб. А) и записи из (таб. В), но при этом возвращены будут только совпадающие столбцы.
Пример запроса:
Просмотр кода SQL
SELECT <select_list> FROM Table_A A INNER JOIN Table_B B ON A.Key = B.Key |
Left JOIN
Данный запрос вернет все столбцы из левой таблицы (таб. А), а также все столбцы из правой таблицы (таб. В) но только которые совпадают со столбцами из левой таблицы.
Пример запроса:
Просмотр кода SQL
SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key |
Right JOIN
Аналогичен предыдущему запросу, но уже вернет все столбцы из правой таблицы (таб. В), а также все столбцы из левой таблицы (таб. А) которые совпадают со столбцами из правой таблицы.
Пример запроса:
Просмотр кода SQL
SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key |
Outer JOIN
Часто данный запрос записывают как FULL OUTER JOIN или FULL JOIN, все вариации выполняют одно действие, а именно возвращают все столбцы из обоих таблиц, при этом совпадающие столбцы будут перекрыты столбцами из левой таблицы.
Пример запроса:
Просмотр кода SQL
SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key |
Left Excluding JOIN
Этот запрос вернет все столбцы из левой таблицы (таб. А), которые не совпадают со столбцами из правой таблицы (таб. В).
Пример запроса:
Просмотр кода SQL
SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key WHERE B.Key IS NULL |
Right Excluding JOIN
Почти как и предыдущий, но этот запрос вернет все столбцы из правой таблицы (таб. В), которые не совпадают со столбцами из левой таблицы (таб. А).
Пример запроса:
Просмотр кода SQL
SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL |
Outer Excluding JOIN
Этот запрос вернет все записи из левой и правой таблицы, но при этом исключит совпадающие столбцы.
Пример запроса:
Просмотр кода SQL
SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL |
Надеюсь этот пост пригодится многим начинающий веб-разработчикам, ведь запомнить сразу все отличия запросов друг от друга очень сложно, ввиду чего многие пользуются одним, двумя типами запросов и забывают про силу и мощь mySQL.
В качестве шпаргалки приведу изображение со всеми типами JOIN запросов и кратким примером кода.
MySQL LEFT JOIN clause examples
Let’s take some examples of using the clause.
1) Using MySQL LEFT JOIN clause to join two tables
See the following tables and in the sample database.
Each customer can have zero or more orders while each order must belong to one customer.
This query uses the clause to find all customers and their orders:
Alternatively, you can save some typing by using table aliases:
In this example:
- The is the left table and is the right table.
- The clause returns all customers including the customers who have no order. If a customer has no order, the values in the column and are .
Because both table customers and orders have the same column name ( ) in the join condition with the equal operator, you can use the USING syntax as follows:
The following clauses are equivalent:
And
If you replace the clause by the clause, you will get the only customers who have at least one order.
2) Using MySQL LEFT JOIN clause to find unmatched rows
The clause is very useful when you want to find rows in a table that doesn’t have a matching row from another table.
The following example uses the to find customers who have no order:
3) Using MySQL LEFT JOIN to join three tables
See the following three tables , , and :
This example uses two clauses to join the three tables: , , and .
This picture shows the partial output:
How it works.
- The first returns all employees and customers who represented each employee or if the employee does not in charge of any customer.
- The second returns payments of each customer represented by an employee or if the customer has no payment.
Анимированная версия
SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour NOT IN («Зеленый», «Синий»)
Внутреннее условие соединения необязательно должно быть условием равенства, и ему не нужно ссылаться на столбцы из (или даже любой) таблиц. Оценка в каждой строке перекрестного соединения возвращается.
SELECT A.Colour, B.Colour FROM IN INER JOIN B ON 1 = 1
Условие соединения оценивается как true для всех строк в результате перекрестного соединения, так что это то же самое, что и кросс-соединение. Я не буду повторять изображение 16 строк.
SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour
Внешние соединения логически оцениваются так же, как и внутренние соединения, за исключением того, что если строка из левой таблицы (для левого соединения) не объединяется ни с одной строкой из правой таблицы, она сохраняется в результате с значениями для правые столбцы.
SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL
Это просто ограничивает предыдущий результат только возвратом строк, где . В этом конкретном случае это будут строки, которые были сохранены, поскольку они не совпадали в правой таблице, и запрос возвращает единственную красную строку, не сопоставленную в таблице Это известно как анти-соединение.
Важно выбрать столбец для теста который либо не имеет значения NULL, либо для которого условие соединения гарантирует, что любые значения будут исключены для правильной работы этого шаблона и избежания просто возврата строк, которые имеют Значение для этого столбца в дополнение к несогласованным строкам
SELECT A.Colour, B.Colour FROM A RIGHT OUTER JOIN B ON A.Colour = B.Colour
Правые внешние соединения действуют аналогично левым внешним соединениям, за исключением того, что они сохраняют несоответствующие строки из правой таблицы, а null расширяют левые столбцы.
SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON A.Colour = B.Colour
Полное внешнее объединение объединяет поведение левого и правого объединений и сохраняет несоответствующие строки как из левой, так и из правой таблиц.
SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON 1 = 0
Никакие строки в перекрестном соединении не соответствуют предикату . Все строки с обеих сторон сохраняются с использованием обычных правил внешнего соединения с NULL в столбцах из таблицы с другой стороны.
Обратите внимание, что (если присутствует) логически запускается после соединения. Одной из распространенных ошибок является выполнение левого внешнего соединения, а затем включение предложения WHERE с условием в правой таблице, которое заканчивается исключением несоответствующих строк
Вышеприведенное завершает выполнение внешнего соединения…
… И затем выполняется предложение «Где». не оценивает значение true, поэтому строка, сохраненная внешним соединением, заканчивается отбрасыванием (вместе с синим), эффективно преобразуя соединение обратно во внутреннее.
Если бы намерение состояло в том, чтобы включать только строки из B, где Цвет Зеленый, а все строки из A, независимо от правильного синтаксиса,
Внешнее соединение
В предшествующих примерах естественного соединения, результирующий набор содержал только те строки с одной таблицы, для которых имелись соответствующие строки в другой таблице. Но иногда кроме совпадающих строк бывает необходимым извлечь из одной или обеих таблиц строки без совпадений. Такая операция называется внешним соединением (outer join).
В примере ниже показана выборка всей информации для сотрудников, которые проживают и работают в одном и том же городе. Здесь используется таблица EmployeeEnh, которую мы создали в статье «Инструкция SELECT: расширенные возможности» при обсуждении оператора UNION.
Результат выполнения этого запроса:
В этом примере получение требуемых строк осуществляется посредством естественного соединения. Если бы в этот результат потребовалось включить сотрудников, проживающих в других местах, то нужно было применить левое внешнее соединение. Данное внешнее соединение называется левым потому, что оно возвращает все строки из таблицы с левой стороны оператора сравнения, независимо от того, имеются ли совпадающие строки в таблице с правой стороны. Иными словами, данное внешнее соединение возвратит строку с левой таблицы, даже если для нее нет совпадения в правой таблице, со значением NULL соответствующего столбца для всех строк с несовпадающим значением столбца другой, правой, таблицы. Для выполнения операции левого внешнего соединения компонент Database Engine использует оператор LEFT OUTER JOIN.
Операция правого внешнего соединения аналогична левому, но возвращаются все строки таблицы с правой части выражения. Для выполнения операции правого внешнего соединения компонент Database Engine использует оператор RIGHT OUTER JOIN.
В этом примере происходит выборка сотрудников (с включением полной информации) для таких городов, в которых сотрудники или только проживают (столбец City в таблице EmployeeEnh), или проживают и работают. Результат выполнения этого запроса:
Как можно видеть в результате выполнения запроса, когда для строки из левой таблицы (в данном случае EmployeeEnh) нет совпадающей строки в правой таблице (в данном случае Department), операция левого внешнего соединения все равно возвращает эту строку, заполняя значением NULL все ячейки соответствующего столбца для несовпадающего значения столбца правой таблицы. Применение правого внешнего соединения показано в примере ниже:
В этом примере происходит выборка отделов (с включением полной информации о них) для таких городов, в которых сотрудники или только работают, или проживают и работают. Результат выполнения этого запроса:
Кроме левого и правого внешнего соединения, также существует полное внешнее соединение, которое является объединением левого и правого внешних соединений. Иными словами, результирующий набор такого соединения состоит из всех строк обеих таблиц. Если для строки одной из таблиц нет соответствующей строки в другой таблице, всем ячейкам строки второй таблицы присваивается значение NULL. Для выполнения операции полного внешнего соединения используется оператор FULL OUTER JOIN.
Любую операцию внешнего соединения можно эмулировать, используя оператор UNION совместно с функцией NOT EXISTS. Таким образом, запрос, показанный в примере ниже, эквивалентен запросу левого внешнего соединения, показанному ранее. В данном запросе осуществляется выборка сотрудников (с включением полной информации) для таких городов, в которых сотрудники или только проживают или проживают и работают:
Первая инструкция SELECT объединения определяет естественное соединение таблиц EmployeeEnh и Department по столбцам соединения City и Location. Эта инструкция возвращает все города для всех сотрудников, в которых сотрудники и проживают и работают. Дополнительно, вторая инструкция SELECT объединения возвращает все строки таблицы EmployeeEnh, которые не отвечают условию в естественном соединении.
Introduction to MySQL join clauses
A relational database consists of multiple related tables linking together using common columns, which are known as foreign key columns. Because of this, data in each table is incomplete from the business perspective.
For example, in the sample database, we have the and tables that are linked using the column:
To get complete order’s information, you need to query data from both and tables.
That’s why joins come into the play.
A join is a method of linking data between one (self-join) or more tables based on values of the common column between the tables.
MySQL supports the following types of joins:
- Inner join
- Left join
- Right join
- Cross join
To join tables, you use the cross join, inner join, left join, or right join clause. The join clause is used in the statement appeared after the clause.
Note that MySQL hasn’t supported the yet.
What is the difference between Left Join and Left Outer Join in SQL?
There is actually no difference between a left join and a left outer join – both of them refer to the similar operation in SQL.
Sample table: company
COMPANY_ID COMPANY_NAME COMPANY_CITY ---------- ------------------------- ------------- 18 Order All Boston 15 Jack Hill Ltd London 16 Akas Foods Delhi 17 Foodies. London 19 sip-n-Bite. New York
Sample table: foods
ITEM_ID ITEM_NAME ITEM_UNIT COMPANY_ID -------- ------------------------- ---------- ---------- 1 Chex Mix Pcs 16 6 Cheez-It Pcs 15 2 BN Biscuit Pcs 15 3 Mighty Munch Pcs 17 4 Pot Rice Pcs 15 5 Jaffa Cakes Pcs 18 7 Salt n Shake Pcs
The important point to be noted that the very last row in the company table, the company ID does not exist in the foods table. Also, the very last row in the foods table the value of company ID is NULL and does not exist in the company table. These facts will prove to be significant of the left join.
Here the SQL statement without using «outer» with «left join».
SQL Code:
Running the SQL with the «outer» keyword, would give us the exact same results as running the SQL without the “outer”. Here the SQL statement with «outer» with «left join».
SQL Code:
A left outer join or left join retains all of the rows of the left table company, regardless of whether there is a row that matches on the right table foods. Here is the output below for both of the above statement.
Output:
COMPANY_ID COMPANY_NAME ITEM_ID ITEM_NAME COMPANY_ID ---------- ------------------------- -------- ------------------------- ---------- 16 Akas Foods 1 Chex Mix 16 15 Jack Hill Ltd 6 Cheez-It 15 15 Jack Hill Ltd 2 BN Biscuit 15 17 Foodies. 3 Mighty Munch 17 15 Jack Hill Ltd 4 Pot Rice 15 18 Order All 5 Jaffa Cakes 18 19 sip-n-Bite. NULL NULL NULL
Outputs of the said SQL statement shown here is taken by using Oracle Database 10g Express Edition.
LEFT JOIN: Relational Databases
- Oracle LEFT JOIN
- MySQL LEFT JOIN
- PostgreSQL LEFT JOIN
- SQLite LEFT JOIN
Key points to remember :
Click on the following to get the slides presentation —
SQL FULL OUTER JOIN
Another type of join is called a SQL FULL OUTER JOIN. This type of join returns all rows from the LEFT-hand table and RIGHT-hand table with NULL values in place where the join condition is not met.
Syntax
The syntax for the SQL FULL OUTER JOIN is:
SELECT columns FROM table1 FULL JOIN table2 ON table1.column = table2.column;
In some databases, the OUTER keyword is omitted and written simply as FULL JOIN.
Visual Illustration
In this visual diagram, the SQL FULL OUTER JOIN returns the shaded area:
The SQL FULL OUTER JOIN would return the all records from both table1 and table2.
Example
Let’s look at an example that shows how to use the FULL OUTER JOIN in a SELECT statement.
Using the same customers table as the previous example:
customer_id | last_name | first_name | favorite_website |
---|---|---|---|
4000 | Jackson | Joe | techonthenet.com |
5000 | Smith | Jane | digminecraft.com |
6000 | Ferguson | Samantha | bigactivities.com |
7000 | Reynolds | Allen | checkyourmath.com |
8000 | Anderson | Paige | NULL |
9000 | Johnson | Derek | techonthenet.com |
And the orders table with the following data:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2016/04/18 |
2 | 5000 | 2016/04/18 |
3 | 8000 | 2016/04/19 |
4 | 4000 | 2016/04/20 |
5 | NULL | 2016/05/01 |
Enter the following SQL statement:
Try It
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;
There will be 7 records selected. These are the results that you should see:
customer_id | order_id | order_date |
---|---|---|
NULL | 5 | 2016/05/01 |
4000 | 4 | 2016/04/20 |
5000 | 2 | 2016/04/18 |
6000 | NULL | NULL |
7000 | 1 | 2016/04/18 |
8000 | 3 | 2016/04/19 |
9000 | NULL | NULL |
This FULL OUTER JOIN example would return all rows from the orders table and all rows from the customers table. Whenever the joined condition is not met, a NULL value would be extended to those fields in the result set. This means that if a customer_id value in the customers table does not exist in the orders table, all fields in the orders table will display as NULL in the result set. Also, if a customer_id value in the orders table does not exist in the customers table, all fields in the customers table will display as NULL in the result set.
As you can see, the rows where the customer_id is 6000 and 9000 would be included but the order_id and order_date fields for those records contains a NULL value. The row where the order_id is 5 would be also included but the customer_id field for that record has a NULL value.
SQL RIGHT OUTER JOIN
Another type of join is called a SQL RIGHT OUTER JOIN. This type of join returns all rows from the RIGHT-hand table specified in the ON condition and only those rows from the other table where the joined fields are equal (join condition is met).
Syntax
The syntax for the RIGHT OUTER JOIN in SQL is:
SELECT columns FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
In some databases, the OUTER keyword is omitted and written simply as RIGHT JOIN.
Visual Illustration
In this visual diagram, the SQL RIGHT OUTER JOIN returns the shaded area:
The SQL RIGHT OUTER JOIN would return the all records from table2 and only those records from table1 that intersect with table2.
Example
Now let’s look at an example that shows how to use the RIGHT OUTER JOIN in a SELECT statement.
Using the same customers table as the previous example:
customer_id | last_name | first_name | favorite_website |
---|---|---|---|
4000 | Jackson | Joe | techonthenet.com |
5000 | Smith | Jane | digminecraft.com |
6000 | Ferguson | Samantha | bigactivities.com |
7000 | Reynolds | Allen | checkyourmath.com |
8000 | Anderson | Paige | NULL |
9000 | Johnson | Derek | techonthenet.com |
And the orders table with the following data:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2016/04/18 |
2 | 5000 | 2016/04/18 |
3 | 8000 | 2016/04/19 |
4 | 4000 | 2016/04/20 |
5 | NULL | 2016/05/01 |
Enter the following SQL statement:
Try It
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;
There will be 5 records selected. These are the results that you should see:
customer_id | order_id | order_date |
---|---|---|
NULL | 5 | 2016/05/01 |
4000 | 4 | 2016/04/20 |
5000 | 2 | 2016/04/18 |
7000 | 1 | 2016/04/18 |
8000 | 3 | 2016/04/19 |
This RIGHT OUTER JOIN example would return all rows from the orders table and only those rows from the customers table where the joined fields are equal.