Присвоение псевдонима таблице способствует уменьшению кода и улучшает восприятия текста запроса. Псевдоним должен быть уникален в рамках одного запроса. Следует учесть и то, что после того, как был объявлен псевдоним, SQL Server 2000 перестает воспринимать действительное имя таблицы в рамках данного запроса. Один и тот же псевдоним может быть присвоен различным таблицам в запросе и подзапросе. Однако, стремясь к совершенному коду надо отдавать себе отчет насколько это целесообразно. Существует несколько способов соединения таблиц (см.Таблица 12), наиболее применяемый способ INNER JOIN, который также может быть реализован и с помощью предложения WHERE.
В предложении FROM должны быть указаны все таблицы, участвующие в запросе, даже если данные из той или иной таблицы не обозначены в предложении SELECT.
Таблица 12
№
Варианты JOIN
Назначение
INNER JOIN
Внутреннее соединение, включающее только совпадающие по условию соединения записи из соединяемых таблиц
Продолжение таблицы
OUTER JOIN(LEFT – RIGHT)
Включающее все записи левой (правой) таблицы и совпадающие с ними по условию соединения записи правой (левой) таблицы
FULL JOIN
Включение всех данных из соединяемых таблиц
CROSS JOIN
Декартово произведение
Пример 43
Задача.
Вывести списки студентов с указанием названий групп, в которых они обучаются.
Решение.
SELECT NameGroup,NRecordBook,STname
FROM SGroup SG INNER JOIN Student St
ON SG.IDGroup=St.IDGroup
Результат реализации запроса:
Пример 44
Задача.
Вывести названия групп и список студентов, которые в них зачислены. Здесь подразумевается, что имеют место группы, в которые еще не были записаны студенты.
Решение.
SELECT NameGroup,NRecordBook,STname
FROM SGroup SG LEFT OUTER JOIN Student St
ON SG.IDGroup=St.IDGroup
или
SELECT NameGroup,NRecordBook,STname
FROM Student St RIGHT OUTER JOIN SGroup SG
ON St.IDGroup =SG.IDGroup
Результат реализации запроса:
Пример 45
Задача.
Вывести данные об успеваемости студентов.
Решение.
Данные об успеваемости содержатся в таблице Progress, однако там информация хранится в закодированном виде. Чтобы сделать необходимые данные доступными и понятными, следует выполнить соединение этой таблицы Progress с таблицами Subject, Report, Student, Teacher.
Вывести номера зачёток и фамилии студентов из отношения Progress.
SELECT NRecordBook, StName ФИО
FROM Student, Progress
WHERE Student. NRecordBook = Progress. NRecordBook
Результат реализации запроса:
Ambiguous column name 'NRecordBook'.
Будет выдано сообщение об ошибке, так как атрибут NRecordBook входит в схемы двух отношений и необходимо конкретизировать, из какого отношения выбирается предложением SELECT атрибут NRecordBook.
Пример 47
Задача.
Вывести номера зачёток и фамилии студентов из отношения Progress.
SELECT Student.NRecordBook, StName ФИО
FROM Student, Progress
Будет выведено 36 строк, а сообщение об ошибке не будет выведено. Возможно, результаты будут корректны, если вы хотели выполнить декартово соединение. В противном случае вы получите таблицу содержащее количество записей, равное произведению количества записей первой таблицы на количество записей второй, потому что не было указано условие соединения таблиц.
Пример 48
Задача.
Вывести номера зачёток и фамилии студентов из отношения Progress.
SELECT S.NRecordBook, StName ФИО
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.
После присвоения таблицам псевдонимов была попытка использовать действительные имена таблиц.
В большинстве случаев мало кого интересует все содержимое таблиц. Чаще всего при запросе отбирается множество записей, удовлетворяющих тому или иному условию. Реализация оператора выбора осуществляется в SQL Server 2000 посредством применения предложения WHERE. Предложение WHERE позволяет задать критерии отбора строк из таблиц.