Sql pl join: Oracle / PLSQL: Joins
Содержание
Выборка данных из нескольких таблиц (JOIN)
Довольно часто приходится выбирать данные из нескольких таблиц. Для показа в одном запросе данных из нескольких таблиц Oracle позволяет выполнять так называемые соединения таблиц. Имеется два относящихся к соединению таблиц правила, о которых следует постоянно помнить. Данные из двух (или нескольких) таблиц могут быть объединены в том случае, если у обеих таблиц имеется совпадающий столбец (с тем же самым или с другим именем) и этот столбец в одной из таблиц является первичным ключом (или частью этого ключа).
SELECT ename, deptno FROM emp ORDER BY deptno; | SELECT deptno, dname FROM dept ORDER BY deptno; | ||||||||||||||||||||||||||||||||||||||||
|
|
Давайте рассмотрим пример оператора соединения (join), использующего традиционный синтаксис Oracle, где мы объединяем вместе содержимое таблиц emp и dept для получения перечня всех сотрудников и названий отделов, где они работают:
SELECT e. ename, e.deptno, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno;
ENAME | DEPTNO | DNAME |
---|---|---|
CLARK | 10 | ACCOUNTING |
KING | 10 | ACCOUNTING |
MILLER | 10 | ACCOUNTING |
JONES | 20 | RESEARCH |
FORD | 20 | RESEARCH |
ADAMS | 20 | RESEARCH |
SMITH | 20 | RESEARCH |
SCOTT | 20 | RESEARCH |
WARD | 30 | SALES |
TURNER | 30 | SALES |
ALLEN | 30 | SALES |
JAMES | 30 | SALES |
BLAKE | 30 | SALES |
MARTIN | 30 | SALES |
Обратите внимание на многие важные компоненты этого соединения таблиц. Использование во фразе FROM двух таблиц четко указывает на то, что имеет место соединиения таблиц. Обратите также внимание на то, что перед именем каждой таблицы присутствует буква: e для таблицы emp или d для таблицы dept. Это служит иллюстрацией интересной концепции – столбцы могут иметь псевдонимы точно так же, как их имеют таблицы. Псевдонимы служат важной цели – они не дают Oracle запутаться в том, какую таблицу использовать при выводе данных в столбец deptno. Вспомните, что в обеих таблицах (emp и dept) имеются столбцы с именем deptno.
Неоднозначности при соединении таблиц можно также избежать, если в качестве префикса перед именем столбца указать имена таблиц.
SELECT emp.ename, emp.deptno, dept.dname FROM emp, dept WHERE emp.deptno = dept.deptno;
Заметьте, что в нашу фразу WHERE включено сравнение по полю deptno, соединяющему данные в emp с данными в dept. В случае отсутствия этой связи в выходные данные были вы включены все данные из emp и dept.
Синтаксис соединения по ANSI/ISO
В соответствии с синтаксисом ANSI/ISO, для того, чтобы соединить содержимое двух таблиц для получения единого результата, мы должны включить в SQL-оператор фразу JOIN имятаблицы ON условиесоединения. Если вы хотите в соответствии с этим синтаксисом выполнить то же соединение таблиц, которое мы делали раньше, наш оператор будет выглядеть следующим образом:
SELECT ename, emp.deptno, dname FROM emp JOIN dept ON emp.deptno = dept.deptno;
ENAME | DEPTNO | DNAME |
---|---|---|
CLARK | 10 | ACCOUNTING |
KING | 10 | ACCOUNTING |
MILLER | 10 | ACCOUNTING |
JONES | 20 | RESEARCH |
FORD | 20 | RESEARCH |
ADAMS | 20 | RESEARCH |
SMITH | 20 | RESEARCH |
SCOTT | 20 | RESEARCH |
WARD | 30 | SALES |
TURNER | 30 | SALES |
ALLEN | 30 | SALES |
JAMES | 30 | SALES |
BLAKE | 30 | SALES |
MARTIN | 30 | SALES |
Обратите внимание на различия между этим синтаксисом и синтаксисом Oracle. Во-первых, в синтаксисе ANSI/ISO сравнения, используемые для соединения, отделяются от всех остальных сравнений с помощью специального ключевого слова ON, указывающего на то, что именно это сравнение используется для соединения. Вы по-прежнему можете включать в соответствующие ANSI/ISO запросы на соединение фразу WHERE. Единственное отличие состоит в том, что фраза WHERE теперь будет содержать только дополнительные операторы сравнения, используемые дл дополнительной фильтрации данных. Кроме того, вы не должны теперь указывать во фразе FROM имена всех объединяемых таблиц. Вместо этого сразу же после фразы FROM вы должны использовать фразу JOIN, в которой и будут определены имена всех соединяемых таблиц.
Естественные соединения (NATURAL JOIN)
Естественным соединением называется соединение между двумя таблицами, в котором Oracle соединяет таблицы по одинаково называющемуся столбцу (столбцам) обеих таблиц (естественным образом!). Естественное соединение выполняется в том случае, если указано ключевое слово NATURAL.
Единственным совпадающим столбцом для таблиц emp и dept является столбец depnto,
SELECT ename, deptno, dname FROM emp NATURAL JOIN dept ORDER BY deptno;
ENAME | DEPTNO | DNAME |
---|---|---|
CLARK | 10 | ACCOUNTING |
KING | 10 | ACCOUNTING |
MILLER | 10 | ACCOUNTING |
JONES | 20 | RESEARCH |
FORD | 20 | RESEARCH |
ADAMS | 20 | RESEARCH |
SMITH | 20 | RESEARCH |
SCOTT | 20 | RESEARCH |
WARD | 30 | SALES |
TURNER | 30 | SALES |
ALLEN | 30 | SALES |
JAMES | 30 | SALES |
BLAKE | 30 | SALES |
MARTIN | 30 | SALES |
Нетрудно заменить, что естественные соединения позволяют в значительной степени упростить запросы с соединением за счет устранения псевдонимов таблиц и сравнений дл соединения.
Оператор SQL CROSS JOIN: примеры, синтаксис
Оператор SQL CROSS JOIN формирует таблицу перекрестным соединением (декартовым произведением) двух таблиц. При использовании оператора SQL CROSS JOIN каждая строка левой таблицы сцепляется с каждой строкой правой таблицы. В результате получается таблица со всеми возможными сочетаниями строк обеих таблиц.
Оператор SQL CROSS JOIN имеет следующий синтаксис:
SELECT column_names [,... n] FROM Table_1 CROSS JOIN Table_2
Обратите внимание, что в операторе за ненадобностью отсутствует условие (ON).
Примеры оператора SQL CROSS JOIN. Имеются две таблицы:
Authors — содержит в себе информацию об авторах книг:
AuthorID | AuthorName |
1 | Bruce Eckel |
2 | Robert Lafore |
3 | Andrew Tanenbaum |
Books — содержит в себе информацию о названии книг:
BookID | BookName |
3 | Modern Operating System |
1 | Thinking in Java |
3 | Computer Architecture |
4 | Programming in Scala |
В таблице Books поле BookID являются внешним ключом и ссылаются на таблицу Authors.
Пример 1. Произвести декартово произведение обеих таблиц с помощью оператора SQL CROSS JOIN:
SELECT * FROM Authors CROSS JOIN Books
Результирующая таблица будет выглядеть следующим образом:
Authors.AuthorID | Authors.AuthorName | Books.BookID | Books.BookName |
1 | Bruce Eckel | 3 | Modern Operating System |
1 | Bruce Eckel | 1 | Thinking in Java |
1 | Bruce Eckel | 3 | Computer Architecture |
1 | Bruce Eckel | 4 | Programming in Scala |
2 | Robert Lafore | 3 | Modern Operating System |
2 | Robert Lafore | 1 | Thinking in Java |
2 | Robert Lafore | 3 | Computer Architecture |
2 | Robert Lafore | 4 | Programming in Scala |
3 | Andrew Tanenbaum | 3 | Modern Operating System |
3 | Andrew Tanenbaum | 1 | Thinking in Java |
3 | Andrew Tanenbaum | 3 | Computer Architecture |
3 | Andrew Tanenbaum | 4 | Programming in Scala |
SQL JOINS (INNER, LEFT, RIGHT и FULL Join)
Обзор
Оператор SQL Join объединяет данные или строки из двух или более таблиц на основе общего поля между ними.
В этой статье дается краткое представление о различных типах соединений, таких как INNER/EQUI JOIN, NATURAL JOIN, CROSS JOIN, SELF JOIN и т. д.
Scope
СОЕДИНЯЕТ в SQL.
- В этой статье теоретически обсуждаются соединения SQL и примеры, связанные с ними.
- В этой статье также рассматриваются различные типы JOINS в SQL с подробными примерами каждого типа.
- В этой статье также обсуждается, когда использовать конкретное объединение.
- Наконец, мы обсудили несколько вопросов для интервью, основанных на СОЕДИНЕНИЯХ в SQL.
Что такое JOINS в SQL?
Соединения SQL в основном используются, когда пользователь пытается одновременно извлечь данные из нескольких таблиц (которые имеют отношения «один ко многим» или «многие ко многим»). Ключевое слово join объединяет две или более таблиц и создает временный образ объединенной таблицы. Затем в соответствии с заданными условиями он извлекает необходимые данные из таблицы изображений, и после извлечения данных временный образ объединенных таблиц сбрасывается.
Большие базы данных часто подвержены избыточности данных, т. е. созданию повторяющихся аномалий данных путем вставки, удаления и обновления. Но с помощью соединений SQL мы способствуем нормализации базы данных, что уменьшает избыточность данных и устраняет избыточные данные.
В реляционных базах данных, таких как SQL, обычно используются два ключевых поля: первичный ключ и внешний ключ. В то время как первичный ключ необходим для того, чтобы таблица считалась частью реляционной базы данных и однозначно идентифицировала каждую строку таблицы, которой она принадлежит, внешний ключ отвечает за связывание двух таблиц в базе данных. Здесь внешний ключ должен быть первичным ключом другой таблицы. В некоторых случаях внешний и первичный ключи, на которые он ссылается, присутствуют в одной и той же таблице. В таких случаях мы используем Самосоединение SQL . Когда мы используем SQL Joins, мы часто используем эти два ключевых поля, чтобы определить, что нужно пользователю, и соответствующим образом сформировать наши запросы.
Пример SQL JOINS
У нас есть база данных сотрудников компании, где таблица 1 ( emp_dets ) содержит информацию о сотруднике, например: идентификатор сотрудника , имя сотрудника и идентификатор руководителя . Таблица 2 ( supervisor_dets ) включает информацию о руководителях, т. е. их id и имя .
Таблица 1 имеет emp_id в качестве первичного ключа, а Таблица 2 имеет supervisor_id в качестве первичного ключа. В Таблице 1 supervisor_id ссылается на Таблицу 2. Следовательно, это внешний ключ для Таблицы 1.
В зависимости от потребностей пользователей существует несколько типов соединений. Эти соединения в целом подразделяются на четыре типа, т. е. перекрестное, внутреннее и внешнее.
Типы СОЕДИНЕНИЙ в SQL
ПЕРЕКРЕСТНЫЕ СОЕДИНЕНИЯ в SQL
Декартово соединение, также известное как перекрестное соединение, представляет собой декартово произведение всех строк первой таблицы на все строки второй таблицы. Допустим, у нас есть m строк в первой таблице и n строк во второй таблице. Тогда результирующая декартова таблица соединений будет иметь m * n строк. Обычно это происходит, когда соответствующий столбец или условие WHERE не указаны.
Общий синтаксис
SELECT имена столбцов ИЗ таблицы1 ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ таблица2;SELECT используется для указания всех столбцов, которые нам нужно отобразить в результирующей таблице. FROM указывает таблицы, в которых нам нужно искать эти столбцы. Тип соединения, т. е. в данном случае CROSS JOIN, помещается между двумя таблицами, которые мы хотим соединить.
Пример
Рассмотрим сценарий, в котором первая таблица содержит сведения о клиенте, т. е. идентификатор клиента и имя клиента , а вторая таблица содержит сведения о покупках, т. е. идентификатор продукта 9.0028 и название продукта .
Постановка задачи
Напишите запрос, чтобы получить декартово произведение таблиц Customers и Shopping_Details.
Запрос
ВЫБЕРИТЕ * ОТ клиентов ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ Shopping_Details;SELF JOIN в SQL
В SQL Self Join таблица соединяется сама с собой. Это означает, что каждая строка таблицы соединяется сама с собой и со всеми другими строками, касающимися указанных условий, если таковые имеются. Другими словами, можно сказать, что это слияние двух копий одной и той же таблицы. Это чрезвычайно полезно, когда внешний ключ ссылается на первичный ключ той же таблицы.
Общий синтаксис
SELECT a.column1 , b.column2 ИЗ table_name a, table_name b ГДЕ какое-то_условие;Здесь мы ссылаемся на одну и ту же таблицу с разными именами, т. е. a и b. Это означает САМОСОЕДИНЕНИЕ.
Пример
Рассмотрим таблицу сотрудников со следующими деталями, т. е. идентификатор сотрудника , имя, номер телефона и идентификатор руководителя . Руководители присутствуют непосредственно за рабочим столом. Следовательно, идентификатор руководителя действует как внешний ключ, который также является первичным ключом, поскольку он ссылается на идентификатор сотрудника.
Table_Name: Сотрудники
Постановка задачи
Напишите запрос, чтобы получить всех сотрудников, которые также являются руководителями некоторых других сотрудников из таблицы данного сотрудника.
Запрос
ВЫБЕРИТЕ Имя КАК Руководители ОТ Работники а, Работники б ГДЕ a.ID = b.supervisor_ID;Здесь мы используем AS для переименования имени столбца результирующей таблицы.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ в SQL
SQL Inner Join или Equi Join — это самое простое соединение, при котором все строки из нужных таблиц кэшируются вместе, если они соответствуют установленному условию. Для этого объединения требуется две или более таблиц. Inner Join можно использовать с различными условными операторами SQL, такими как WHERE, GROUP BY, ORDER BY и т. д.
Общий синтаксис
SELECT имя-столбца ИЗ таблицы-1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблица-2 ГДЕ таблица-1.имя-столбца = таблица-2.имя-столбца;В качестве альтернативы мы можем использовать только ключевое слово «JOIN» вместо «INNER JOIN».
Пример
Рассмотрим два стола в супермаркете. Первая таблица с именем Customers дает нам информацию о разных клиентах, то есть их идентификатор клиента , имя и номер телефона . Здесь CustID — это первичный ключ , который однозначно идентифицирует каждую строку. Вторая таблица с именем Shopping_Details дает нам информацию о товарах, купленных клиентами, то есть идентификатор товара 9.0028 , идентификатор клиента (ссылка на покупателя, купившего товар), название товара и количество .
Постановка задачи
Напишите запрос, чтобы получить всех клиентов, которые купили товары в магазине. Отображение их имени, купленного товара и количества.
Запрос
ВЫБЕРИТЕ Customers.Name, Shopping_Details.Item_Name, Shopping_Details.Quantity ОТ клиентов ВНУТРЕННЕЕ ПРИСОЕДИНЯЙТЕСЬ Shopping_Details ГДЕ Customers.ID==Shopping_Details.ID;Особый случай ВНУТРЕННЕГО СОЕДИНЕНИЯ: ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ
Естественное соединение SQL — это тип внутреннего соединения, основанный на условии, что столбцы с одинаковым именем и типом данных присутствуют в обеих объединяемых таблицах.
Общий синтаксис
SELECT * FROM таблица-1 ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ таблица-2;Пример
Рассмотрим два стола в супермаркете. Первая таблица с именем Customers дает нам информацию о разных клиентах, т. е. их идентификатор клиента , имя и номер телефона . Здесь CustID — это первичный ключ , который однозначно идентифицирует каждую строку. Вторая таблица с именем Shopping_Details дает нам информацию о товарах, купленных покупателями, т. е. идентификатор товара , идентификатор клиента (ссылка на покупателя, купившего товар), имя товара и количество .
Постановка задачи
Напишите запрос, чтобы найти все данные о покупателях, которые что-то купили в магазине.
Запрос
ВЫБЕРИТЕ * ОТ клиентов ЕСТЕСТВЕННОЕ ПРИСОЕДИНЕНИЕ Shopping_Details;ВНЕШНИЕ СОЕДИНЕНИЯ в SQL
Внешние соединения SQL дают как совпадающие, так и несовпадающие строки данных в зависимости от типа внешнего соединения. Эти типы внешних соединений подразделяются на следующие типы:
- Левое внешнее соединение
- Правое внешнее соединение
- Полное внешнее соединение
1.
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
В этом объединении, также известном как левое соединение SQL, все строки левой таблицы, независимо от выполнения указанных условий, добавляются в выходную таблицу. При этом добавляются только совпадающие строки правой таблицы.
Строки, принадлежащие левой таблице и не имеющие значений из правой таблицы, представлены в результирующей таблице как значения NULL.
Общий синтаксис
SELECT имена столбцов ИЗ таблицы1 ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ таблица2 ON table1.column-name = table2.column-name;Пример
Рассмотрим два стола супермаркета. Первая таблица с именем Customers дает нам информацию о разных клиентах, то есть их идентификатор клиента , имя и номер телефона . Здесь CustID — это первичный ключ , который однозначно идентифицирует каждую строку. Вторая таблица с именем Shopping_Details дает нам информацию о товарах, купленных покупателями, т. е. идентификатор товара , идентификатор клиента (ссылка на покупателя, купившего товар), название товара и количество .
Постановка задачи
Напишите запрос для отображения всех клиентов независимо от того, куплены они или нет. Отображение имени клиента и купленного товара. Если ничего не куплено, вывести NULL.
Запрос
ВЫБЕРИТЕ клиентов. Имя, Shopping_Details.Item_Name FROM Customers LEFT OUTER JOIN Shopping_Details; ON Customers.ID = Shopping_Details.ID;2. ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
Подобно левому внешнему соединению, в случае правого внешнего соединения, также известного как правое соединение SQL, все строки в правой таблице, независимо от соблюдения установленных условий, добавляется в выходную таблицу. При этом добавляются только совпадающие строки левой таблицы.
Строки, принадлежащие правой таблице и не имеющие значений из левой таблицы, представлены в результирующей таблице как значения NULL.
Общий синтаксис
SELECT имя(а) столбцов ИЗ таблицы 1 ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ таблица 2 ON table1.column-name = table2.column-name;Пример
Рассмотрим два стола в супермаркете. Первая таблица с именем Customers дает нам информацию о разных клиентах, то есть их идентификатор клиента , имя и номер телефона . Здесь CustID — это первичный ключ 9.0028, который однозначно идентифицирует каждую строку. Вторая таблица с именем Shopping_Details дает нам информацию о товарах, купленных покупателями, т. е. идентификатор товара , идентификатор клиента (ссылка на покупателя, купившего товар), имя товара и количество .
Постановка задачи
Напишите запрос, чтобы получить все товары, купленные клиентами, даже если клиент не существует в базе данных клиентов. Отображение имени клиента и названия товара. Если клиент не существует, отобразите NULL.
Запрос
ВЫБЕРИТЕ Customers.Name, Shopping_Details.Item_Name FROM Customers RIGHT OUTER JOIN Shopping_Details; ON Customers.ID = Shopping_Details.ID;3. ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
Полное внешнее соединение (также известное как Полное соединение SQL) сначала добавляет все строки, соответствующие заданному условию в запросе, а затем добавляет оставшиеся несопоставленные строки из обеих таблиц. Нам нужны две или более таблицы для соединения.
После добавления совпадающих строк в выходную таблицу несовпадающие строки левой таблицы добавляются с последующими значениями NULL, а затем несовпадающие строки правой таблицы добавляются с последующими значениями NULL.
Общий синтаксис
SELECT имя(а) столбцов ИЗ таблицы 1 ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ таблица 2 ON table1.column-name = table2. column-name;Пример
Рассмотрим два стола в супермаркете. Первая таблица с именем Customers дает нам информацию о разных клиентах, то есть их идентификатор клиента , имя и номер телефона . Здесь CustID — это первичный ключ 9.0028, который однозначно идентифицирует каждую строку. Вторая таблица с именем Shopping_Details дает нам информацию о товарах, купленных покупателями, т. е. идентификатор товара , идентификатор клиента (ссылка на покупателя, купившего товар), имя товара и количество .
Постановка задачи
Напишите запрос для получения данных обо всех покупателях и товарах, когда-либо купленных в магазине. Отображение имени клиента и названия товара. Если какие-либо данные не существуют, отобразите NULL.
Запрос
ВЫБЕРИТЕ Customers. Name, Shopping_Details.Item_Name FROM Customers ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Shopping_Details ГДЕ Customer.ID = Shopping_Details.ID;Когда использовать Что?
SQL является важным навыком для людей, которые ищут работу в области Data Engineering, Data Science и Software Engineering. Соединения в SQL — это одна из продвинутых концепций SQL, о которой часто спрашивают на собеседованиях. В этих вопросах прямо не указывается, какое соединение SQL использовать. Следовательно, нам нужно использовать четырехэтапный анализ, прежде чем мы начнем формировать наш SQL-запрос.
- Идентификация: Определите таблицы, относящиеся к постановке задачи. Нам также необходимо определить отношения между этими таблицами, порядок, в котором они связаны, а также первичные и внешние ключи.
Пример: Допустим, у нас есть таблицы A и B. Таблица A и таблица B имеют общее отношение «Сведения о сотруднике — Сведения об отделе». В таблице A есть три поля — ID, Name и DeptID. В таблице B есть два поля — DeptID и DeptName. Таблица A имеет идентификатор первичного ключа, а первичный ключ таблицы B — DeptID. Таблица A и таблица B связаны с внешним ключом в таблице A, то есть с первичным ключом таблицы B, DeptID.
- Наблюдение: обратите внимание, какое объединение будет наиболее подходящим для данного сценария. Это означает, что он должен иметь возможность извлекать все необходимые столбцы и иметь наименьшее количество столбцов, которые необходимо исключить по условию.
Пример: Если все значения таблицы A требуются независимо от условия, зависящего от таблицы C, мы можем использовать левое внешнее соединение для A и C.
- Деконструкция: Теперь, когда у нас есть все требования для формирования нашего запроса , во-первых, нам нужно разбить его на подчасти. Это помогает нам быстрее сформировать запрос и быстрее понять структуру базы данных. Здесь же мы формируем условия на правильно выявленные связи.
Пример: Вам необходимо представить данные из таблицы A и таблицы B. Но внешний ключ таблицы A — это первичный ключ таблицы C, который является внешним ключом таблицы B. Следовательно, разбивка запроса на результаты из таблицы B и C (скажем, Temp), а затем общие результаты между его Temp и таблицей A дадут нам правильное решение.
- Компиляция: Наконец, мы объединяем все части и формируем наш окончательный запрос. Мы можем использовать методы оптимизации запросов, такие как эвристическая оптимизация, что приводит к более быстрым ответам.
Давайте рассмотрим некоторые вопросы для собеседования, основанные на SQL Joins:
- Напишите запрос на SQL, чтобы найти названия отделов, в которых работает более двух сотрудников.
Пример таблицы: emp_dept
dpt_code | dpt_name |
---|---|
57 | Продажи |
63 | Финансы |
47 | Управление персоналом |
Пример таблицы: emp_details
emp_id | emp_fname | emp_lname | emp_dpt |
---|---|---|---|
1001 | Джим | Халперт 57 | 57 |
1002 | Кевин | Мэлоун | 63 |
1003 | Дуайт | Шрут | 57 |
Решение
Запрос
90 068 ВЫБРАТЬ emp_dept. dpt_name ОТ emp_details ВНУТРЕННЕЕ СОЕДИНЕНИЕ emp_dept ON emp_dept = dpt_code СГРУППИРОВАТЬ ПО emp_department.dpt_name СЧЕТ(*) > 2;
Вывод:
dpt_name ПродажиОбъяснение
Поскольку в вопросе прямо указано одно условие, которое мы можем выполнить напрямую без каких-либо лазеек, мы напрямую связываем обе таблицы с помощью ВНУТРЕННЕГО СОЕДИНЕНИЯ.
- Напишите оператор SQL, чтобы составить список в порядке возрастания продавцов, которые работают на одного или нескольких клиентов или еще не присоединились ни к одному из клиентов.
Образец таблицы: клиенты
cust_id | cust_name | город | продавец_id |
---|---|---|---|
101 | Ник Римандо | Нью-Йорк | 648 |
102 | Брэд Дэвис | Скрантон | 271 9 0507 |
103 | Грэм Зуси | Атланта | 271 |
104 | Джулиан Грин | Нью-Йорк | 648 |
Образец таблицы: продавец
salesman_id | salesman_name | город |
---|---|---|
648 | Джим Халперт 90 507 | Нью-Йорк |
271 | Дуайт Шрут | Скрантон |
017 | Пэм Бизли 9050 7 | Scranton |
Решение:
Запрос:
ВЫБЕРИТЕ a. cust_name,a.city,b.name AS "Продавец", b.city ОТ клиента RIGHT OUTER JOIN продавец b ВКЛ b.salesman_id=a.salesman_id ЗАКАЗАТЬ ПО b.salesman_id;Выход:
cust_name | город | продавец | город |
---|---|---|---|
NULL | Пэм Бизли | Скрэнтон | |
Брэд Дэвис | Скрэнтон | Дуайт Шрут | Скрэнтон |
Грэм Зуси | Атланта | Дуайт Шрут | Скрэнтон |
Ник Римандо | Нью-Йорк | Джим Халперт | Нью-Йорк |
Джулиан Грин | Нью-Йорк | Джим Халперт | Нью-Йорк |
Объяснение:
В этом вопросе говорится: «один или больше клиентов или еще не присоединились ни к одному из клиентов». Если бы это был только «один или несколько клиентов», мы могли бы напрямую выполнить условие, используя ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Но «или еще нет» создает требование формирования сложного состояния. Чтобы избежать этой сложности, мы можем думать о результирующей таблице, используя ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, где нам нужно будет только сформировать условие оператора «один или несколько», а результаты «или еще нет» будут добавлены как часть ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ.
Заключение
Мы видим углубленный анализ соединений в SQL. Подводя итог:
- Что такое JOINS в SQL?
- Типы СОЕДИНЕНИЙ в SQL и способы их использования: самосоединение, внутреннее соединение, внешнее соединение — левое, правое и полное, декартово/перекрестное соединение.
- Как подойти к вопросу SQL Joins – четырехэтапный анализ.
- Примеры вопросов уровня интервью и как определить, какое объединение использовать.
Несколько советов по освоению SQL Вопросов о соединении:
- Практика SQL Объединение вопросов по реальным данным
- Ознакомьтесь с основами управления базами данных, такими как визуализация диаграмм ER, создание схем
- Использовать эвристическую оптимизацию для оптимизации запросов
Все о соединениях SQL.
Недавно в интервью меня попросили… | Эми Резник | Analytics Vidhya
Недавно в интервью меня попросили объяснить разницу между JOIN
и LEFT JOIN
в SQL. По общему признанию, прошло некоторое время с тех пор, как я думал о различных соединениях SQL, и я немного возился со своим ответом. Поэтому я пользуюсь этой возможностью, чтобы погрузиться в SQL соединения.
Соединение SQL — это способ объединения строк из двух или более таблиц на основе общего столбца между ними.
Давайте разберем это на примере книги и автора, где у авторов может быть много книг, и книга принадлежит одному автору.
Таблица авторов
имеет первичный ключ id
, имя
и age
:
авторов
id | имя | возраст
1 | Джеймс Паттерсон | 72
2 | Дэн Браун | 55
3 | Джоан Роулинг | 54
4 | Дэвид Балдаччи | 59
Таблица books
имеет первичный ключ id
, title
, page_count
и author_id
, который является внешним ключом, ссылающимся на id
автор:
книги
идентификатор | название | страницы | author_id
1 | И пришел паук | 435 | 1
2 | Код да Винчи | 454 | 2
3 | Потерянный символ | 528 | 2
4 | HP и философский камень | 309 | 3
5 | HP и Тайная комната | 341 | 3
Внешний ключ используется для формирования связи между двумя таблицами, где внешний ключ ссылается на первичный ключ другой таблицы. Внешний ключ — это общий столбец, который мы используем для объединения двух таблиц.
Если мы хотим запросить все книги и включить информацию об авторе, нам нужно соединить две таблицы вместе.
Существует четыре типа соединений SQL:
-
(ВНУТРЕННЕЕ) СОЕДИНЕНИЕ
возвращает все строки, в которых есть совпадения в обеих таблицах -
ЛЕВОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ
возвращает все строки из левой таблицы и соответствующие строки из правой таблицы -
ПРАВОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ
возвращает все строки из правой таблицы и соответствующие строки из левой таблицы -
ПОЛНОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ
возвращает все строки, в которых есть совпадение в одной из таблиц
Слова в скобках необязательны при написании SQL-запроса. Также обратите внимание, что RIGHT JOIN
и FULL JOIN
не поддерживаются в SQLite.
Хороший способ запомнить это — подумать о диаграмме Венна:
Диаграмма соединения SQL с https://www. w3schools.com/sql/sql_join.asp ) JOIN книг
и авторов
таблиц на author_id
:
ВЫБЕРИТЕ *
ОТ авторов
ПРИСОЕДИНЯЙТЕСЬ к книгам
ПО author.id = books.author_id
id| имя | возраст| идентификатор | название | страницы | author_id
1 | Джей Паттерсон | 72 | 1 | И пришел паук | 435 | 1
2 | Дэн Браун | 55 | 2 | Код да Винчи | 454 | 2
2 | Дэн Браун | 55 | 3 | Потерянный символ | 528 | 2
3 | Джоан Роулинг | 54 | 4 | HP и философский камень | 309 | 3
3 | Джоан Роулинг | 54 | 5 | HP и Тайная комната| 341 | 3
Обратите внимание, что автор Дэвид Балдаччи ( id
из 4
в таблице авторов
) не включен в наш результат, потому что нет книги с author_id
из 4
в книгах 9 0818 таблица . Чтобы быть включенным в результаты
(INNER) JOIN
, должно быть совпадение в обеих таблицах.
Если мы сравним это с ЛЕВОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ
:
ВЫБЕРИТЕ *
ОТ авторов
ЛЕВОЕ СОЕДИНЕНИЕ книги
ПО author.