본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL CONCAT — 문자열 연결 완전 정리

by 왕진 2026. 6. 27.
반응형

 

 

Database · MySQL

MySQL CONCAT —
문자열 연결 완전 정리

CAST로 형변환하고 CONCAT으로 이어붙여 보고서용 한 줄 문자열 만들기
시작 오늘 분석할 코드

구매 테이블(buytbl)에서 숫자로 저장된 단가·수량을 문자열로 바꾼 뒤 하나로 이어 붙여 "30X2=" 같은 한 줄짜리 표기를 만들고, 동시에 실제 곱셈 결과(구매액)도 함께 조회하는 코드다. CAST·CONCAT·산술식이 한 문장 안에 다 들어 있다.

SELECT num, CONCAT(CAST(price AS CHAR(10)), 'X', CAST(amount AS CHAR(4)) ,'=' ) AS '단가X수량', price*amount AS '구매액' FROM buytbl ; -- 지금 다룬 CAST + CONCAT + 산술식 조합은 -- 실무 보고서나 화면 출력에서 정말 자주 쓰는 스킬이야.
실제 결과 미리보기
num 단가X수량 구매액
1 30X2= 60
2 15X5= 75
3 1000X1= 1000
4 200X6= 1200
용어 용어 정리
CONCAT()여러 값을 하나의 문자열로 이어 붙이는 함수
CAST()값의 자료형을 다른 타입으로 강제 변환
CHAR(n)최대 n자 길이의 문자열 타입
AS컬럼·결과에 별칭(alias)을 붙이는 키워드
별칭(alias)SELECT 결과에 화면 표시용 이름을 붙임
산술식 컬럼price*amount처럼 SELECT 안에서 즉석 계산
NULL값이 없음 — CONCAT에 섞이면 전체가 NULL
CONCAT_WS()구분자를 자동으로 넣어주는 CONCAT의 변형
-- 주석SQL 한 줄 주석, 하이픈 뒤 공백 필수

1 CONCAT() — 왜 문자열은 +로 못 붙이나
다른 언어의 습관이 여기서는 통하지 않는 이유

PHP는 ., JavaScript는 +로 문자열을 이어 붙인다. 그래서 처음 SQL을 배우면 price + 'X'처럼 쓰고 싶어진다. 하지만 MySQL에서 +는 오직 산술 덧셈 전용이다. 문자열을 숫자로 어떻게든 해석해서 더해버리거나 오류를 낸다. 그래서 MySQL은 문자열 연결을 위한 전용 함수 CONCAT()을 따로 둔다.

※ 표준 SQL의 || 연결 연산자도 있지만, MySQL은 기본 설정(PIPES_AS_CONCAT 꺼짐)에서 ||를 논리 OR로 해석한다. 그래서 실무에서는 이식성 걱정 없이 CONCAT()을 쓰는 게 정석이다.

2 CAST(값 AS CHAR(n)) — 숫자를 문자로 바꾸는 이유
CONCAT은 숫자를 그냥 안 받아주나?

사실 CONCAT(price, 'X', amount)처럼 숫자를 그냥 넣어도 MySQL이 알아서 문자열로 암묵 변환(implicit conversion)해준다. 그런데도 이 코드가 굳이 CAST(price AS CHAR(10))를 쓰는 이유는 변환을 우연이 아니라 의도로 만들기 위해서다.

암묵 변환에 맡기기
MySQL 내부 규칙에 따라 알아서 문자열화
버전·설정에 따라 자릿수·형식이 달라질 수 있음
코드만 봐서는 의도가 안 보임
CAST로 명시
"이 값은 최대 10자 문자열이다"를 코드에 못 박음
자릿수 제한으로 예상 밖 길이 조기 발견
읽는 사람이 의도를 바로 이해
CAST(price AS CHAR(10))에서 10은 최대 자릿수다. price가 이보다 긴 숫자가 되면 뒷부분이 잘릴 수 있으니, 실제 컬럼이 가질 수 있는 최대 자릿수보다 여유 있게 잡아야 한다.

3 AS '별칭' — 계산 결과에 이름 붙이기
별칭이 없으면 어떤 일이 벌어지나?

별칭을 안 붙이면 이 컬럼의 제목은 CONCAT(CAST(price AS CHAR(10)), 'X', ...) 원본 수식 그대로 나온다. 화면·엑셀·보고서 어디에도 쓸 수 없는 이름이다. AS '단가X수량'처럼 별칭을 붙이면 결과 테이블의 헤더가 사람이 읽을 수 있는 이름으로 바뀐다.

별칭 없음 → 컬럼명: CONCAT(CAST(price AS CHAR(10)), 'X', CAST(amount AS CHAR(4)) ,'=' ) 별칭 있음 → 컬럼명: 단가X수량
※ 따옴표가 필요한 이유
  • 별칭에 공백이나 특수문자(한글 포함 가능하지만 예약어·기호와 섞이면)가 있으면 반드시 따옴표로 감싼다
  • MySQL은 작은따옴표('별칭') 또는 백틱(`별칭`) 둘 다 허용
  • ANSI_QUOTES 모드에서는 작은따옴표가 문자열이 아니라 식별자로 취급되니 백틱이 더 안전할 때도 있다

 

반응형

 

4 price*amount AS '구매액' — SELECT 안에서의 즉석 계산
SELECT는 저장된 값만 보여주는 게 아니다

buytbl에는 priceamount라는 원본 컬럼만 저장돼 있고, "구매액"이라는 컬럼은 테이블에 실제로 존재하지 않는다. price*amount는 조회하는 그 순간 계산되는 가상의 값이다. 원본 데이터는 전혀 건드리지 않으면서 화면에 필요한 값을 만들어내는 것이 SELECT 산술식의 핵심이다.

price (저장값)
×
amount (저장값)
구매액 (계산 결과, DB엔 없음)
※ 이렇게 매번 계산해도 되는 이유: 곱셈 하나는 DB 입장에서 매우 가벼운 연산이다. 반대로 "구매액"을 컬럼으로 따로 저장하면 price나 amount가 바뀔 때마다 구매액도 같이 갱신해줘야 하는 정합성 부담이 생긴다.

5 CONCAT의 콤마 — 인자를 몇 개든 순서대로
CONCAT은 인자 개수 제한이 없다

CONCAT(a, b, c, d, ...)처럼 콤마로 구분한 값을 원하는 만큼 이어 붙일 수 있고, 결과는 왼쪽부터 순서대로 합쳐진다. 이번 코드는 인자 4개(CAST(price...), 'X', CAST(amount...), '=')를 순서대로 이어서 "30X2=" 형태의 결과를 만든다.

CONCAT( CAST(price AS CHAR(10)), 'X', CAST(amount AS CHAR(4)), '=' ) └─── ①30 ───┘ └②┘ └──③2──┘ └④┘ 결과: "30" + "X" + "2" + "=" → "30X2="

6 NULL이 하나만 섞여도 전체가 NULL — CONCAT의 함정
왜 결과가 통째로 사라지는가?

CONCAT의 가장 유명한 함정이다. 인자 중 단 하나라도 NULL이면 CONCAT() 전체 결과가 NULL이 되어버린다. 만약 amount가 아직 입력 안 된 행이 있다면, 그 행의 단가X수량"30X="가 아니라 완전히 빈 값(NULL)으로 나온다.

※ CONCAT('30', NULL, '=') → 결과: NULL (문자 하나도 안 남고 통째로 사라짐)
※ 해결 방법
  • IFNULL(amount, 0)이나 COALESCE(amount, 0)으로 NULL을 기본값으로 먼저 바꾼 뒤 CONCAT에 넣기
  • 구분자가 필요한 경우 CONCAT_WS(구분자, ...)를 쓰면 NULL 인자만 건너뛰고 나머지는 이어 붙여준다

7 -- 주석 — SQL 한 줄 주석 문법

원본 코드 맨 아래 두 줄은 --로 시작하는 SQL 표준 한 줄 주석이다. 여기서 주의할 점은 하이픈 두 개 뒤에 공백이 반드시 있어야 한다는 것이다. --주석처럼 공백 없이 붙이면 일부 클라이언트나 표준 SQL 파서가 주석으로 인식하지 못할 수 있다.

주석 문법 사용 위치 비고
-- 내용 표준 SQL 한 줄 주석 하이픈 뒤 공백 필수
/* 내용 */ 여러 줄 주석 MySQL·표준 SQL 공통
# 내용 한 줄 주석 MySQL 전용 확장 문법

8 MySQL이 이 SELECT를 처리하는 순서

겉보기엔 한 줄이지만, MySQL 내부에서는 각 컬럼을 아래 순서로 계산해 결과 테이블을 만든다. CONCAT과 산술식이 SELECT 목록 안에서 각각 독립적으로 평가된다는 흐름을 알아두면 디버깅이 쉬워진다.

1
FROM buytbl대상 테이블에서 행을 하나씩 꺼내옴
2
num 그대로 출력변환 없이 원본 값 그대로 첫 번째 컬럼
3
CAST(price AS CHAR(10))price를 문자열로 먼저 변환
4
CAST(amount AS CHAR(4))amount도 문자열로 변환
5
CONCAT(...) 실행변환된 문자열 + 'X' + 변환된 문자열 + '=' 를 순서대로 결합
6
AS '단가X수량'결합 결과에 별칭을 붙여 두 번째 컬럼으로 확정
7
price*amount 계산 후 AS '구매액'원본 숫자값끼리 곱해 세 번째 컬럼으로 확정
※ 핵심은 CONCAT용 값은 CAST를 거쳐 문자열이 되고, 구매액용 값은 원본 숫자 그대로 곱해진다는 것이다. 같은 price·amount를 두 번 쓰지만 컬럼마다 완전히 다른 타입으로 처리된다.

9 자주 하는 실수
실수 증상 해결
CONCAT 인자에 NULL이 섞임 결과 컬럼 전체가 NULL로 나옴 IFNULL/COALESCE로 감싸거나 CONCAT_WS 사용
CAST 자릿수(CHAR(n))를 너무 작게 지정 큰 값이 중간에서 잘려 이상한 문자열이 됨 실제 최대 자릿수보다 여유 있게 지정
한글 별칭에 따옴표를 안 씀 구문 오류 또는 의도치 않은 파싱 작은따옴표('별칭')나 백틱(`별칭`)으로 감싸기
-- 뒤 공백을 빠뜨림 주석이 인식되지 않아 오류 발생 -- 뒤에 반드시 공백 한 칸
다른 언어 습관대로 +로 문자열 연결 시도 덧셈으로 처리되어 엉뚱한 숫자가 나옴 CONCAT() 함수 사용

핵심 한 줄 요약

CONCAT(a, b, c...)여러 값을 왼쪽부터 순서대로 이어 붙임
CAST(값 AS CHAR(n))숫자를 문자열로 명시적으로 형변환
AS '별칭'계산 결과에 사람이 읽을 이름을 붙임
price*amountSELECT 시점 즉석 계산, 원본 데이터는 안 바뀜
CONCAT + NULL인자 하나라도 NULL이면 결과 전체가 NULL
-- 주석하이픈 두 개 + 공백 한 칸 필수

Tags

#MySQL #CONCAT #문자열연결 #문자열함수 #CAST #형변환 #SQL #데이터베이스 #DB #AS별칭 #NULL처리 #CONCAT_WS #SQL주석 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
MySQL, CONCAT, 문자열연결, 문자열함수, CAST, 형변환, SQL, 데이터베이스, DB, AS별칭, NULL처리, CONCAT_WS, SQL주석, 웹개발, 티스토리
반응형

댓글