JavaRush /Курсы /SQL SELF /Проверка корректности загруженных данных

Проверка корректности загруженных данных

SQL SELF
24 уровень , 2 лекция
Открыта

Загрузка данных из внешних источников — это как приглашение подельников на дело. Вы хотите убедиться, что все пришли с правильным настроем — или, в нашем случае, в нужном формате. Даже небольшая ошибка в загружаемом файле может привести к часам отладки, неправильным результатам запросов или просто испортить данные в таблице.

Иногда в файл могут затесаться пустые строки, лишние пробелы, дубликаты или, скажем, текст там, где должна быть цифра. А если ещё и кодировка окажется неподходящей, таблица может просто отказаться принимать файл.

Чтобы этого не произошло, важно научиться заранее проверять данные на корректность — ещё до загрузки или сразу после неё. Сейчас мы разберём, как это делать.

Проверка структуры данных

  1. Сравнение структуры таблицы с загруженными данными

Самый первый шаг — убедиться, что данные загружены в соответствии со структурой вашей таблицы. Например, вы создавали таблицу students для хранения информации о студентах:

CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    birth_date DATE,
    email VARCHAR(100) UNIQUE
);

Если вы загрузили данные в эту таблицу, для начала давайте просто посмотрим, что в ней находится:

SELECT * FROM students;

Возвращенные строки покажут нам все записи в таблице. Если структура данных в CSV-файле не соответствует структуре таблицы, вы увидите ошибки уже на этапе загрузки. Однако даже если ошибок не было, это не значит, что данные загружены идеально.

  1. Проверка типов данных

Используйте функции PostgreSQL для проверки содержимого колонок. Например:

Проверка пустых значений (NULL):

Если в вашей таблице есть обязательные поля NOT NULL, вам нужно убедиться, что они действительно заполнены. Например:

SELECT * FROM students WHERE first_name IS NULL OR last_name IS NULL;

Проверка форматов данных:

Иногда данные могут быть загружены как строки, хотя должны быть датами или числами. Чтобы проверить это, используйте соответствующие функции PostgreSQL, например:

SELECT * FROM students WHERE birth_date::DATE IS NULL;

Этот запрос покажет строки, где поле birth_date нельзя привести к типу DATE.

Проверка на наличие ошибок

  1. Поиск дубликатов

Дублирующиеся записи — одна из самых распространённых проблем. Предположим, что ваши данные должны быть уникальны по адресу электронной почты (email). Чтобы проверить на наличие дубликатов, используйте следующий запрос:

SELECT email, COUNT(*)
FROM students
GROUP BY email
HAVING COUNT(*) > 1;

Этот запрос покажет вам все повторяющиеся email, а также количество их вхождений. Если ваш столбец email настроен как UNIQUE, то загрузка таких данных вызовет ошибку.

  1. Проверка некорректных данных

Если вы ожидаете, что поле birth_date содержит только даты рождения, вам нужно убедиться, что все значения находятся в допустимом интервале. Например:

SELECT * FROM students
WHERE birth_date < '1900-01-01' OR birth_date > CURRENT_DATE;

Этот запрос покажет строки, где дата рождения слишком далека от реальности.

Работа с некорректными данными

После того как вы нашли проблемы, нужно их исправить. Давайте разберем, как это сделать.

  1. Удаление некорректных данных

Если обнаружилось, что в таблице есть строки с пустыми именами, вы можете их удалить:

DELETE FROM students
WHERE first_name IS NULL OR last_name IS NULL;

Но удалять данные следует с осторожностью! Так как они могут быть важны, возможно, вместо удаления лучше стоит их обновить.

  1. Обновление данных

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

UPDATE students
SET email = 'unknown@example.com'
WHERE email IS NULL;

Визуализация данных для анализа

  1. Использование агрегатных функций

Иногда для проверки данных полезно посчитать агрегаты. Например, чтобы узнать, сколько студентов родилось в каждом году, выполните:

SELECT EXTRACT(YEAR FROM birth_date) AS year, COUNT(*)
FROM students
GROUP BY year
ORDER BY year;

Этот запрос покажет вам распределение по годам и может указать на аномалии (например, если в одном году появилась подозрительно большая группа студентов).

  1. Проверка данных с помощью ограничений

Убедитесь, что данные соответствуют ограничениям, заданным в таблице, например, следующим образом:

Проверка на уникальность:

SELECT DISTINCT email
FROM students;

Если количество уникальных значений меньше, чем общее количество строк — у вас есть дубликаты.

Проверка диапазонов значений:

SELECT * FROM students
WHERE LENGTH(first_name) > 50 OR LENGTH(last_name) > 50;

Это поможет убедиться, что имена студентов не превышают лимита в 50 символов.

Что делать, если всё плохо?

Иногда данные настолько плохи, что их проще загрузить заново.

  1. Удалите все строки из таблицы:

    TRUNCATE TABLE students;
    
  2. Исправьте исходный CSV-файл с помощью Python, Excel или любого другого инструмента.

  3. Загрузите данные заново с помощью команды COPY.

Практическое применение

Навыки валидации данных пригодятся вам каждый раз, когда вы работаете с внешними источниками. На собеседованиях, например, вас вполне могут попросить составить SQL-запрос для проверки качества входящих данных — это обычная практика. В реальных проектах ситуация ничуть не проще: данные от клиента или другого отдела почти всегда приходят с ошибками, и именно вы станете тем, кто заметит их первым и сможет всё поправить до того, как дело дойдёт до багов.

Регулярная проверка данных помогает поддерживать базу в порядке — и это не просто формальность, а реальная экономия времени, нервов и усилий всей команды. Так что если вы умеете быстро понять, в порядке ли данные, — считайте, вы на шаг ближе к званию мастера PostgreSQL.

2
Задача
SQL SELF, 24 уровень, 2 лекция
Недоступна
Проверка наличия пустых значений
Проверка наличия пустых значений
Комментарии (11)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 30
9 февраля 2026
Задача конечно дико не правильно сформулирована и 3-ий пункт тут вообще конфликтует (в текущей формулировке) с постановкой самой задачи. На это также ругается сам валидатор. Т.е валидатнор сам ругается на формулировку ))) Нйденное решение: ИИ сообразил, что возможно хотел автор. А именно - вы вести строки, которые содержат NULL, но не выводить строки в которых ВСЕ значения NULL. И это устроило валидатор ))

SELECT
    student_id,
    first_name,
    last_name, 
    email
FROM
    students
WHERE
    -- 1. Хотя бы одно поле NULL
    (first_name IS NULL OR last_name IS NULL OR email IS NULL)
    -- 2. Но при этом не все поля одновременно NULL (есть хотя бы одно значение)
    AND NOT (first_name IS NULL AND last_name IS NULL AND email IS NULL);
Jh-007 Уровень 27
9 февраля 2026
"Правильное решение" не проходит.
Анатолий Уровень 30
9 февраля 2026
решение выше ))
Jh-007 Уровень 27
9 февраля 2026
Вопрос же не в этом. У них есть опция "Правильное решение", а оно не проходит валидацию. Халтура. Ну и публиковать решение - это не правильно, на мой взгляд. Там и так в задании все расписано.
Анатолий Уровень 30
9 февраля 2026
как раз в задании ошибка, поэтому их собственное решение не подходит. Опубликовал, потому что правильного решения нет, должно быть по правилам курса. А вот пользоваться им или нет - это дело каждого как и правильными решениями автора.
Сергій Бабич Уровень 37
2 января 2026
Поясніть, що в задачі відбувається: Условие: Поля `first_name`, `last_name` и `email` помечены как не обязательные. Требования: Учитывается, что поля `first_name`, `last_name` и `email` являются обязательными и не должны содержать `NULL`. Вірне, навіть власне рішення не приймає. І видає наступне: В условии указано, что поля являются обязательными и не должны содержать NULL — это противоречие с основной задачей. Рекомендация: уточнить условие. Если требуется проверять наличие NULL, то оставить поля как nullable в схеме (как в init.sql) или изменить требование на то, что поля НЕ являются обязательными.
9 ноября 2025
Правильное решение выдает ошибку.
Евгений Уровень 49 Expert
13 августа 2025
Вот такой запрос:

SELECT * FROM students WHERE birth_date::DATE IS NULL;
не показывает никаких строк, а просто кидает ошибку в случае расхождения типов. Более того, можно вообще не делать никаких запросов, а просто посмотреть структуру таблицы, чтобы понять, какие данные в неё можно загрузить. А вообще, что за сценарий обсуждается в лекции? Если мы смогли импортировать данные, то всё и так уже окей. Все эти проверки на уникальность и NULL смысла в данном случае не имеют. Единственный возможный сценарий: это если мы создаёт таблицу с минимальными ограничениями, импортируем в неё данные, а потом устанавливаем ограничения через ALTER TABLEЮ, но зачем так делать?
Евгений Уровень 49 Expert
13 августа 2025
Хотя да, возможно, мы сначала загрузим данные во временную таблицу, там их проверим, а потом уже данные из временной таблицы зальём в реальную. Тогда данные проверки могут иметь смысл.
Slevin Уровень 35
17 сентября 2025
Именно. Речь вероятно идет про загрузку данных во временную таблицу и уже затем анализ этой таблицы на наличие несопоставимых данных. Но в лекции про это нихрена не указано.
Евгений Уровень 49 Expert
18 сентября 2025
Честно говоря, для проверки корректности данных в реальной жизни я бы использовал regexp, просто и надёжно 🙃 Да, долго наверное, но и операции импорта выполняются довольно редко