· 7 years ago · Dec 27, 2018, 12:48 PM
1/*
2USE - команда, Ð·Ð°Ð´Ð°ÑŽÑ‰Ð°Ñ Ð±Ð°Ð·Ñƒ данных, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ далее будет идти работа.
3GO - управлÑÑŽÑ‰Ð°Ñ ÐºÐ¾Ð½ÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° к Ñледующему блоку команд.
4*/
5USE master
6GO
7
8/*
9|> Создание и переÑоздание базы Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑоÑтава команд в игровых видах Ñпорта.
10|> База ÑоÑтоит из 2-Ñ… файловых групп: первичной и пользовательÑкой.
11|> В каждой из которых по одному файлу.
12
13IF - управлÑÑŽÑ‰Ð°Ñ ÐºÐ¾Ð½ÑтрукциÑ, позволÑÑŽÑ‰Ð°Ñ Ð¸Ñпользовать ветвление.
14EXISTS - предикат, принимающий значение TRUE, еÑли Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñодержит любое количеÑтво Ñтрок,
15иначе он принимает значение FALSE.
16SELECT - команда, Ð²Ñ‹Ð±Ð¸Ñ€Ð°ÑŽÑ‰Ð°Ñ Ð´Ð°Ð½Ð½Ñ‹Ðµ из таблицы, заданной в параметре FROM,
17по уÑловию, определённому в параметре WHERE.
18DROP - команда, удалÑÑŽÑ‰Ð°Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¹ объект. Ðапример, она позволÑет удалÑть базы.
19*/
20-- удалÑем базу, еÑли уже ÑущеÑтвует
21IF EXISTS (SELECT * FROM [sys].[databases] WHERE [name] = 'commands')
22BEGIN
23 ALTER DATABASE [commands] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
24 DROP DATABASE [commands]
25END
26GO
27
28/*
29CREATE - команда, ÑÐ¾Ð·Ð´Ð°ÑŽÑ‰Ð°Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ñ‹.
30Ð’ данном коде она иÑпользуетÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных и таблиц.
31С помощью параметра ON указываетÑÑ Ð¿ÑƒÑ‚ÑŒ Ð´Ð»Ñ Ñ€Ð°ÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² Ñоздаваемой базы.
32ОпиÑание первичной файловой группы Ñледует за ключевым Ñловом ON и не обÑзательным PRIMARY.
33Затем Ñледует опиÑание второй файловой группы, которое начинаетÑÑ Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð¾Ð³Ð¾ Ñлова FILEGROUP.
34LOG ON указывает путь Ð´Ð»Ñ Ñ€Ð°ÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð°.
35*/
36-- Ñоздаём базу
37-- C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\
38-- /mnt/xfs/mssql/commands/
39CREATE DATABASE [commands]
40ON PRIMARY (
41 NAME = COMMANDS_P,
42 FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\commands_primary.mdf',
43 SIZE = 5 MB,
44 FILEGROWTH = 10%
45),
46FILEGROUP SECOND (
47 NAME = COMMANDS_S,
48 FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\commands_second.ndf',
49 SIZE = 10 MB,
50 FILEGROWTH = 10%
51)
52LOG ON (
53 NAME = COMMANDS_LOG,
54 FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\commands_log.ldf',
55 SIZE = 5 MB,
56 MAXSIZE = 50 MB,
57 FILEGROWTH = 5 MB
58)
59GO
60
61/*
62ALTER - команда, позволÑÑŽÑ‰Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½Ñть ÑвойÑтва уже Ñозданных объектов.
63Сочетание ключевого Ñлова SET Ñ MULTI_USER позволÑет объÑвить БД многопользовательÑкой.
64*/
65ALTER DATABASE [commands] SET MULTI_USER
66GO
67
68/*
69|> Создание таблиц в базе данных, Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, игроков и ÑвÑзи игрок <---> команда.
70|> Таблица Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ хранитÑÑ Ð² первичной файловой группе.
71|> Две другие хранÑÑ‚ÑÑ Ð² пользовательÑкой файловой группе.
72*/
73
74USE [commands]
75/*
76Ð’ Ñкобках поÑле команды CREATE опиÑываетÑÑ Ñтруктура Ñоздавае2мой таблицы.
77С помощью ключевого Ñлова CONSTRAINT задаютÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñ‹Ðµ ограничениÑ.
78Ограничение PRIMARY KEY задаёт первичный ключ.
79Ключевое Ñлово CLUSTERED указывает на то, что данные на диÑке должны хранитьÑÑ Ð² порÑдке,
80определённом данным ключом.
81Ð’ Ñкобках указываютÑÑ Ñтолбцы, по которым ÑтроитÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¹ индекÑ.
82Ключевое Ñлово ON задаёт файловую группу, в которой будет хранитьÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°.
83*/
84-- Ñоздание таблицы Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´
85CREATE TABLE [teams] (
86 [code] int NOT NULL,
87 [name] [NVARCHAR](100) NOT NULL,
88 [city] [NVARCHAR](50) NOT NULL,
89 [trainer] [NVARCHAR](200) NOT NULL,
90 [league] [NVARCHAR](100) NOT NULL,
91 [status] BIT DEFAULT 1 NOT NULL,
92 [create_year] SMALLINT NOT NULL,
93 CONSTRAINT PK_TEAMS PRIMARY KEY CLUSTERED ([name], [city])
94) ON [PRIMARY]
95-- Ñоздание таблицы Ð´Ð»Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ¾Ð²
96CREATE TABLE [players] (
97 [full_name] [NVARCHAR](200) NOT NULL,
98 [birthday] DATETIME NOT NULL,
99 [role] [NVARCHAR](50) NOT NULL,
100 [goals] INT DEFAULT 0 NOT NULL,
101 CONSTRAINT PK_PLAYERS PRIMARY KEY CLUSTERED ([full_name], [birthday])
102) ON [SECOND]
103GO
104/*
105Ограничение FOREIGN KEY задаёт внешний ключ, Ñоздаёт ÑвÑзь Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ таблицами.
106Ключевое Ñлово REFERENCES задаёт таблицу и полÑ,
107Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ необходимо ÑвÑзать Ð¿Ð¾Ð»Ñ Ñоздаваемой таблицы.
108Ключевое Ñлово ON в данном Ñлучае задаёт поведение при удалении и при обновлении полей
109в указанных таблицах.
110*/
111-- Ñоздание таблицы Ð´Ð»Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ¾Ð²
112CREATE TABLE [team_players] (
113 [team_name] [NVARCHAR](100) NOT NULL,
114 [team_city] [NVARCHAR](50) NOT NULL,
115 [player_name] [NVARCHAR](200) NOT NULL,
116 [player_birthday] DATETIME NOT NULL,
117 [entry_date] SMALLINT NOT NULL,
118 [leave_date] SMALLINT NULL,
119 [number] INT NOT NULL,
120 CONSTRAINT FK_TEAMS FOREIGN KEY ([team_name], [team_city])
121 REFERENCES [teams] ([name], [city])
122 ON DELETE CASCADE
123 ON UPDATE CASCADE,
124 CONSTRAINT FK_PLAYERS FOREIGN KEY ([player_name], [player_birthday])
125 REFERENCES [players] ([full_name], [birthday])
126 ON DELETE CASCADE
127 ON UPDATE CASCADE
128) ON [SECOND]
129GO
130
131/*
132|> Добавление в базу теÑтовых данных, ÑоответÑтвующих ограничениÑм БД.
133
134Команда INSERT позволÑет добавить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² таблицу.
135За необÑзательным ключевым Ñловом INTO Ñледует название таблицы и
136необÑзательный ÑпиÑок Ñтолбцов. ЕÑли ÑпиÑок Ñтолбцов не указан,
137то далее будут ожидатьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех Ñтолбцов в таблице.
138Ключевое Ñлово VALUES определÑет добавлÑемые значениÑ.
139DEFAULT указывает на то, что необходимо иÑпользовать значение по умолчанию.
140*/
141-- добавление команд
142INSERT INTO [teams] ([code], [name], [city], [trainer], [league], [create_year])
143VALUES (1, 'ÐÑ€Ñенал', 'Лондон', 'ÐÑ€Ñен Венгер', 'ÐнглийÑÐºÐ°Ñ ÐŸÑ€ÐµÐ¼ÑŒÐµÑ€-лига', 1886),
144 (2, 'ЧелÑи', 'Лондон', 'Ðнтонио Конте', 'ÐнглийÑÐºÐ°Ñ ÐŸÑ€ÐµÐ¼ÑŒÐµÑ€-лига', 1905),
145 (3, 'Зенит', 'Санкт-Петербург', 'Роберто Манчини ', 'РоÑÑийÑÐºÐ°Ñ Ñ„ÑƒÑ‚Ð±Ð¾Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€ÐµÐ¼ÑŒÐµÑ€-лига', 1925),
146 (4, 'Спартак', 'МоÑква', 'МаÑÑимо Каррера', 'РоÑÑийÑÐºÐ°Ñ Ñ„ÑƒÑ‚Ð±Ð¾Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€ÐµÐ¼ÑŒÐµÑ€-лига', 1922),
147 (5, 'Урал', 'Екатеринбург', 'ÐлекÑандр Фёдорович Тарханов', 'РоÑÑийÑÐºÐ°Ñ Ñ„ÑƒÑ‚Ð±Ð¾Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€ÐµÐ¼ÑŒÐµÑ€-лига', 1930),
148 (6, 'МанчеÑтер Сити', 'МанчеÑтер', 'ХоÑеп Гвардиола', 'ÐнглийÑÐºÐ°Ñ ÐŸÑ€ÐµÐ¼ÑŒÐµÑ€-лига', 1880),
149 (7, 'ЦСКÐ', 'МоÑква', 'Виктор Гончаренко', 'РоÑÑийÑÐºÐ°Ñ Ñ„ÑƒÑ‚Ð±Ð¾Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€ÐµÐ¼ÑŒÐµÑ€-лига', 1911)
150-- добавление игроков
151INSERT INTO [players] ([full_name], [birthday], [role], [goals])
152VALUES ('Георгий Тамазович ДжикиÑ', '21.11.1993', 'защитник', DEFAULT),
153 ('ÐлекÑандр Юрьевич Ерохин', '13.10.1989', 'полузащитник', DEFAULT),
154 ('Юрий Валентинович Жирков', '20.08.1983', 'полузащитник', 2),
155 ('ÐлекÑандр ÐлекÑандрович Кокорин', '19.03.1991', 'нападающий', 12),
156 ('Дмитрий Дмитриевич Полоз', '12.07.1991', 'нападающий', 2),
157 ('Фёдор Михайлович Смолов', '09.02.1990', 'нападающий', 9),
158 ('Игорь Владимирович Ðкинфеев', '08.04.1986', 'вратарь', -82)
159-- добавление игроков в клубы
160INSERT INTO [team_players] ([team_name], [team_city], [player_name], [player_birthday], [entry_date], [leave_date], [number])
161VALUES ('ЦСКÐ', 'МоÑква', 'Игорь Владимирович Ðкинфеев', '8.04.1986', 2002, NULL, 35),
162 ('Спартак', 'МоÑква', 'Георгий Тамазович ДжикиÑ', '21.11.1993', 2017, NULL, 14),
163 ('Урал', 'Екатеринбург', 'ÐлекÑандр Юрьевич Ерохин', '13.10.1989', 2013, 2016, 21),
164 ('Зенит', 'Санкт-Петербург', 'ÐлекÑандр Юрьевич Ерохин', '13.10.1989', 2017, NULL, 21),
165 ('ЦСКÐ', 'МоÑква', 'Юрий Валентинович Жирков', '20.08.1983', '2004', 2009, 18),
166 ('ЧелÑи', 'Лондон', 'Юрий Валентинович Жирков', '20.08.1983', '2009', 2011, 18),
167 ('Зенит', 'Санкт-Петербург', 'Юрий Валентинович Жирков', '20.08.1983', 2016, NULL, 18),
168 ('Зенит', 'Санкт-Петербург', 'ÐлекÑандр ÐлекÑандрович Кокорин', '19.03.1991', 2016, NULL, 9),
169 ('Урал', 'Екатеринбург', 'Фёдор Михайлович Смолов', '09.02.1990', 2014, 2015, 90),
170 ('Зенит', 'Санкт-Петербург', 'Дмитрий Дмитриевич Полоз', '12.07.1991', 2017, NULL, 7)
171GO
172
173/*
174|> Вывод данных из таблиц БД
175
176Ключевое Ñлово AS позволÑет переназвать Ñтолбец в выводимых данных.
177*/
178-- вывод данных о командах
179SELECT [code] AS [Код команды], [name] AS [Ð˜Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹], [city] AS [Город], [trainer] AS [Тренер], [league] AS [Лига], [status] AS [СтатуÑ], [create_year] AS [Дата ÑозданиÑ]
180FROM [teams]
181-- вывод данных о игроках
182SELECT [full_name] AS [ФИО], [birthday] AS [Дата рождениÑ], [role] AS [Роль], [goals] AS [КоличеÑтво голов]
183FROM [players]
184-- вывод данных о игроках в командах
185SELECT [player_name] AS [ФИО], [player_birthday] AS [Дата рождениÑ], [team_name] AS [Ðазвание команды], [team_city] AS [Город], [number] AS [Ðомер игрока в команде], [entry_date] AS [Ðачал играть], [leave_date] AS [Закончил играть]
186FROM [team_players]
187GO
188
189/*
190|> Вывод данных из таблиц БД, Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ ÑвÑзей
191
192Ключевое Ñлово AS также позволÑет дать таблице пÑевдоним Ð´Ð»Ñ ÑƒÐºÐ¾Ñ€Ð°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ ÑƒÑÐ»Ð¾Ð²Ð¸Ñ WHERE
193и ÑпиÑка выборки.
194Оператор LEFT JOIN работает Ñледующим образом:
1951. ПроиÑходит формирование таблицы внутренним Ñоединением (JOIN) левой и правой таблиц.
1962. Ð’ результат добавлÑÑŽÑ‚ÑÑ Ð·Ð°Ð¿Ð¸Ñи левой таблицы не вошедшие
197в результат Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ внутренним Ñоединением.
198Ð”Ð»Ñ Ð½Ð¸Ñ…, ÑоответÑтвующие запиÑи из правой таблицы заполнÑÑŽÑ‚ÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñми NULL.
199Оператор FULL JOIN помимо данных шагов выполнÑет ещё один: добавлÑет в результат запиÑи,
200не вошедшие в него в результате Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ внешним левым Ñоединением, и заполнÑет их
201значениÑми NULL.
202*/
203SELECT [full_name] AS [ФИО], [birthday] AS [Дата рождениÑ], [role] AS [Роль], [goals] AS [КоличеÑтво голов], [number] AS [Ðомер игрока в команде], [entry_date] AS [Ðачал играть], [leave_date] AS [Закончил играть], [name] AS [Ðазвание команды], [city] AS [Город], [trainer] AS [Тренер], [league] AS [Лига], [status] AS [СтатуÑ], [create_year] AS [Дата ÑозданиÑ], [code] AS [Код команды]
204FROM [teams] AS t
205 LEFT JOIN [team_players] AS tp ON t.name = tp.team_name AND t.city = tp.team_city
206 FULL JOIN [players] AS p ON tp.player_name = p.full_name AND tp.player_birthday = p.birthday
207GO
208
209/*
210|> Индивидуальное задание:
211|> По любой чаÑти Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ и города вывеÑти вÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ ее игроках.
212|> ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Â«Ð³Ð¾Ñ€Ð¾Ð´Â» может быть NULL, тогда она игнорируетÑÑ.
213
214Оператор DECLARE позволÑет объÑвить переменную на уровне Ñкрипта и
215задать ей тип и значение.
216Переменные могут Ñодержать ÑкалÑрные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸ таблицы.
217Ключевое Ñлово LIKE позволÑет произвеÑти поиÑк по Ñтроке.
218% указывает на любое кол-во Ñимволов.
219*/
220
221---- определение переменных city и name, необходимых Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ и города.
222DECLARE @city NVARCHAR(100) = 'Ека'
223DECLARE @name NVARCHAR(100) = 'Ура'
224
225-- определение временной таблицы
226DECLARE @team table(
227 [name] [NVARCHAR](100) NOT NULL,
228 [city] [NVARCHAR](50) NOT NULL
229)
230-- поиÑк команды, подходÑщей под заданные уÑловиÑ
231IF (@city IS NOT NULL)
232 INSERT INTO @team SELECT [name], [city] FROM [teams] WHERE [name] LIKE '%' + @name + '%' AND [city] LIKE '%' + @city + '%'
233ELSE
234 INSERT INTO @team SELECT [name], [city] FROM [teams] WHERE [name] LIKE '%' + @name + '%'
235
236-- вывод данных о игроках команды
237SELECT [full_name] AS [ФИО], [birthday] AS [Дата рождениÑ], [role] AS [Роль], [goals] AS [КоличеÑтво голов], [number] AS [Ðомер игрока в команде], [entry_date] AS [Ðачал играть], [leave_date] AS [Закончил играть]
238FROM @team AS t
239 JOIN [team_players] AS tp ON t.name = tp.team_name AND t.city = tp.team_city
240 JOIN [players] AS p ON tp.player_name = p.full_name AND tp.player_birthday = p.birthday
241GO
242
243
244
245--2
246
247
248DECLARE @Average int = (select avg(tp.leave_date - tp.entry_date) from team_players as tp
249 where tp.leave_date is not null);
250
251select p.*, @Average as 'average' from players as p
252 join team_players as tp on p.full_name = tp.player_name
253where tp.leave_date - tp.entry_date > @Average;
254
255
256
257--3
258
259IF EXISTS ( SELECT *
260 FROM sysobjects
261 WHERE name = N'UpdateCode'
262 AND type = N'P')
263 DROP PROCEDURE dbo.UpdateCode
264
265USE commands;
266GO
267CREATE PROCEDURE dbo.UpdateCode
268 @NewCode int,
269 @OldCode int
270AS
271BEGIN
272 IF NOT EXISTS (SELECT * FROM teams WHERE code = @NewCode)
273 BEGIN
274 IF EXISTS (SELECT * FROM teams WHERE code = @OldCode)
275 BEGIN
276 UPDATE teams SET code = @NewCode WHERE code = @OldCode
277 END
278 ELSE
279 BEGIN
280 SELECT 'Указанного ключа в таблице нет, проверьте вводные данные' AS 'ПРЕДУПРЕЖДЕÐИЕ'
281 END
282 END
283 ELSE
284 BEGIN
285 SELECT 'Ðевозможно вÑтавить уже ÑущеÑтвующий ключ' AS 'ОШИБКÐ'
286 END
287END
288GO
289
290select * from teams
291DECLARE @NewCode int = 10
292EXECUTE UpdateCode @NewCode, @OldCode = 3
293select * from teams
294
295
296DECLARE @NewCode int = 10
297
298--4
299declare @TeamName nvarchar(100) = (SELECT [name] from teams where code = @NewCode)
300select * from teams
301DELETE FROM team_players where team_name = @TeamName
302DELETE FROM teams WHERE code = @NewCode
303select * from teams
304
305--5
306
307IF EXISTS ( SELECT *
308 FROM sysobjects
309 WHERE name = N'Num5'
310 AND type = N'P')
311 DROP PROCEDURE dbo.Num5
312
313
314USE commands
315GO
316CREATE PROCEDURE dbo.Num5
317 @TeamName nvarchar(100),
318 @Code int
319AS
320BEGIN
321 if exists (select * from teams where code = @Code and [name] = @TeamName)
322 begin
323 select TOP(1) p.*, tp.entry_date from teams as t
324 join team_players as tp on tp.team_name = t.[name]
325 join players as p on tp.player_name = p.full_name
326 where tp.leave_date is null and (t.[name] = @TeamName or t.code = @Code)
327 ORDER BY tp.entry_date desc, p.birthday
328 end
329 else
330 begin
331 select null
332 end
333
334
335 select top (3) tp.team_name from team_players as tp
336 where tp.leave_date is null
337 GROUP BY tp.team_name
338 order by count(tp.player_name) desc
339END
340GO
341
342EXECUTE Num5 @TeamName = 'Ñпартак', @Code = 4