Декартовым произведением двух таблиц называется таблица, составленная из всевозможных сочетаний записей обеих таблиц.
Пример 1. Вывести декартово произведение таблиц DANNIE и USPEV.
SELECT * FROM DANNIE, USPEV
Общим столбцом этих таблиц является столбец kod_student.
В полученном декартовом произведении интересуют не все данные, а только те, в которых идентичные столбцы имеют одинаковые значения. Кроме того, в результативной таблице не нужны два идентичных столбца, достаточно лишь одного из них.
SELECT DANNIE.*, USPEV.OCENKA FROM DANNIE, USPEV WHERE DANNIE.KOD_STUDENT=USPEV.KOD_STUDENT
В результате выполнения этого запроса получается таблица естественным соединением.
Данный запрос можно записать, используя псевдонимы.
SELECT T1.*, T2.OCENKA FROM DANNIE T1, USPEV T2 WHERE T1.KOD_STUDENT=T2.KOD_STUDENT
Эквивалентный запрос можно составить с помощью оператора NATURAL JOIN
SELECT T1.*, T2.OCENKA FROM DANNIE T1 NATURAL JOIN USPEV T2.
При естественном соединении, выполняемом с помощью NATURAL JOIN, проверяется равенство всех одноимённых столбцов соединяемых таблиц.
Условное соединение (JOIN …ON)
Условное соединение похоже на соединение с условием равенства. В качестве условия может выступать любое логическое выражение, которое записывается после ключевого слова ON (при), а не WHERE. Если условие выполняется для текущей записи декартового произведения, то она входит в результативную таблицу.
Пример 2. Вывести информацию о студентах и их оценках по дисциплине с кодом 2.
SELECT * FROM DANNIE JOIN USPEV ON (DANNIE.KOD_STUDENT = USPEV.KOD_STUDENT) AND (USPEV.KOD_DISCHIPLINA=2)
Соединение по именам столбцов (JOIN …USING)
Соединение по именам столбцов похоже на естественное соединение. Отличие состоит в том, что можно указать, какие именно одноименные столбцы должны проверяться, а при естественном проверяются все одноименные столбцы.
Пример 3. Вывести в каком городе какие улицы.
SELECT * FROM GOROD JOIN ULICA USING (KOD_GOROD)
Данные таблицы содержат более одного идентичного поля, поэтому естественное соединение вернет пустой результат.
Пример 4. Запрос можно сформулировать иначе:
SELECT * FROM GOROD INNER JOIN ULICA ON (GOROD.KOD_GOROD= ULICA. KOD_GOROD)