Ответы на контрольные вопросы курса "MS SQL с нуля"
Курс MS SQL с нуля · Итоговая статья · Проверка двенадцати уроков
Развёрнутые ответы на контрольные вопросы всех двенадцати уроков курса MS SQL с нуля. Проверка засчитывается совпадением механики и приёма, а не дословной фразой.
Базовая проверка проходит на живой базе TechStore: любой ответ подкрепляется своим запросом в консоли.
Содержание
- 1. Как пользоваться этой статьёй
- 2. Установка и подключение
- 3. Первая база и первый SELECT
- 4. Фильтрация WHERE
- 5. Соединения
- 6. Группировки и агрегаты
- 7. Подзапросы и множества
- 8. Изменение данных
- 9. Типы и ограничения
- 10. Функции и CASE
- 11. Представления и CTE
- 12. Первые транзакции
- 13. Первый план и первый индекс
- 14. Что дальше
1. Как пользоваться этой статьёй
Каждый вопрос сначала получает ответ собственными словами и только потом сверяется с эталоном: ответ, подсмотренный до попытки, не запоминается. Эталон считается совпавшим, если назван тот же приём или механика, а не точная буквальная фраза.
Как работать со статьёй
порядок самопроверки
По уроку за раз: вопросы читаются по одному, ответ проговаривается вслух или пишется комментарием в консоли, эталон открывается последним. При расхождении возвращайтесь к разделу «Типичные ошибки» соответствующего урока.
2. Установка и подключение
- Чем экземпляр по умолчанию отличается от именованного при подключении? Экземпляр по умолчанию не имеет имени: подключение по адресу localhost и порту 1433. Именованный требует имени через слэш (localhost\SQLEXPRESS) и службы обозревателя; путь аутентификации одинаков.
- Что означают поля сообщения Msg 208, Level 16, State 1? 208 — номер ошибки «объект не найден»; тяжесть 16 — ошибка текста пользователя; state — внутренняя метка сервера; по номеру Msg и дословному тексту ищут причину: опечатка, не та база или отсутствует схема.
- Почему Test Connection красный при работающей службе сервера? Чаще всего выключен протокол TCP/IP: включается в SQL Server Configuration Manager с перезапуском службы. Реже — неверный порт или логин при выключенной аутентификации SQL Server.
3. Первая база и первый SELECT
- Почему TOP без ORDER BY непредсказуем? Результат запроса без сортировки порядка не имеет: сервер волен вернуть любые строки, удовлетворяющие фильтру. «Последние N» пишутся парой ORDER BY по убыванию и TOP.
- Зачем двухкомпонентное имя dbo.Products? Поиск без схемы медленнее и ошибочен при наличии других схем. Двухкомпонентное имя — привычка курса с первого дня.
- Чем DISTINCT отличается от «убрать повторы по одному столбцу»? DISTINCT работает на строку результата целиком: убирает полные дубли. Уникальность одного столбца означает, что остальные столбцы выборки меняться не должны.
4. Фильтрация WHERE
- Как устроена ловушка NOT IN с NULL? NOT IN неизвестно о равенстве NULL элементу списка, поэтому одно NULL в списке подзапроса обесценивает условие целиком: выборка пуста. В курсе отрицание пишется через NOT EXISTS.
- Почему BETWEEN по дате теряет конец дня? Столбец DATETIME2 хранит время: BETWEEN по голым датам ловит последний день лишь на момент полуночи. Диапазон пишется до последней секунды дня включительно.
- Что проверяет «приём полноты» фильтра? Сумма счётчиков обеих половин условия обязана равняться таблице целиком; расхождение означает молчаливую потерю строк, чаще всего через NULL.
5. Соединения
- Чем INNER JOIN отличается от LEFT JOIN по смыслу? INNER оставляет пары, где условие выполнилось с обеих сторон; LEFT сохраняет все строки левой таблицы, подставляя NULL при отсутствии пары: его роль — «сущность и необязательное свойство».
- Как фильтр по правой таблице превращает LEFT в INNER? Условие вида равенства по правой таблице в WHERE отсекает NULL-строки результата: левость теряется. Такой фильтр переносится в ON.
- Откуда берётся завышение суммы после соединения? Строка «одной» стороны стыкуется с каждой строкой «многих»: агрегат по левой таблице считается с повторами. Лечится агрегацией правой до соединения в производной таблице.
6. Группировки и агрегаты
- Перечислите шесть шагов логического порядка SELECT. FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Отсюда правила: агрегат нельзя в WHERE, столбец результата либо в ключе группы, либо в агрегате.
- Чем HAVING отличается от WHERE? WHERE отсекает строки до группировки, HAVING — готовые группы после неё. Отсевы, выразимые строками, дешевле ставить в WHERE.
- Почему COUNT(столбец) может не совпадать с COUNT(*)? COUNT(столбец) пропускает NULL; разница чисел — готовая диагностика заполненности, как Email у клиентов TechStore.
7. Подзапросы и множества
- Какие три рода подзапросов различает курс? Скалярный (одно значение в выражении), список (правая часть IN) и производная таблица (во FROM с алиасом). У каждого свой контракт.
- Что грозит скалярному подзапросу без агрегата? Две строки — Msg 512 «вернуло больше одного значения»; ноль строк — сравнение с NULL и молча пустой результат.
- Чем UNION отличается от UNION ALL ценой? UNION убирает дубли ценой сортировки; ALL склеивает как есть. Для непересекающихся источников берётся ALL.
8. Изменение данных
- Из чего состоит безопасная тройка массового UPDATE? Прогноз SELECT тем же WHERE, UPDATE с OUTPUT, постпроверка итогового числа строк: три числа обязаны совпасть.
- Почему SCOPE_IDENTITY, а не @@IDENTITY? @@IDENTITY — последний номер сеанса вообще; при триггере он может принадлежать чужой таблице. SCOPE_IDENTITY возвращает номер своего оператора.
- Что означает Msg 547 при удалении клиента с заказами? Внешний ключ защищает целостность: строка не удаляется, пока жива ссылка. Это защита, а не ошибка; осознанная цепочка удалений — правильный путь.
9. Типы и ограничения
- Почему деньги хранят в DECIMAL, а не в FLOAT? FLOAT приближённый: итоги расходятся на копейках незаметно. Точная арифметика денег требует DECIMAL(p, s).
- CHECK (Rating BETWEEN 1 AND 5) достаточен для обязательной оценки? Нет: CHECK пропускает NULL, условие ловит лишь явную ложь. Обязательность дополняется NOT NULL.
- Как читать Msg 547 по имени ограничения? В тексте ошибки сервер называет конфликтовавшее ограничение; имена по канону курса (FK_Таблица_Куда, CK_Таблица_Смысл) сразу говорят, какое правило сработало.
10. Функции и CASE
- Чем CONCAT лучше склейки плюсом? CONCAT превращает NULL в пустую строку; плюс при NULL в слагаемом обнуляет всю строку. Для описательных колонок отчётов — только CONCAT или COALESCE.
- Что считает DATEDIFF на самом деле? Число пересечённых границ единицы: 23:59 и 00:01 соседних суток дают единицу. Для «полных суток» считают часы или минуты с делением.
- ISNULL или COALESCE? ISNULL принимает два аргумента и наследует тип первого; COALESCE — цепочку и приводит по приоритету типов. Курс берёт COALESCE как стандартную форму.
11. Представления и CTE
- Что хранит представление VIEW? Текст запроса: при обращении содержимое вычисляется заново. Данных представление не хранит; материализация — отдельная тема старшего курса.
- Когда CTE предпочтительнее производной таблицы? В многошаговой логике одного оператора: цепочка читается сверху вниз именами шагов. Для повторного использования многими запросами — VIEW.
- Почему #таблица недоступна из второй консоли? Временная таблица живёт в пределах сеанса; вторая консоль DataGrip — другой сеанс: Msg 208. Это ожидаемое поведение, а не поломка.
12. Первые транзакции
- Чем COMMIT и ROLLBACK различаются на вложенной цепочке? COMMIT уменьшает счётчик @@TRANCOUNT на единицу, а ROLLBACK гасит всю цепочку до нуля: вложенных откатов «на один шаг» не существует.
- Зачем уроки переводят DataGrip в Tx Manual? В Auto каждый оператор подтверждается немедленно и откатывать нечего; Manual накапливает изменения до явного Commit или Rollback кнопками.
- Почему забытая открытая транзакция опасна? Она держит блокировки строк: второй сеанс ждёт на чтении или записи тех же данных — механика «всё повисло». Правило курса: в конце лаборатории @@TRANCOUNT равен нулю.
13. Первый план и первый индекс
- Чем честны logical reads против миллисекунд? Страницы из памяти не зависят от состояния кэша и загрузки машины; время между повторами плавает из-за кэша. Сравнение запросов идёт по logical reads.
- Когда индекс перестаёт окупаться? При выборе значительной доли таблицы сканирование дешевле поиска с дочитками; такое решение оптимизатора — следствие стоимости, а не «игнорирование индекса».
- Что такое покрытие запроса индексом? Все нужные запросу столбцы лежат в самом индексе: ключи для поиска, INCLUDE для списка выборки; Key Lookup исчезает из плана.
14. Что дальше
Совпадение по механике засчитывается; формальное дословное совпадение не требуется. Курс завершён, когда по каждому уроку эталон воспроизводится без подглядывания и подтверждён своим запросом на базе TechStore.
Проверено: 23.10.2026
↑ К оглавлению