- •Створення запитів до декількох таблиць бази даних
- •Постановка задачи
- •Исходные данные в таблицах
- •Оператор select, объединяющий две и более таблицы
- •Select, объединяющий две и более таблицы со сложным условием:
- •Оператор select с использованием агрегатных выражений select, который использует агрегатные функции и содержит группировку (group by и having):
- •Оператор select с использованием union select с использованием объединения нескольких запросов вместе (union):
- •Select, реализующий внутреннее и внешнее (левое, правое и полное) объединение таблиц:
- •Оператор select и самосоединение select, который реализует самосоединение:
- •Оператор select и join Добавим несколько записей в таблицу, нарушая целостность базы данных:
- •Select, реализующий перекрестное объединение таблиц:
- •Оператор select и вложенные подзапросы select с использованием вложенных подзапросов:
Select, объединяющий две и более таблицы со сложным условием:
SELECT a.Nick_Name, b.Name as 'Type', 'Type description' = b.Description, FLOOR((COS(PI()*b.Id/5))*1000)/1000 as 'Just an experiment'
FROM dbo.Account a, dbo.[Type] b -- Type is a keyword, so that's why we put it in brackets
WHERE a.Account_Type = b.Id AND CONVERT(nvarchar, FLOOR((COS(PI()*b.Id/5))*1000)/1000) LIKE '%8%'; -- there is some questions
DECLARE @SearchWord varchar(30);
SET @SearchWord ='БД';
SELECT a.Full_Name, t.Name, q.Name
FROM dbo.Account a, dbo.TestCase t, dbo.Question q
WHERE (a.Id = t.Id_Creator AND t.Id = q.Id_Test AND t.Name LIKE '%'+@SearchWord+'%');
SELECT a.Full_Name, t.Name, s.Start_Time, 'Start time (Day of week)' = DATENAME(WEEKDAY, s.Start_Time), DATEDIFF(DAY, s.Start_Time, SYSDATETIME()) as 'Days ago'
FROM dbo.Account a, dbo.[Session] s, dbo.TestCase t
WHERE a.Id = s.Id_Account AND s.Id_Test = t.Id AND DATEDIFF(DAY, s.Start_Time, SYSDATETIME()) BETWEEN 10 AND 20;
Оператор select с использованием агрегатных выражений select, который использует агрегатные функции и содержит группировку (group by и having):
SELECT 'How many?' =
CASE COUNT(a.Full_Name) -- how can we use IF-ELSE or "()?():()" statement instead of this?
WHEN 1 THEN CONVERT(nvarchar, COUNT(a.Full_Name)) + ' guy'
ELSE CONVERT(nvarchar, COUNT(a.Full_Name)) + ' guys'
END,
'Account name' = t.Name + 's', t.[Description]
FROM dbo.Account a, dbo.[Type] t
WHERE a.Account_Type = t.Id
GROUP BY t.Name, t.[Description] -- question. How can we optimise that so that we don't have to put here every output expression
HAVING t.Name IN ('Teacher', 'Student'); -- how to use a number of column instead of t.Name?
SELECT TOP(1) 'Created questions' = COUNT(q.Id), a.Full_Name
FROM dbo.Account a, dbo.TestCase t, dbo.Question q
WHERE a.Id = t.Id_Creator AND t.Id = q.Id_Test
GROUP BY a.Id, a.Full_Name -- I need to goup only by a.Id but i'm forced to write a.Full_Name. I don't wanna group by Full_Name, 'cause it can be a lotta equal names. How can I avoid this?
ORDER BY 1 DESC;
SELECT MAX(q.Name) as 'The longest question', t.Name, a.Full_Name -- max means by alphabet but not by its length
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; -- the same situation as in the previous requests
Оператор select с использованием union select с использованием объединения нескольких запросов вместе (union):
SELECT t.Creation_Date, a.Full_Name, t.Name, t.Questions_Amount
FROM dbo.TestCase t, dbo.Account a
WHERE t.Id_Creator = a.Id AND t.Questions_Amount = 2
UNION
SELECT '2015-12-21 00:00:00.000', 'Some name', 'Some subject', 5
UNION
SELECT t.Creation_Date, a.Full_Name, t.Name, t.Questions_Amount
FROM dbo.TestCase t, dbo.Account a
WHERE t.Id_Creator = a.Id AND t.Questions_Amount = 1
ORDER BY t.Questions_Amount -- order by must be in the select list
