Microsoft SQL Server

📜 Общее описание и историческая справка

Microsoft SQL Server — реляционная система управления базами данных (РСУБД), разработанная корпорацией Microsoft. Первая версия была выпущена в 1989 году как совместный проект с Sybase (тогда назывался SQL Server 1.0 для OS/2). После распада партнёрства в 1990-х Microsoft продолжила самостоятельную разработку. Версия 7.0 (1998) стала переломной: был полностью переписан движок хранения, появилась поддержка OLAP, а в 2000 году вышла версия 2000 с XML-интеграцией. В 2005 году представлена версия 2005, которая ввела среду SQL Server Management Studio (SSMS), оконные функции, динамическое управление представлениями (DMV). В последующих выпусках (2008, 2012, 2014, 2016, 2017, 2019, 2022) добавлялись поддержка Always On Availability Groups, In-Memory OLTP, интеграция с Azure, Big Data Clusters и улучшения безопасности. На сегодняшний день SQL Server доступен как в Windows, так и в Linux-версиях (начиная с 2017).

Источник: Официальная документация Microsoft, книга "Microsoft SQL Server 2019 Inside Out" (Klein, D., 2020).

🏭 Область применения и рекомендации

SQL Server широко применяется в корпоративной среде для:

  • OLTP-систем (обработка транзакций) — банки, ритейл, ERP.
  • Хранилищ данных и бизнес-аналитики (SSAS, SSIS, SSRS).
  • Приложений на стеке .NET и Azure.
  • Критически важных систем с высокими требованиями к безопасности и согласованности данных.

Рекомендации: SQL Server оптимален для средних и крупных организаций, использующих инфраструктуру Microsoft. Для небольших проектов или веб-приложений может быть избыточен с точки зрения стоимости лицензирования (существуют бесплатные редакции: Express, Developer).

🛠️ Как создать/инициировать базу

Для создания базы данных можно использовать SQL Server Management Studio (SSMS) или выполнить SQL-скрипт:

-- Создание новой базы данных
CREATE DATABASE CompanyDB;
GO

-- Использование базы
USE CompanyDB;
GO

-- Создание таблицы
CREATE TABLE Employees (
    EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL,
    LastName NVARCHAR(50) NOT NULL,
    HireDate DATE DEFAULT GETDATE(),
    Salary DECIMAL(18,2)
);
GO

Также можно создать базу через PowerShell, Azure Data Studio или средства автоматизации (DACPAC).

💡 Основные нюансы языка для общения с базой (T-SQL)

SQL Server использует диалект Transact-SQL (T-SQL), который расширяет стандарт SQL следующими возможностями:

  • Переменные (объявляются с @): DECLARE @count INT = 10;
  • Управляющие конструкции: IF...ELSE, WHILE, BEGIN...END.
  • Обработка ошибок через TRY...CATCH.
  • Хранимые процедуры, функции, триггеры.
  • Оконные функции (ROW_NUMBER(), RANK() и др.).
  • Возможность использовать CLR (C#/VB.NET) для расширенной логики.
  • Специфические типы данных: UNIQUEIDENTIFIER, HIERARCHYID, XML, JSON (начиная с 2016).

🔑 Наборы ключевых команд

-- Выборка с топом
SELECT TOP 10 * FROM Orders ORDER BY OrderDate DESC;

-- Обновление с условием
UPDATE Employees SET Salary = Salary * 1.1 WHERE DepartmentID = 5;

-- Удаление записей
DELETE FROM Products WHERE Discontinued = 1;

-- Резервное копирование
BACKUP DATABASE CompanyDB TO DISK = 'C:\backups\CompanyDB.bak';

-- Показать список баз
SELECT name FROM sys.databases;

-- Показать все таблицы в текущей базе
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';

📊 Построение запросов (сложные примеры)

Оконная функция для ранжирования сотрудников по зарплате в каждом отделе:

SELECT 
    DepartmentID,
    LastName,
    Salary,
    RANK() OVER (PARTITION BY DepartmentID ORDER BY Salary DESC) AS RankInDept
FROM Employees;

Общий табличный выражение (CTE) для рекурсивного обхода иерархии подразделений:

WITH OrgCTE AS (
    SELECT DepartmentID, ParentDepartmentID, DepartmentName
    FROM Departments
    WHERE ParentDepartmentID IS NULL
    UNION ALL
    SELECT d.DepartmentID, d.ParentDepartmentID, d.DepartmentName
    FROM Departments d
    INNER JOIN OrgCTE o ON d.ParentDepartmentID = o.DepartmentID
)
SELECT * FROM OrgCTE;

Использование динамического управления (DMV) для поиска медленных запросов:

SELECT TOP 10
    qs.total_elapsed_time / qs.execution_count AS avg_elapsed_time,
    qs.execution_count,
    qt.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY avg_elapsed_time DESC;

📚 Ссылки на документы, статьи, книги