열 개수와 형식 호환성
결과 집합을 결합하기 위해 충족해야 하는 규칙과 일반적인 불일치 오류를 알아봅니다.
열 개수와 형식 호환성은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL 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: 위치별로 형식이 호환되어야 합니다
열은 이름이 아니라 위치를 기준으로 대응됩니다. 쿼리 1의 첫 번째 열은 쿼리 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 DECIMALNULL로 누락된 열 채우기
두 쿼리의 형태가 자연스럽게 다를 때는 자리 표시자 열을 추가하여 형태를 맞춥니다. 흔히 다른 분기에 있는 슬롯을 채우기 위해 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사전 점검 목록
결과 집합을 결합하기 전에 다음을 확인하세요.
- 모든 분기의 열 개수가 같은지 확인합니다.
- 각 위치의 열 쌍이 형식상 호환되는지 확인합니다(확실하지 않다면 형 변환을 적용합니다).
- 열이 같은 논리적 순서로 배치되어 있는지 확인합니다.
- 깔끔한 출력 이름을 위해 첫 번째 쿼리에 별칭이 설정되어 있는지 확인합니다.
면접에서 이 목록을 소리 내어 확인하면 조용히 발생하는 정렬 불일치 문제를 예방할 수 있습니다.
종합하기
호환성 문제는 대부분 예방할 수 있습니다. 열 개수가 다르면 오류가 분명하게 발생하지만, 열 순서가 바뀌거나 예상하지 못한 형 변환이 일어나면 문제가 드러나지 않을 수 있습니다. 쿼리를 열의 위치 기준으로 읽고 의도적으로 형 변환을 적용하면 집합 연산을 올바르게 유지할 수 있습니다.
자신 있는 답변에서는 두 규칙을 모두 말하고, 위치 기준 대응을 언급하며, 출력 이름이 첫 번째 쿼리에서 결정된다는 점을 설명하세요.
빠른 확인
구조화 질의 언어에서는 두 UNION 분기의 어떤 열이 서로 대응하는지 어떻게 결정하나요?
복습
핵심 내용:
- 모든 집합 연산자는 모든 분기에서 같은 열 개수를 요구합니다.
- 열은 위치를 기준으로 대응하며, 각 열 쌍의 형식이 호환되어야 합니다.
- 호환되는 형식은 더 넓은 공통 형식으로 변환될 수 있습니다.
- 형태가 다른 경우
CAST(NULL AS type)을 사용하여 부족한 부분을 채우세요. - 출력 이름은 첫 번째 쿼리에서 가져옵니다.
자주 묻는 질문
“열 개수와 형식 호환성” 강의는 무료인가요?
네 — “열 개수와 형식 호환성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“열 개수와 형식 호환성”에서 뭘 배우나요?
결과 집합을 결합하기 위해 충족해야 하는 규칙과 일반적인 불일치 오류를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“열 개수와 형식 호환성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.