December 10, 2024

SQL: базовый уровень

SQL (Structured Query Language) — это основа работы с базами данных, и знание базовых операций является первым шагом к построению успешной карьеры в сфере анализа данных, программирования и администрирования баз данных. В этой статье мы рассмотрим ключевые базовые навыки, которые помогут вам успешно подтвердить свои знания на платформе HeadHunter.

Тест базового уровня включает в себя задачи на понимание операций выборки (SELECT), условий (WHERE), соединений таблиц (JOIN), а также базовые операции работы с индексами и оптимизации запросов. Чтобы помочь вам подготовиться, мы разберем структуру теста и предложим пример вопроса с детальным объяснением правильного ответа. После прочтения вы будете готовы уверенно пройти тест и подтвердить базовый уровень своих навыков по SQL.

👉🏻Навигация и ссылки по всем материалам в Telegram

Вопрос №1
Какая команда применяется для удаления таблицы из базы данных в SQL?

Варианты ответа:

  • TRUNCATE TABLE
  • DROP
  • DROP TABLE
  • DELETE TABLE
  • DELETE

Обоснование:

  1. TRUNCATE TABLE: Эта команда удаляет все данные из таблицы, но структура таблицы остаётся. Она не подходит для полного удаления таблицы.
  2. DROP: Команда некорректна без уточнения, что именно удаляется.
  3. DROP TABLE: Это правильная команда для полного удаления таблицы, включая её данные, структуру и связанные объекты.
  4. DELETE TABLE: Такой команды в SQL не существует.
  5. DELETE: Эта команда удаляет данные из таблицы, но структура таблицы остаётся неизменной.

📌Правильный ответ: DROP TABLE

Вопрос №2
Удалите столбец old_email из таблицы Clients.

Варианты ответа:

  • INTO TABLE Clients DELETE COLUMN old_email;
  • ALTER TABLE Clients DELETE old_email;
  • ALTER TABLE Clients DROP COLUMN old_email;
  • UPDATE TABLE Clients DELETE old_email;
  • UPDATE TABLE Clients DROP COLUMN old_email;

Обоснование:

  1. INTO TABLE Clients DELETE COLUMN old_email: Такой синтаксис не существует в SQL.
  2. ALTER TABLE Clients DELETE old_email: DELETE используется для удаления данных, а не столбцов. Такой синтаксис некорректен.
  3. ALTER TABLE Clients DROP COLUMN old_email: Это правильный синтаксис для удаления столбца из таблицы. ALTER TABLE позволяет модифицировать структуру таблицы, а DROP COLUMN удаляет конкретный столбец.
  4. UPDATE TABLE Clients DELETE old_email: UPDATE используется для изменения данных, а не для модификации структуры таблицы. Такой синтаксис неверен.
  5. UPDATE TABLE Clients DROP COLUMN old_email: DROP COLUMN не используется в сочетании с UPDATE.

📌Правильный ответ: ALTER TABLE Clients DROP COLUMN old_email;

Вопрос №3
Получите список имен и фамилий сотрудников, которые имеют должность аналитика (Analyst), из таблицы Employees.

Варианты ответа:

  • FROM Employees SELECT first_name, last_name WHERE job_title = 'Analyst';
  • CHOOSE first_name, last_name FROM Employees HAVING job_title = 'Analyst';
  • SELECT first_name, last_name FROM Employees WHERE job_title = 'Analyst';
  • SELECT first_name, last_name WHERE job_title = 'Analyst' FROM Employees;
  • SELECT first_name, last_name WHERE job_title = 'Analyst';

Обоснование:

  1. FROM Employees SELECT first_name, last_name WHERE job_title = 'Analyst': Синтаксис некорректен, так как в SQL порядок ключевых слов — SELECT, затем FROM.
  2. CHOOSE first_name, last_name FROM Employees HAVING job_title = 'Analyst': Слово CHOOSE не используется в SQL, а оператор HAVING применяется для фильтрации агрегированных данных, что здесь не требуется.
  3. SELECT first_name, last_name FROM Employees WHERE job_title = 'Analyst': Это правильный синтаксис. Команда SELECT позволяет выбрать столбцы, а WHERE фильтрует строки по условию.
  4. SELECT first_name, last_name WHERE job_title = 'Analyst' FROM Employees: Неверный порядок ключевых слов, SELECT должен идти перед WHERE и FROM.
  5. SELECT first_name, last_name WHERE job_title = 'Analyst': Отсутствует ключевое слово FROM, что делает запрос некорректным.

📌Правильный ответ: SELECT first_name, last_name FROM Employees WHERE job_title = 'Analyst';

Вопрос №4
Что возвращает следующий запрос?

SELECT MAX(salary), MIN(salary), COUNT(*) FROM Employees;

SELECT MAX(salary), MIN(salary), COUNT(*) FROM Employees;

Варианты ответа:

  • Количество сотрудников, получающих самую высокую и самую низкую заработную плату
  • Самую высокую и самую низкую заработную плату — отдельно для каждого подразделения
  • Список сотрудников, получающих самую высокую и самую низкую заработную плату
  • Разницу между самой высокой и самой низкой заработной платой
  • Самую высокую и самую низкую заработную плату, а также общее количество сотрудников

Обоснование:

  1. Количество сотрудников, получающих самую высокую и самую низкую заработную плату: Запрос не определяет конкретное количество сотрудников, а возвращает общую информацию о зарплатах и количестве сотрудников.
  2. Самую высокую и самую низкую заработную плату — отдельно для каждого подразделения: Для этого нужно было бы использовать GROUP BY по полю department.
  3. Список сотрудников, получающих самую высокую и самую низкую заработную плату: Запрос не включает поля first_name и last_name и не фильтрует данные для получения списка сотрудников.
  4. Разницу между самой высокой и самой низкой заработной платой: Для этого нужно было бы использовать выражение MAX(salary) - MIN(salary).
  5. Самую высокую и самую низкую заработную плату, а также общее количество сотрудников: Этот вариант соответствует результату запроса. MAX(salary) возвращает максимальную зарплату, MIN(salary) — минимальную, а COUNT(*) возвращает общее количество строк в таблице.

📌Правильный ответ: Самую высокую и самую низкую заработную плату, а также общее количество сотрудников

Вопрос №5
Что из перечисленного — пример первичного ключа в SQL?

Варианты ответа:

  • Родительская таблица, хранящая информацию обо всех таблицах базы данных
  • Уникальный id посетителя сайта
  • Должность сотрудника в таблице отдела кадров
  • Уникальное название каждой таблицы в базе данных
  • Первая строка, добавленная в новую таблицу

Обоснование:

  1. Родительская таблица, хранящая информацию обо всех таблицах базы данных: Это описание системной таблицы базы данных, а не примера первичного ключа.
  2. Уникальный id посетителя сайта: Это корректный пример первичного ключа, так как первичный ключ должен быть уникальным и идентифицировать каждую строку в таблице.
  3. Должность сотрудника в таблице отдела кадров: Должность не является уникальным идентификатором, так как разные сотрудники могут иметь одну и ту же должность.
  4. Уникальное название каждой таблицы в базе данных: Уникальность названия таблицы относится к структуре базы данных, а не к первичному ключу внутри таблицы.
  5. Первая строка, добавленная в новую таблицу: Первая строка сама по себе не является уникальным идентификатором, так как её можно перезаписать или удалить.

📌Правильный ответ: Уникальный id посетителя сайта

Вопрос №6
Выберите вариант, в котором указаны ТОЛЬКО существующие в SQL типы соединения.

Варианты ответа:

  • INNER JOIN, OUTER JOIN, BETWEEN JOIN, FULL OUTER JOIN
  • INNER JOIN, OUTER JOIN, JOIN GROUP BY, JOIN ORDER BY
  • LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, BETWEEN OUTER JOIN
  • JOIN SELECT, JOIN FROM, JOIN GROUP BY, JOIN ORDER BY
  • INNER JOIN, OUTER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN

Обоснование:

1. INNER JOIN, OUTER JOIN, BETWEEN JOIN, FULL OUTER JOIN:

  • INNER JOIN, FULL OUTER JOIN и OUTER JOIN существуют.
  • BETWEEN JOIN не существует в SQL, так как BETWEEN — это условие фильтрации, а не тип соединения.

2. INNER JOIN, OUTER JOIN, JOIN GROUP BY, JOIN ORDER BY:

  • JOIN GROUP BY и JOIN ORDER BY не являются типами соединений. GROUP BY и ORDER BY используются для группировки и сортировки данных, но это не соединения.

3. LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, BETWEEN OUTER JOIN:

  • LEFT OUTER JOIN, RIGHT OUTER JOIN и FULL OUTER JOIN существуют.
  • BETWEEN OUTER JOIN не существует.

4. JOIN SELECT, JOIN FROM, JOIN GROUP BY, JOIN ORDER BY:

  • SELECT, FROM, GROUP BY и ORDER BY — это команды SQL, но не типы соединений.

5. INNER JOIN, OUTER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN:

  • INNER JOIN, OUTER JOIN, LEFT OUTER JOIN и RIGHT OUTER JOIN — все это существующие типы соединений в SQL.

📌Правильный ответ: INNER JOIN, OUTER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN

Вопрос №7
Отсортируйте все покупки от последней к первой, а по каждому дню — от большей суммы продаж к меньшей в таблице Sales.

Варианты ответа:

  • SELECT * FROM Sales ORDER BY date DESC, sale_amount DESC;
  • SELECT * FROM Sales SORT BY date DESC, sale_amount DESC;
  • SELECT * FROM Sales ORDER BY date, sale_amount DESC, DESC;
  • SELECT * FROM Sales SORT BY date, sale_amount DESC;
  • SELECT * FROM Sales SORT BY sale_amount DESC, date DESC;

Обоснование:

  1. SELECT * FROM Sales ORDER BY date DESC, sale_amount DESC: Это правильный синтаксис для сортировки. ORDER BY сортирует строки сначала по столбцу date в порядке убывания (DESC), а затем внутри каждого дня по sale_amount в порядке убывания.
  2. SELECT * FROM Sales SORT BY date DESC, sale_amount DESC: В SQL используется ключевое слово ORDER BY, а не SORT BY. Такой синтаксис некорректен.
  3. SELECT * FROM Sales ORDER BY date, sale_amount DESC, DESC: Такой синтаксис некорректен, так как дважды указано DESC для одного столбца.
  4. SELECT * FROM Sales SORT BY date, sale_amount DESC: Аналогично пункту 2, SORT BY некорректно в SQL.
  5. SELECT * FROM Sales SORT BY sale_amount DESC, date DESC: SORT BY некорректно, и порядок столбцов не соответствует условию задачи (сначала нужно сортировать по дате).

📌Правильный ответ: SELECT * FROM Sales ORDER BY date DESC, sale_amount DESC;

Вопрос №8
Какое утверждение верно?

Варианты ответа:

  1. HAVING применяется для фильтрации строк по значениям агрегатных функций, а WHERE — для поиска строк по значениям агрегатных функций.
  2. HAVING группирует строки с одинаковыми значениями и вычисляет по ним агрегатные функции, а WHERE — сортирует строки и не используется вместе с агрегатными функциями.
  3. HAVING сначала выбирает строки, затем группирует их и вычисляет агрегатные функции, а WHERE — сначала группирует строки, вычисляет агрегатные функции и только потом выбирает строки.
  4. WHERE группирует строки с одинаковыми значениями и вычисляет по ним агрегатные функции, а HAVING — сортирует строки и не используется вместе с агрегатными функциями.
  5. WHERE сначала выбирает строки, затем группирует их и вычисляет агрегатные функции, а HAVING — сначала группирует строки, вычисляет агрегатные функции и только потом выбирает строки.

Обоснование:

  • HAVING применяется для фильтрации строк после группировки и может использовать агрегатные функции, такие как SUM, COUNT, AVG и т.д.
  • WHERE фильтрует строки перед группировкой и не работает с агрегатными функциями.

Разбор вариантов:

  1. Неверно: WHERE не работает с агрегатными функциями.
  2. Неверно: WHERE не сортирует строки и не применяется к агрегатным функциям.
  3. Неверно: HAVING работает после группировки, а WHERE — до группировки.
  4. Неверно: WHERE не группирует строки и не вычисляет агрегатные функции.
  5. Верно: WHERE фильтрует строки до группировки, а HAVING — фильтрует результаты уже после группировки.

📌Правильный ответ: WHERE сначала выбирает строки, затем группирует их и вычисляет агрегатные функции, а HAVING — сначала группирует строки, вычисляет агрегатные функции и только потом выбирает строки.

Вопрос №9
Найдите регионы со средним рейтингом городов выше 3,0 в таблице Cities.

Варианты ответа:

  1. SELECT region_id, AVG(rating) FROM Cities GROUP BY region_id HAVING rating > 3.0;
  2. SELECT region_id, AVG(rating) FROM Cities GROUP BY region_id HAVING AVG(rating) > 3.0;
  3. SELECT region_id, AVG(rating) FROM Cities GROUP BY region_id WHERE AVG(rating) > 3.0;
  4. SELECT region_id, rating FROM Cities GROUP BY region_id HAVING AVG(rating) > 3.0;
  5. SELECT region_id, rating FROM Cities GROUP BY region_id HAVING rating > 3.0;

Обоснование:

  • GROUP BY используется для группировки данных по столбцу region_id.
  • AVG(rating) вычисляет средний рейтинг городов в каждой группе.
  • HAVING применяется для фильтрации агрегированных данных (например, AVG(rating)).
  • WHERE не может использовать агрегатные функции, такие как AVG.

Разбор вариантов:

  1. Неверно: В HAVING используется rating, а не AVG(rating), что некорректно.
  2. Верно: Это правильный синтаксис. AVG(rating) вычисляется для каждой группы, и HAVING фильтрует группы, где средний рейтинг больше 3,0.
  3. Неверно: WHERE не поддерживает агрегатные функции.
  4. Неверно: В выборке присутствует столбец rating, который не является агрегатным и не включён в GROUP BY. Это вызовет ошибку.
  5. Неверно: Аналогично варианту 1, в HAVING некорректно используется rating вместо AVG(rating).

📌Правильный ответ: SELECT region_id, AVG(rating) FROM Cities GROUP BY region_id HAVING AVG(rating) > 3.0;

Вопрос №10
Что вы получите, запустив следующий код?

SELECT * FROM Food ORDER BY price DESC LIMIT 10;

SELECT * FROM Food ORDER BY price DESC LIMIT 10;

Варианты ответа:

  1. Первые 10 записей из таблицы Food, отсортированных по столбцу price в порядке возрастания.
  2. Первые 10 записей из таблицы Food, отсортированных по столбцу price в порядке убывания.
  3. Первые 10 столбцов таблицы Food, отсортированной по столбцу price в порядке убывания.
  4. Первые 10 столбцов таблицы Food, отсортированной по столбцу price в порядке возрастания.
  5. Таблицу Food, отсортированную по столбцу price в порядке возрастания, но только с записями, где price не меньше 10.

Обоснование:

  • ORDER BY price DESC указывает сортировку записей по столбцу price в порядке убывания.
  • LIMIT 10 ограничивает количество возвращаемых строк до первых 10 записей, основываясь на указанной сортировке.
  • * означает выбор всех столбцов в указанных строках, а не отдельных столбцов.

Разбор вариантов:

  1. Неверно: Сортировка по price выполняется в порядке убывания, а не возрастания.
  2. Верно: Этот запрос возвращает первые 10 строк, отсортированных по price в порядке убывания.
  3. Неверно: Возвращаются строки, а не столбцы.
  4. Неверно: Возвращаются строки, и сортировка выполняется в порядке убывания, а не возрастания.
  5. Неверно: Условие о price >= 10 отсутствует в запросе.

📌Правильный ответ: Первые 10 записей из таблицы Food, отсортированных по столбцу price в порядке убывания.

Заключение

Поздравляем! Освоение базовых навыков SQL — это первый шаг к успешному управлению базами данных. Теперь вы уверенно справляетесь с простыми операциями выборки, фильтрации и соединения таблиц, а также понимаете основы оптимизации запросов. После прохождения теста базового уровня на платформе HeadHunter вы сможете подтвердить свои навыки и сделать уверенный шаг в развитии вашей карьеры.

P.S.

Дорогие читатели! Если материалы данной статьи помогли вам успешно пройти тест на платформе HeadHunter, буду признателен, если вы поставите лайк 👍🏻 именно той статье, которая соответствовала вашему уровню подготовки. Также, если тестирование оказалось неудачным ❌, пожалуйста, оставьте комментарий 📝 с указанием количества ошибок допущенных в тесте.

Эта обратная связь чрезвычайно важна. Она позволит в дальнейшем проанализировать эффективность материалов, а также создать аналитическое заключение для всей серии статей по прохождению тестирования на платформе. Спасибо за вашу помощь в совершенствовании контента!