П. Г. Демидова А. В. Зафиевский А. А. Короткин А. Н. Лататуев Базы данных Учебное пособие


Download 1.32 Mb.
Pdf ko'rish
bet40/94
Sana15.06.2023
Hajmi1.32 Mb.
#1487605
1   ...   36   37   38   39   40   41   42   43   ...   94
Bog'liq
Базы данных

3.4.9. Внешние соединения 
Мы уже отмечали, что не очень логично смешивать в одной 
фразе 
WHERE
условия связи таблиц и условия, описывающие 
логику обработки данных. Кроме того, описанный в предыдущем 
пункте способ связи таблиц обладает тем недостатком, что в 
результирующую таблицу попадают данные только из тех строк 
исходных таблиц, для которых есть соответствующие строки в 
другой таблице. Так, если студент в приводившемся примере по-
ка еще не сдавал ни одного экзамена, то в итоговой таблице ин-
формация о нем вообще будет отсутствовать, хотя логичнее было 
бы информацию о студенте разместить в этой таблице, заполнив 
информацию об экзаменах пустыми значениями. 
Обе этих проблемы решаются способом, предложенным в 
стандарте SQL92 и называемым соединением таблиц (JOIN). 
Смысл его заключается в создании на основе двух таблиц нового 
объекта, называемого соединением двух таблиц и который может 
размещаться на месте исходной таблицы во фразе 
FROM
. Син-
таксис соединения выглядит следующим образом: 
<левая таблица> <тип соединения> JOIN <правая таблица> 
ON <условие соединения> . 
В качестве типа соединения могут быть использованы LEFT 
OUTER (левое внешнее), RIGHT OUTER (правое внешнее), FULL 
OUTER (полное внешнее), INNER (внутреннее). При этом слова 
INNER и OUTER могут быть опущены. Рассмотренный ранее ва-


64 
риант соединения, при котором из исходных выбираются только 
соответствующие друг другу строки, называется внутренним сое-
динением, а приведенный пример может быть записан следую-
щим образом: 
SELECT grp, fam, disc, ball 
FROM stud INNER JOIN sess ON stud.nsb = sess.nsb 
WHERE grp='МО-33' . 
При этом в результирующей таблице будут присутствовать 
только те студенты, которые сдали хотя бы один экзамен. Если 
же мы хотим включить в итоговую таблицу всех студентов
запрос должен быть записан как 
SELECT grp, fam, disc, ball 
FROM stud LEFT OUTER JOIN sess ON stud.nsb = sess.nsb 
WHERE grp='МО-33' . 
В итоговой таблице будут находиться все значения 
grp
и 
fam
левой исходной таблицы, причем при отсутствии соответст-
вующих строк правой таблицы значения 
disc 
и
ball 
будут пустыми. 
Для иллюстрации возможных вариантов соединений рас-
смотрим простой пример. Пусть имеются таблицы 
t1 t2 
a1 a2 a1 a3 
1 a 2 f 
2 s 3 g 
4 d 4 h 
Тогда запрос 
SELECT t1.a1, t2.a1, a2, a3 FROM t1 <тип соединения>
JOIN t2 ON t1.a1 = t2.a1, 
где тип соединения – 
INNER
(внутреннее), 
LEFT OUTER
(левое внеш-
нее), 
RIGHT OUTER
(правое внешнее) или 
FULL OUTER
(полное 
внешнее), выдаст следующие результаты: 
Внутреннее 
Левое 
Правое 
Полное 
t1.a1 t2.a1 a2 a3 t1.a1 t2.a1 a2 a3 t1.a1 t2.a1 a2 a3 t1.a1 t2.a1 a2 a3 
2 2 s f 1 
null

null
2 2 s f 1 
null 

null
4 4 d h 2 2 s f null
3 null
g 2 2 s f 
4 4 d h 4 4 d h 4 4 d h 
null 

null


Download 1.32 Mb.

Do'stlaringiz bilan baham:
1   ...   36   37   38   39   40   41   42   43   ...   94




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling