Комментирование нескольких строк SQL и их повторное раскомментирование
Вы тестируете длинный запрос и хотите выполнить его без последних трех объединений. Или вы написали заметку, занимающую пять строк. Оба требуют одновременного отключения нескольких строк, и SQL предоставляет вам два способа сделать это, которые ведут себя по-разному в момент перекрытия.
Что вы делаете: используйте ярлык редактора для переключения -- в каждой выбранной строке. Это быстрее, чем ввод блочного комментария, и его нельзя нарушить комментарием, уже находящимся внутри выделения.
Краткая версия. Блочные комментарии не являются вложенными, поэтому /* внутри вашего блока ничего не происходит, и первый */ заканчивает все.
Два синтаксиса
-- a line comment. Everything after the two dashes, to the end of the line.
/* a block comment.
It can run over
as many lines as you like. */
Оба являются стандартными SQL и оба работают в PostgreSQL, MySQL, SQL Server, Оракул, SQLite, Снежинка и БигЗапрос. В MySQL есть одно дополнительное правило, которое стоит знать: -- после него должен идти пробел или управляющий символ, поэтому --this это не комментарий, пока -- this является. Писать пробел всегда — это привычка, которая позволяет избежать всего этого вопроса.
Ярлык от редактора
| Редактор | Переключить комментарий к строке |
|---|---|
| ДБивер | Ctrl+/ (Cmd+/ на Мак) |
| VS Code, Azure Data Studio | Ctrl+/ |
| DataGrip и IDE JetBrains | Ctrl+/ и Ctrl+Shift+/ для блока |
| Студия управления SQL Serverом | Ctrl+К, затем Ctrl+С, чтобы прокомментировать, Ctrl+К, затем Ctrl+U, чтобы раскомментировать. |
| pgAdmin | Ctrl+/ |
| MySQL рабочая среда | Ctrl+/ |
| Разработчик Oracle SQL | Ctrl+/ |
Выделите строки, нажмите ярлык, и каждая строка получит -- на фронте. Нажмите еще раз, и они оторвутся. Этот переключатель — самый полезный ярлык в редакторе SQL, и большинство людей никогда его не находят.
Гнездовая ловушка
/* switching this section off for now
SELECT customer_id,
SUM(amount) AS total /* only shipped orders */
FROM orders
WHERE status = 'shipped'
GROUP BY customer_id
*/
Это не делает то, на что похоже. Блок заканчивается на первый */, который стоит после «только отправленные заказы». Все из FROM orders и далее снова является живым SQL, и завершающий */ внизу теперь синтаксическая ошибка.
База данных не является неудобной. Стандартные комментарии блоков SQL не вложены, и сканер просто берет первый встреченный закрывающий маркер. PostgreSQL — единственное распространенное исключение: он поддерживает вложенные блочные комментарии, а это означает, что запрос, который работает там, может потерпеть неудачу везде.
Защита заключается в использовании строковых комментариев для внешнего отключения, что и производит ярлык редактора:
-- switching this section off for now
-- SELECT customer_id,
-- SUM(amount) AS total /* only shipped orders */
-- FROM orders
-- WHERE status = 'shipped'
-- GROUP BY customer_id
Комментарии к строке не могут быть закрыты ничем досрочно, поскольку их областью действия является строка.
WHERE может оставить висеть AND, поэтому запрос завершается неудачно на следующей строке, и ошибка указывает на бесполезное место. Напишите условия с оператором в начале каждой строки и проблема исчезнет.Тестирование запроса путем отключения частей
Техника, которая делает длинные запросы управляемыми: закомментируйте все после первого соединения, запустите его, подсчитайте строки, затем добавляйте по одному соединению обратно и наблюдайте за подсчетом.
SELECT COUNT(*)
FROM orders o
JOIN customers c ON c.customer_id = o.customer_id
-- JOIN payments p ON p.order_id = o.order_id
-- JOIN regions r ON r.region_id = c.region_id
;
Раскомментируйте одну строку, запустите заново, сравните. Любое соединение, которое изменяет счетчик, представляет собой либо фильтрацию строк, либо их умножение, и об обоих стоит знать, прежде чем что-либо суммировать. Это метод обнаружения в почему объединение дублирует строки.
При этом поставьте точку с запятой на отдельной строке. Тогда комментирование последнего соединения не приводит к комментированию терминатора.
Оставляем хорошие комментарии
Комментарии, которые стоит сохранить, — это не те комментарии, которые повторяют SQL. Это те, которые читатель не может вывести:
-- Excludes status 'test' because the ZZ accounts are load-test data.
-- Confirmed with the ops team, 12 Aug 2026.
WHERE status <> 'test'
-- Amount is in pence in this table, unlike orders_v2.
SELECT SUM(amount) / 100.0 AS pounds
Почему исключена строка, в каком блоке находится столбец, кто и когда согласовал правило. Более полный метод их записи находится в обучающие комментарии.
Как применить это в своей работе
- Изучите ярлык переключения для редактора, который вы используете каждый день. Оно окупается в первый же день.
- Используйте комментарии к строкам для всего, что вы хотите сохранить, и блокируйте комментарии только для временного отключения.
- Напишите условия с помощью
ANDв начале строки, чтобы любую отдельную строку можно было аккуратно закомментировать. - Добавляйте по одному объединению за раз и проверяйте количество строк после каждого. Это самая дешевая проверка правильности в SQL.
- Прежде чем сохранить запрос, удалите закомментированные эксперименты. Файл, полный мертвого SQL, — это файл, который никто не может определить, является ли он актуальным.
Единственная привычка, которую нужно сохранить
Закомментируйте, чтобы проверить, а затем удалите, а не оставляйте. Закомментированный код не может сказать, является ли это заметкой, экспериментом или правилом, которое было в спешке отключено, и спустя шесть месяцев никто не может сказать, что именно.
Сколько закомментированных строк содержится в запросе, который вы выполняете чаще всего?
SQL для аналитиков — это 458 страниц, которые считывают запросы построчно в повседневных словах, поэтому ошибочный результат нужно где-то отслеживать, а не перепечатывать, пока он не станет выглядеть лучше.
SQL для аналитиков, 19 $ →Комментарии в SQL полностью охватывает оба синтаксиса, синтаксис по базе данных охватывает различия и обучающие комментарии охватывает их написание, чтобы кто-то другой мог прочитать запрос.
Читать комментарии в SQL →