Загрузка данных
-- 1. Создание таблицы «Ученики»
CREATE TABLE Ученики
(
ID INT PRIMARY KEY IDENTITY(1,1),
Фамилия VARCHAR(50) NOT NULL,
Предмет VARCHAR(50) NOT NULL,
Школа VARCHAR(50) NOT NULL,
Баллы FLOAT CHECK ((Баллы >= 0) AND (Баллы <= 100)) NULL
);
-- 2. Заполнение таблицы начальными данными
INSERT INTO Ученики (Фамилия, Предмет, Школа, Баллы)
VALUES
('Иванова', 'Математика', 'Лицей', 98.5),
('Петров', 'Физика', 'Лицей', 99),
('Сидоров', 'Математика', 'Лицей', 88),
('Полухина', 'Физика', 'Гимназия', 78),
('Матвеева', 'Химия', 'Лицей', 92),
('Касимов', 'Химия', 'Гимназия', 68),
('Нурулин', 'Математика', 'Гимназия', 81),
('Авдеев', 'Физика', 'Лицей', 87),
('Никитина', 'Химия', 'Лицей', 94),
('Барышева', 'Химия', 'Лицей', 88);
--10.1 В таблицу «Ученики» внести новую запись для ученика школы № 18 Трошкова, оценка которого по химии неизвестна[span_0](start_span)[span_0](end_span).
INSERT INTO Ученики
(Фамилия, Предмет, Школа, Баллы)
VALUES
('Трошков', 'Химия', 'Школа №18', NULL);
--10.2 В таблицу «Ученики» внести три строки[span_1](start_span)[span_1](end_span).
INSERT INTO Ученики
(Фамилия, Предмет, Школа, Баллы)
VALUES
('Иванов', 'Математика', 'Лицей', 85),
('Смирнов', 'Физика', 'Гимназия', 90),
('Кузнецов', 'Химия', 'Школа №18', 75);
--10.3 В таблице «Ученики» изменить данные Трошкова, школу исправить на № 21, предмет на математику, а оценку на 56[span_2](start_span)[span_2](end_span).
UPDATE Ученики
SET
Школа = 'Школа №21',
Предмет = 'Математика',
Баллы = 56
WHERE Фамилия = 'Трошков';
--10.4 В таблице «Ученики» изменить данные всех учеников по химии, оценку увеличить на 10%, если она ниже 60 баллов[span_3](start_span)[span_3](end_span).
UPDATE Ученики
SET Баллы = Баллы * 1.1
WHERE Предмет = 'Химия' AND Баллы < 60;
--10.5 В таблице «Ученики» удалить данные всех учеников из школы №21[span_4](start_span)[span_4](end_span).
DELETE FROM Ученики
WHERE Школа = 'Школа №21';
--10.6 Создать таблицу «Гимназисты» и скопировать туда данные всех гимназистов, кроме тех, которые набрали меньше 60 баллов[span_5](start_span)[span_5](end_span).
SELECT
ID,
Фамилия,
Предмет,
Школа,
Баллы
INTO Гимназисты
FROM Ученики
WHERE Школа = 'Гимназия' AND Баллы >= 60;
--10.7 Очистить таблицу «Гимназисты»[span_6](start_span)[span_6](end_span).
TRUNCATE TABLE Гимназисты;
--11.1 Даны числа А и В. Найти и вывести их произведение.
DECLARE @a INT = 5, @b INT = 4, @c INT;
SET @c = @a * @b;
PRINT @c;
--11.2 В таблице «Ученики» найти разницу между средними баллами лицеистов и гимназистов.
DECLARE @licey FLOAT, @gimn FLOAT, @diff FLOAT;
SET @licey = (SELECT AVG(Баллы) FROM Ученики WHERE Школа = 'Лицей');
SET @gimn = (SELECT AVG(Баллы) FROM Ученики WHERE Школа = 'Гимназия');
SET @diff = ABS(@licey - @gimn);
PRINT @diff;
--11.3 В таблице «Ученики» проверить на четность количество строк.
DECLARE @count INT;
SET @count = (SELECT COUNT(*) FROM Ученики);
IF @count % 2 = 0
PRINT 'Количество строк четное';
ELSE
PRINT 'Количество строк нечетное';
--11.4 Дано четырехзначное число. Вывести сумму его цифр.
DECLARE @num INT = 4852, @sum INT = 0;
SET @sum = (@num / 1000) + (@num / 100 % 10) + (@num / 10 % 10) + (@num % 10);
PRINT @sum;
--11.5 Даны случайные целые числа a, b и c. Найти наименьшее из них.
DECLARE @a INT = 15, @b = 7, @c = 22, @min INT;
SET @min = @a;
IF @b < @min SET @min = @b;
IF @c < @min SET @min = @c;
PRINT @min;
--11.6 Дано случайное целое число a. Проверить, делится ли данное число на 11.
DECLARE @a INT = 33;
IF @a % 11 = 0
PRINT CAST(@a AS VARCHAR(5)) + ' делится на 11';
ELSE
PRINT CAST(@a AS VARCHAR(5)) + ' не делится на 11';
--11.7 Дано случайное целое число N (N < 1000). Если оно является степенью числа 3, то вывести «Да», если не является вывести «Нет».
DECLARE @n INT = 27;
WHILE @n > 1 AND @n % 3 = 0
SET @n = @n / 3;
IF @n = 1
PRINT 'Да';
ELSE
PRINT 'Нет';
--11.8 Даны случайные целые числа a и b. Найти наименьший общий кратный (НОК).
DECLARE @a INT = 12, @b = 18, @p INT, @nod INT;
SET @p = @a * @b;
WHILE @b != 0
BEGIN
DECLARE @temp INT = @b;
SET @b = @a % @b;
SET @a = @temp;
END
SET @nod = @a;
PRINT 'НОК = ' + CAST(@p / @nod AS VARCHAR(10));
--11.9 Даны два целых числа А и В (A < B). Найти сумму квадратов всех целых чисел от А до В включительно.
DECLARE @a INT = 2, @b = 4, @s INT = 0;
WHILE @a <= @b
BEGIN
SET @s = @s + SQUARE(@a);
SET @a = @a + 1;
END
PRINT 'Сумма квадратов = ' + CAST(@s AS VARCHAR(10));
--11.10 Найти первое натуральное число, которое при делении на 2, 3, 4, 5, и 6 дает остаток 1, но делится на 7.
DECLARE @x INT = 1;
WHILE 1 = 1
BEGIN
IF @x % 2 = 1 AND @x % 3 = 1 AND @x % 4 = 1 AND @x % 5 = 1 AND @x % 6 = 1 AND @x % 7 = 0
BEGIN
PRINT @x;
BREAK;
END
SET @x = @x + 1;
END
--11.11 Вывести свою фамилию на экран столько раз, сколько в ней букв.
DECLARE @fam VARCHAR(20) = 'Сергеев', @len INT, @i INT = 1;
SET @len = LEN(@fam);
WHILE @i <= @len
BEGIN
PRINT @fam;
SET @i = @i + 1;
END
--11.12 Напишите код для вывода на экран с помощью цикла (по аналогии с примером 15).
DECLARE @L INT, @M INT, @N CHAR(13);
SET @N = 'Нижневартовск';
SET @L = LEN(@N);
SET @M = @L;
WHILE @L > 0
BEGIN
PRINT LEFT(REVERSE(@N), @L) + SPACE(2 * (@M - @L)) + RIGHT(@N, @L);
SET @L = @L - 1;
END
--12.1 Напишите функцию для вывода названия страны с заданной столицей, и вызовите ее.
CREATE FUNCTION GetCountryByCapital
(
@Capital AS VARCHAR(50)
)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Country AS VARCHAR(50);
SELECT @Country = Название
FROM Countries
WHERE Столица = @Capital;
RETURN @Country;
END;
GO
SELECT dbo.GetCountryByCapital('Вена') AS Страна;
--12.2 Напишите функцию для перевода населения в млн. чел. и вызовите ее.
CREATE FUNCTION ConvertPopulationToMillions
(
@Population AS INT
)
RETURNS FLOAT
AS
BEGIN
RETURN ROUND(CAST(@Population AS FLOAT) / 1000000.0, 2);
END;
GO
SELECT
Название,
Столица,
dbo.ConvertPopulationToMillions(Население) AS [Население (млн чел)]
FROM Countries;
--12.3 Напишите функцию для вычисления плотности населения заданной части света и вызовите ее.
CREATE FUNCTION GetContinentDensity
(
@Continent AS VARCHAR(50)
)
RETURNS FLOAT
AS
BEGIN
DECLARE @Density AS FLOAT;
SELECT @Density = ROUND(SUM(CAST(Население AS FLOAT)) / SUM(Площадь), 2)
FROM Countries
WHERE Континент = @Continent;
RETURN @Density;
END;
GO
SELECT dbo.GetContinentDensity('Европа') AS [Плотность Европы];
--12.4 Напишите функцию для поиска страны, третьей по населению и вызовите ее.
CREATE FUNCTION GetThirdLargestPopulationCountry()
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Country AS VARCHAR(50);
SET @Country = (
SELECT TOP 1 Название
FROM (
SELECT TOP 3 Название
FROM Countries
ORDER BY Население DESC
) AS T
ORDER BY Население ASC
);
RETURN @Country;
END;
GO
SELECT dbo.GetThirdLargestPopulationCountry() AS [Третья страна по населению];
--12.5 Напишите функцию для поиска страны с максимальным населением в заданной части света и вызовите ее. Если часть света не указана, выбрать Азию.
CREATE FUNCTION GetMaxPopulationCountry
(
@Continent AS VARCHAR(50) = 'Азия'
)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Country AS VARCHAR(50);
SELECT TOP 1 @Country = Название
FROM Countries
WHERE Континент = @Continent
ORDER BY Население DESC;
RETURN @Country;
END;
GO
SELECT dbo.GetMaxPopulationCountry('Европа') AS [Самая населенная в Европе];
SELECT dbo.GetMaxPopulationCountry(DEFAULT) AS [Самая населенная в Азии (по умолчанию)];
--12.6 Напишите функцию для замены букв в заданном слове от третьей до предпоследней на "тест" и примените ее для столицы страны.
CREATE FUNCTION ReplaceMiddleWithTest
(
@Word AS VARCHAR(50)
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @Result AS VARCHAR(100);
IF LEN(@Word) <= 3
SET @Result = @Word;
ELSE
SET @Result = LEFT(@Word, 2) + 'тест' + RIGHT(@Word, 1);
RETURN @Result;
END;
GO
SELECT
Название,
Столица,
dbo.ReplaceMiddleWithTest(Столица) AS [Измененная столица]
FROM Countries;
--12.7 Напишите функцию, которая возвращает количество стран, не содержащих в названии заданную букву.
CREATE FUNCTION GetCountriesCountWithoutLetter
(
@Letter AS CHAR(1)
)
RETURNS INT
AS
BEGIN
DECLARE @Count AS INT;
SELECT @Count = COUNT(*)
FROM Countries
WHERE CHARINDEX(@Letter, Название) = 0;
RETURN @Count;
END;
GO
SELECT dbo.GetCountriesCountWithoutLetter('а') AS [Количество стран];
--12.8 Напишите функцию для возврата списка стран с площадью меньше заданного числа и вызовите ее.
CREATE FUNCTION GetCountriesByMaxArea
(
@MaxArea AS FLOAT
)
RETURNS TABLE
AS
RETURN (
SELECT Название, Столица, Площадь, Население, Континент
FROM Countries
WHERE Площадь < @MaxArea
);
GO
SELECT * FROM dbo.GetCountriesByMaxArea(100000);
--12.9 Напишите функцию для возврата списка стран с населением в интервале заданных значений и вызовите ее.
CREATE FUNCTION GetCountriesByPopulationRange
(
@MinPop AS INT,
@MaxPop AS INT
)
RETURNS TABLE
AS
RETURN (
SELECT Название, Столица, Площадь, Население, Континент
FROM Countries
WHERE Население BETWEEN @MinPop AND @MaxPop
);
GO
SELECT * FROM dbo.GetCountriesByPopulationRange(10000000, 50000000);
--12.10 Напишите функцию для возврата таблицы с названием континента и суммарным населением и вызовите ее.
CREATE FUNCTION GetContinentPopulationTable()
RETURNS TABLE
AS
RETURN (
SELECT Континент, SUM(Население) AS [Суммарное население]
FROM Countries
GROUP BY Континент
);
GO
SELECT * FROM dbo.GetContinentPopulationTable();
--12.11 Напишите функцию IsPalindrom(P) целого типа, возвращающую 1, если целый параметр P (P > 0) является палиндромом, и 0 в противном случае.
CREATE FUNCTION IsPalindrom
(
@P AS INT
)
RETURNS INT
AS
BEGIN
DECLARE @Str AS VARCHAR(50) = CAST(@P AS VARCHAR(50));
IF @Str = REVERSE(@Str)
RETURN 1;
RETURN 0;
END;
GO
SELECT dbo.IsPalindrom(12321) AS [Палиндром];
--12.12 Напишите функцию Quarter(x, y) целого типа, определяющую номер координатной четверти, содержащей точку с ненулевыми вещественными координатами (х, у).
CREATE FUNCTION Quarter
(
@x AS FLOAT,
@y AS FLOAT
)
RETURNS INT
AS
BEGIN
IF @x > 0 AND @y > 0 RETURN 1;
IF @x < 0 AND @y > 0 RETURN 2;
IF @x < 0 AND @y < 0 RETURN 3;
IF @x > 0 AND @y < 0 RETURN 4;
RETURN 0;
END;
GO
SELECT dbo.Quarter(-3.5, 4.2) AS [Четверть];
--12.13 Напишите функцию IsPrime(N) целого типа, возвращающую 1, если целый параметр N (N > 1) является простым числом, и 0 в противном случае.
CREATE FUNCTION IsPrime
(
@N AS INT
)
RETURNS INT
AS
BEGIN
IF @N <= 1 RETURN 0;
DECLARE @i AS INT = 2;
WHILE @i * @i <= @N
BEGIN
IF @N % @i = 0 RETURN 0;
SET @i = @i + 1;
END
RETURN 1;
END;
GO
SELECT dbo.IsPrime(17) AS [Простое число];
--12.14 Напишите код для удаления созданных вами функций.
DROP FUNCTION IF EXISTS GetCountryByCapital;
DROP FUNCTION IF EXISTS ConvertPopulationToMillions;
DROP FUNCTION IF EXISTS GetContinentDensity;
DROP FUNCTION IF EXISTS GetThirdLargestPopulationCountry;
DROP FUNCTION IF EXISTS GetMaxPopulationCountry;
DROP FUNCTION IF EXISTS ReplaceMiddleWithTest;
DROP FUNCTION IF EXISTS GetCountriesCountWithoutLetter;
DROP FUNCTION IF EXISTS GetCountriesByMaxArea;
DROP FUNCTION IF EXISTS GetCountriesByPopulationRange;
DROP FUNCTION IF EXISTS GetContinentPopulationTable;
DROP FUNCTION IF EXISTS IsPalindrom;
DROP FUNCTION IF EXISTS Quarter;
DROP FUNCTION IF EXISTS IsPrime;
GO