0Pricing
Coding Interview Prep · Урок

Совместимость количества и типов столбцов

Правила, которым должны соответствовать наборы результатов для объединения, и распространённые ошибки несовпадения.

«Совместимость количества и типов столбцов» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

Правила совместимости, о которых спрашивают на собеседованиях

Каждая операция над множествами (UNION, INTERSECT, EXCEPT) требует, чтобы два набора результатов были совместимы для UNION. На собеседованиях об этом спрашивают, чтобы проверить, знаете ли вы неочевидные причины сбоев таких запросов.

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

Правило 1: одинаковое количество столбцов

Оба запроса должны возвращать одинаковое количество столбцов. Если первый запрос возвращает три столбца, а второй — два, база данных отклоняет оператор.

Это самая распространённая ошибка при работе с операциями над множествами на собеседованиях, особенно когда кто-то изменяет одну ветку и забывает об другой.

SELECT id, name, city FROM a
UNION
SELECT id, name FROM b;
-- ERROR: each UNION query must have the same number of columns

Правило 2: совместимые типы по позициям

Столбцы сопоставляются по позиции, а не по имени. Первый столбец первого запроса сопоставляется с первым столбцом второго запроса и так далее. Каждая пара должна иметь совместимые типы.

Совместимость обычно означает возможность неявного преобразования: INT и BIGINT подходят друг другу, а INT и DATE — обычно нет.

SELECT id, signup_date FROM a
UNION
SELECT id, signup_date FROM b;
-- positions: (int,date) vs (int,date) -> OK

Важна позиция, а не имя

Есть важная тонкость: столбцы могут иметь разные имена и всё равно объединяться, если их позиции совпадают по типу. И наоборот, одинаковые имена в неправильном порядке приведут к неверному сопоставлению данных.

Всегда анализируйте операции над множествами по позициям столбцов. На собеседованиях часто намеренно меняют столбцы местами, чтобы это проверить.

SELECT name, id FROM a
UNION ALL
SELECT id, name FROM b;
-- name<->id swapped: types may clash or data lands in wrong column

Имена столбцов результата

Набор результатов получает имена столбцов из первого запроса. Метки второго запроса отбрасываются. Чтобы управлять заголовками, задайте псевдонимы столбцов в первой ветке.

Именно поэтому последующий ORDER BY должен ссылаться на имена из первого запроса или использовать порядковые позиции.

SELECT id AS user_id, city AS location FROM a
UNION ALL
SELECT id, town FROM b;
-- output headers: user_id, location

Неявное приведение типов

Когда два сопоставленных по позиции столбца имеют разные, но совместимые типы, движок выбирает общий тип, достаточно широкий для хранения обоих значений. Сочетание INT и DECIMAL обычно даёт DECIMAL.

Упоминание этого приведения типов на собеседовании показывает глубину понимания: вы знаете, что столбец не вызовет ошибку, а будет приведён к более широкому типу.

SELECT amount FROM int_table   -- INT
UNION ALL
SELECT amount FROM dec_table;  -- DECIMAL
-- result column is DECIMAL

Заполнение отсутствующих столбцов значением NULL

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

Приведение NULL к типу не позволяет движку угадывать тип и сохраняет совместимость столбцов.

SELECT id, phone, CAST(NULL AS VARCHAR) AS email FROM a
UNION ALL
SELECT id, CAST(NULL AS VARCHAR), email FROM b;

Разбор ошибки из-за несовместимых типов

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

На собеседовании предложите явное приведение типа, а не полагайтесь на неявное преобразование.

SELECT id, CAST(event_date AS VARCHAR) FROM a
UNION ALL
SELECT id, label FROM b;
-- both second columns now VARCHAR -> compatible

Эти правила применимы ко всем операторам над множествами

Правила одинакового количества столбцов и совместимости типов идентичны для UNION, UNION ALL, INTERSECT и EXCEPT. Все они объединяют наборы результатов по вертикали и требуют совместимых для UNION входных данных.

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

SELECT id, city FROM a
INTERSECT
SELECT id, city FROM b;
-- same compatibility rules as UNION

Проверка перед объединением

Перед объединением наборов результатов проверьте:

  • Одинаковое количество столбцов в каждой ветке.
  • Совместимость типов в каждой паре позиций (если сомневаетесь, выполните приведение типа).
  • Одинаковый логический порядок столбцов.
  • Псевдонимы заданы в первом запросе, чтобы имена в результате были понятными.

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

Объединяем правила

Большинства ошибок совместимости можно избежать. При разном количестве столбцов возникают явные ошибки, а при переставленных столбцах или неожиданном приведении типов — незаметные. Анализ запросов по позициям столбцов и осознанное приведение типов помогают сохранять корректность операций над множествами.

Уверенный ответ называет оба правила, упоминает сопоставление по позициям и отмечает, что имена результата берутся из первого запроса.

Быстрая проверка

Как SQL определяет, какие столбцы двух веток UNION соответствуют друг другу?

Итоги

Основные выводы:

  • Для всех операторов над множествами требуется одинаковое количество столбцов в каждой ветке.
  • Столбцы сопоставляются по позициям, и каждая пара должна иметь совместимые типы.
  • Совместимые типы могут быть приведены к более широкому общему типу.
  • Используйте CAST(NULL AS type), чтобы дополнить запросы с разной структурой.
  • Имена результата берутся из первого запроса.

Часто задаваемые вопросы

Урок «Совместимость количества и типов столбцов» бесплатный?

Да — полный текст урока «Совместимость количества и типов столбцов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Совместимость количества и типов столбцов»?

Правила, которым должны соответствовать наборы результатов для объединения, и распространённые ошибки несовпадения. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Совместимость количества и типов столбцов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. UNION и UNION ALL
  2. Совместимость количества и типов столбцов
  3. INTERSECT и EXCEPT для сравнения
  4. Имитация операций над множествами с помощью JOIN
← Назад к Coding Interview Prep