SQL — это стандартный декларативный язык запросов к реляционным базам данных, а T-SQL (Transact-SQL) — это диалект SQL от Microsoft, который расширяет стандарт процедурными возможностями и работает в СУБД Microsoft SQL Server. Проще говоря, T-SQL — это надстройка над SQL, а не отдельный язык.
Содержание
Ниже разберем, что именно входит в стандарт SQL, что добавляет к нему T-SQL, чем они отличаются построчно в таблице, и покажем на прогнанных примерах, какой код переносится между СУБД, а какой работает только в SQL Server.
Коротко: в чем разница
SQL — это общий стандарт (ANSI/ISO), которому в разной степени следуют все реляционные СУБД: MySQL, PostgreSQL, Oracle Database, SQLite, MS SQL Server. На чистом стандарте вы пишете запросы SELECT, INSERT, UPDATE, DELETE и получаете один и тот же результат в любой из них.
T-SQL — это конкретная реализация SQL в SQL Server плюс процедурные добавки, которых в базовом стандарте нет: переменные, условия, циклы, обработка ошибок. Эти добавки не переносятся в другие СУБД: у Oracle своя надстройка PL/SQL, у PostgreSQL — PL/pgSQL.
Ключевой вывод сразу: любой корректный запрос стандартного SQL выполнится и в T-SQL (T-SQL — надмножество), но код с T-SQL-конструкциями в чужой СУБД не запустится.
SQL: стандартный язык запросов
SQL (Structured Query Language) появился в IBM в 1970-х годах на основе реляционной модели Кодда. Язык стандартизировали: ANSI в 1986 году, ISO в 1987 году, дальше стандарт много раз обновлялся. Это делает SQL общим языком для реляционных СУБД.
SQL — декларативный: вы описываете, какой результат нужен, а не как его вычислять. Планировщик СУБД сам решает, в каком порядке читать таблицы и какие индексы использовать. Команды языка принято делить по назначению.
- DDL (Data Definition Language) — структура БД:
CREATE,ALTER,DROP. - DML (Data Manipulation Language) — работа с данными:
SELECT,INSERT,UPDATE,DELETE. - DCL (Data Control Language) — права доступа:
GRANT,REVOKE. - TCL (Transaction Control Language) — управление транзакциями:
COMMIT,ROLLBACK,SAVEPOINT.
Важная оговорка: стандарт — это ориентир, а не гарантия. Каждая СУБД реализует его со своими отклонениями и расширениями, поэтому один и тот же запрос может вести себя по-разному в MySQL и в SQL Server. Такую реализацию и называют диалектом SQL.
T-SQL: диалект Microsoft для SQL Server
Transact-SQL (T-SQL) — это диалект SQL, на котором пишут запросы к Microsoft SQL Server. Исторически язык вырос из совместной разработки Microsoft и Sybase, поэтому он же (в своей ветке) используется в Sybase ASE — теперь это SAP ASE. В экосистеме Microsoft T-SQL развивает и поддерживает именно Microsoft.
T-SQL включает в себя весь стандартный SQL и добавляет к нему процедурное расширение — средства, которые превращают набор запросов в программу с логикой:
- локальные и системные переменные (
DECLARE @x INT,@@ROWCOUNT); - управляющие конструкции:
IF ... ELSE,WHILE,BEGIN ... END,TRY ... CATCH; - расширенный набор встроенных функций для строк, дат и чисел;
- хранимые процедуры и триггеры на этом же языке;
- интеграцию с аутентификацией Windows.
Здесь важно не путать три вещи. SQL Server — это продукт (СУБД). T-SQL — это язык запросов внутри него. MS SQL — разговорное имя того же продукта. Язык живет внутри продукта, но это не одно и то же.
SQL и T-SQL: таблица различий
| Признак | SQL (стандарт) | T-SQL (Transact-SQL) |
|---|---|---|
| Что это | Стандарт языка запросов ANSI/ISO | Диалект SQL от Microsoft |
| Кто отвечает | Комитеты ANSI/ISO | Microsoft (истоки — Sybase) |
| Где работает | Любая реляционная СУБД (с оговорками) | В основном Microsoft SQL Server, а также SAP ASE |
| Парадигма | Декларативная (описываем результат) | Декларативная плюс процедурные добавки |
Переменные, циклы, IF |
Нет в базовом стандарте | Есть |
| Переносимость кода | Высокая для ядра языка | Низкая для T-SQL-конструкций |
| Аналоги у конкурентов | — | PL/SQL (Oracle), PL/pgSQL (PostgreSQL) |
Строку «SQL разработан IBM, T-SQL — Microsoft» из старых сравнений стоит читать аккуратно: IBM создала первый SQL, но нынешний стандарт ведут комитеты ANSI/ISO, а не IBM.
Что T-SQL добавляет к стандарту
Разница нагляднее всего видна на процедурном коде. Такой фрагмент — это уже мини-программа: он объявляет переменную, считает в нее агрегат и ветвится по условию. В чистом стандартном SQL так написать нельзя, а в SQL Server — можно.
DECLARE @dept VARCHAR(20) = 'bi';
DECLARE @total INT;
SELECT @total = SUM(amount)
FROM sales
WHERE dept = @dept;
IF @total > 500
PRINT 'Отдел ' + @dept + ': сумма ' + CAST(@total AS VARCHAR) + ', план перевыполнен';
ELSE
PRINT 'Отдел ' + @dept + ': план не выполнен';
Вывод в SQL Server (сообщение вкладки Messages):
Отдел bi: сумма 800, план перевыполнен
Обратите внимание на границу: DECLARE, присваивание @total = ... и IF ... PRINT — это конструкции T-SQL. Если скопировать этот блок в PostgreSQL или SQLite, он не выполнится — там свой синтаксис переменных и условий. Именно поэтому такой код называют непереносимым.
Отдельно развеем частое заблуждение. Оконные функции (OVER) и агрегатные функции (SUM, AVG) — это не уникальная особенность T-SQL: они входят в стандарт SQL и есть в PostgreSQL, Oracle, современном MySQL и даже в SQLite. Уникальны для T-SQL именно процедурные конструкции, а не аналитические функции.
Один и тот же запрос: переносимое ядро SQL
Теперь противоположный пример — код, который одинаково работает и в SQL Server, и в других СУБД, потому что состоит только из стандартного SQL. Прогоним его в SQLite, чтобы показать реальный результат; в SQL Server те же запросы дадут те же строки. Первый запрос — агрегаты GROUP BY, второй — оконная функция, которая считает нарастающий итог внутри отдела, не схлопывая строки.
CREATE TABLE sales (id INTEGER, dept TEXT, amount INTEGER);
INSERT INTO sales VALUES (1,'sql',100),(2,'sql',300),(3,'bi',200),(4,'bi',600);
SELECT dept, SUM(amount) AS total, AVG(amount) AS avg_amount
FROM sales
GROUP BY dept
ORDER BY total DESC;
SELECT id, dept, amount,
SUM(amount) OVER (PARTITION BY dept ORDER BY id) AS running_total
FROM sales
ORDER BY dept, id;
Результат (сначала агрегаты по отделам, затем нарастающий итог):
dept | total | avg_amount
bi | 800 | 400.0
sql | 400 | 200.0
id | dept | amount | running_total
3 | bi | 200 | 200
4 | bi | 600 | 800
1 | sql | 100 | 100
2 | sql | 300 | 400
Вывод сошелся: GROUP BY дал одну строку на отдел с суммой и средним, а OVER (PARTITION BY ...) сохранил все строки и добавил столбец с накоплением. Оба запроса — чистый стандарт, поэтому их не придется переписывать при переносе на другую СУБД.
Как выбрать, что учить
Практический ориентир простой. Если вы работаете с разными СУБД или пишете переносимые запросы — опирайтесь на стандартное ядро SQL и проверяйте диалектные отличия по документации конкретной базы. Если ваша работа завязана на инфраструктуру Microsoft — учите именно T-SQL: хранимые процедуры, переменные, обработку ошибок и особенности оптимизатора SQL Server.
На практике одно не отменяет другого: сначала осваивают общий SQL (выборки, соединения, группировки, оконные функции), а затем — процедурные возможности конкретного диалекта под свою СУБД.
Выводы
- SQL — стандартный декларативный язык запросов к реляционным БД (ANSI/ISO), которому с оговорками следуют все реляционные СУБД; T-SQL (Transact-SQL) — диалект SQL от Microsoft для SQL Server.
- T-SQL — надмножество стандарта: он включает весь стандартный SQL и добавляет процедурные средства (переменные,
IF/WHILE, обработку ошибок, хранимые процедуры), которых в базовом стандарте нет. - Переносимость односторонняя: корректный стандартный SQL выполнится и в SQL Server, а код с T-SQL-конструкциями в чужой СУБД (PostgreSQL, SQLite) не запустится.
- Оконные (
OVER) и агрегатные функции — это стандарт SQL, а не особенность T-SQL; уникальны для T-SQL именно процедурные конструкции. - У конкурентов свои аналоги процедурного расширения: PL/SQL у Oracle, PL/pgSQL у PostgreSQL; напрямую между собой такой код не переносится.
Где применяется и связь с практикой
T-SQL — основной инструмент разработчика и администратора SQL Server: на нем пишут отчеты, хранимые процедуры, триггеры, задачи ETL и бизнес-логику прямо в базе. Знание того, где кончается стандарт и начинается диалект, экономит часы отладки при переносе кода между системами.
Освойте тему на практике
Если хотите разобрать T-SQL и внутреннее устройство SQL Server системно — от запросов и хранимых процедур до оптимизации и администрирования — посмотрите курс MS SQL Server Разработчик. Оценить формат и уровень до старта помогают бесплатные открытые уроки Otus — живые занятия с преподавателями.
Смежные темы: SQL: описание и особенности, Основы работы с базами SQL, Особенности работы с MS SQL.
FAQ
T-SQL и SQL Server — это одно и то же? Нет. SQL Server — это СУБД (продукт), а T-SQL — язык запросов, на котором с ней общаются. Один продукт, один основной язык, но это разные сущности.
Чем T-SQL отличается от PL/SQL? Это диалекты-аналоги: T-SQL — процедурное расширение для Microsoft SQL Server, PL/SQL — для Oracle Database. Идея у них общая (SQL плюс процедурная логика), но синтаксис и функции разные, код между ними напрямую не переносится.
Можно ли выполнить обычный SQL-запрос в SQL Server? Да. T-SQL включает стандартный SQL, поэтому корректные SELECT, INSERT, UPDATE, DELETE работают в SQL Server без изменений. Обратно это не всегда верно: код с T-SQL-конструкциями в другой СУБД не запустится.



