Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Sabelnikov_lab3_2_4_DataBases.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

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;

  1. Оператор 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

  1. Оператор 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]