Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD шпорки.doc
Скачиваний:
112
Добавлен:
17.06.2021
Размер:
4.62 Mб
Скачать
  1. Язык sql: соединение таблиц (внутреннее и внешнее)

Команда выборки данных позволяет извлечь данные сразу из нескольких таблиц, для этого их имена нужно перечислить во FROM, а в WHERE необходимо задать условие соединение, указывая через знак равенства поля, по которым происходит соединение таблиц. Чаще всего такими полями являются первичные и внешние ключи таблиц между которыми установлены связи типа 1:М

SELECT Группа.*, Студент.фамилия

FROM Группа, Студент

WHERE Группа.N_группы = Студент.N_группы

Чтобы упростить запись таких команд, имена таблиц в FROM снабжаются псевдонимами, которых можно использовать лишь в контексте данной команды

SELECT Г.*, С.фамилия

FROM Группа Г, Студент С

WHERE Г.N_группы = C.N_группы

SELECT Г.*, С.фамилия, Э.*

FROM Группа Г, Студент С, Экзамен Э

WHERE Г.N_группы = C.N_группы

AND C.N_зачетки = Э.N_зачетки

Существуют следующие правила:

Число условий соединения предложения WHERE не должно быть меньше, чем n – 1, где n – число таблиц, перечисленных во FROM.

Если условия соединения не указывать, то результирующий набор данных будет представлять собой декартово произведение таблиц, перечисленных в FROM.

SELECT Г.*, Э.*

FROM Группа Г, Экзамен Э

/*не получится соединить, т.к. нет непосредств. Связи */

Чтобы избежать декартово произведения нужно добавить связующую страницу и 2 условия соединения.

Как правило, БД не содержит изолированных таблиц, поэтому нужно соединять любые таблицы, добавляя при необходимости промежуточные связующие таблицы.

SELECT С.фамилия, С.N_зачетки, Э.оценка

FROM Студент С, Экзамен Э

WHERE C.N_зачетки = Э.N_зачетки

AND C.N_группы = 372302

AND Э.предмет = ‘Теория систем’

ORDER BY С.фамилия

SELECT Г.N_группы, AVG(Э.оценка)

FROM Группа Г, Студент С, Экзамен Э

WHERE Г.N_группы = C.N_группы

AND C.N_зачетки = Э.N_зачетки

AND Г.Факультет = ‘ИЭ’

AND Э.предмет = ‘Теория систем’

GROUP BY Г.N_группы

Рассмотренный способ соединения таблиц:

Известен как внутреннее соединение, и он характерен тем, что результирующий набор данных будет содержать только те строки, которые удовлетворяют условиям соединения, указанным в

WHERE

SELECT Г.*, С.фамилия

FROM Группа Г, Студент С

WHERE Г.N_группы = C.N_группы

Предположим, что таблица студент содержит 100 строк, в которых поле N_группы наполовину не заполнено(NULL), тогда эта команда вернет результирующий набор данных, содерж. 50 строк, т.к. поле N_группы фигурирует в условии соединения таблиц. Если мы хотим получить фамилии всех 100 студентов и увидеть, у кого отсутствует инфа о N_группы, то нужно использовать другой тип соединения, называемый внешним соединением.

Внешнее соединение может быть левым или правым.

Левое внешнее соединение включ. в результ. набор данных все строки таблицы, расположенный слева в предл. FROM, а правое внешнее – все троки таблицы, распол. справа.

При этом условие соединения записываются в предл. FROM после зарезервированного слова ON

SELECT Г.*, С.фамилия

FROM Студент С LEFT OUTER JOIN Группа Г

ON Г.N_группы = С.N_группы

SELECT Г.*, С.фамилия

FROM Группа Г

RIGHT OUTER JOIN Студент С

ON Г.N_группы = С.N_группы

SELECT Г.*, С.фамилия, Э.оценка

FROM Студент С

LEFT OUTER JOIN Группа Г ON Г.N_группы = С.N_группы

LEFT OUTER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки

WHERE Э.предмет = ‘Теория систем’

Внешнее соединение используется не очень часто и обычно в тех случаях, когда поля, по которым производится соединение содержит NULL значит, если же указанных поля не содержат NULL значений, то внутр. и внешн. соединение порождают один и тот же набор данных

SELECT С.фамилия, Э.*

FROM Студент С

RIGHT OUTER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки

WHERE Э.оценка

~

SELECT С.фамилия, Э.*

FROM Студент С, Экзамен Э

RIGHT OUTER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки

WHERE C.N_зачетки = Э.N_зачетки

AND Э.оценка = 10

Имеется другой альтернативный способ записи внутренних соединений. Аналогичн. способ записи внешних соединений.

SELECT С.фамилия, Э.*

FROM Студент С

INNER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки

WHERE Э.оценка = 10

Соседние файлы в предмете Базы данных