Базы данных и SQL: тренировочные вопросы с объяснениями

Бесплатные тестовые вопросы по теме Базы данных и SQL с подсказками и объяснениями, трёх уровней: ключевые термины и факты, применение понятий, кейсы и анализ.

Бесплатная задачаЛёгкая

Какое ограничение гарантирует, что столбец никогда не останется пустым (NULL)?

Следующая задача →

Что вы отрабатываете

  1. Лёгкаяключевые термины и факты
  2. Средняяприменение понятий
  3. Сложнаякейсы и анализ

Изучите тему «Базы данных и SQL» с нуля

1Что такое реляционная база данных

Реляционная база данных хранит данные в таблицах. Таблица выглядит как электронная таблица: каждая строка — одна запись, каждый столбец — одно свойство.

В магазине может быть таблица customers со столбцами id, name и city и таблица orders со столбцами id, customer_id и total.

Первичный ключ — это столбец или набор столбцов, однозначно идентифицирующий каждую строку. Он никогда не повторяется и никогда не бывает пустым. Здесь это id каждой таблицы.

Внешний ключ — это столбец, ссылающийся на первичный ключ другой таблицы. В orders столбец customer_id показывает, какой клиент сделал заказ.

Так связываются таблицы: у одного клиента может быть много заказов, но каждый заказ принадлежит одному клиенту. Это связь «один ко многим».

SQL (Structured Query Language) — это язык, на котором создают таблицы, изменяют данные и задают вопросы о них.

Самопроверка Что такое первичный ключ?
  1. Индекс, ускоряющий поиск
  2. Первый столбец каждой таблицы
  3. Столбец или набор столбцов, однозначно идентифицирующий каждую строку
  4. Столбец, ссылающийся на строку в другой таблице

Ответ: Столбец или набор столбцов, однозначно идентифицирующий каждую строку. Первичный ключ уникален и никогда не равен NULL, поэтому он выбирает ровно одну строку. Столбец, ссылающийся на другую таблицу, — это внешний ключ.

2Чтение данных с помощью SELECT

Большинство вопросов касается оператора SELECT. Он состоит из предложений, которые всегда пишутся в таком порядке:

SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
  • SELECT перечисляет нужные столбцы. DISTINCT удаляет повторяющиеся строки.
  • FROM называет таблицу или объединённые таблицы.
  • WHERE оставляет только строки, удовлетворяющие условию, например WHERE total > 20.
  • GROUP BY помещает строки с одинаковым значением в одну группу, чтобы можно было считать или суммировать по группам.
  • HAVING оставляет только группы, удовлетворяющие условию. В нём можно использовать агрегаты, а в WHERE нельзя.
  • ORDER BY сортирует результат, по умолчанию по возрастанию; добавьте DESC, чтобы сначала шли наибольшие.

Агрегатные функции сводят много строк в одно значение: COUNT, SUM, AVG, MIN и MAX.

База данных выполняет предложения не в том порядке, в котором вы их пишете. Сначала выполняется FROM, затем WHERE, GROUP BY, HAVING, SELECT и в конце ORDER BY.

Другие операторы изменяют данные: INSERT добавляет строки, UPDATE изменяет строки, а DELETE удаляет строки. CREATE, ALTER и DROP изменяют сами таблицы.

Самопроверка Вам нужны только клиенты с более чем 5 заказами. Какое предложение фильтрует по COUNT(*) > 5?
  1. DISTINCT
  2. HAVING
  3. ORDER BY
  4. WHERE

Ответ: HAVING. Количество существует только после группировки строк, а HAVING фильтрует группы. WHERE выполняется до группировки, поэтому не может использовать агрегат вроде COUNT.

3Соединения, нормализация и транзакции

Соединение (join) объединяет строки двух таблиц по условию, обычно внешний ключ = первичный ключ:

FROM customers c JOIN orders o ON o.customer_id = c.id
  • INNER JOIN (или JOIN) оставляет только строки, имеющие соответствие в обеих таблицах.
  • LEFT JOIN оставляет каждую строку левой таблицы. Где соответствия нет, столбцы правой таблицы равны NULL.
  • NULL означает, что значение отсутствует или неизвестно. Проверяйте его с помощью IS NULL, а не = NULL.

Нормализация разбивает таблицы так, чтобы каждый факт хранился один раз. Это позволяет не обновлять один и тот же факт в нескольких местах.

  • 1NF: каждая ячейка содержит одно атомарное значение, без повторяющихся групп.
  • 2NF: 1NF, и каждый неключевой столбец зависит от всего ключа, а не от части составного ключа.
  • 3NF: 2NF, и ни один неключевой столбец не зависит от другого неключевого столбца.

Транзакция объединяет операторы в одну единицу. COMMIT делает её постоянной, а ROLLBACK отменяет. Транзакции подчиняются принципам ACID: атомарность (всё или ничего), согласованность, изолированность и долговечность.

Самопроверка У клиента нет заказов. Что происходит с этим клиентом в customers LEFT JOIN orders?
  1. Запрос завершается ошибкой
  2. Клиент исключается из результата
  3. Клиент появляется один раз, с NULL в столбцах заказа
  4. Клиент появляется по одному разу для каждого заказа в таблице

Ответ: Клиент появляется один раз, с NULL в столбцах заказа. LEFT JOIN оставляет каждую строку левой таблицы и заполняет недостающую правую часть значениями NULL. Исключение клиента — это то, что делает INNER JOIN.

4Метод по шагам

Чтобы написать запрос или выяснить, что возвращает заданный запрос:

  1. Найдите таблицы, содержащие данные, и то, как они связаны ключами.
  2. Напишите FROM с соединениями. Выберите LEFT JOIN, если строки без соответствия должны остаться.
  3. Добавьте WHERE для условий на отдельные строки.
  4. Если в вопросе есть «на каждого» или «для каждого», добавьте GROUP BY и агрегат.
  5. Добавьте HAVING для условий на агрегат, затем ORDER BY, если важен порядок.
  6. Проверьте результат на небольшом примере: перечислите строки после каждого предложения в порядке, в котором их выполняет база данных.

Для теоретического вопроса сначала назовите понятие (ключ, тип соединения, нормальная форма, свойство ACID), затем выберите вариант, соответствующий его определению.

5Разобранный пример

Пройдите каждый шаг. Попробуйте предсказать следующий, прежде чем открыть его.

Разобранный пример

В таблице customers строки (1, Ana), (2, Ben) и (3, Cas). В таблице orders строки (id, customer_id) = (10, 1), (11, 1), (12, 2) и (13, 1). Что возвращает этот запрос? SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name

1

Выполните FROM и соединение

Каждый клиент сопоставляется с заказами, несущими его id. Ana соответствует заказам 10, 11 и 13. Ben соответствует заказ 12.

У Cas нет заказов. Поскольку это LEFT JOIN, Cas остаётся в результате, с NULL для o.id.

2

Перечислите соединённые строки

  • Ana, 10
  • Ana, 11
  • Ana, 13
  • Ben, 12
  • Cas, NULL

Это 5 строк.

3

Группировка по name

GROUP BY c.name создаёт три группы: Ana с 3 строками, Ben с 1 строкой и Cas с 1 строкой.

4

Подсчёт по группам

COUNT(o.id) считает только значения, не равные NULL. У Ana получается 3, у Ben — 1.

У Cas одна строка, но её o.id равен NULL, поэтому у Cas получается 0.

5

Проверьте ответ

Ana, Ben и Cas вместе имеют 3 + 1 + 0 = 4 заказа, что совпадает с числом строк в orders. Если бы вместо этого было COUNT(*), Cas ошибочно получил бы 1, потому что COUNT(*) считает саму строку.

Ответ

Ana 3, Ben 1, Cas 0.

6Типичные ошибки

  • Использовать агрегат в WHERE. Условия на COUNT, SUM или AVG следует писать в HAVING.
  • Писать = NULL. Любое сравнение с NULL даёт неопределённость; используйте IS NULL или IS NOT NULL.
  • Использовать INNER JOIN, когда строки без соответствия должны остаться. Используйте LEFT JOIN.
  • Забыть условие соединения. Без ON каждая строка сопоставляется с каждой строкой (перекрёстное соединение).
  • Выбирать столбец, которого нет ни в GROUP BY, ни внутри агрегата.
  • Путать DELETE (удаляет строки) и DROP TABLE (удаляет всю таблицу).
  • Выполнять UPDATE или DELETE без WHERE. Это изменяет каждую строку таблицы.
Самопроверка В таблице 10 строк, и столбец col равен NULL в каждой строке. Что возвращает SELECT COUNT(col)?
  1. 0
  2. 10
  3. 1
  4. NULL

Ответ: 0. COUNT(col) считает только значения, не равные NULL, поэтому возвращает 0. COUNT(*) считает строки и вернул бы 10.

7Как выглядят экзаменационные задачи

  • Лёгкая: ключевые термины и факты. Что делают SELECT, WHERE, ORDER BY или DELETE, первичные и внешние ключи, что означает NULL.
  • Средняя: применение понятий. Правильный запрос для задачи, WHERE и HAVING, внутренние и внешние соединения, нормальные формы, ACID.
  • Сложная: случаи и анализ. Подзапросы, уровни изоляции и их аномалии, BCNF, оконные функции, индексы и производительность запросов, SQL-инъекции.

Когда дан запрос, проследите его на нескольких строках в порядке FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Большинство ловушек проявляется уже на трёх строках.

Изучайте шаг за шагом в приложенииИзучайте шаг за шагом в приложении

Примеры вопросов

Пример 1Лёгкая

Что делает UNION с результатами двух запросов SELECT?

  1. AСоединяет их бок о бок по ключу
  2. BОставляет только строки, присутствующие в обоих
  3. CОбъединяет их в один результат и удаляет повторяющиеся строки
  4. DОставляет только строки, которые есть в первом запросе, но нет во втором
Показать подсказки
  1. Оба запроса должны иметь одинаковое число совместимых столбцов.
  2. Два неверных ответа теперь зачёркнуты. Один из двух оставшихся верный.
Показать ответ и объяснение

Почему это ответ

UNION ставит строки обоих запросов друг под другом и удаляет дубликаты; UNION ALL сохраняет дубликаты.

Ответ

C · Объединяет их в один результат и удаляет повторяющиеся строки
Пример 2Средняя

Что возвращает SELECT SUM(amount) FROM orders, если предложению WHERE не соответствует ни одна строка?

  1. AОшибку
  2. B0
  3. CNULL
  4. DПустую строку
Показать подсказки
  1. Здесь SUM ведёт себя иначе, чем COUNT.
  2. Два неверных ответа теперь зачёркнуты. Один из двух оставшихся верный.
Показать ответ и объяснение

Почему это ответ

SUM, AVG, MIN и MAX на пустом множестве возвращают NULL, а COUNT возвращает 0; COALESCE(SUM(amount), 0) вместо этого даёт 0.

Ответ

C · NULL
Пример 3Сложная

Что возвращает SELECT name, dept, AVG(salary) OVER (PARTITION BY dept) FROM emp?

  1. AТолько сотрудников, зарабатывающих больше среднего по отделу
  2. BКаждую строку сотрудника вместе со средней зарплатой его отдела
  3. CОшибку, потому что name нет в GROUP BY
  4. DПо одной строке на отдел со средней зарплатой
Показать подсказки
  1. Оконные функции не сворачивают строки.
  2. Два неверных ответа теперь зачёркнуты. Один из двух оставшихся верный.
Показать ответ и объяснение

Почему это ответ

В отличие от GROUP BY, оконная функция сохраняет каждую входную строку и добавляет значение, вычисленное по её разделу, здесь — отделу.

Ответ

B · Каждую строку сотрудника вместе со средней зарплатой его отдела

Вопросы и ответы

Базы данных и SQL: что это?

В магазине может быть таблица customers со столбцами id, name и city и таблица orders со столбцами id, customer_id и total.

Так связываются таблицы: у одного клиента может быть много заказов, но каждый заказ принадлежит одному клиенту. Это связь «один ко многим».

Базы данных и SQL: как изучить шаг за шагом?
  1. Что такое реляционная база данных
  2. Чтение данных с помощью SELECT
  3. Соединения, нормализация и транзакции
  4. Метод по шагам
  5. Разобранный пример
  6. Типичные ошибки
  7. Как выглядят экзаменационные задачи
Базы данных и SQL: что вы тренируете?
  • Лёгкая: ключевые термины и факты
  • Средняя: применение понятий
  • Сложная: кейсы и анализ

У каждого вопроса четыре варианта ответа, и только один правильный. Застряли? Сначала откройте небольшую подсказку, а полное объяснение — только когда оно понадобится.

Как проходят занятия

  • У каждого вопроса четыре варианта ответа, и только один правильный.
  • Застряли? Сначала откройте небольшую подсказку, а полное объяснение — только когда оно понадобится.
  • Ваш прогресс, ошибки и сохранённые задачи остаются, поэтому перед экзаменом вы сможете всё повторить.

Курсы с этой темой

Другие темы: Информатика

Лист заданий для печати