Я не думаю, что подзапрос и полусоединение являются чем-то похожим. Подзапрос не более интересен, чем запрос, который используется внутри другого запроса:
select * -- this is often called the "outer" query
from (
select columnA -- this is the subquery inside the parentheses
from mytable
where columnB = 'Y'
)
Полу-соединение - это концепция , основанная на соединении. Конечно, объединение таблиц объединит обеих таблиц и возвратит объединенные строки на основе критериев объединения. Оттуда вы выбираете нужные столбцы из любой таблицы, основываясь на дальнейших критериях (и, конечно, на том, что еще вы хотите сделать). Понятие полусоединения - это когда вы хотите вернуть строки только из первой таблицы , но вам нужна вторая таблица, чтобы решить, какие строки вернуть. Пример: вы хотите вернуть людей в классе:
select p.FirstName, p.LastName, p.DOB
from people p
inner join classes c on c.pID = p.pID
where c.ClassName = 'SQL 101'
group by p.pID
Это завершает концепцию полусоединения. Мы только возвращаем столбцы из первой таблицы (люди). Использование группы по необходимо для концепции полусоединения, потому что истинное соединение может возвращать повторяющиеся строки из первой таблицы (в зависимости от критериев объединения). Приведенный выше пример не часто называют полусоединением и не является наиболее типичным способом его достижения. Следующий запрос является более распространенным методом выполнения полусоединения:
select FirstName, LastName, DOB
from people
where pID in (select pID
from class
where ClassName = 'SQL 101'
)
Здесь нет формального соединения. Но мы используем 2-ю таблицу, чтобы определить, какие строки из первой таблицы нужно вернуть. Это все равно что сказать , если мы сделали присоединением второй таблицы к первой таблице, какие строки из первой таблицы будут соответствовать? Для производительности обычно предпочтительнее существует:
select FirstName, LastName, DOB
from people p
where exists (select pID
from class c
where c.pID = p.pID
and c.ClassName = 'SQL 101'
)
На мой взгляд, это самый прямой способ понять полусоединение. Формального объединения по-прежнему нет, но вы можете увидеть идею объединения, на которую намекнет использование прямого сопоставления столбца pID первой таблицы со столбцом pID второй таблицы. Конечная нота . Последние два запроса над каждым используют подзапрос для реализации концепции полусоединения.