SQL Joins Виды, типы, различия.
В первую очередь шпаргалка для себя, но надеюсь кому нибудь окажется полезным.
Для начала оговорим, что у нас есть две таблицы: Table A и Table B:
id name id name -- ---- -- ---- 1 Pirate 1 Rutabaga 2 Monkey 2 Pirate 3 Ninja 3 Darth Vader 4 Spaghetti 4 NinjaТеперь можно рассмотреть, варианты и различия возможных JOIN запросов. Inner join выведет записи, которые соответствуют таблице A и таблице B.
Full outer join выведет все записи из Таблицы A и Таблицы B, сопоставив данные из обеих таблиц, если в одной из таблиц данные отсутсвуют, то результатом для данной ячейки будет "NULL"SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- 1 Pirate 2 Pirate 3 Ninja 4 Ninja
Left outer join выведет данные из Таблицы A, с сопутсвующими данными из Таблицы B. Если подходящих данных в Таблице B нету, то будет выбран "NULL"SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader
Оперируя прошлым примером, нам не составит труда достать только те данные, которые есть в Таблице A, для этого нужно использовть left outer join, с исключением пустых записей из Таблицы BSELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null
А если, чуть чуть усложнить задачу, то мы лего достанем данные, которые не имеют ничего общего. Для этого нужно использовать full outer join.SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null id name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null
Вот собственно и всё. Всё просто. P.s. Данная статья является вольным переводом некой статьи, авторство которой мне не известно.SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null id name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader




