ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 02.04.2021
Просмотров: 1534
Скачиваний: 4
66
2.18.
В неш нее
объ единение
Ч а сто
п олез на
оп ерация
объед инения
д в ух
з а п росов
,
в
которой
в торой
з а п рос
в ыбира ет
строки
,
исключ енные
п ер в ым
.
Та ка я
оп ерация
на з ыв а ется
в нешним
объед инением
.
Ра ссмотрим
п ример
.
Пусть
в
та блице
STUDENT
имеются
з а п иси
о
студ ента х
,
в
которых
не
ука з а н
ид ентифика тор
унив ерситета
.
Требуется
соста в ить
сп исок
студ ентов
с
ука з а нием
на именов а ния
унив ерситета
д ля
тех
студ ентов
,
у
которых
э ти
д а нные
есть
,
но
п ри
э том
не
отбра сыв а я
и
студ ентов
,
у
которых
унив ерситет
не
ука з а н
.
М ожно
п олуч ить
жела емые
св ед ения
,
сфор миров а в
объед инение
д в ух
з а п росов
,
од ин
из
которых
в ып олняет
в ыборку
студ ентов
с
на з в а ниями
их
унив ерситетов
,
а
в торой
в ыбирает
студ ентов
с
NULL
-
з на ч ениями
в
п оле
UNIV
_
ID
.
В
д а нном
случ а е
ока з ыв а ется
п олезной
в оз можность
в ста в ки
в
з а п рос
конста нт
,
в
на шем
случ а е
текстов ой
конста нты
‘
н е
и звестен
’
,
ч тобы
отметить
в
сп иске
тех
студ ентов
,
у
которых
отсутств ует
информа ция
об
унив ерситете
.
SELECT
SURNAME
,
NAME
,
UNIV
_
NAME
FROM
STUDENT
,
UNIVERSITY
WHERE
STUDENT
.
UNIV
_
ID
=
UNIVERSITY
.
UNIV
_
ID
UNION
SELECT
SURNAME
,
NAME
,
‘
н е
и звестен
’
FROM
STUDENT
WHERE
UNIV
_
ID
IS
NULL
ORDER
BY
1;
Д ля
сов местимости
столбцов
объед иняемых
з а п росов
конста нту
‘
н е
и звестен
’
в о
в тором
з а п росе
след ует
д оп олнить
п робела ми
та к
,
ч тобы
ее
д лина
соотв етств ов а ла
д лине
п оля
UNIV
_
NAME
или
исп ользов а ть
д ля
согла сов а ния
тип ов
функцию
CAST
.
В
некоторых
СУ Б Д
согла сов а ние
тип ов
п оля
и
з а мещ а ющ ей
его
текстов ой
конста нты
осущ еств ляется
а в тома тич ески
.
УП Р АЖ НЕ НИ Я
41.
Соз д а йте
объед инение
д в ух
з а п росов
,
которые
в ыд а ют
з на ч ения
п олей
UNIV
_
NAME
,
CITY
,
RATING
д ля
в сех
унив ерситетов
.
Те
из
них
,
у
которых
р ейтинг
рав ен
или
в ыше
300,
д олжны
иметь
коммента р ий
‘
Вы со к
и й
’
,
в се
оста льные
–
‘
Н и зкий
’
.
67
42.
Н а п ишите
кома нд у
,
которая
в ыд а ет
сп исок
фа милий
студ ентов
,
с
коммента р ием
‘
успева ет
’
у
студ ентов
,
имеющ их
в се
п оложительные
оценки
,
коммента р ием
‘
н е
успева ет
’
д ля
сд а в а в ших
э кз а мены
,
но
имеющ их
хотя
бы
од ну
неуд ов летв орительную
оценку
,
и
коммента р ием
‘
н е
сда ва л
’
–
д ля
в сех
оста льных
.
В
в ыв од имом
результа те
фа милии
студ ентов
уп оряд оч ить
п о
а лфа в иту
.
43.
Выв ед ите
объед иненный
сп исок
студ ентов
и
п реп од а в а телей
,
жив ущ их
в
М оскв е
,
с
соотв етств ующ ими
коммента р иями
‘
студен т
’
или
‘
пр епо да ва тель
’
.
44.
Выв ед ите
объед иненный
сп исок
студ ентов
и
п реп од а в а телей
Воронежского
госуд а р ств енного
унив ерситета
с
соотв етств ующ ими
коммента р иями
‘
студен т
’
или
‘
пр епо да ва тель
’
.
2.19.
С оединение
т абл иц
с
испол ь з ованием
операт ора
JOIN
Е сли
в
оп ераторе
SELECT
п осле
ключ ев ого
слов а
FROM
ука з ыв а ется
не
од на
,
а
д в е
та блицы
,
то
в
рез ульта те
в ып олнения
з а п р оса
,
в
котором
отсутств ует
п ред ложение
WHERE
,
ка жд а я
стр ока
од ной
та блицы
буд ет
соед инена
с
ка жд ой
стр окой
в торой
та блицы
.
Та ка я
оп ерация
на з ыв а ется
д ека р т о в ы м
пр о и зв ед ени ем
или
по лны м
(
CROSS
)
со ед и нени ем
та блиц
ба з ы
д а нных
.
Са ма
п о
себе
э та
оп ерация
не
имеет
п рактич еского
з на ч ения
,
более
того
,
п ри
ошибоч ном
исп ользов а нии
она
может
п рив ести
к
неожид а нным
нешта тным
ситуа циям
,
та к
ка к
в
э том
случ а е
в
отв ете
на
з а п рос
колич еств о
з а п исей
буд ет
ра в но
п роиз в ед ению
ч исла
з а п исей
в
соед иняемых
та блица х
,
то
есть
может
ока з аться
ч резв ыч а йно
большим
.
Соед инение
та блиц
имеет
смысл
тогд а
,
когд а
соед иняются
не
в се
строки
исход ных
та блиц
,
а
только
те
,
которые
интересуют
п ользов а теля
.
Та кое
огранич ение
может
быть
осущ еств лено
с
п омощ ью
исп ользов а ния
в
з а п росе
соотв етств ующ его
услов ия
в
п ред ложении
WHERE
.
Та ким
обр а з ом
, SQL
п оз в ол яет
в ыв од ить
информа цию
из
нескольких
та блиц
,
св яз ыв а я
их
п о
з на ч ениям
оп ред еленных
п олей
.
Н а п ример
,
если
необход имо
п олуч ить
фа милии
студ ентов
(
та блица
STUDENT
)
и
д ля
ка жд ого
студ ента
–
на з в а ния
унив ерситетов
(
та блица
68
UNIVERSITY
),
расп оложенных
в
город е
,
гд е
жив ет
студ ент
,
то
необход имо
п олуч ить
в се
комбина ции
з а п исей
о
студ ента х
и
унив ерситета х
в
обеих
та блица х
,
в
которых
з на ч ение
п оля
CITY
сов п а д а ет
.
Э то
можно
сд ела ть
с
п омощ ью
след ующ его
з а п роса
.
SELECT
STUDENT
.
SURNAME
,
UNIVERSITY
.
UNIV
_
NAME
,
STUDENT
.
CITY
FROM
STUDENT
,
UNIVERSITY
WHERE
STUDENT
.
CITY
=
UNIVERSITY
.
CITY
;
Соед инение
,
исп ользующ ее
п ред ика ты
,
основ а нные
на
рав енств а х
,
на з ыв а ется
экв и со ед и нени ем
.
Ра ссмотренный
п ример
соед инения
та блиц
относятся
к
в ид у
та к
на з ыв а емого
в нут р еннего
(
INNER
)
со ед и нени я
.
При
та ком
тип е
соед инения
соед иняются
только
те
строки
та блиц
,
д ля
которых
яв ляется
истинным
п р ед ика т
,
з а д а в а емый
в
п ред ложении
ON
в ып олняемого
з а п роса
.
Прив ед енный
в ыше
з а п рос
может
быть
з а п иса н
ина ч е
,
с
исп ользов а нием
ключ ев ого
слов а
JOIN
.
SELECT
STUDENT
.
SURNAME
,
UNIVERSITY
.
UNIV
_
NAME
,
STUDENT
.
CITY
FROM
STUDENT
INNER
JOIN
UNIVERSITY
ON
STUDENT
.
CITY
=
UNIVERSITY
.
CITY
;
К люч ев ое
слов о
INNER
в
з а п р осе
может
быть
оп ущ ено
,
та к
ка к
э та
оп ция
в
оп ераторе
JOIN
д ейств ует
п о
умолч а нию
.
Ра ссмотренный
в ыше
случ а й
п олного
соед инения
(
д ека р тов а
п роиз в ед ения
та блиц
)
с
исп ользов а нием
ключ ев ого
слов а
JOIN
буд ет
в ыгляд еть
след ующ им
образ ом
SELECT
*
FROM
STUDENT
JOIN
UNIVERSITY
;
ч то
э кв ив а лентно
SELECT
*
FROM
STUDENT
,
UNIVERSITY
;
За метим
,
ч то
в
СУ Б Д
Oracle
з а д а в а емый
ста нд а р том
яз ыка
SQL
оп ератор
JOIN
не
п од д ержив а ется
.
69
2.19.1.
О перац ии
соединения
т абл иц
посредст вом
ссы л очной
ц ел остност и
Информа ция
в
та блица х
STUDENT
и
EXAM
_
MARKS
уже
св яз а на
п осред ств ом
п оля
STUDENT
_
ID
.
В
та блице
STUDENT
п оле
STUDENT
_
ID
яв ляется
п ер в ич ным
ключ ом
,
а
в
та блице
EXAM
_
MARKS
,
ссыла ющ имся
на
него
в нешним
ключ ом
.
Состояние
св яз а нных
та ким
обра з ом
та блиц
на з ыв а ется
состоянием
ссылоч ной
целостности
.
В
д а нном
случ а е
ссылоч на я
целостность
э тих
та блиц
п од р а з умев а ет
,
ч то
ка ж д о м у
з на ч ению
п оля
STUDENT
_
ID
в
та блице
EXAM
_
MARKS
о бяза т ельно
соотв етств ует
т а ко е
ж е
зна чени е
п оля
STUDENT
_
ID
в
та блице
STUDENT
.
Д ругими
слов а ми
,
в
та блице
EXAM
_
MARKS
не
может
быть
з а п исей
,
имеющ их
ид ентифика торы
студ ентов
,
которых
нет
в
та блице
STUDENT
.
Ста нд а р тное
п рименение
оп ерации
соед инения
состоит
в
из в леч ении
д а нных
в
термина х
э той
св яз и
.
Ч тобы
п олуч ить
сп исок
фа милий
студ ентов
с
п олуч енными
ими
оценка ми
и
ид ентифика тор а ми
п ред метов
можно
исп ользов а ть
след ующ ий
з а п рос
:
SELECT
SURNAME
,
MARK
,
SUBJ
_
ID
FROM
STUDENT
,
EXAM
_
MARKS
WHERE
STUDENT
.
STUDENT
_
ID
=
EXAM
_
MARKS
.
STUDENT
_
ID
;
Тот
же
са мый
результа т
может
быть
п олуч ен
п ри
исп ользов а нии
в
з а п росе
д ля
з а д а ния
оп ерации
соед инения
та блиц
ключ ев ого
слов а
JOIN
.
За п рос
с
оп ера тором
JOIN
в ыгляд ит
след ующ им
образ ом
SELECT
SURNAME
,
MARK
FROM
STUDENT
JOIN
EXAM
_
MARKS
ON
STUDENT
.
STUDENT
_
ID
=
EXAM
_
MARKS
.
STUDENT
_
ID
;
Х отя
в ыше
реч ь
шла
о
соед инении
д в ух
та блиц
,
можно
сформиров а ть
з а п росы
п утем
соед инения
более
ч ем
д в ух
та блиц
.
Пусть
требуется
на йти
фа милии
в сех
студ ентов
,
п олуч ив ших
неуд ов летв ор ительную
оценку
,
в месте
с
на з в а ниями
п р ед метов
обуч ения
,
п о
которым
п олуч ена
э та
оценка
.
SELECT
SUBJ
_
NAME
,
SURNAME
,
MARK
FROM
STUDENT
,
SUBJECT
,
EXAM
_
MARKS
WHERE
STUDENT
.
STUDENT_ID
=
EXAM
_
MARKS
.
STUDENT
_
ID
AND
SUBJECT
.
SUBJ_ID
=
EXAM
_
MARKS
.
SUBJ
_
ID
70
AND
EXAM
_
MARKS
.
MARK
=
2
;
То
же
са мое
с
исп ользов а нием
оп ератор а
JOIN
SELECT
SUBJ
_
NAME
,
SURNAME
,
MARK
FROM
STUDENT
JOIN
SUBJECT
JOIN
EXAM
_
MARKS
ON
STUDENT
.
STUDENT_ID
=
EXAM
_
MARKS
.
STUDENT
_
ID
AND
SUBJECT
.
SUBJ_ID
=
EXAM
_
MARKS
.
SUBJ
_
ID
AND
EXAM
_
MARKS
.
MARK
=
2
;
2.19.2.
В неш нее
соединение
т абл иц
К а к
отмеч а лось
ранее
,
п ри
исп ользов а нии
в нут р еннего
(
INNER
)
соед инения
та блиц
соед иняются
только
те
их
строки
,
в
которых
сов п а д а ют
з на ч ения
п олей
,
з а д а в а емые
в
п р ед ложении
WHERE
з а п роса
.
О д на ко
в о
многих
случ а ях
э то
может
п рив ести
к
нежела тельной
п отере
информа ции
.
Ра ссмотрим
ещ е
раз
п рив ед енный
в ыше
п ример
з а п роса
на
в ыборку
сп иска
фа милий
студ ентов
с
п олуч енными
ими
оценка ми
и
ид ентифика торами
п ред метов
.
Пр и
исп ользов а нии
,
ка к
э то
было
сд ела но
в
р а ссма трив а емом
п римере
,
в нутреннего
соед инения
в
результа т
з а п роса
не
п оп а д ут
студ енты
,
которые
ещ е
не
сд а в а ли
э кз а мены
и
которые
,
след ов а тельно
,
отсутств уют
в
та блице
EXAM
_
MARKS
.
Е сли
же
необход имо
иметь
з а п иси
об
э тих
студ ента х
в
в ыд а в а емом
з а п росом
сп иске
,
то
можно
п рисоед инить
св ед ения
о
студ ента х
,
не
сд а в а в ших
э кз а мен
,
п утем
исп ол ьзов а ния
оп ератора
UNION
с
соотв етств ующ им
з а п росом
.
Н а п ример
,
след ующ им
обра з ом
:
SELECT
SURNAME
,
CAST
MARK
AS
CHAR
(
1
),
CAST
SUBJ
_
ID
AS
CHAR
(
10
)
FROM
STUDENT
,
EXAM
_
MARKS
WHERE
STUDENT
.
STUDENT
_
ID
=
EXAM
_
MARKS
.
STUDENT
_
ID
UNION
SELECT
SURNAME
,
CAST
NULL
AS
CHAR
(
1
),
CAST
NULL
AS
CHAR
(
10
)
FROM
STUDENT
WHERE NOT EXIST
(
SELECT
*
FROM
EXAM
_
MARKS
WHERE
STUDENT
.
STUDENT
_
ID
=
EXAM
_
MARKS
.
STUDENT
_
ID)
;
(
з д есь
функция
п реобраз ов а ния
тип ов
CAST
исп ользуется
д ля
обесп еч ения
сов местимости
тип ов
п олей
объед иняемых
з а п росов
).