- •Введение
- •Лабораторное занятие № 1
- •Описание учебного примера.
- •Удаление таблиц
- •Создание таблиц
- •Имена ограничений
- •Ограничения null и not null
- •Ограничение primary key
- •IdSubject, idReport, nTerm));
- •Ограничение unique
- •Ограничение Foreign key
- •Ограничение check
- •Вопросы для самоконтроля к лабораторной работе № 1
- •Лабораторная работа № 2
- •Команда вставки - insert
- •Команда обновления - update
- •Команда удаления - delete
- •Вопросы для самоконтроля к лабораторной работе № 2
- •Лабораторная работа №3
- •Команда alter table
- •Модификация ограничений
- •Добавление ограничений с ограниченной областью проверки
- •Отключение и подключение ограничений
- •Правила для изменения и модификации описания столбцов
- •Добавление столбца
- •Модификация столбца
- •Удаление столбца
- •Удаление таблицы
- •Переименование таблицы
- •Вопросы для самоконтроля к лабораторной работе № 3
- •Лабораторная работа № 4
- •Выборка данных из нескольких таблиц
- •Определение условий выборки в предложении where.
- •Групповые функции и предложение group by
- •Наиболее часто встречающиеся ошибки при выполнении group by
- •Предложение order by
- •Вопросы для самоконтроля к лабораторной работе № 4
- •Лабораторная работа № 5
- •Подзапросы
- •Inner join Student s
- •Inner join Student s
- •Inner join
- •Inner join Student s
- •Вопросы для самоконтроля к лабораторной работе № 5
- •Лабораторная работа №6
- •Представления
- •Вопросы для самоконтроля к лабораторной работе № 6
- •Лабораторная работа №7
- •Хранимые процедуры
- •Оператор use
- •Оператор declare
- •Операторы set и select
- •Функция @@identity
- •Функция @@error
- •Объявление параметров
- •Изменение хранимых процедур
- •Удаление хранимой процедуры
- •Лабораторная работа №8
- •If exists
- •Вопросы для самоконтроля к лабораторной работе № 8
- •Задания в тестовой форме
- •Литература Оглавление
Выборка данных из нескольких таблиц
Большая часть запросов обращается не к одной, а нескольким таблицам, перечень которых и условия их соединения указываются в предложении FROM.
Синтаксис предложения FROM:
FROM <первая таблица> [[AS] <псевдоним>]
<тип объединения> <вторая таблица>[[AS] <псевдоним>]
[ON <условие объединения>]
Типы объединения приведены ниже в таблице.
Присвоение псевдонима таблице способствует уменьшению кода и улучшает восприятия текста запроса. Псевдоним должен быть уникален в рамках одного запроса. Следует учесть и то, что после того, как был объявлен псевдоним, SQL Server 2000 перестает воспринимать действительное имя таблицы в рамках данного запроса. Один и тот же псевдоним может быть присвоен различным таблицам в запросе и подзапросе. Однако, стремясь к совершенному коду надо отдавать себе отчет насколько это целесообразно. Существует несколько способов соединения таблиц (см.Таблица 12), наиболее применяемый способ INNER JOIN, который также может быть реализован и с помощью предложения WHERE.
В предложении FROM должны быть указаны все таблицы, участвующие в запросе, даже если данные из той или иной таблицы не обозначены в предложении SELECT.
Таблица 12
№ |
Варианты JOIN |
Назначение |
1 |
2 |
3 |
1 |
INNER JOIN |
Внутреннее соединение, включающее только совпадающие по условию соединения записи из соединяемых таблиц |
Продолжение таблицы
1 |
2 |
3 |
2 |
OUTER JOIN(LEFT – RIGHT) |
Включающее все записи левой (правой) таблицы и совпадающие с ними по условию соединения записи правой (левой) таблицы |
3 |
FULL JOIN |
Включение всех данных из соединяемых таблиц |
4 |
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 позволяет задать критерии отбора строк из таблиц.