Выборка данных из нескольких таблиц

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

Синтаксис предложения FROM:

FROM <первая таблица> [[AS] <псевдоним>]

<тип объединения> <вторая таблица>[[AS] <псевдоним>]

[ON <условие объединения>]

Типы объединения приведены ниже в таблице (см. Таблица 13).

Присвоение псевдонима таблице способствует уменьшению кода и улучшает восприятия текста запроса. Псевдоним должен быть уникален в рамках одного запроса. Следует учесть и то, что после того, как был объявлен псевдоним, SQL Server 2000 перестает воспринимать действительное имя таблицы в рамках данного запроса. Один и тот же псевдоним может быть присвоен различным таблицам в запросе и подзапросе. Однако, стремясь к совершенному коду, надо отдавать себе отчет насколько это целесообразно. Существует несколько способов соединения таблиц (см. Таблица 13), наиболее применяемый способ INNER JOIN, который также может быть реализован и с помощью предложения WHERE.

Таблица 13

Варианты JOIN Назначение
     
  INNER JOIN Внутреннее соединение, включающее только совпадающие по условию соединения записи из соединяемых таблиц
  OUTER JOIN(LEFT – RIGHT) Включающее все записи левой (правой) таблицы и совпадающие с ними по условию соединения записи правой (левой) таблицы
  FULL JOIN Включение всех данных из соединяемых таблиц
  CROSS JOIN Декартово произведение

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

Пример 41

Задача.

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

Решение.

Необходимые для вывода данные хранятся в различных таблицах (Student и Sgroup), которые соединяются по атрибутам внешнего ключа. Исходя из условия целостности базы данных, в таблице Student не могут храниться данные о студентах, не обучающихся в какой-либо группе, нас также не интересуют группы, в которых никто не обучается. Следовательно, соединение будет INNER JOIN.

SELECT NameGroup,NRecordBook,SName

FROM SGroup SG INNER JOIN Student St

ON SG.IDGroup=St.IDGroup

Результат реализации запроса:

Пример 42

Задача.

Сформировать запрос для вывода названий групп и списка студентов, зачисленных в них.

Решение.

Здесь, в отличие от предыдущего примера (см. Пример 41) предполагается, что имеют место группы, в которых еще не были записаны студенты.

SELECT NameGroup,NRecordBook,SName

FROM SGroup SG LEFT OUTER JOIN Student St

ON SG.IDGroup=St.IDGroup

или

SELECT NameGroup,NRecordBook,SName

FROM Student St RIGHT OUTER JOIN SGroup SG

ON St.IDGroup =SG.IDGroup

Результат реализации запроса:

Пример 43

Задача.

Сформировать запрос для вывода данных об успеваемости студентов.

Решение.

Данные об успеваемости содержатся в таблице Progress, однако там информация хранится в закодированном виде. Чтобы сделать необходимые данные доступными и понятными, следует выполнить соединение этой таблицы Progress с таблицами Student, Sgroup, Subject, Report, Teacher.

SELECT

NameGroup [Группа],

S.NRecordBook [№ зачетки],

Sname [Имя студента ],

NameSubject[Дисциплина],

NameReport[Отчетность],

NTerm[Семестр],

TName[Имя преподавателя],

Mark[Оценка]

FROM Progress P INNER JOIN Student S

ON P.NRecordBook=S.NRecordBook

INNER JOIN SGroup SG

ON S.IDGroup=SG.IDGroup

INNER JOIN Subject SB

ON P.IDSubject=SB. IDSubject

INNER JOIN Report R

ON P.IDReport=R.IDReport

INNER JOIN Teacher T

ON P.Pin=T.Pin

Результат реализации запроса:

Условие соединение таблиц может быть задано также и в предложении WHERE. В этом случае, например, один из приведенных выше запросов будет иметь вид

SELECT NameGroup,NRecordBook,SName

FROM SGroup SG, Student St

WHERE SG.IDGroup=St.IDGroup

Однако предложение WHERE позволяет реализовать только один вид соединения – INNER JOIN.

Наиболее часто встречающиеся ошибки при реализации запросов на нескольких таблицах

Пример 44

После присвоения таблицам псевдонимов была попытка использовать действительные имена таблиц.

SELECT S.NRecordBook, SName ФИО

FROM Student S,Progress P

WHERE Student. NRecordBook = Progress. NRecordBook

Server: Msg 107

The column prefix 'Student' does not match with a table name or alias name used in the query.

Server: Msg 107The column prefix 'Progress' does not match with a table name or alias name used in the query.

Пример 45

SELECT NRecordBook, SName ФИО

FROM Student, Progress

WHERE Student. NRecordBook = Progress. NRecordBook

Результат реализации запроса:

Ambiguous column name 'NRecordBook'.

Будет выдано сообщение об ошибке, так как атрибут NRecordBook входит в схемы двух отношений и необходимо конкретизировать, из какого отношения выбирается предложением SELECT атрибут NRecordBook.

Пример 46

SELECT Student.NRecordBook, SName ФИО

FROM Student, Progress

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: