SQL: базовый уровень
SQL (Structured Query Language) — это основа работы с базами данных, и знание базовых операций является первым шагом к построению успешной карьеры в сфере анализа данных, программирования и администрирования баз данных. В этой статье мы рассмотрим ключевые базовые навыки, которые помогут вам успешно подтвердить свои знания на платформе HeadHunter.
Тест базового уровня включает в себя задачи на понимание операций выборки (SELECT), условий (WHERE), соединений таблиц (JOIN), а также базовые операции работы с индексами и оптимизации запросов. Чтобы помочь вам подготовиться, мы разберем структуру теста и предложим пример вопроса с детальным объяснением правильного ответа. После прочтения вы будете готовы уверенно пройти тест и подтвердить базовый уровень своих навыков по SQL.
👉🏻Навигация и ссылки по всем материалам в Telegram
Вопрос №1
Какая команда применяется для удаления таблицы из базы данных в SQL?
- TRUNCATE TABLE: Эта команда удаляет все данные из таблицы, но структура таблицы остаётся. Она не подходит для полного удаления таблицы.
- DROP: Команда некорректна без уточнения, что именно удаляется.
- DROP TABLE: Это правильная команда для полного удаления таблицы, включая её данные, структуру и связанные объекты.
- DELETE TABLE: Такой команды в SQL не существует.
- DELETE: Эта команда удаляет данные из таблицы, но структура таблицы остаётся неизменной.
Вопрос №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;
- INTO TABLE Clients DELETE COLUMN old_email: Такой синтаксис не существует в SQL.
- ALTER TABLE Clients DELETE old_email: DELETE используется для удаления данных, а не столбцов. Такой синтаксис некорректен.
- ALTER TABLE Clients DROP COLUMN old_email: Это правильный синтаксис для удаления столбца из таблицы. ALTER TABLE позволяет модифицировать структуру таблицы, а DROP COLUMN удаляет конкретный столбец.
- UPDATE TABLE Clients DELETE old_email: UPDATE используется для изменения данных, а не для модификации структуры таблицы. Такой синтаксис неверен.
- 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';
- FROM Employees SELECT first_name, last_name WHERE job_title = 'Analyst': Синтаксис некорректен, так как в SQL порядок ключевых слов — SELECT, затем FROM.
- CHOOSE first_name, last_name FROM Employees HAVING job_title = 'Analyst': Слово CHOOSE не используется в SQL, а оператор HAVING применяется для фильтрации агрегированных данных, что здесь не требуется.
- SELECT first_name, last_name FROM Employees WHERE job_title = 'Analyst': Это правильный синтаксис. Команда SELECT позволяет выбрать столбцы, а WHERE фильтрует строки по условию.
- SELECT first_name, last_name WHERE job_title = 'Analyst' FROM Employees: Неверный порядок ключевых слов, SELECT должен идти перед WHERE и FROM.
- 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;
- Количество сотрудников, получающих самую высокую и самую низкую заработную плату
- Самую высокую и самую низкую заработную плату — отдельно для каждого подразделения
- Список сотрудников, получающих самую высокую и самую низкую заработную плату
- Разницу между самой высокой и самой низкой заработной платой
- Самую высокую и самую низкую заработную плату, а также общее количество сотрудников
- Количество сотрудников, получающих самую высокую и самую низкую заработную плату: Запрос не определяет конкретное количество сотрудников, а возвращает общую информацию о зарплатах и количестве сотрудников.
- Самую высокую и самую низкую заработную плату — отдельно для каждого подразделения: Для этого нужно было бы использовать GROUP BY по полю department.
- Список сотрудников, получающих самую высокую и самую низкую заработную плату: Запрос не включает поля first_name и last_name и не фильтрует данные для получения списка сотрудников.
- Разницу между самой высокой и самой низкой заработной платой: Для этого нужно было бы использовать выражение MAX(salary) - MIN(salary).
- Самую высокую и самую низкую заработную плату, а также общее количество сотрудников: Этот вариант соответствует результату запроса. MAX(salary) возвращает максимальную зарплату, MIN(salary) — минимальную, а COUNT(*) возвращает общее количество строк в таблице.
📌Правильный ответ: Самую высокую и самую низкую заработную плату, а также общее количество сотрудников
Вопрос №5
Что из перечисленного — пример первичного ключа в SQL?
- Родительская таблица, хранящая информацию обо всех таблицах базы данных
- Уникальный id посетителя сайта
- Должность сотрудника в таблице отдела кадров
- Уникальное название каждой таблицы в базе данных
- Первая строка, добавленная в новую таблицу
- Родительская таблица, хранящая информацию обо всех таблицах базы данных: Это описание системной таблицы базы данных, а не примера первичного ключа.
- Уникальный id посетителя сайта: Это корректный пример первичного ключа, так как первичный ключ должен быть уникальным и идентифицировать каждую строку в таблице.
- Должность сотрудника в таблице отдела кадров: Должность не является уникальным идентификатором, так как разные сотрудники могут иметь одну и ту же должность.
- Уникальное название каждой таблицы в базе данных: Уникальность названия таблицы относится к структуре базы данных, а не к первичному ключу внутри таблицы.
- Первая строка, добавленная в новую таблицу: Первая строка сама по себе не является уникальным идентификатором, так как её можно перезаписать или удалить.
📌Правильный ответ: Уникальный 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:
4. JOIN SELECT, JOIN FROM, JOIN GROUP BY, JOIN ORDER BY:
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;
- SELECT * FROM Sales ORDER BY date DESC, sale_amount DESC: Это правильный синтаксис для сортировки. ORDER BY сортирует строки сначала по столбцу date в порядке убывания (DESC), а затем внутри каждого дня по sale_amount в порядке убывания.
- SELECT * FROM Sales SORT BY date DESC, sale_amount DESC: В SQL используется ключевое слово ORDER BY, а не SORT BY. Такой синтаксис некорректен.
- SELECT * FROM Sales ORDER BY date, sale_amount DESC, DESC: Такой синтаксис некорректен, так как дважды указано DESC для одного столбца.
- SELECT * FROM Sales SORT BY date, sale_amount DESC: Аналогично пункту 2, SORT BY некорректно в SQL.
- SELECT * FROM Sales SORT BY sale_amount DESC, date DESC: SORT BY некорректно, и порядок столбцов не соответствует условию задачи (сначала нужно сортировать по дате).
📌Правильный ответ: SELECT * FROM Sales ORDER BY date DESC, sale_amount DESC;
Вопрос №8
Какое утверждение верно?
- HAVING применяется для фильтрации строк по значениям агрегатных функций, а WHERE — для поиска строк по значениям агрегатных функций.
- HAVING группирует строки с одинаковыми значениями и вычисляет по ним агрегатные функции, а WHERE — сортирует строки и не используется вместе с агрегатными функциями.
- HAVING сначала выбирает строки, затем группирует их и вычисляет агрегатные функции, а WHERE — сначала группирует строки, вычисляет агрегатные функции и только потом выбирает строки.
- WHERE группирует строки с одинаковыми значениями и вычисляет по ним агрегатные функции, а HAVING — сортирует строки и не используется вместе с агрегатными функциями.
- WHERE сначала выбирает строки, затем группирует их и вычисляет агрегатные функции, а HAVING — сначала группирует строки, вычисляет агрегатные функции и только потом выбирает строки.
- HAVING применяется для фильтрации строк после группировки и может использовать агрегатные функции, такие как SUM, COUNT, AVG и т.д.
- WHERE фильтрует строки перед группировкой и не работает с агрегатными функциями.
- Неверно: WHERE не работает с агрегатными функциями.
- Неверно: WHERE не сортирует строки и не применяется к агрегатным функциям.
- Неверно: HAVING работает после группировки, а WHERE — до группировки.
- Неверно: WHERE не группирует строки и не вычисляет агрегатные функции.
- Верно: WHERE фильтрует строки до группировки, а HAVING — фильтрует результаты уже после группировки.
📌Правильный ответ: WHERE сначала выбирает строки, затем группирует их и вычисляет агрегатные функции, а HAVING — сначала группирует строки, вычисляет агрегатные функции и только потом выбирает строки.
Вопрос №9
Найдите регионы со средним рейтингом городов выше 3,0 в таблице Cities.
- SELECT region_id, AVG(rating) FROM Cities GROUP BY region_id HAVING rating > 3.0;
- SELECT region_id, AVG(rating) FROM Cities GROUP BY region_id HAVING AVG(rating) > 3.0;
- SELECT region_id, AVG(rating) FROM Cities GROUP BY region_id WHERE AVG(rating) > 3.0;
- SELECT region_id, rating FROM Cities GROUP BY region_id HAVING AVG(rating) > 3.0;
- 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.
- Неверно: В HAVING используется rating, а не AVG(rating), что некорректно.
- Верно: Это правильный синтаксис. AVG(rating) вычисляется для каждой группы, и HAVING фильтрует группы, где средний рейтинг больше 3,0.
- Неверно: WHERE не поддерживает агрегатные функции.
- Неверно: В выборке присутствует столбец rating, который не является агрегатным и не включён в GROUP BY. Это вызовет ошибку.
- Неверно: Аналогично варианту 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;
- Первые 10 записей из таблицы Food, отсортированных по столбцу price в порядке возрастания.
- Первые 10 записей из таблицы Food, отсортированных по столбцу price в порядке убывания.
- Первые 10 столбцов таблицы Food, отсортированной по столбцу price в порядке убывания.
- Первые 10 столбцов таблицы Food, отсортированной по столбцу price в порядке возрастания.
- Таблицу Food, отсортированную по столбцу price в порядке возрастания, но только с записями, где price не меньше 10.
- ORDER BY price DESC указывает сортировку записей по столбцу price в порядке убывания.
- LIMIT 10 ограничивает количество возвращаемых строк до первых 10 записей, основываясь на указанной сортировке.
- * означает выбор всех столбцов в указанных строках, а не отдельных столбцов.
- Неверно: Сортировка по price выполняется в порядке убывания, а не возрастания.
- Верно: Этот запрос возвращает первые 10 строк, отсортированных по price в порядке убывания.
- Неверно: Возвращаются строки, а не столбцы.
- Неверно: Возвращаются строки, и сортировка выполняется в порядке убывания, а не возрастания.
- Неверно: Условие о price >= 10 отсутствует в запросе.
📌Правильный ответ: Первые 10 записей из таблицы Food, отсортированных по столбцу price в порядке убывания.
Заключение
Поздравляем! Освоение базовых навыков SQL — это первый шаг к успешному управлению базами данных. Теперь вы уверенно справляетесь с простыми операциями выборки, фильтрации и соединения таблиц, а также понимаете основы оптимизации запросов. После прохождения теста базового уровня на платформе HeadHunter вы сможете подтвердить свои навыки и сделать уверенный шаг в развитии вашей карьеры.
P.S.
Дорогие читатели! Если материалы данной статьи помогли вам успешно пройти тест на платформе HeadHunter, буду признателен, если вы поставите лайк 👍🏻 именно той статье, которая соответствовала вашему уровню подготовки. Также, если тестирование оказалось неудачным ❌, пожалуйста, оставьте комментарий 📝 с указанием количества ошибок допущенных в тесте.
Эта обратная связь чрезвычайно важна. Она позволит в дальнейшем проанализировать эффективность материалов, а также создать аналитическое заключение для всей серии статей по прохождению тестирования на платформе. Спасибо за вашу помощь в совершенствовании контента!