
Лабораторна робота № 4
Ціль заняття: вивчити команди формування запитів до бази даних (SELECT)
Результат заняття: результати виконання завдань, що приведені вкінці тексту. Сформування команди виборки даних у відповідності з варіантом завдання.
Теоретичні відомості.
Команда SELECT дозволяє реалізувати всі оператори реляційної алгебри над відношеннями (таблицями) бази даних. Обов’язковими виразами команди SELECT є вирази SELECT та FROM. В найпростішій формі, команда SELECT використовується для того, щоб добути інформацію з таблиці. Не обов’язково використовувати всі функції команди, але обов’язково зберігати їх порядок слідування, тобто функція ORDER BY завжди завершує команду SELECT, а функція HAVING завжди стоїть після GROUP BY, яке в свою чергу не може бути раніше ніж функція WHERE і т.д.
Синтаксис команди SELECT:
SELECT [DISTINCT] *|<стовпець> [<псевдонім>] [,<групова функція>] [,…n]
FROM <таблиця>[, …n]| (<підзапит>)
[WHERE <умова>]
[GROUP BY<вираз групування]
[HAVING <умова відбору групи>]
[ORDER BY < стовпець >[,…n]]
Щоб вивести вміст всіх стовпців, можна замінити їх перлік знаком *. В цьому випадку стовпці будуть виведені в тому порядку, в якому вони ідуть в таблиці. Якщо ви хочете змінити порядок, то доведеться перераховувати імена стовпців у потрібному порядку.
Функція FROM використовується для вказання переліку таблиць, що використовуються в запиті та умови їх з’єднання.
Приклад 1
Задача.
Вивести всі записи з відношення Progress.
Рішення.
1 варіант:
SELECT * FROM Progress;
2 варіант:
SELECT IDReport, IDSubject, NRecordBook, NTerm, PIN, Mark
FROM Progress;
Приклад 2
Задача.
Вивести назви предметів з таблиці Subject.
Рішення.
SELECT NameSubject
FROM Subject ;
Приклад 3
Задача.
Вивести список студентів з таблиці Student, присвоївши стовпцю виводу ім’я ПІП.
Рішення.
SELECT StName ФИО
FROM Student;
Окремо слід зупинитися на функції DISTINCT, яка дозволяє вивести унікальне значення на множині атрибутів, що задані у функції SELECT.
Приклад 4
Задача.
Вивести значення оцінок, які коли-небудь ставилися студентам.
Рішення.
SELECT Mark Оценка
FROM Progress;
Результатом цього запиту буде множина значень оцінок, що повторюються, в той час як нас цікавить тільки їх наявність у вихідній множині, тому доцільно цей запит виконати наступним чином:
SELECT DISTINCT Mark Оцінка
FROM Progress;
Виборка даних з декількох таблиць
Більшість запитів звертається не до однієї, а до декількох таблиць, перелік яких та умови їх з’єднання вказуються у функції FROM.
Синтаксис функції FROM:
FROM <перша таблиця> [[AS] <псевдонім>]
<тип об’єднання> <друга таблиця>[[AS] <псевдонім>]
[ON <умова об’єднання>]
Типи об’єднань наведені нижче в таблиці.
Присвоєння псевдоніма таблиці призводить до зменшення коду та покращує сприйняття тексту запита. Псевдонім повинен бути унікальним в рамках одного запита. Слід враховувати й те, що після того, як був оголошений псевдонім, SQL Server перестає сприймати дійсне ім’я таблиці в рамках даного запиту. Один і той же псевдонім може бути присвоєний різним таблицям в запиті і підзапиті. Однак, прагнучи до оптимального коду потрібно віддавати собі звіт наскільки це доцільно. Існує декілька способів з’єднання таблиць (див. Таблиця 1),найбільш вживаний спосіб INNER JOIN, який також може бути реалізований і з допомогою функції WHERE.
У функції FROM повинні бути вказані всі таблиці, що приймають участь у запиті, навіть якщо дані з тієї чи іншої таблиці не позначені у функції SELECT.
Таблиця 1
№ |
Варіанти JOIN |
Призначення |
1 |
2 |
3 |
1 |
INNER JOIN |
Внутрішнє з’єднання, що включає тільки співпадаючі по умові з’єднання записи з таблиць, що з’єднуються |
2 |
OUTER JOIN(LEFT – RIGHT) |
Включає всі записи лівої (правої) таблиці і співпадаючі ї ними по умові з’єднання записи правої (лівої) таблиці |
3 |
FULL JOIN |
Включення всіх даних із з’єднувальних таблиць |
4 |
CROSS JOIN |
Декартове множення |
Приклад 5
Задача.
Вивести списки студентів та назви груп, в яких вони навчаються.
Рішення.
SELECT NameGroup,NRecordBook,STname
FROM SGroup SG INNER JOIN Student St
ON SG.IDGroup=St.IDGroup
Приклад 6
Задача.
Вивести назви груп та список студентів, які в них зараховані. Тут розуміється, що мають місце групи, в які ще не були записані студенти.
Рішення.
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
Приклад 7
Задача.
Вивести дані про успішність студентів.
Рішення.
Дані про успішність містяться в таблиці 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
Приклад 8
Задача.
Вивести номера залікової книжки та прізвища студентів з відношення Progress.
SELECT NRecordBook, StName ФИО
FROM Student, Progress
WHERE Student. NRecordBook = Progress. NRecordBook
Результат реалізації запита:
Ambiguous column name 'NRecordBook'.
Буде видано повідомлення про помилку, так як атрибут NRecordBook входить в схеми двох відношень і необхідно конкретизувати, із якого відношення вибирається функцією SELECT атрибут NRecordBook.
Приклад 8
Задача.
Вивести номера залікової книжки та прізвища студентів з відношення Progress.
SELECT Student.NRecordBook, StName ФИО
FROM Student, Progress
Можливо, результати будуть коректні, якщо ви хотіли виконати декартове з’єднання. В іншому випадку ви отримаєте таблицю що містить кількість записів, що рівне добутку кількості записів першої таблиці на кількість записів другої, тому що не була вказана умова з’єднання таблиць.
Приклад 9
Задача.
Вивести номера залікової книжки та прізвища студентів з відношення 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 за допомогою використання функції WHERE. Функція WHERE дозволяє задати критерій відбору рядків з таблиць.