- •Створення запитів до декількох таблиць бази даних
- •Постановка задачи
- •Исходные данные в таблицах
- •Оператор select, объединяющий две и более таблицы
- •Select, объединяющий две и более таблицы со сложным условием:
- •Оператор select с использованием агрегатных выражений select, который использует агрегатные функции и содержит группировку (group by и having):
- •Оператор select с использованием union select с использованием объединения нескольких запросов вместе (union):
- •Select, реализующий внутреннее и внешнее (левое, правое и полное) объединение таблиц:
- •Оператор select и самосоединение select, который реализует самосоединение:
- •Оператор select и join Добавим несколько записей в таблицу, нарушая целостность базы данных:
- •Select, реализующий перекрестное объединение таблиц:
- •Оператор select и вложенные подзапросы select с использованием вложенных подзапросов:
Select, реализующий перекрестное объединение таблиц:
-- CROSS JOIN --
SELECT a.Id, a.Nick_Name, a.Full_Name, t.Name, t.[Description]
FROM dbo.Account a CROSS JOIN dbo.[Type] t;
Оператор select и вложенные подзапросы select с использованием вложенных подзапросов:
-- FIND QUESTIONS WITH THE MAXIMUM AND MINIMUM LENGTH --
SELECT TOP(1) q.Name, res.[Question length], res.Name as 'Subject', res.Full_Name as 'Creator'
FROM dbo.Question q,
(SELECT TOP (1) MAX(LEN(q.Name)) as 'Question length', t.Name, a.Full_Name, q.Id
FROM dbo.TestCase t, dbo.Question q, dbo.Account a
WHERE t.Id = q.Id_Test AND a.Id = t.Id_Creator
GROUP BY t.Id, t.Name, a.Full_Name, q.Id
ORDER BY 1 DESC) res
WHERE res.Id = q.Id
UNION ALL
SELECT TOP(1) q.Name, res.[Question length], res.Name as 'Subject', res.Full_Name as 'Creator'
FROM dbo.Question q,
(SELECT TOP (1) MIN(LEN(q.Name)) as 'Question length', t.Name, a.Full_Name, q.Id
FROM dbo.TestCase t, dbo.Question q, dbo.Account a
WHERE t.Id = q.Id_Test AND a.Id = t.Id_Creator
GROUP BY t.Id, t.Name, a.Full_Name, q.Id
ORDER BY 1 ASC) res
WHERE res.Id = q.Id
ORDER BY 3 DESC;
-- FIND A TESTCASE WITH THE LONGEST DURATION AND SHOW WHO IS AN AUTHOR OF THIS QUESTION --
SELECT TOP(1) *
FROM dbo.Account a
WHERE a.Id =
(SELECT TOP(1) t.Id_Creator
FROM dbo.TestCase t
ORDER BY t.Time_To_Answer DESC);
Выводы
В результате выполнения лабораторной работы были написаны сценарии, производящие ряд различных запросов к множествам таблиц.
Во время создания кода на T-SQL столкнулись с рядом проблем. Во-первых не была найдена тернарная операция. Часто бывает проще написать одну такую операцию, чем вставлять громоздкую конструкцию CASE. Более того, CASE не поддерживает диапазоны и сравнения, и поэтому он мало применим для чисел с плавающей запятой.
Во-вторых, возникли проблемы с GROUP BY. Вначале мы выбираем поле, по которому будем объединять, но потом приходится дописывать туда все те поля, которые мы хотим вывести результат запроса SELECT. Это неудобно учитывая тот факт, что выражения типа "dbo.MyTable.*" в GROUP BY запрещены.
В-третьих, оказалось, что обращаться по номеру колонки не так просто, как хотелось бы. Особенно это видно в конструкциях с WHERE и HAVING, где мы хотим вместо громоздкого выражения подставить номер колонки, но при функция начинает воспринимать этот номер как число.
