LEFT OUTER JOIN
It returns all the rows that satisfy the join condition and also returns all the rows from the table on the left side of the JOIN keyword. Note, if no matching rows are found, it will return a NULL value
SQL JOIN METHOD
In SQL join method, we simply use LEFT OUTER JOIN keyword to join the tables
SELECT m.member_name, b.category FROM members m LEFT OUTER JOIN books b ON m.book_id=b.book_id; OR SELECT m.member_name, b.category FROM members m LEFT OUTER JOIN books b USING (book_id); MEMBER_NAME CATEGORY -------------- ---------- John Inspire Max Novel Sam Business Leo Sales Kish
Observe that we got all the rows as output from the MEMBERS table because its on the left side of the JOIN keyword. We also have output from the BOOKS table (which is on the right side of the JOIN keyword).
In the above output all records from MEMBERS table are present in the output as all satisfy the join condition. As we do not have any record in the MEMBERS table that do not satisfy the JOIN condition, hence no null values.
TRADITIONAL METHOD
In traditional method of joining, we use “(+)” on the side of table B. Many people get confused abut using “(+)” on the side of table A as it is a LEFT OUTER JOIN
SELECT m.member_name, b.category FROM members m, books b WHERE m.book_id = b.book_id (+); MEMBER_NAME CATEGORY -------------- ---------- John Inspire Max Novel Sam Business Leo Sales Kish
MySQL CROSS JOIN clause
Unlike the inner join, left join, and right join, the cross join clause does not have a join condition.
The cross join makes a Cartesian product of rows from the joined tables. The cross join combines each row from the first table with every row from the right table to make the result set.
Suppose the first table has rows and the second table has rows. The cross join that joins the tables will return rows.
The following shows the syntax of the cross join clause:
This example uses the cross join clause to join the with the tables:
The cross join is useful for generating planning data. For example, you can carry the sales planning by using the cross join of customers, products, and years.
In this tutorial, you have learned various MySQL join statements, including cross join, inner join, left join, and right join, to query data from two tables.
SQL RIGHT OUTER JOIN JOIN
Другой тип соединения называется SQL RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с правосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны (выполняется условие соединения).
Синтаксис
Синтаксис для RIGHT OUTER JOIN в SQL:
SELECT columns
FROM table1
RIGHT 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 оператор:
PgSQL
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;
1 |
SELECTcustomers.customer_id, orders.order_id, orders.order_date FROMcustomers RIGHT OUTER JOINorders ONcustomers.customer_id=orders.customer_id ORDERBYcustomers.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.
4 Разница между INNER / LEFT / RIGHT / FULL JOIN
- INNER JOIN…ON…: Вернуть все строки, которые соответствуют друг другу в левой и правой таблицах (потому что выше выполняется только второй шаг фильтрации ON, а третий шаг не выполняется для добавления внешних строк)
- LEFT JOIN…ON…: Вернуть все строки левой таблицы, если некоторые строки не имеют соответствующих совпадающих строк в правой таблице, установите для столбцов правой таблицы значение NULL в новой таблице
- RIGHT JOIN…ON…: Вернуть все строки правой таблицы, если некоторые строки не имеют соответствующих совпадающих строк в левой таблице, установите для столбцов левой таблицы значение NULL в новой таблице
INNER JOIN
Сделайте третий шаг вышеДобавить внешнюю строкуНапример, еслиLEFT JOINЗаменитьINNER JOIN, Этот шаг будет пропущен, а сгенерированная таблица vt3 будет точно такой же, как vt2:
RIGHT JOIN
ЕслиLEFT JOINЗаменитьRIGHT JOIN, Сгенерированная таблица vt3 выглядит следующим образом:
Поскольку в user_account (правая таблица) есть строка с идентификатором пользователя = 1009, но в user_info (левая таблица) запись для этой строки не найдена, на третьем шаге будет вставлена следующая строка:
FULL JOIN
Указанная выше статьяУпоминается в стандартном определении SQLFULL JOIN, Это не поддерживается в mysql, но мы можем передатьLEFT JOIN + UNION + RIGHT JOIN чтобы понятьFULL JOIN:
Он вернет следующие результаты:
ps: Фактически, мы можем видеть из семантикиLEFT JOINс участиемRIGHT JOINНет никакой разницы. Разница между двумя результатами зависит от порядка размещения левой и правой таблиц. Следующее взято из официальной документации MySQL:
Поэтому, когда вы запутались в использовании LEFT JOIN или RIGHT JOIN, используйте LEFT JOIN как можно чаще.
Conclusion
The SQL CROSS JOIN allows you to generate a Cartesian product for two given sets of data. When the underlying use case calls for generating a Cartesian product like it was the case for our poker game, then using a CROSS JOIN is the idiomatic way for addressing this task.
Note that a Cartesian product could be generated unintentionally, too, in which case it would indicate a flaw in the join conditions. For instance, this could happen when joining two or more unrelated one-to-many table relationships. For more details about this unintentional Cartesian product issues and how you can fix them, check out this article.
Follow @vlad_mihalcea
SQL INNER JOIN | EXAMPLE 1
Let us see example 1 to join the table of Students with Courses with INNER Join Class and with only JOIN clause. We will observe the output result table whether the result of the INNER JOIN and only the JOIN keyword are the same. As it has been mentioned that you can use either INNER JOIN or only JOIN.
Syntax / Code Comparison
- is the Table1
- is the Table2
- is the join_predicate
- SELECT, FROM, INNER JOIN, and ON are the keyword of SQL
OUTPUT
Table 1
Observe the output of the first INNER JOIN Example shown by Table 1, You can see only the four rows are present in the output. You can see above the Students Table that it has five students. The Courses Table has a total of four records. In the output, you can see that only those records are taken which have similar values in the ID field of the Students Table and the SID field of the Courses Table. INNER JOIN defines. Here is the analysis of the rows from both tables.
- ON clause of this SELECT query states that Students.ID must be equal to filed.
- INNER JOIN clause that this will find only match values in both Students.ID and must be equal to field.
- Stephen, Lucas, and Brendon are those students from the Students Table who have matched values in the Courses table.
- Computing, Data structure, programming, and OOP are the courses to which Stephen, Lucas, and Brendon have registered.
- All other 2 students from the Students table do not have any match in the SID column of the Courses table.
SQL INNER JOIN Examples
Suppose we have a demo Database with four tables.
- The students table is used to store the records about the students.
- The courses table is used to store the information about the courses.
- A teacher table is used to store the information about teachers.
- The CourseRegistration table is used to store the information about the students and their registered courses with teachers.
The following diagram (Figure 2) shows the Tables structure and relationship among these. You can observe that the Students, the Courses, and the Teacher all these tables have one-to-many with CourseRegistration.
Figure -2
The Students Table
ID | StName | Age | City | Fee |
---|---|---|---|---|
1 | Stephen | 23 | London | 2000 |
2 | Lucas | 32 | New York | 2100 |
3 | Brendon | 34 | Oslo | 2300 |
4 | Ahmad | 31 | Mumbai | 3400 |
5 | Joe | 45 | China | 2300 |
The Courses Table
CID | CourseName | Duration | SID | CR |
---|---|---|---|---|
101 | Computing | 3 months | 1 | 3 |
201 | Programming | 4 months | 2 | 3 |
301 | Data Structures | 6 Months | 1 | 3 |
401 | OOP | 2 Months | 3 | 2 |
The Teacher Table
TeacherID | TeacherName | TeacherOffice | TeacherGrade |
---|---|---|---|
T101 | Habib Ullah Qamar | Admin block | 17 |
T102 | Deepak Prasad | CS Block | 18 |
T103 | Martin | Sociology Block | 17 |
T104 | Pressman | SE Block | 19 |
T105 | Michael Sisper | CS Block | 19 |
T106 | Ahmad | Psychology Block | 18 |
The CourseRegistration Table
Advertisement
TeacherID | StudentID | CourseID | Semester |
---|---|---|---|
T101 | 1 | 101 | Fall |
T101 | 2 | 201 | Fall |
T102 | 3 | 101 | Spring |
T103 | 1 | 301 | Spring |
T103 | 4 | 301 | Fall |
T104 | 5 | 401 | Fall |
T105 | 6 | 101 | Spring |
T106 | 2 | 201 | Fall |
T105 | 3 | 301 | Fall |
T106 | 5 | 401 | Spring |
INNER JOIN in Sql Server
Inner Join returns only the matching rows in both the tables (i.e. returns only those rows for which the join condition satisfies).
Demo 1: As per the data in our demo tables, Customers with CustomerId 1 and 3 in Customers table have the orders in the Orders table. Where as the customer with CustomerId 2 doesn’t have any order in the Orders table. So the Inner Join on the CustomerId column between Customers and Orders table will return the Customer and Order details of the Customers with CustomerId 1 and 3 only.
SELECT * FROM Customers C INNER JOIN Orders O ON O.CustomerId = C.CustomerId
RESULT:
Demo 2: Below Inner Join query demonstrates how to get name of all the Customer who have at-least one order in the Orders table.
SELECT C.Name FROM Customers C INNER JOIN Orders O ON O.CustomerId = C.CustomerId
RESULT:
Name
——————-
Basavaraj
Shree
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 оператор:
PgSQL
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;
1 |
SELECTcustomers.customer_id, orders.order_id, orders.order_date FROMcustomers INNER JOINorders ONcustomers.customer_id=orders.customer_id ORDERBYcustomers.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.
Вместо заключения
Помните о порядке выполнения соединений и порядке таблиц, если используете несколько соединений и используете внешние соединения. Можно выполнять 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 */
- < Назад
- Вперёд >
Новые статьи:
-
Объединение таблиц – UNION
-
Соединение таблиц – операция JOIN и ее виды
-
Тест на знание основ SQL
Если материалы office-menu.ru Вам помогли, то поддержите, пожалуйста, проект, чтобы я мог развивать его дальше.
Joining More than Two Tables
There may be times when you need to combine data from more than just two tables. You can join any number of tables together by embedding clauses within other clauses. The following syntax is an example of how this can look when joining three tables:
This example syntax’s clause starts by joining with . After this joining’s clause, it starts a second that combines the initial set of joined tables with . Note that the third table can be joined to a column in either the first or second table.
To illustrate, imagine that you want to know how much revenue your employee’s sales have brought in, but you only care about sales records that involve an employee selling the product they specialize in.
To get this information, you could run the following query. This query starts by joining the and tables together by matching their respective columns. It then joins the table to the first two by matching each row in the initial to its column. The query then filters the results with a clause to only return rows where the matched employee was also the person who made the sale. This query also includes an clause that sorts the final results in ascending order based on the value in the column:
Note that among the columns listed in this query’s clause is an expression that multiplies the values in the table’s column by the table’s values. It returns the products of these values in the matched rows:
All the examples so far have featured the same type of clause: the . For an overview of joins, joins, and how they differ, continue reading the next section.
JOIN Condition
Tables are joined together by at least one common attribute. This common attribute is often referred to as a foreign key. As demonstrated in the excel example, VLOOKUP function also takes advantage of this shared attribute. We use this shared attribute (foreign key) as the matching point where we can find corresponding information of each row in another table. This common attribute needs to be explicitly indicated as the join condition in the SQL statement.
Country Code example (image by author)
Let’s continue with this country code example. The aim of this exercise is to find the country name of each criterion in the “Google_Ads_GeoTargets” table. The datasets are from Google Public Dataset. Have an exploration and try to implement it in the BigQuery if you are interested.
In the left table, we have already got the country_code for each criterion and the Country_Code table provides us with the country name of fips_code. Therefore, the logic is to match the country_code in the GeoTarget table to the fips_code in the Country_Code table and find the corresponding name. country_code and fips_code are the common attributes that build the relationship between two tables.
We write down the following statement to indicate the join condition. Notice that it is better to use the table name as the attribute prefix and don’t forget the keyword “ON”:
ON Google_Ads_GeoTargets.country_code = Country_Code.fips_code
Mechanics of SQL Joins
When broken down the mechanics of a SQL join are pretty straightforward. To perform a join you need two items: two tables and a join condition. The tables contain the rows to combine, and the join condition the instructions to match rows together.
Take a look at the following Venn diagram. The circles represent the tables and where they overlap rows satisfying the join condition.
You may be wondering what makes up a join condition. In many cases a join condition is just matching one or more fields in one table to those in another.
A common join pattern used to join the primary key of one table to its foreign key. I suppose this is self-evident, but I think it is important to highlight it. Can you think why this is the case?
Use of ORDER BY Clause with INNER JOIN
It has been mentioned in every example and in every output, the order of the output rows is taken from the order of Table1 in the SELECT Query. You can use the ORDER BY clause in INNER JOIN as well as WHERE Clause if you want to change the order of the output rows. ORDER By clause can use any of the Column names either from Table 1 or Table 2 in the following way.
This example will generate the same output as Table 4 but CourseID will be ordered in ascending order. The required SELECT statement expressing How to use the ORDER BY clause with SQL INNER JOIN will be as under :
OUTPUT
Table 6
This time output is the same as the output of Table 5, but the order of the rows is different. CID Columns is in Ascending order with the use of the ORDER BY clause. As far as ORDER is concerned.
Advertisement
Oracle full outer join
Oracle full outer join or full join returns a result set that contains all rows from both left and right tables, with the matching rows from both sides where available. If there is no match, the missing side will have nulls.
The following example shows the full outer join of the left and right tables:
The following picture illustrates the result set of the full outer join:
Note that the keyword is optional.
The following Venn diagram illustrates the full outer join:
To get a set of rows that are unique from the left and right tales, you perform the same full join and then exclude the rows that you don’t want from both sides using a clause as follows:
Here is the result:
The following Venn diagram illustrates the above operation:
In this tutorial, you have learned how to use various kinds of Oracle joins to query data from two tables.
Setup tables
For our join example, we will be using sample tables. Create below tables and insert rows before proceeding with Oracle join types.
Create first table Books
CREATE TABLE books ( book_id NUMBER(4) CONSTRAINT books_pk PRIMARY KEY, title VARCHAR2(30), category VARCHAR2(10) ); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (1,'Wolf of wallsteet','Business'); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (2,'Start with why','Inspire'); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (3,'The one thing','Inspire'); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (4,'Real Steel','Business'); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (5,'Safe house','Novel'); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (6,'Leader eat last','Business'); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (7,'10X rule','Sales'); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (8,'Sell or be sold','Sales'); Insert into BOOKS (BOOK_ID,TITLE,CATEGORY) values (9,'Obama',NULL);
Create second table Members
CREATE TABLE members ( member_id NUMBER(2) CONSTRAINT member_pk PRIMARY KEY, member_name VARCHAR2(14), book_id NUMBER(4) CONSTRAINT members_books_id_fk REFERENCES books(book_id) ); Insert into MEMBERS (MEMBER_ID,MEMBER_NAME,BOOK_ID) values (11,'John',3); Insert into MEMBERS (MEMBER_ID,MEMBER_NAME,BOOK_ID) values (22,'Max',5); Insert into MEMBERS (MEMBER_ID,MEMBER_NAME,BOOK_ID) values (33,'Sam',6); Insert into MEMBERS (MEMBER_ID,MEMBER_NAME,BOOK_ID) values (44,'Leo',7); Insert into MEMBERS (MEMBER_ID,MEMBER_NAME,BOOK_ID) values (55,'Kish',9);
These tables are for demonstration purpose and you create create it in any database schema.
Db2 Left Join
The left join selects data starting from the left table and matches rows in the right table. Similar to the inner join, the left join returns all rows from the left table and the matching rows from the right table. In addition, if a row in the left table does not have a matching row in the right table, the columns of the right table will have nulls.
Note that the left join is also called the left outer join. The outer keyword is optional.
The following statement joins the table with the table using left join:
Here is the result set:
This Venn diagram illustrates the left join of two result sets:
To get the rows that available only in the left table but not in the right table, you add a clause to the above query:
And the this Venn diagram illustrates the left join that selects rows available only in the left table:
Проще простого – Inner
Первый вариант – это использование простого объединения. Встречается на практике чаще всего. Возвращает пересечение нескольких (обычно двух) множеств. В табличной терминологии — происходит возврат записи, которая имеется в обоих таблицах. Оная должна соответствовать выставленному заранее критерию.
Для реализации поставленной задачи применяется INNER JOIN. Чтобы лучше понимать данный процесс, стоит составить диаграмму Венна:
- нарисовать круг – пусть это будет «таблица 1»;
- рядом, задевая область первой фигуры, изобразить второй круг – это «таблица 2»;
- закрасить область пересечения – это и есть результат операции inner join.
Рисунок выше – наглядный пример диаграммы Венна. С его помощью удастся разобраться в принципах «простого» объединения нескольких табличек.
Запись
Для того, чтобы выполнять те или иные операции в запросовом языке, стоит уточнить синтаксис желаемой команды. В случае с обычным (простым) объединением необходимо использовать следующий шаблон:
Здесь никаких проблем возникнуть не должно. Код легко читается:
- выбрать колонки;
- from table1 – из первой таблицы;
- объединить с таблицей 2.
Для наглядного примера стоит рассмотреть несколько таблиц с информацией, а также принцип joins типа inner.
Наглядный пример
Пусть будет дана таблица под названием customer. В ней такая информация:
Далее – создается таблица orders:
Теперь нужно joining поля в этих хранилищах информации простым объединением. Для реализации поставленной задачи составляется команда типа:
SELECT customers.customer_id,orders.order_id,orders.order_dateFROM customersINNER JOIN ordersON customers.customer_id = orders.customer_idORDER BY customers.customer_id; |
В конечном итоге при обработке запроса на экран будет выведен следующий результат:
Здесь выбираются поля в таблице, которые имеют одинаковые значения customer_id в обоих хранилищах. Поэтому другие поля будут пропущены. А строчка, где order_id = 5 в orders опускается, так как customer_id идут со значениями null. То есть, их нет в customers.
Саязанные таблицы в стиле MS
Объединение по стандарту SQL, который мы рассматривали в главе 2.7, описывает условие связи в секции WHERE. В MS зачем-то связи перенесли в секцию FROM. На мой взгляд, это как минимум не удобно для создания и для чтения связей. Стандартный вариант намного проще и удобнее. И все же, метод MS мы рассмотрим, ведь только с его помощью в MS Access можно создать левое или правое объединение, и этот же метод поддерживается в MS SQL Server.
Ортогональное объединение по методу MS, т.е. без указания связи:
SELECT * FROM tbPeoples CROSS JOIN tbPosition
Внутреннее объединение (эквивалентно знаку равенства) по методу MS описывается следующим образом:
SELECT * FROM tbPeoples pl INNER JOIN tbPosition ps ON pl.idPosition=ps.idPosition
Как видите, для этого метода не нужна секция WHERE, но зато намного больше всего нужно писать. Вначале мы описываем, что нам нужно внутреннее объединение (INNER JOIN). Слева и справа от этого оператора указываются таблицы, которые нужно связать. После этого ставиться ключевое слово ON, и только теперь наводим связь между полями связанных таблиц. Таким образом, этот запрос эквивалентен следующему:
SELECT * FROM tbPeoples pl, tbPosition ps WHERE pl.idPosition=ps.idPosition
Самая большая путаница начинается, когда нужно объединить три таблицы в одно целое. Посмотрите на следующий запрос:
SELECT * FROM tbPeoples pl LEFT OUTER JOIN tbPhoneNumbers pn ON pl.idPeoples=pn.idPeoples INNER JOIN tbPosition ps ON pl.idPosition=ps.idPosition
Сначала объединяются таблицы tbPeoples и tbPhoneNumbers через внешнее левое объединение (LEFT OUTER JOIN). Затем указывается связь между этими таблицами. А вот теперь результат объединение, связываем внутренним объединением (INNER JOIN) с таблицей tbPosition. Внимательно осмотрите запрос, чтобы понять его формат, и что в нем происходит.
Чтобы получить правое объединение, необходимо просто поменять перечисление таблиц местами:
SELECT * FROM tbPhoneNumbers pn RIGHT OUTER JOIN tbPeoples pl ON pl.idPeoples=pn.idPeoples INNER JOIN tbPosition ps ON pl.idPosition=ps.idPosition
Меняется местами перечисление таблиц, а вот порядок указания связанных полей не имеет особого значения и здесь ничего не меняется.
Если честно, то мне не очень нравиться объединение по методу Microsoft. Какое-то оно неудобное и громоздкое. Даже не знаю, зачем его придумали, когда в стандарте есть все то же самое, только намного проще и нагляднее.
SQL Challenge: Complex Query with Joins and Subqueries
Let’s take everything we’ve learned before and use it to write a more complex query. It’s not uncommon to find that ‘thinking in SQL’ takes a bit of getting used to, so don’t be discouraged if this query seems difficult to understand at first. It will get easier with practice!
When you’re writing complex queries with joins and subqueries, it helps to follow this process:
- Think about what data you need in your final output
- Work out which tables you’ll need to join, and whether you will need to join to a subquery.
- Then start writing your SELECT clause, followed by the join and any other clauses you will need.
- Don’t be afraid to write your query in steps, running it as you go— for instance you can run your subquery as a ‘stand alone’ query first to make sure it looks like you want before writing the outer query.
We will be writing a query to find the countries where the urban center (city) population is more than half of the country’s total population. There are multiple ways to write this query but we’ll step through one approach.
We can start by writing a query to sum all the urban populations for cities in each country. We can do this without a join by grouping on the (we’ll use a limit in our example below to make the output managable):
facts_id | urban_pop |
---|---|
1 | 3097000 |
10 | 172000 |
100 | 1127000 |
101 | 5000 |
102 | 546000 |
Next, we’ll join the table to that subquery, selecting the country name, urban population and total population (again, we’ve used a limit to keep things tidy):
country | urban_pop | total_pop |
---|---|---|
Afghanistan | 3097000 | 32564342 |
Austria | 172000 | 8665550 |
Libya | 1127000 | 6411776 |
Liechtenstein | 5000 | 37624 |
Lithuania | 546000 | 2884433 |
Lastly, we’ll create a new column that divides the urban population by the total population, and use a and to filter/rank the results:
country | urban_pop | total_pop | urban_pct |
---|---|---|---|
Uruguay | 1672000 | 3341893 | 0.500315 |
Congo, Republic of the | 2445000 | 4755097 | 0.514185 |
Brunei | 241000 | 429646 | 0.560927 |
New Caledonia | 157000 | 271615 | 0.578024 |
Virgin Islands | 60000 | 103574 | 0.579296 |
Falkland Islands (Islas Malvinas) | 2000 | 3361 | 0.595061 |
Djibouti | 496000 | 828324 | 0.598800 |
Australia | 13789000 | 22751014 | 0.606083 |
Iceland | 206000 | 331918 | 0.620635 |
Israel | 5226000 | 8049314 | 0.649248 |
United Arab Emirates | 3903000 | 5779760 | 0.675288 |
Puerto Rico | 2475000 | 3598357 | 0.687814 |
Bahamas, The | 254000 | 324597 | 0.782509 |
Kuwait | 2406000 | 2788534 | 0.862819 |
Saint Pierre and Miquelon | 5000 | 5657 | 0.883861 |
Guam | 169000 | 161785 | 1.044596 |
Northern Mariana Islands | 56000 | 52344 | 1.069846 |
American Samoa | 64000 | 54343 | 1.177705 |
You can see that while our final query is complex, it’s much easier to understand if you build it step-by-step.