• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

SQL Join Dark Arts: Anti Joins, Semi Joins, and Beyond

Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



SQL Join Dark Arts: Anti Joins, Semi Joins, and Beyond

“Beyond INNER and OUTER lies the realm of the JOIN masters.”
Modern SQL isn’t just about fetching related rows—it’s about expressing logic concisely, filtering precisely, and maximizing performance.

In this article, we’ll explore the most underused join strategies in SQL, often called the “dark arts”:

  • Anti joins (NOT EXISTS, NOT IN, EXCEPT)
  • Semi joins (EXISTS, IN, INTERSECT)
  • Cartesian joins (CROSS JOIN)

We’ll walk through practical use cases and advanced examples that turn verbose logic into elegant queries.

Data Setup: Customers and Orders


CREATE TABLE Customers (
id INT PRIMARY KEY,
name TEXT
);

CREATE TABLE Orders (
id INT PRIMARY KEY,
customer_id INT REFERENCES Customers(id),
total DECIMAL(10,2)
);

INSERT INTO Customers VALUES
(1, 'Alice'), (2, 'Bob'), (3, 'Carol');

INSERT INTO Orders VALUES
(1, 1, 120.00), (2, 1, 80.00), (3, 2, 50.00);
Semi Join with EXISTS


Use Case: Get customers who placed at least one order.


SELECT *
FROM Customers c
WHERE EXISTS (
SELECT 1 FROM Orders o WHERE o.customer_id = c.id
);

✅ Fast, short-circuiting filter. Equivalent with IN:


SELECT * FROM Customers
WHERE id IN (SELECT customer_id FROM Orders);
Anti Join with NOT EXISTS


Use Case: Get customers who never placed an order.


SELECT *
FROM Customers c
WHERE NOT EXISTS (
SELECT 1 FROM Orders o WHERE o.customer_id = c.id
);

? Avoid NOT IN if nulls exist:


-- Risky version
SELECT * FROM Customers
WHERE id NOT IN (SELECT customer_id FROM Orders);

✅ NOT EXISTS is null-safe and preferred for anti joins.

INTERSECT and EXCEPT


Set operations offer declarative alternatives.


-- Who placed orders? (like semi join)
SELECT id FROM Customers
INTERSECT
SELECT customer_id FROM Orders;

-- Who never placed orders? (like anti join)
SELECT id FROM Customers
EXCEPT
SELECT customer_id FROM Orders;

✅ Cleaner for full-row matching, cross-database compatible (Postgres, SQL Server).

CROSS JOIN for Combinatorics


Use Case: Generate all combinations of colors and sizes.


CREATE TABLE Colors (name TEXT);
CREATE TABLE Sizes (name TEXT);

SELECT *
FROM Colors CROSS JOIN Sizes;

Returns cartesian product of N × M rows.

✅ Useful for testing, generating permutations, or grid-like data.

? Beware: No filter = explosion in row count.

Performance Tips

PatternUse CaseCaution
EXISTSFast membership testsGreat for subquery filters
INCleaner for small listsMay degrade with large sets
NOT EXISTSAnti join with null safetyPrefer over NOT IN
INTERSECTClean set intersectionSlower with large datasets
EXCEPTAnti set logicCan replace outer joins
CROSS JOINFull combination logicLimit with WHERE clause
Bonus Challenge


Try these exercises to reinforce your skills:

  • Get products not ordered in the last 30 days (anti join)
  • Find users who posted both articles and comments (intersect)
  • Generate color-size combos for a product grid (cross join)
Final Thoughts: Beyond Joins, Into Logic


Advanced join patterns help you:

  • Write faster SQL
  • Express intent clearly
  • Avoid imperatively nested logic
“Your SQL should not only fetch rows, it should tell a story.”
#SQL #Joins #SemiJoin #AntiJoin #CrossJoin #EXCEPT #INTERSECT #DataEngineering #AdvancedSQL


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

 
Вверх Снизу