
- •Створення запитів до декількох таблиць бази даних
- •Постановка задачи
- •Исходные данные в таблицах
- •Оператор select, объединяющий две и более таблицы
- •Select, объединяющий две и более таблицы со сложным условием:
- •Оператор select с использованием агрегатных выражений select, который использует агрегатные функции и содержит группировку (group by и having):
- •Оператор select с использованием union select с использованием объединения нескольких запросов вместе (union):
- •Оператор select и самосоединение select, который реализует самосоединение:
- •Оператор select и join Добавим несколько записей в таблицу, нарушая целостность базы данных:
- •Select, реализующий внутреннее и внешнее (левое, правое и полное) объединение таблиц:
- •Select, реализующий перекрестное объединение таблиц:
- •Оператор select и вложенные подзапросы select с использованием вложенных подзапросов:
Оператор select и самосоединение select, который реализует самосоединение:
-- FIND PAIRS OF TESTCASES WITH EQUAL AMOUNT OF QUESTIONS --
SELECT t1.Name as 'Name of t1', t2.Name as 'Name of t2', t1.Questions_Amount
FROM dbo.TestCase t1, dbo.TestCase t2
WHERE t1.Questions_Amount = t2.Questions_Amount AND t1.Name < t2.Name
ORDER BY LEN(t1.Name) ASC, LEN(t2.Name) ASC;
-- The same but we're searching for triples (not pairs) with the same creator --
SELECT t1.Name as 'Name of t1', t2.Name as 'Name of t2', t3.Name as 'Name of t2', a.Full_Name
FROM dbo.TestCase t1, dbo.TestCase t2, dbo.TestCase t3, dbo.Account a
WHERE t1.Id_Creator = t2.Id_Creator AND t2.Id_Creator = t3.Id_Creator AND t1.Id < t2.Id AND t2.Id < t3.Id AND t1.Id_Creator = a.Id
ORDER BY LEN(t1.Name) ASC, LEN(t2.Name) ASC, LEN(t3.Name) ASC;
-- FIND PAIRS OF QUESTIONS WITH THE SAME RIGHT ANSWERS, AND SHOW WHO CREATED THEM --
SELECT q1.Name as 'Name of t1', 'Author of t1' = a1.Full_Name, q2.Name as 'Name of t2', 'Author of t2' = a2.Full_Name, q1.Right_Answers
FROM dbo.Question q1, dbo.Question q2, dbo.TestCase t1, dbo.TestCase t2, dbo.Account a1, dbo.Account a2
WHERE q1.Right_Answers = q2.Right_Answers AND q1.Id < q2.Id AND q1.Id_Test = t1.Id AND q2.Id_Test = t2.Id AND t1.Id_Creator = a1.Id AND t2.Id_Creator = a2.Id
ORDER BY LEN(q1.Name) ASC, LEN(q2.Name) ASC;
Оператор select и join Добавим несколько записей в таблицу, нарушая целостность базы данных:
-- ADD SOME ADDITIONAL DATA
ALTER TABLE dbo.Account NOCHECK CONSTRAINT all;
ALTER TABLE dbo.Question NOCHECK CONSTRAINT all;
ALTER TABLE dbo.[Session] NOCHECK CONSTRAINT all;
ALTER TABLE dbo.TestCase NOCHECK CONSTRAINT all;
ALTER TABLE dbo.[Type] NOCHECK CONSTRAINT all;
INSERT INTO [dbo].[Account]
([Nick_Name],[Full_Name],[Account_Type],[Notes])
VALUES
('eliza2','Her Majesty Elizabeth II',99,'A Queen of GB');
INSERT INTO [dbo].[Type]
([Name],[Description],[Rights])
VALUES
('CoolGuy','The coolest guy on the district ever',77);
ALTER TABLE dbo.Account CHECK CONSTRAINT all;
ALTER TABLE dbo.Question CHECK CONSTRAINT all;
ALTER TABLE dbo.[Session] CHECK CONSTRAINT all;
ALTER TABLE dbo.TestCase CHECK CONSTRAINT all;
ALTER TABLE dbo.[Type] CHECK CONSTRAINT all;
SELECT * FROM dbo.Account;
SELECT * FROM dbo.[Type];
Select, реализующий внутреннее и внешнее (левое, правое и полное) объединение таблиц:
-- INNER JOIN --
SELECT a.Id, a.Nick_Name, a.Full_Name, t.Name, t.[Description]
FROM dbo.Account a JOIN dbo.[Type] t ON a.Account_Type = t.Id;
-- LEFT OUTER JOIN --
SELECT a.Id, a.Nick_Name, a.Full_Name, t.Name, t.[Description]
FROM dbo.Account a LEFT JOIN dbo.[Type] t ON a.Account_Type = t.Id;
-- RIGHT OUTER JOIN --
SELECT a.Id, a.Nick_Name, a.Full_Name, t.Name, t.[Description]
FROM dbo.Account a RIGHT JOIN dbo.[Type] t ON a.Account_Type = t.Id;
-- FULL OUTER JOIN --
SELECT a.Id, a.Nick_Name, a.Full_Name, t.Name, t.[Description]
FROM dbo.Account a FULL JOIN dbo.[Type] t ON a.Account_Type = t.Id;