В чем разница между «INNER JOIN» и «OUTER JOIN»?

Также как подходят LEFT JOIN , RIGHT JOIN и FULL JOIN ?

вопрос задан 1.09.2008
Chris de Vries
23601 репутация

32 ответов


  • 0 рейтинг

    Точный алгоритм для INNER JOIN , LEFT/RIGHT OUTER JOIN выглядит следующим образом:

    1. Возьмите каждую строку из первой таблицы: a
    2. Рассмотрим все строки из второго стола: (a, b[i])
    3. Оцените ON clause против каждой пары: ON(a, b[i]) = true/false?
      • Когда условие оценивается до true , верните его.
      • Для (слева /справа) Outer Joins : если конец конца второй таблицы без какого-либо совпадения, верните ( виртуальную ) пару, используя Null для всех столбцов второй таблицы: (a, Null) . Это делается для обеспечения того, чтобы все строки первой таблицы существовали в конечных результатах.

    Примечание: условие, указанное в предложении ON , может быть любым, не требуется использовать первичные ключи, и вам не нужно всегда ссылаться на столбцы из обеих таблиц! Например:

    Внутренняя вставка против левого наружного соединения


    введите описание изображения здесь

    Вы также можете увидеть этот ответ на текущей странице для большего количества образцов.

    ответ дан S.Serpooshan, с репутацией 3760, 8.11.2016
  • 0 рейтинг

    Простыми словами:

    Внутреннее соединение извлекает только согласованные строки.

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

    • Слева : совпадающие строки в правой таблице и все строки в левой таблице

    • Справа : совпадающие строки в левой таблице и все строки в правой таблице или

    • Полный : все строки во всех таблицах. Не имеет значения, есть ли матч или нет

    ответ дан vidyadhar, с репутацией 2021, 12.01.2013
  • 0 рейтинг

    Простыми словами:

    Внутреннее соединение -> Принимать ТОЛЬКО общие записи из родительских и дочерних таблиц. ГДЕ первичный ключ родительской таблицы соответствует внешнему ключу в таблице «Дети».

    Левое соединение ->

    псевдокод

     1.Take All records from left Table
    2.for(each record in right table,) {
        if(Records from left & right table matching on primary & foreign key){
           use their values as it is as result of join at the right side for 2nd table.
        } else {
           put value NULL values in that particular record as result of join at the right side for 2nd table.
        }
      }
     

    Правое соединение : прямо напротив левого соединения. Поместите имя таблицы в LEFT JOIN с правой стороны в правом соединении, вы получите тот же результат, что и LEFT JOIN.

    Внешнее соединение : показать все записи в обеих таблицах No matter what . Если записи в левой таблице не соответствуют таблице справа на основе основного, Forieign ключа, используйте значение NULL в результате объединения.

    Пример :

    пример

    Предположим теперь, что для двух таблиц

    1.employees , 2.phone_numbers_employees

     employees : id , name 
    
    phone_numbers_employees : id , phone_num , emp_id   
     

    Здесь таблица employee - это таблица Master, phone_numbers_employees - дочерняя таблица (она содержит emp_id качестве внешнего ключа, который соединяет employee.id поэтому его дочерняя таблица).

    Внутренние соединения

    Принимать записи из 2 таблиц ТОЛЬКО ЕСЛИ Первичный ключ таблицы employee (его идентификатор) соответствует внешнему ключу таблицы Child_phone_numbers_employees (emp_id) .

    Таким образом, запрос будет выглядеть следующим образом:

     SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
     

    Здесь берут только совпадающие строки в primary key = foreign key, как описано выше. Если не совпадают строки в первичном ключе = внешний ключ, пропущены как результат объединения.

    Левые соединения :

    Левое соединение сохраняет все строки левой таблицы, независимо от того, есть ли строка, которая соответствует правой таблице.

     SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
     

    Внешние соединения :

     SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
     

    Диаграмматически это выглядит так:

    схема

    ответ дан Pratik C Joshi, с репутацией 8862, 19.02.2015
  • 0 рейтинг

    В простых условиях,

    1. INNER JOIN или EQUI JOIN: возвращает набор результатов, который соответствует только условию в обеих таблицах.

    2. OUTER JOIN: Возвращает набор результатов всех значений из обеих таблиц, даже если есть условие соответствия или нет.

    3. LEFT JOIN: Возвращает набор результатов всех значений из левой таблицы и только строки, соответствующие условию в правой таблице.

    4. RIGHT JOIN: Возвращает набор результатов всех значений из правой таблицы и только строки, соответствующие условию в левой таблице.

    5. ПОЛНЫЙ ПРИСОЕДИНЯЙТЕСЬ: Полное Присоединение и Полное Внешнее Соединение - то же самое.

    ответ дан Anands23, с репутацией 343, 13.10.2016
  • 0 рейтинг

    Внутреннее соединение

    Получите только совпадающие строки, то есть A intersect B .

    Введите описание изображения здесь

     SELECT *
    FROM dbo.Students S
    INNER JOIN dbo.Advisors A
        ON S.Advisor_ID = A.Advisor_ID
     

    Левая внешняя связь

    Выберите все записи из первой таблицы и любые записи во второй таблице, которые соответствуют связанным ключам.

    Введите описание изображения здесь

     SELECT *
    FROM dbo.Students S
    LEFT JOIN dbo.Advisors A
        ON S.Advisor_ID = A.Advisor_ID
     

    Полная внешняя связь

    Выберите все записи из второй таблицы и любые записи в первой таблице, которые соответствуют соединенным ключам.

    Введите описание изображения здесь

     SELECT *
    FROM dbo.Students S
    FULL JOIN dbo.Advisors A
        ON S.Advisor_ID = A.Advisor_ID
     

    Рекомендации

    ответ дан Tushar Gupta, с репутацией 41347, 27.01.2014
  • 0 рейтинг

    Соединения используются для объединения данных из двух таблиц, в результате чего создается новая временная таблица. Соединения выполняются на основе чего-то, называемого предикатом, который определяет условие для использования для соединения. Разница между внутренним соединением и внешним соединением заключается в том, что внутреннее соединение будет возвращать только строки, которые фактически соответствуют на основе предиката соединения. Рассмотрим таблицу Employee and Location:

    введите описание изображения здесь

    Внутреннее соединение: - Внутреннее соединение создает новую таблицу результатов путем объединения значений столбцов двух таблиц ( Employee and Location ) на основе предиката соединения. Запрос сравнивает каждую строку Employee с каждой строкой местоположения, чтобы найти все пары строк, которые удовлетворяют предикату соединения. Когда предикат соединения выполняется путем сопоставления значений, отличных от NULL, значения столбцов для каждой согласованной пары строк Employee и Location объединяются в строку результатов. Вот как выглядит SQL для внутреннего соединения:

     select  * from employee inner join location on employee.empID = location.empID
    OR
    select  * from employee, location where employee.empID = location.empID
     

    Теперь вот что получило бы результат выполнения SQL: введите описание изображения здесь введите описание изображения здесь

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

    Left Outer Join: - Результат левого внешнего соединения (или просто левого соединения) для таблиц Employee and Location всегда содержит все записи «левой» таблицы ( Employee ), даже если условие соединения не находит подходящей записи в «правая» таблица ( местоположение ). Вот как выглядит SQL для левого внешнего соединения, используя приведенные выше таблицы:

     select  * from employee left outer join location on employee.empID = location.empID;
    //Use of outer keyword is optional
     

    Теперь вот что получило результат выполнения этого SQL: введите описание изображения здесь введите описание изображения здесь

    Right Outer Join: - Правое внешнее соединение (или правое соединение) близко напоминает левое внешнее соединение, за исключением обработки обращенных столов. Каждая строка из «правой» таблицы ( Location ) появится хотя бы один раз в объединенной таблице. Если ни одна соответствующая строка из «левой» таблицы ( Employee ) не существует, NULL будет отображаться в столбцах Employee для тех записей, которые не совпадают в Location . Это выглядит так:

     select * from employee right outer join location  on employee.empID = location.empID;
    //Use of outer keyword is optional
     

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

    введите описание изображения здесь введите описание изображения здесь

    Полное Внешнее Объединение: - Полное Внешнее Присоединение или Полное Присоединение - сохранить информацию о немаркировке, включив нечетные строки в результаты соединения, используйте полное внешнее соединение. Он включает все строки из обеих таблиц, независимо от того, имеет ли другая таблица соответствующее значение. введите описание изображения здесь

    Источник изображения

    Справочное руководство по MySQL 8.0 - Синтаксис соединения

    Операции Oracle Join

    ответ дан ajitksharma, с репутацией 2803, 18.12.2014
  • 0 рейтинг

    Простейшие определения

    Inner Join: возвращает совпадающие записи из обеих таблиц.

    Full Outer Join: возвращает совпадающие и несогласованные записи из обеих таблиц с нулевым значением для непревзойденных записей из обоих таблиц .

    Left Outer Join: возвращает совпадающие и несогласованные записи только из таблицы слева .

    Right Outer Join: возвращает совпадающие и несогласованные записи только из таблицы справа .

    Вкратце

    Совпадение + Слева Непревзойденное + Правое Непревзойденное = Полное Наружное Присоединение

    Совпадение + Левое Непревзойденное = Левое Наружное Соединение

    Совпадение + Правое Непревзойденное = Правое Наружное Присоединение

    Согласовано = Внутреннее соединение

    ответ дан Akshay Khale, с репутацией 3658, 28.04.2016
  • 0 рейтинг

    Из статьи « MySQL - ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ И ПРАВИЛЬНОЕ ПРИСОЕДИНЕНИЕ, ВНУТРЕННЕЙ ПРИСОЕДИНЯЮЩЕЙСЯ И ВЗАИМОДЕЙСТВУЮЩЕЙСЯ СТРАНИЦЕ » Грэм Эллис в своем блоге «Лошадь».

    В базе данных, такой как MySQL, данные делятся на несколько таблиц, которые затем соединяются ( Joined ) вместе JOIN в SELECT командах для чтения записей из нескольких таблиц. Прочтите этот пример, чтобы узнать, как он работает.

    Во-первых, некоторые примеры данных:

     people
        mysql> select * from people;
        +------------+--------------+------+
        | name       | phone        | pid  |
        +------------+--------------+------+
        | Mr Brown   | 01225 708225 |    1 |
        | Miss Smith | 01225 899360 |    2 |
        | Mr Pullen  | 01380 724040 |    3 |
        +------------+--------------+------+
        3 rows in set (0.00 sec)
    
    property
        mysql> select * from property;
        +------+------+----------------------+
        | pid  | spid | selling              |
        +------+------+----------------------+
        |    1 |    1 | Old House Farm       |
        |    3 |    2 | The Willows          |
        |    3 |    3 | Tall Trees           |
        |    3 |    4 | The Melksham Florist |
        |    4 |    5 | Dun Roamin           |
        +------+------+----------------------+
        5 rows in set (0.00 sec)
     

    РЕГУЛЯРНОЕ СОЕДИНЕНИЕ

    Если мы делаем регулярный JOIN (без каких-либо ключевых слов INNER, OUTER, LEFT или RIGHT), мы получим все записи, соответствующие соответствующим образом в двух таблицах, и записи в обеих входящих таблицах, которые не совпадают, не сообщаются :

     mysql> select name, phone, selling 
    from people join property 
    on people.pid = property.pid;
    +-----------+--------------+----------------------+
    | name      | phone        | selling              |
    +-----------+--------------+----------------------+
    | Mr Brown  | 01225 708225 | Old House Farm       |
    | Mr Pullen | 01380 724040 | The Willows          |
    | Mr Pullen | 01380 724040 | Tall Trees           |
    | Mr Pullen | 01380 724040 | The Melksham Florist |
    +-----------+--------------+----------------------+
    4 rows in set (0.01 sec)
     

    ВЛЕВО

    Если мы делаем LEFT JOIN, мы получаем все записи, которые совпадают так же, и IN ADDITION мы получаем дополнительную запись для каждой несопоставимой записи в левой таблице соединения - таким образом, гарантируя (в этом примере), что каждый PERSON получает упоминание :

        mysql> select name, phone, selling 
        from people left join property 
        on people.pid = property.pid; 
        +------------+--------------+----------------------+
        | name       | phone        | selling              |
        +------------+--------------+----------------------+
        | Mr Brown   | 01225 708225 | Old House Farm       |
        | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
        | Mr Pullen  | 01380 724040 | The Willows          |
        | Mr Pullen  | 01380 724040 | Tall Trees           |
        | Mr Pullen  | 01380 724040 | The Melksham Florist |
        +------------+--------------+----------------------+
        5 rows in set (0.00 sec)
     

    ПРАВОЕ СОЕДИНЕНИЕ

    Если мы делаем ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, мы получаем все записи, которые соответствуют и IN ADDITION, дополнительную запись для каждой несогласованной записи в правой таблице соединения - в моем примере, это означает, что каждое свойство получает упоминание, даже если мы не делаем есть детали продавца:

     mysql> select name, phone, selling 
    from people right join property 
    on people.pid = property.pid;
    +-----------+--------------+----------------------+
    | name      | phone        | selling              |
    +-----------+--------------+----------------------+
    | Mr Brown  | 01225 708225 | Old House Farm       |
    | Mr Pullen | 01380 724040 | The Willows          |
    | Mr Pullen | 01380 724040 | Tall Trees           |
    | Mr Pullen | 01380 724040 | The Melksham Florist |
    | NULL      | NULL         | Dun Roamin           |
    +-----------+--------------+----------------------+
    5 rows in set (0.00 sec)
     

    INNER JOIN делает полное соединение, как и в первом примере, и слово OUTER можно добавить после слова LEFT или RIGHT в последних двух примерах - оно предусмотрено для совместимости ODBC и не добавляет дополнительных возможностей.

    ответ дан gtiwari333, с репутацией 15212, 14.02.2011
  • 0 рейтинг

    Это хорошее объяснение для присоединений

    Это хорошее диаграммное объяснение для всех видов объединений

    источник: http://ssiddique.info/understanding-sql-joins-in-easy-way.html

    ответ дан Raghu K Nair, с репутацией 2279, 21.03.2016
  • 0 рейтинг

    введите описание изображения здесь

    • INNER JOIN наиболее типичное соединение для двух или более таблиц. Он возвращает совпадение данных как по таблице ON, так и по команде forignkey.
    • OUTER JOIN - это то же самое, что и INNER JOIN , но также включает NULL данных в ResultSet.
      • LEFT JOIN = INNER JOIN + Непревзойденные данные левой таблицы с нулевым совпадением на правой таблице.
      • RIGHT JOIN = INNER JOIN + Непревзойденные данные правой таблицы с нулевым совпадением на левой таблице.
      • FULL JOIN = INNER JOIN + Непревзойденные данные в правой и левой таблицах с нулевыми совпадениями.
    • Самосоединение не является ключевым словом в SQL, когда таблица ссылается на данные сама по себе, знает как самостоятельное объединение. Используя INNER JOIN и OUTER JOIN мы можем писать запросы на самостоятельное присоединение.

    Например:

     SELECT * 
    FROM   tablea a 
           INNER JOIN tableb b 
                   ON a.primary_key = b.foreign_key 
           INNER JOIN tablec c 
                   ON b.primary_key = c.foreign_key 
     
    ответ дан Premraj, с репутацией 25713, 26.12.2017
  • 0 рейтинг

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

    В OUTER JOIN результирующая таблица может иметь пустые столбцы. Внешнее соединение может быть либо LEFT либо RIGHT .

    LEFT OUTER JOIN возвращает все строки из первой таблицы, даже если во второй таблице нет совпадений.

    RIGHT OUTER JOIN возвращает все строки из второй таблицы, даже если в первой таблице нет совпадений.

    ответ дан vijikumar, с репутацией 1519, 27.09.2012
  • 0 рейтинг

    Также вы можете рассмотреть следующую схему для разных типов соединений;

    визуальное объяснение объединений

    Источник: Visual-Representation-of-SQL-Joins, подробно описанный CL Moffatt

    ответ дан Teoman shipahi, с репутацией 33469, 16.05.2013
  • 0 рейтинг

    left join on (aka left outer join on ) возвращает inner join on строки union all несогласованных строк левой строки, расширенных нулями.

    right join (on aka right outer join on ) возвращает inner join on строк union all несравнимых строк правой строки, расширенных нулями.

    full join on (aka full outer join on ) возвращает inner join on строк union all несравнимых строк левой таблицы, расширенных нулями union all несравнимых строк правой строки, расширенных нулями.

    (SQL Standard 2006 SQL /Foundation 7.7 Правила синтаксиса 1, Общие правила 1 b, 3 c & d, 5 b.)

    Так что не делайте outer join пока не узнаете, что такое inner join .


    Узнайте, какие строки inner join возвращаются .

    Прочитайте мои комментарии там много запутанных и бедных ответов.

    Затем прочитайте мои комментарии здесь, много разных и запутанных ответов.

    ответ дан philipxy, с репутацией 10766, 7.09.2017
  • 0 рейтинг

    Разница заключается в том, как таблицы объединяются, если нет общих записей.

    • JOIN совпадает с INNER JOIN и означает только отображение записей, общих для обеих таблиц. Независимо от того, являются ли записи обычными, определяются поля в предложении join. Например:

       FROM t1
      JOIN t2 on t1.ID = t2.ID
       

      означает показывать только записи, где одинаковое значение ID существует в обеих таблицах.

    • LEFT JOIN совпадает с LEFT OUTER JOIN и означает отображать все записи из левой таблицы (т.е. той, которая предшествует в инструкции SQL), независимо от существования совпадающих записей в правой таблице.

    • RIGHT JOIN - то же, что и RIGHT OUTER JOIN и означает противоположность LEFT JOIN , т.е. показывает все записи из второй (правой) таблицы и только совпадающие записи из первой (левой) таблицы.

    Источник: В чем разница между LEFT, RIGHT, INNER, OUTER, JOIN?

    ответ дан Aldee, с репутацией 2109, 18.09.2013
  • 0 рейтинг
    • Внутреннее соединение . Внутреннее соединение, использующее любой из эквивалентных запросов, дает пересечение двух таблиц , то есть двух строк, которые они имеют вместе.

    • Левое внешнее соединение . Левое внешнее соединение даст все строки в A, а также любые общие строки в B.

    • Полное внешнее соединение . Полное внешнее соединение даст вам объединение A и B, т. Е. Все строки в A и все строки в B. Если что-то в A не имеет соответствующей привязки в B, тогда часть B null, и наоборот

    ответ дан Sandesh, с репутацией 1064, 2.02.2016
  • 0 рейтинг

    Разница заключается в том, как таблицы объединяются, если нет общих записей.

    JOIN совпадает с INNER JOIN и означает только отображение записей, общих для обеих таблиц. Независимо от того, являются ли записи обычными, определяются поля в предложении join.

    Например:

     SELECT * 
    FROM t1
    JOIN t2 on t1.ID = t2.ID
     

    Это означает, что отображаются только записи, в которых одинаковое значение ID существует в обеих таблицах.

    LEFT JOIN совпадает с LEFT OUTER JOIN и означает отображение всех записей из левой таблицы (т.е. той, которая предшествует в инструкции SQL), независимо от наличия совпадающих записей в правой таблице.

    RIGHT JOIN - то же, что и RIGHT OUTER JOIN и означает противоположность LEFT JOIN , т.е. показывает все записи из второй (правой) таблицы и только совпадающие записи из первой (левой) таблицы.

    ответ дан Rahul Parit, с репутацией 291, 4.05.2015
  • 0 рейтинг

    Внутреннее соединение показывает только строки, если на другой (правой) стороне соединения есть соответствующая запись.

    A (слева) внешнее соединение показывает строки для каждой записи в левой части, даже если на другой (правой) стороне соединения нет соответствующих строк. Если нет соответствующей строки, столбцы для другой (правой) стороны отображают NULL.

    ответ дан 1800 INFORMATION, с репутацией 96094, 1.09.2008
  • 0 рейтинг

    Внутреннее соединение.

    Соединение объединяет строки из двух таблиц. Внутреннее соединение пытается сопоставить две таблицы на основе критериев, заданных в запросе, и возвращает только строки, которые соответствуют. Если строка из первой таблицы в соединении совпадает с двумя строками во второй таблице, в результатах будут возвращены две строки. Если в первой таблице есть строка, которая не соответствует строке во второй, она не возвращается; Аналогично, если во второй таблице есть строка, которая не соответствует строке в первой, она не возвращается.

    Внешняя связь.

    Левое соединение пытается найти совпадение строк из первой таблицы со строками во второй таблице. Если он не может найти совпадение, он вернет столбцы из первой таблицы и оставит столбцы со второй таблицы пустым (null).

    ответ дан Kanwar Singh , с репутацией 511, 11.04.2014
  • 0 рейтинг

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

    Внешние соединения возвращают записи для левой стороны, даже если ничего не существует для правой стороны.

    Например, у вас есть таблица Заказы и OrderDetails. Они связаны «OrderID».

    заказы

    • Номер заказа
    • Имя Клиента

    Информация для заказа

    • OrderDetailID
    • Номер заказа
    • Наименование товара
    • Кол-во
    • Цена

    Запрос

     SELECT Orders.OrderID, Orders.CustomerName
      FROM Orders 
     INNER JOIN OrderDetails
        ON Orders.OrderID = OrderDetails.OrderID
     

    будет возвращать только ордеры, которые также имеют что-то в таблице OrderDetails.

    Если вы измените его на ВНЕШНЮЮ ВЛЕВО

     SELECT Orders.OrderID, Orders.CustomerName
      FROM Orders 
      LEFT JOIN OrderDetails
        ON Orders.OrderID = OrderDetails.OrderID
     

    то он будет возвращать записи из таблицы Orders, даже если у них нет записей OrderDetails.

    Вы можете использовать это, чтобы найти Заказы, у которых нет каких-либо OrderDetails, указывающих на возможный осиротевший порядок, добавив предложение where, подобное WHERE OrderDetails.OrderID IS NULL .

    ответ дан Brian Boatright, с репутацией 15462, 1.09.2008
  • 0 рейтинг

    Внутреннее объединение Внутреннее соединение фокусируется на общности между двумя таблицами. При использовании внутреннего соединения должны быть по крайней мере некоторые совпадающие данные между двумя (или более) таблицами, которые сравниваются. Внутреннее соединение ищет таблицы для сопоставления или перекрытия данных. Обнаружив это, внутреннее объединение объединяет и возвращает информацию в одну новую таблицу.

    Внешнее соединение Внешнее объединение возвращает набор записей (или строк), которые включают в себя то, что будет возвращено внутренним соединением, а также включает другие строки, для которых не найдено соответствующего соответствия в другой таблице.

    Существует три типа внешних соединений:

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

    ответ дан Sumudu De Zoysa, с репутацией 315, 7.09.2015
  • 0 рейтинг

    Предполагая, что вы присоединяетесь к столбцам без дубликатов, что является очень распространенным случаем:

    • Внутреннее объединение A и B дает результат пересечения A с B, т. Е. Внутреннюю часть пересечения диаграммы Венна .

    • Внешнее объединение A и B дает результаты A-соединения B, т. Е. Внешних частей диаграммы Венна.

    Примеры

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

     A    B
    -    -
    1    3
    2    4
    3    5
    4    6
     

    Заметим, что (1,2) уникальны для A, (3,4) являются общими, и (5,6) являются единственными для B.

    Внутреннее соединение

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

     select * from a INNER JOIN b on a.a = b.b;
    select a.*, b.*  from a,b where a.a = b.b;
    
    a | b
    --+--
    3 | 3
    4 | 4
     

    Левое внешнее соединение

    Левое внешнее соединение даст все строки в A плюс любые общие строки в B.

     select * from a LEFT OUTER JOIN b on a.a = b.b;
    select a.*, b.*  from a,b where a.a = b.b(+);
    
    a |  b
    --+-----
    1 | null
    2 | null
    3 |    3
    4 |    4
     

    Правое внешнее соединение

    Правое внешнее объединение даст все строки в B плюс любые общие строки в A.

     select * from a RIGHT OUTER JOIN b on a.a = b.b;
    select a.*, b.*  from a,b where a.a(+) = b.b;
    
    a    |  b
    -----+----
    3    |  3
    4    |  4
    null |  5
    null |  6
     

    Полное внешнее соединение

    Полное внешнее объединение даст вам объединение A и B, т. Е. Все строки в A и все строки в B. Если что-то в A не имеет соответствующей базы данных в B, то B-часть является нулевой, а порог наоборот.

     select * from a FULL OUTER JOIN b on a.a = b.b;
    
     a   |  b
    -----+-----
       1 | null
       2 | null
       3 |    3
       4 |    4
    null |    6
    null |    5
     
    ответ дан Mark Harrison, с репутацией 165836, 1.09.2008
  • 0 рейтинг

    INNER JOIN требуется, по крайней мере, совпадение при сравнении двух таблиц. Например, таблица A и таблица B, которая подразумевает A 8 B (пересечение A).

    LEFT OUTER JOIN и LEFT JOIN одинаковы. Он дает все записи, соответствующие в обеих таблицах, и все возможности левой таблицы.

    Аналогично, RIGHT OUTER JOIN и RIGHT JOIN одинаковы. Он дает все записи, соответствующие в обеих таблицах, и все возможности правой таблицы.

    FULL JOIN представляет собой комбинацию LEFT OUTER JOIN и RIGHT OUTER JOIN без дублирования.

    ответ дан naga, с репутацией 489, 2.09.2010
  • 0 рейтинг

    1. Внутренняя регистрация: также называется Join. Он возвращает строки, присутствующие как в левой таблице, так и в правой таблице, только если есть совпадение . В противном случае он возвращает нулевые записи.

    Пример:

     SELECT
      e1.emp_name,
      e2.emp_salary    
    FROM emp1 e1
    INNER JOIN emp2 e2
      ON e1.emp_id = e2.emp_id
     

    output1

    2. Полная Outer Join: также называется Full Join. Он возвращает все строки, присутствующие как в левой таблице, так и в правой таблице.

    Пример:

     SELECT
      e1.emp_name,
      e2.emp_salary    
    FROM emp1 e1
    FULL OUTER JOIN emp2 e2
      ON e1.emp_id = e2.emp_id
     

    output2

    3. Левое внешнее соединение: или просто называется Left Join. Он возвращает все строки, присутствующие в левой таблице, и соответствующие строки из правой таблицы (если есть).

    4. Right Outer Join: также называется Right Join. Он возвращает совпадающие строки из левой таблицы (если есть) и все строки, присутствующие в правой таблице.

    присоединяется

    Преимущества объединений

    1. Выполняется быстрее.
    ответ дан Laxmi, с репутацией 2621, 10.07.2017
  • 0 рейтинг

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

    Наиболее распространенным случаем является сопоставление внешнего ключа одной таблицы с первичным ключом другого, например, при использовании и идентификаторе для поиска значения.

    Хотя как внутренние, так и внешние соединения включают строки из обеих таблиц, когда условие соответствия выполнено успешно, они отличаются тем, как они обрабатывают условие ложного совпадения.

    Внутренние соединения не включают несогласованные строки; тогда как внешние объединения включают их. Давайте копаем немного глубже в механику каждого

    Механика внутренней связи

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

    В своем простейшем случае, когда нет условия соединения, внутреннее объединение объединяет все строки из одной таблицы с данными из другого. Если первая таблица содержала три строки, а вторая, четыре, то окончательный результат будет содержать двенадцать (3 х 4 = 12)!

    Целью условия соединения является ограничение того, какие строки объединяются. В большинстве случаев мы ограничиваем строки теми, которые соответствуют столбцу. Если у человека более одного номера телефона, производится более одного совпадения. Из этого вы можете видеть, что мы можем получить больше возвращенных строк, чем у каждого человека.

    введите описание изображения здесь

    Таблицы для присоединения. И наоборот, если у человека нет номера телефона, то в PersonPhone не будет записи, и никакое совпадение не будет выполнено. Этот конкретный человек не будет включен в результаты, так как включены только те, у кого есть спички. Попробуем пример. Предположим, что HR Manager хочет создать телефонный каталог. Они хотят, чтобы имя, фамилия, название и номера телефонов человека. Какой запрос вы могли бы использовать для создания этого? Вот один из них:

     SELECT   P.FirstName,
             P.LastName,
             P.Title,
             PH.PhoneNumber
    FROM     Person.Person AS P
             INNER JOIN
             Person.PersonPhone AS PH
             ON P.BusinessEntityID = PH.BusinessEntityID
             AND PH.PhoneNumberTypeID = 3
    ORDER BY P.LastName
     

    INNER JOIN указывает, для каких таблиц необходимо присоединиться, и условия соответствия для этого. Условие PH.Phone NumberTyeID = 3 ограничивает запрос рабочими числами. Если вы выполните вышеуказанное, вы получите следующие результаты:

    введите описание изображения здесь

    Внутренние результаты присоединения Помните, что внутреннее соединение возвращает строку, где условие соответствия истинно. В этом примере строки, в которых не совпадают идентификаторы BusinessEntityID, не включены. Это может быть проблемой, если у человека нет номера телефона, так как эти сотрудники не будут в списке. Если вы хотите включить этих сотрудников, вы можете использовать Outer join.

    Механизм внешней механики

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

     SELECT   P.FirstName,
             P.LastName,
             P.Title,
             PH.PhoneNumber
    FROM     Person.Person AS P
             LEFT OUTER JOIN
             Person.PersonPhone AS PH
             ON P.BusinessEntityID = PH.BusinessEntityID
             AND PH.PhoneNumberTypeID = 3
    ORDER BY P.LastName
     

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

    введите описание изображения здесь Outer Join Results Обратите внимание, что в примере PhoneNumber для Catherine Abel имеет значение NULL. Это связано с тем, что номер работы Кэтрин не указан, и во время соединения не было найдено совпадения. Если бы это было внутреннее соединение, то эта строка не была бы включена в результаты.

    ответ дан Nitin Kumar, с репутацией 749, 11.10.2016
  • 0 рейтинг

    ВНУТРЕННЕЕ СОЕДИНЕНИЕ

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

    ЛЕВЫЙ ВНЕШНИЙ ВСТУПИТЕЛЬ

    Левое внешнее соединение или левое соединение приводит к набору, в котором сохраняются все строки из первой или левой стороны таблицы. Строки со второй или правой стороны таблицы отображаются только в том случае, если они совпадают с строками из первой таблицы. Если в левой таблице есть значения, но не справа, таблица будет считаться нулевой, что означает, что значение не было установлено.

    ПРАВО НА ВСТУПЛЕНИЕ

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

    ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

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

    Дополнительные ссылки

    ответ дан AVI, с репутацией 4212, 20.12.2015
  • 0 рейтинг

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

    Хотя ответ @Martin Smith - лучший из этого пучка длинным путем, он показывает только столбец ключей из каждой таблицы, тогда как я думаю, что в идеале должны быть показаны нек-ликовые столбцы.

    Лучшее, что я мог сделать за полчаса, я все же не думаю, что это адекватно показывает, что нули есть из-за отсутствия ключевых значений в TableB или что OUTER JOIN фактически является объединением, а не соединением:

    введите описание изображения здесь

    ответ дан onedaywhen, с репутацией 42324, 22.01.2016
  • 0 рейтинг

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

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

    Как правило, рекомендуется использовать INNER JOIN вместо разных типов соединений. (Конечно, если это возможно, учитывая ожидаемый набор результатов.)

    В этом странном ассоциативном поведении есть несколько хороших примеров и объяснений:

    ответ дан Lajos Veres, с репутацией 12078, 17.11.2013
  • 0 рейтинг

    В чем разница между «INNER JOIN» и «OUTER JOIN»?

    Они являются наиболее часто используемыми экзистенциальными операторами в SQL, где INNER JOIN используется для «существует», а LEFT OUTER JOIN используется для «не существует».

    Рассмотрим эти запросы:

     users who have posted and have votes
    users who have posted but have no badges
     

    Люди, которые ищут комплексные решения (отраслевой термин), распознают соответствующие запросы как:

     users who have posted INTERSECT users who have votes
    users who have posted MINUS users who have badges
     

    Переведя их в стандартный SQL:

     SELECT UserId FROM Posts
    INTERSECT 
    SELECT UserId FROM Votes;
    
    SELECT UserId FROM Posts
    EXCEPT 
    SELECT UserId FROM Badges;
     

    Другие будут думать так же:

     users who have posted and IN the set of users who have votes
    users who have posted and NOT IN the set of users who have badges
     

    Переведя их в стандартный SQL:

     SELECT UserId 
      FROM Posts
     WHERE UserId IN ( SELECT UserId FROM Votes );
    
    SELECT UserId 
      FROM Posts
     WHERE UserId NOT IN ( SELECT UserId FROM Badges );
     

    Некоторые будут думать в терминах «существования» внутри множеств, например

     users who have posted and EXIST in the set of users who have votes
    users who have posted and do NOT EXIST in the set of users who have badges
     

    Переведя их в стандартный SQL (обратите внимание, что теперь нам нужно использовать переменные диапазона, т. Е. p , v , b ):

     SELECT p.UserId 
      FROM Posts p
     WHERE EXISTS ( SELECT *
                      FROM Votes v
                     WHERE v.UserId = p.UserId );
    
    SELECT p.UserId 
      FROM Posts p
     WHERE NOT EXISTS ( SELECT *
                          FROM Badges b
                         WHERE b.UserId = p.UserId );
     

    Однако я обнаружил, что подход «отраслевой стандарт» заключается в том, чтобы использовать только объединения. Я не знаю, что думает здесь ( Закон инструмента ? Преждевременная оптимизация ?), Поэтому я перейду к синтаксису:

     SELECT p.UserId 
      FROM Posts p
           INNER JOIN Votes v ON v.UserId = p.UserId;
    
    SELECT p.UserId 
      FROM Posts p
           LEFT JOIN Badges b ON b.UserId = p.UserId
     WHERE b.UserId IS NULL;
     

    Что нужно отметить:

    • Единственный прогноз - от Users но для условий поиска нам все же нужны все эти переменные диапазона ( p , v , b ).
    • UserId IS NULL условие поиска «принадлежит» OUTER JOIN но отключено в запросе.
    • LEFT - это отраслевой стандарт: профессионалы переписывают запрос, чтобы избежать использования RIGHT !
    • Ключевое слово OUTER из LEFT OUTER JOIN опущено.

    Заключительные замечания:

    Иногда объединения используются в запросах исключительно для определения того, существуют ли значения или не существуют в другом наборе. Научитесь внимательно смотреть на проецируемые атрибуты (столбцы в предложении SELECT ): если из объединенной таблицы их нет, они просто используются в качестве экзистенциальных операторов. Кроме того, для внешнего соединения найдите экземпляры <key_column> IS NULL в предложении WHERE .

    ответ дан onedaywhen, с репутацией 42324, 30.09.2016
  • 0 рейтинг

    Разница между внутренним соединением и внешним соединением заключается в следующем:

    1. Внутреннее объединение - это объединение, объединяющее таблицы на основе совпадающих кортежей, тогда как внешнее объединение - это объединение, которое объединяет таблицу на основе как согласованного, так и несогласованного кортежа.
    2. Внутреннее объединение объединяет согласованную строку из двух таблиц, в которых пропущена непревзойденная строка, тогда как внешнее объединение объединяет строки из двух таблиц, а несогласованные строки заполняют нулевым значением.
    3. Внутреннее соединение подобно операции пересечения, тогда как внешнее соединение подобно операции объединения.
    4. Внутреннее соединение - два типа, тогда как внешнее соединение - три типа.
    5. Внутреннее соединение медленнее, тогда как внешнее соединение быстрее, чем внутреннее соединение.
    ответ дан rashedcs, с репутацией 930, 17.10.2017
  • 0 рейтинг

    Ответ заключается в значении каждого из них, поэтому в результатах.

    Заметка :
    В SQLite нет RIGHT OUTER JOIN или FULL OUTER JOIN .
    А также в MySQL нет FULL OUTER JOIN .

    Мой ответ основан на примечании выше.

    Когда у вас есть две таблицы:

     --[table1]               --[table2]
    id | name                id | name
    ---+-------              ---+-------
    1  | a1                  1  | a2
    2  | b1                  3  | b2
     

    ПЕРЕКРЕСТНЫЙ ПРИСОЕДИНЕНИЕ /ВСТУПЛЕНИЕ ВЕДЬ:
    Вы можете иметь все эти данные таблиц с CROSS JOIN или только с , как это:

     SELECT * FROM table1, table2
    --[OR]
    SELECT * FROM table1 CROSS JOIN table2
    
    --[Results:]
    id | name | id | name 
    ---+------+----+------
    1  | a1   | 1  | a2
    1  | a1   | 3  | b2
    2  | b1   | 1  | a2
    2  | b1   | 3  | b2
     

    ВНУТРЕННЕЕ СОЕДИНЕНИЕ :
    Если вы хотите добавить фильтр к приведенным выше результатам на основе отношения типа table1.id = table2.id вы можете использовать INNER JOIN :

     SELECT * FROM table1, table2 WHERE table1.id = table2.id
    --[OR]
    SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
    
    --[Results:]
    id | name | id | name 
    ---+------+----+------
    1  | a1   | 1  | a2
     

    LEFT [OUTER] JOIN:
    Если вы хотите иметь все строки одной из таблиц в приведенном выше результате - с теми же отношениями, вы можете использовать LEFT JOIN :
    (Для ПРАВИЛЬНОГО СОЕДИНЕНИЯ просто измените место таблиц)

     SELECT * FROM table1, table2 WHERE table1.id = table2.id 
    UNION ALL
    SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
    --[OR]
    SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
    
    --[Results:]
    id | name | id   | name 
    ---+------+------+------
    1  | a1   | 1    | a2
    2  | b1   | Null | Null
     

    ПОЛНАЯ ВНЕШНЯЯ ВСТУПЛЕНИЕ:
    Когда вы также хотите, чтобы все строки другой таблицы в ваших результатах вы могли использовать FULL OUTER JOIN :

     SELECT * FROM table1, table2 WHERE table1.id = table2.id
    UNION ALL
    SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
    UNION ALL
    SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
    --[OR] (recommended for SQLite)
    SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
    UNION ALL
    SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
    WHERE table1.id IS NULL
    --[OR]
    SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
    
    --[Results:]
    id   | name | id   | name 
    -----+------+------+------
    1    | a1   | 1    | a2
    2    | b1   | Null | Null
    Null | Null | 3    | b2
     

    Ну, по мере необходимости, вы выбираете каждый, который покрывает ваши потребности;).

    ответ дан shA.t, с репутацией 12536, 13.04.2015
  • 0 рейтинг

    Диаграммы Венна на самом деле не делают этого для меня.

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

    Нет никакой альтернативы пониманию логической обработки, и это довольно просто понять.

    1. Представьте себе крест.
    2. Оцените предложение on всех строк с шага 1, сохраняя те, где предикат оценивает значение true
    3. (Только для внешних соединений) добавьте обратно в любые внешние строки, которые были потеряны на шаге 2.

    (NB: На практике оптимизатор запросов может найти более эффективные способы выполнения запроса, чем чисто логическое описание выше, но конечный результат должен быть одинаковым)

    Я начну с анимированной версии полного внешнего соединения . Дальнейшее объяснение следует.

    введите описание изображения здесь


    объяснение

    Исходные таблицы

    введите ссылку здесь

    Сначала начните с CROSS JOIN (декартовой продукции AKA). Это не имеет предложения ON и просто возвращает каждую комбинацию строк из двух таблиц.

    SELECT A.Colour, B.Colour FROM A CROSS JOIN B

    введите ссылку здесь

    Внутренние и внешние соединения имеют предикат предложения ON.

    • Внутреннее соединение. Оцените условие в предложении «ON» для всех строк в результате перекрестного соединения. Если true, верните объединенную строку. В противном случае отбросьте его.
    • Left Outer Join. То же, что и внутреннее соединение, то для любых строк в левой таблице, которые не соответствуют чему-либо, выводят их с NULL-значениями для столбцов правой таблицы.
    • Правое внешнее соединение. То же, что и внутреннее соединение, то для любых строк в правой таблице, которые не соответствуют чему-либо, выводят их с значениями NULL для столбцов левой таблицы.
    • Полное внешнее соединение. То же, что и внутреннее соединение, тогда сохраняйте левые несопоставимые строки, как в левом внешнем соединении, так и в правых не совпадающих строках в соответствии с правым внешним соединением.

    Некоторые примеры

    SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour = B.Colour

    Вышеприведенное классическое объединение equi.

    Внутреннее соединение

    Анимированная версия

    введите описание изображения здесь

    SELECT A.Colour, B.Colour FROM IN INER JOIN B ON A.Colour NOT IN («Зеленый», «Синий»)

    Внутреннее условие соединения необязательно должно быть условием равенства, и ему не нужно ссылаться на столбцы из (или даже любой) таблиц. Вычисление A.Colour NOT IN ('Green','Blue') по каждой строке перекрестного соединения возвращается.

    внутренний 2

    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

    Внешние соединения логически оцениваются так же, как и внутренние соединения, за исключением того, что если строка из левой таблицы (для левого соединения) не объединяется ни с одной строкой из правой таблицы, она сохраняется в результате с NULL значениями для правые столбцы.

    LOJ

    SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL

    Это просто ограничивает предыдущий результат только возвратом строк, где B.Colour IS NULL . В этом конкретном случае это будут строки, которые были сохранены, поскольку они не совпадали в правой таблице, и запрос возвращает единственную красную строку, не соответствующую таблице B . Это известно как анти-соединение.

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

    loj - null

    SELECT A.Colour, B.Colour FROM A RIGHT OUTER JOIN B ON A.Colour = B.Colour

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

    ROJ

    SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON A.Colour = B.Colour

    Полное внешнее объединение объединяет поведение левого и правого объединений и сохраняет несоответствующие строки как из левой, так и из правой таблиц.

    FOJ

    SELECT A.Colour, B.Colour FROM FULL OUTER JOIN B ON 1 = 0

    Никакие строки в перекрестном соединении не совпадают с предикатом 1=0 . Все строки с обеих сторон сохраняются с использованием обычных правил внешнего соединения с NULL в столбцах из таблицы с другой стороны.

    FOJ 2

    SELECT COALESCE (A.Colour, B.Colour) AS Color ОТ ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ B ON 1 = 0

    При незначительной поправке к предыдущему запросу можно смоделировать UNION ALL из двух таблиц.

    СОЮЗ ВСЕ

    SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour = 'Green'

    Обратите внимание, что предложение WHERE (если присутствует) логически запускается после соединения. Одной из распространенных ошибок является выполнение левого внешнего соединения, а затем включение предложения WHERE с условием в правой таблице, которое заканчивается исключением несоответствующих строк. Вышеприведенное завершает выполнение внешнего соединения ...

    LOJ

    ... И затем выполняется предложение «Где». NULL= 'Green' не оценивается как true, поэтому строка, сохраненная внешним соединением, заканчивается отбрасыванием (вместе с синим), эффективно преобразуя соединение обратно во внутреннее.

    LOJtoInner

    Если бы намерение состояло в том, чтобы включать только строки из B, где Цвет Зеленый, а все строки из A, независимо от правильного синтаксиса,

    SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour AND B.Colour = 'Green'

    введите описание изображения здесь

    SQL Fiddle

    См. Эти примеры в реальном времени на SQLFiddle.com .

    ответ дан Martin Smith, с репутацией 333672, 13.12.2014
  • 0 рейтинг

    Я рекомендую статью блога Джеффа . Лучшее описание, которое я когда-либо видел, плюс визуализация, например:

    Внутреннее соединение:

    введите описание изображения здесь

    Полное внешнее соединение:

    введите описание изображения здесь

    ответ дан ya23, с репутацией 10901, 30.08.2009