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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

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

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

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

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

Типы объединения приведены ниже в таблице.

Присвоение псевдонима таблице способствует уменьшению кода и улучшает восприятия текста запроса. Псевдоним должен быть уникален в рамках одного запроса. Следует учесть и то, что после того, как был объявлен псевдоним, 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.

select StName ФИО, Student.NRecordBook [№ зачётки],

NameReport[Вид отчётности],NameSubject [Название предмета],

TeacherName [Преподаватель], Mark Оценка

from Progress join Student

ON Student.NRecordBook=Progress.NRecordBook

join Report

ON Progress.IDReport=Report.IDReport

join Subject

ON Progress.IDSubject =Subject.IDSubject

join teacher

ON Progress.PIN=teacher.PIN

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

Пример 46

Задача.

Вывести номера зачёток и фамилии студентов из отношения 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 позволяет задать критерии отбора строк из таблиц.



Поделиться:


Последнее изменение этой страницы: 2016-07-16; просмотров: 214; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.225.31.159 (0.011 с.)