MySQL CONCAT —
문자열 연결 완전 정리
구매 테이블(buytbl)에서 숫자로 저장된 단가·수량을 문자열로 바꾼 뒤 하나로 이어 붙여 "30X2=" 같은 한 줄짜리 표기를 만들고, 동시에 실제 곱셈 결과(구매액)도 함께 조회하는 코드다. CAST·CONCAT·산술식이 한 문장 안에 다 들어 있다.
| num | 단가X수량 | 구매액 |
|---|---|---|
| 1 | 30X2= | 60 |
| 2 | 15X5= | 75 |
| 3 | 1000X1= | 1000 |
| 4 | 200X6= | 1200 |
PHP는 ., JavaScript는 +로 문자열을 이어 붙인다. 그래서 처음 SQL을 배우면 price + 'X'처럼 쓰고 싶어진다. 하지만 MySQL에서 +는 오직 산술 덧셈 전용이다. 문자열을 숫자로 어떻게든 해석해서 더해버리거나 오류를 낸다. 그래서 MySQL은 문자열 연결을 위한 전용 함수 CONCAT()을 따로 둔다.
|| 연결 연산자도 있지만, MySQL은 기본 설정(PIPES_AS_CONCAT 꺼짐)에서 ||를 논리 OR로 해석한다. 그래서 실무에서는 이식성 걱정 없이 CONCAT()을 쓰는 게 정석이다.사실 CONCAT(price, 'X', amount)처럼 숫자를 그냥 넣어도 MySQL이 알아서 문자열로 암묵 변환(implicit conversion)해준다. 그런데도 이 코드가 굳이 CAST(price AS CHAR(10))를 쓰는 이유는 변환을 우연이 아니라 의도로 만들기 위해서다.
버전·설정에 따라 자릿수·형식이 달라질 수 있음
코드만 봐서는 의도가 안 보임
자릿수 제한으로 예상 밖 길이 조기 발견
읽는 사람이 의도를 바로 이해
CAST(price AS CHAR(10))에서 10은 최대 자릿수다. price가 이보다 긴 숫자가 되면 뒷부분이 잘릴 수 있으니, 실제 컬럼이 가질 수 있는 최대 자릿수보다 여유 있게 잡아야 한다.별칭을 안 붙이면 이 컬럼의 제목은 CONCAT(CAST(price AS CHAR(10)), 'X', ...) 원본 수식 그대로 나온다. 화면·엑셀·보고서 어디에도 쓸 수 없는 이름이다. AS '단가X수량'처럼 별칭을 붙이면 결과 테이블의 헤더가 사람이 읽을 수 있는 이름으로 바뀐다.
- 별칭에 공백이나 특수문자(한글 포함 가능하지만 예약어·기호와 섞이면)가 있으면 반드시 따옴표로 감싼다
- MySQL은 작은따옴표(
'별칭') 또는 백틱(`별칭`) 둘 다 허용 - ANSI_QUOTES 모드에서는 작은따옴표가 문자열이 아니라 식별자로 취급되니 백틱이 더 안전할 때도 있다
buytbl에는 price와 amount라는 원본 컬럼만 저장돼 있고, "구매액"이라는 컬럼은 테이블에 실제로 존재하지 않는다. price*amount는 조회하는 그 순간 계산되는 가상의 값이다. 원본 데이터는 전혀 건드리지 않으면서 화면에 필요한 값을 만들어내는 것이 SELECT 산술식의 핵심이다.
CONCAT(a, b, c, d, ...)처럼 콤마로 구분한 값을 원하는 만큼 이어 붙일 수 있고, 결과는 왼쪽부터 순서대로 합쳐진다. 이번 코드는 인자 4개(CAST(price...), 'X', CAST(amount...), '=')를 순서대로 이어서 "30X2=" 형태의 결과를 만든다.
CONCAT의 가장 유명한 함정이다. 인자 중 단 하나라도 NULL이면 CONCAT() 전체 결과가 NULL이 되어버린다. 만약 amount가 아직 입력 안 된 행이 있다면, 그 행의 단가X수량은 "30X="가 아니라 완전히 빈 값(NULL)으로 나온다.
IFNULL(amount, 0)이나COALESCE(amount, 0)으로 NULL을 기본값으로 먼저 바꾼 뒤 CONCAT에 넣기- 구분자가 필요한 경우
CONCAT_WS(구분자, ...)를 쓰면 NULL 인자만 건너뛰고 나머지는 이어 붙여준다
원본 코드 맨 아래 두 줄은 --로 시작하는 SQL 표준 한 줄 주석이다. 여기서 주의할 점은 하이픈 두 개 뒤에 공백이 반드시 있어야 한다는 것이다. --주석처럼 공백 없이 붙이면 일부 클라이언트나 표준 SQL 파서가 주석으로 인식하지 못할 수 있다.
| 주석 문법 | 사용 위치 | 비고 |
|---|---|---|
-- 내용 |
표준 SQL 한 줄 주석 | 하이픈 뒤 공백 필수 |
/* 내용 */ |
여러 줄 주석 | MySQL·표준 SQL 공통 |
# 내용 |
한 줄 주석 | MySQL 전용 확장 문법 |
겉보기엔 한 줄이지만, MySQL 내부에서는 각 컬럼을 아래 순서로 계산해 결과 테이블을 만든다. CONCAT과 산술식이 SELECT 목록 안에서 각각 독립적으로 평가된다는 흐름을 알아두면 디버깅이 쉬워진다.
| 실수 | 증상 | 해결 |
|---|---|---|
| CONCAT 인자에 NULL이 섞임 | 결과 컬럼 전체가 NULL로 나옴 | IFNULL/COALESCE로 감싸거나 CONCAT_WS 사용 |
| CAST 자릿수(CHAR(n))를 너무 작게 지정 | 큰 값이 중간에서 잘려 이상한 문자열이 됨 | 실제 최대 자릿수보다 여유 있게 지정 |
| 한글 별칭에 따옴표를 안 씀 | 구문 오류 또는 의도치 않은 파싱 | 작은따옴표('별칭')나 백틱(`별칭`)으로 감싸기 |
-- 뒤 공백을 빠뜨림 |
주석이 인식되지 않아 오류 발생 | -- 뒤에 반드시 공백 한 칸 |
다른 언어 습관대로 +로 문자열 연결 시도 |
덧셈으로 처리되어 엉뚱한 숫자가 나옴 | CONCAT() 함수 사용 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| MySQL CASE WHEN — 다중 조건 분기 완전 정리 (0) | 2026.06.27 |
|---|---|
| MySQL IF · IFNULL · NULLIF — 조건·NULL 처리 완전 정리 (0) | 2026.06.27 |
| MySQL SET 변수 · PREPARE — 동적 쿼리 완전 정리 (0) | 2026.06.27 |
| MySQL CTE WITH — 공통 테이블 식 완전 정리 (0) | 2026.06.27 |
| MySQL CAST — 형 변환(Casting) 완전 정리 (0) | 2026.06.27 |
왕진 블로그

댓글