Перейти к содержимому

Ответы на контрольные вопросы курса "MS SQL с нуля"

Курс MS SQL с нуля · Итоговая статья · Проверка двенадцати уроков

Развёрнутые ответы на контрольные вопросы всех двенадцати уроков курса MS SQL с нуля. Проверка засчитывается совпадением механики и приёма, а не дословной фразой.

Базовая проверка проходит на живой базе TechStore: любой ответ подкрепляется своим запросом в консоли.

Содержание

1. Как пользоваться этой статьёй

Каждый вопрос сначала получает ответ собственными словами и только потом сверяется с эталоном: ответ, подсмотренный до попытки, не запоминается. Эталон считается совпавшим, если назван тот же приём или механика, а не точная буквальная фраза.

Как работать со статьёй

порядок самопроверки

По уроку за раз: вопросы читаются по одному, ответ проговаривается вслух или пишется комментарием в консоли, эталон открывается последним. При расхождении возвращайтесь к разделу «Типичные ошибки» соответствующего урока.

Правило честной проверки: самооценка занижается по разряду, если эталон читали до формулировки своего ответа: иллюзия узнавания маскируется под знание.
↑ К оглавлению

2. Установка и подключение

  1. Чем экземпляр по умолчанию отличается от именованного при подключении? Экземпляр по умолчанию не имеет имени: подключение по адресу localhost и порту 1433. Именованный требует имени через слэш (localhost\SQLEXPRESS) и службы обозревателя; путь аутентификации одинаков.
  2. Что означают поля сообщения Msg 208, Level 16, State 1? 208 — номер ошибки «объект не найден»; тяжесть 16 — ошибка текста пользователя; state — внутренняя метка сервера; по номеру Msg и дословному тексту ищут причину: опечатка, не та база или отсутствует схема.
  3. Почему Test Connection красный при работающей службе сервера? Чаще всего выключен протокол TCP/IP: включается в SQL Server Configuration Manager с перезапуском службы. Реже — неверный порт или логин при выключенной аутентификации SQL Server.
↑ К оглавлению

3. Первая база и первый SELECT

  1. Почему TOP без ORDER BY непредсказуем? Результат запроса без сортировки порядка не имеет: сервер волен вернуть любые строки, удовлетворяющие фильтру. «Последние N» пишутся парой ORDER BY по убыванию и TOP.
  2. Зачем двухкомпонентное имя dbo.Products? Поиск без схемы медленнее и ошибочен при наличии других схем. Двухкомпонентное имя — привычка курса с первого дня.
  3. Чем DISTINCT отличается от «убрать повторы по одному столбцу»? DISTINCT работает на строку результата целиком: убирает полные дубли. Уникальность одного столбца означает, что остальные столбцы выборки меняться не должны.
↑ К оглавлению

4. Фильтрация WHERE

  1. Как устроена ловушка NOT IN с NULL? NOT IN неизвестно о равенстве NULL элементу списка, поэтому одно NULL в списке подзапроса обесценивает условие целиком: выборка пуста. В курсе отрицание пишется через NOT EXISTS.
  2. Почему BETWEEN по дате теряет конец дня? Столбец DATETIME2 хранит время: BETWEEN по голым датам ловит последний день лишь на момент полуночи. Диапазон пишется до последней секунды дня включительно.
  3. Что проверяет «приём полноты» фильтра? Сумма счётчиков обеих половин условия обязана равняться таблице целиком; расхождение означает молчаливую потерю строк, чаще всего через NULL.
↑ К оглавлению

5. Соединения

  1. Чем INNER JOIN отличается от LEFT JOIN по смыслу? INNER оставляет пары, где условие выполнилось с обеих сторон; LEFT сохраняет все строки левой таблицы, подставляя NULL при отсутствии пары: его роль — «сущность и необязательное свойство».
  2. Как фильтр по правой таблице превращает LEFT в INNER? Условие вида равенства по правой таблице в WHERE отсекает NULL-строки результата: левость теряется. Такой фильтр переносится в ON.
  3. Откуда берётся завышение суммы после соединения? Строка «одной» стороны стыкуется с каждой строкой «многих»: агрегат по левой таблице считается с повторами. Лечится агрегацией правой до соединения в производной таблице.
↑ К оглавлению

6. Группировки и агрегаты

  1. Перечислите шесть шагов логического порядка SELECT. FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Отсюда правила: агрегат нельзя в WHERE, столбец результата либо в ключе группы, либо в агрегате.
  2. Чем HAVING отличается от WHERE? WHERE отсекает строки до группировки, HAVING — готовые группы после неё. Отсевы, выразимые строками, дешевле ставить в WHERE.
  3. Почему COUNT(столбец) может не совпадать с COUNT(*)? COUNT(столбец) пропускает NULL; разница чисел — готовая диагностика заполненности, как Email у клиентов TechStore.
↑ К оглавлению

7. Подзапросы и множества

  1. Какие три рода подзапросов различает курс? Скалярный (одно значение в выражении), список (правая часть IN) и производная таблица (во FROM с алиасом). У каждого свой контракт.
  2. Что грозит скалярному подзапросу без агрегата? Две строки — Msg 512 «вернуло больше одного значения»; ноль строк — сравнение с NULL и молча пустой результат.
  3. Чем UNION отличается от UNION ALL ценой? UNION убирает дубли ценой сортировки; ALL склеивает как есть. Для непересекающихся источников берётся ALL.
↑ К оглавлению

8. Изменение данных

  1. Из чего состоит безопасная тройка массового UPDATE? Прогноз SELECT тем же WHERE, UPDATE с OUTPUT, постпроверка итогового числа строк: три числа обязаны совпасть.
  2. Почему SCOPE_IDENTITY, а не @@IDENTITY? @@IDENTITY — последний номер сеанса вообще; при триггере он может принадлежать чужой таблице. SCOPE_IDENTITY возвращает номер своего оператора.
  3. Что означает Msg 547 при удалении клиента с заказами? Внешний ключ защищает целостность: строка не удаляется, пока жива ссылка. Это защита, а не ошибка; осознанная цепочка удалений — правильный путь.
↑ К оглавлению

9. Типы и ограничения

  1. Почему деньги хранят в DECIMAL, а не в FLOAT? FLOAT приближённый: итоги расходятся на копейках незаметно. Точная арифметика денег требует DECIMAL(p, s).
  2. CHECK (Rating BETWEEN 1 AND 5) достаточен для обязательной оценки? Нет: CHECK пропускает NULL, условие ловит лишь явную ложь. Обязательность дополняется NOT NULL.
  3. Как читать Msg 547 по имени ограничения? В тексте ошибки сервер называет конфликтовавшее ограничение; имена по канону курса (FK_Таблица_Куда, CK_Таблица_Смысл) сразу говорят, какое правило сработало.
↑ К оглавлению

10. Функции и CASE

  1. Чем CONCAT лучше склейки плюсом? CONCAT превращает NULL в пустую строку; плюс при NULL в слагаемом обнуляет всю строку. Для описательных колонок отчётов — только CONCAT или COALESCE.
  2. Что считает DATEDIFF на самом деле? Число пересечённых границ единицы: 23:59 и 00:01 соседних суток дают единицу. Для «полных суток» считают часы или минуты с делением.
  3. ISNULL или COALESCE? ISNULL принимает два аргумента и наследует тип первого; COALESCE — цепочку и приводит по приоритету типов. Курс берёт COALESCE как стандартную форму.
↑ К оглавлению

11. Представления и CTE

  1. Что хранит представление VIEW? Текст запроса: при обращении содержимое вычисляется заново. Данных представление не хранит; материализация — отдельная тема старшего курса.
  2. Когда CTE предпочтительнее производной таблицы? В многошаговой логике одного оператора: цепочка читается сверху вниз именами шагов. Для повторного использования многими запросами — VIEW.
  3. Почему #таблица недоступна из второй консоли? Временная таблица живёт в пределах сеанса; вторая консоль DataGrip — другой сеанс: Msg 208. Это ожидаемое поведение, а не поломка.
↑ К оглавлению

12. Первые транзакции

  1. Чем COMMIT и ROLLBACK различаются на вложенной цепочке? COMMIT уменьшает счётчик @@TRANCOUNT на единицу, а ROLLBACK гасит всю цепочку до нуля: вложенных откатов «на один шаг» не существует.
  2. Зачем уроки переводят DataGrip в Tx Manual? В Auto каждый оператор подтверждается немедленно и откатывать нечего; Manual накапливает изменения до явного Commit или Rollback кнопками.
  3. Почему забытая открытая транзакция опасна? Она держит блокировки строк: второй сеанс ждёт на чтении или записи тех же данных — механика «всё повисло». Правило курса: в конце лаборатории @@TRANCOUNT равен нулю.
↑ К оглавлению

13. Первый план и первый индекс

  1. Чем честны logical reads против миллисекунд? Страницы из памяти не зависят от состояния кэша и загрузки машины; время между повторами плавает из-за кэша. Сравнение запросов идёт по logical reads.
  2. Когда индекс перестаёт окупаться? При выборе значительной доли таблицы сканирование дешевле поиска с дочитками; такое решение оптимизатора — следствие стоимости, а не «игнорирование индекса».
  3. Что такое покрытие запроса индексом? Все нужные запросу столбцы лежат в самом индексе: ключи для поиска, INCLUDE для списка выборки; Key Lookup исчезает из плана.
↑ К оглавлению

14. Что дальше

Совпадение по механике засчитывается; формальное дословное совпадение не требуется. Курс завершён, когда по каждому уроку эталон воспроизводится без подглядывания и подтверждён своим запросом на базе TechStore.

Если ответ расходится: вернитесь к уроку: раздел типичных ошибок закрывает девять из десяти расхождений; десятую гоняют руками в консоли на учебной базе до воспроизведения.
Курс завершён: впереди финальный проект (если ещё не защищён) и переход к продвинутому курсу MS SQL на той же базе TechStore: оконные функции, рекурсия, планы вглубь, процедуры, конкурентность и секционирование.

Проверено: 23.10.2026

↑ К оглавлению
Конспект:
Четверг, 22 октября 2026