Разница между SQL и T-SQL

Разница между SQL и T-SQL Полезное

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-конструкциями в другой СУБД не запустится.

OTUS Журнал
Скидка 5% 12-19 октября на курсы (popup)
Бесплатные открытые уроки (поп-ап)