매일 업데이트
2023-08-30 05:00 10 min

초보자를 위한 기본 가이드

SQL에서 둘 이상의 텍스트 열을 결합하고 싶으신가요? SQL의 CONCAT 함수를 활용하여 문자열을 연결하는 방법을 자세히 알아보세요.

데이터베이스 테이블에서 정보를 조회할 때, 개별 열의 데이터를 검색하는 대신, 여러 개의 텍스트 또는 문자열 열을 연결해야 하는 경우가 종종 있습니다. 이는 특히 사람이 이해하기 쉽고 읽기 편한 형식으로 결과를 출력해야 할 때 유용합니다.

예를 들어, `first_name` 필드와 `last_name` 필드를 합쳐서 `full_name`이라는 새로운 필드를 만들 수 있습니다. 마찬가지로, `street`, `city`, `state` 등 여러 주소 관련 필드를 조합하여 전체 주소를 생성할 수 있습니다.

SQL에서는 CONCAT 함수를 사용하여 문자열을 연결할 수 있습니다. 이 글에서는 다음과 같은 내용을 다룹니다.

  • SQL CONCAT 함수의 기본 구조
  • 실제 사용 예시
  • 연결 대상 열에 NULL 값이 포함된 경우의 처리 방법

자, 시작해 볼까요!

SQL CONCAT 함수의 기본 구조

SQL CONCAT 함수의 기본적인 사용법은 다음과 같습니다.

CONCAT(string_1, string_2, ..., string_n);

여기서 `string_1`, `string_2`, …, `string_n`은 연결하고자 하는 문자열들을 의미합니다. 이들은 실제 문자열, 테이블의 열, 혹은 이들의 조합일 수 있습니다.

CONCAT을 이용한 문자열 연결

CONCAT 함수는 단순한 문자열 리터럴을 연결하는 데에도 사용될 수 있습니다. 간단한 예시 코드를 통해 알아봅시다.

여기서는 'Hello,'와 'world!'라는 두 문자열을 연결하여 하나의 인사말 문자열을 만들 것입니다.

SELECT CONCAT('Hello, ', 'world!') AS greeting;

위의 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+---------------+
| greeting      |
+---------------+
| Hello, world! |
+---------------+
1 row in set (0.00 sec)

실제로는 단순히 문자열 리터럴보다는 데이터베이스 테이블의 특정 열들을 연결해야 할 경우가 더 많습니다. 이제 SQL에서 CONCAT 함수를 사용하여 몇 가지 실질적인 예를 살펴보겠습니다.

SQL에서 열을 연결하는 방법

이제 데이터베이스 테이블 쿼리를 통해 실질적인 연결 예제를 살펴보겠습니다.

📑 이 글의 모든 예시 쿼리는 MySQL 데이터베이스 테이블을 기준으로 작성되었습니다. 하지만, 다른 RDBMS 환경에서도 유사하게 적용할 수 있습니다.

샘플 데이터베이스 테이블 생성

실습에 사용할 데이터베이스를 먼저 만들어 보겠습니다.

CREATE DATABASE db1;
use db1;

이제 `db1` 데이터베이스 안에 `employees`라는 이름의 테이블을 만들겠습니다. 이 테이블은 다음 열과 데이터 유형을 포함합니다:

CREATE TABLE employees (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    street VARCHAR(100),
    city VARCHAR(50),
    state VARCHAR(2),
    username VARCHAR(20)
);

다음으로, 이 `employees` 테이블에 몇몇 샘플 데이터를 추가하겠습니다.

INSERT INTO employees (first_name, last_name, street, city, state, username) VALUES
    ('John', 'Smith', '123 Main St', 'New York', 'NY', 'john123'),
    ('Alice', 'Johnson', '456 Elm St', 'Boston', 'MA', 'alice456'),
    ('Bob', 'Williams', '789 Oak St', 'Chicago', 'IL', 'bob789'),
    ('Mary', 'Davis', '321 Pine St', 'Houston', 'TX', 'mary456'),
    ('James', 'Brown', '555 Cedar St', 'Seattle', 'WA', 'james789'),
    ('Emily', 'Jones', '777 Maple St', 'Atlanta', 'GA', 'emily123'),
    ('Michael', 'Miller', '999 Birch St', 'Miami', 'FL', 'michael456'),
    ('Jessica', 'Wilson', '111 Walnut St', 'Dallas', 'TX', 'jessica789'),
    ('William', 'Taylor', '222 Cherry St', 'Denver', 'CO', 'william123'),
    ('Sarah', 'Martinez', '444 Pine St', 'Phoenix', 'AZ', 'sarah456');

예시 1: 전체 이름 표시하기

첫 번째 예로, `first_name` 열과 `last_name` 열을 연결하여 `full_name`을 만들어 보겠습니다. 이를 위해 SQL CONCAT 함수를 다음과 같이 SELECT 쿼리에 적용할 수 있습니다.

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

결과는 다음과 같습니다.

+----------------+
| full_name      |
+----------------+
| John Smith     |
| Alice Johnson  |
| Bob Williams   |
| Mary Davis     |
| James Brown    |
| Emily Jones    |
| Michael Miller |
| Jessica Wilson |
| William Taylor |
| Sarah Martinez |
+----------------+
10 rows in set (0.00 sec)

`first_name` 및 `last_name` 열 사이에는 공백(' ')을 추가하여, 이름이 자연스럽게 연결되도록 했습니다.

예시 2: 주소 생성하기

이제 다른 예시를 살펴보겠습니다.

`employees` 테이블에는 `street`, `city`, `state` 열이 있습니다. 이 세 개의 필드를 쉼표와 공백을 구분자로 사용하여 연결하여 `full_address`를 만들어 보겠습니다.

SELECT CONCAT(street, ', ', city, ', ', state) AS full_address FROM employees;

결과는 다음과 같습니다.

+---------------------------+
| full_address              |
+---------------------------+
| 123 Main St, New York, NY |
| 456 Elm St, Boston, MA    |
| 789 Oak St, Chicago, IL   |
| 321 Pine St, Houston, TX  |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL   |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ  |
+---------------------------+
10 rows in set (0.00 sec)

예시 3: 프로필 URL 생성하기

`employees` 테이블에는 사용자 이름(`username`) 필드가 있습니다.

루트 도메인 주소가 `https://www.example.com/`이고 사용자 프로필 페이지가 `https://www.example.com/user/{username}` 형식이라고 가정해 봅시다. CONCAT 함수를 사용하여 각 사용자의 프로필 URL을 생성할 수 있습니다.

SELECT CONCAT('https://www.example.com/user/', username) AS profile_url 
FROM employees;

다음과 같이 모든 직원의 프로필 URL을 얻을 수 있습니다.

+-----------------------------------------+
| profile_url                             |
+-----------------------------------------+
| https://www.example.com/user/john123    |
| https://www.example.com/user/alice456   |
| https://www.example.com/user/bob789     |
| https://www.example.com/user/mary456    |
| https://www.example.com/user/james789   |
| https://www.example.com/user/emily123   |
| https://www.example.com/user/michael456 |
| https://www.example.com/user/jessica789 |
| https://www.example.com/user/william123 |
| https://www.example.com/user/sarah456   |
+-----------------------------------------+
10 rows in set (0.00 sec)

NULL 값 처리

`employees` 테이블의 모든 레코드는 현재 모든 필드에 값을 가지고 있습니다. 하지만 만약 하나 이상의 필드에 NULL 값이 존재한다면 어떻게 될까요?

이 경우를 예시로 들어보겠습니다. 여기서는 ID가 2인 레코드를 업데이트하여 `street` 열을 NULL 값으로 변경하겠습니다.

UPDATE employees
SET street = NULL
WHERE ID = 2; -- ID가 2인 레코드 업데이트
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

이제 CONCAT을 사용하여 `full_address`를 다시 조회해 보겠습니다.

SELECT CONCAT(street, ', ', city, ', ', state) AS full_address FROM employees;

결과는 다음과 같습니다.

+---------------------------+
| full_address              |
+---------------------------+
| 123 Main St, New York, NY |
| NULL                      |
| 789 Oak St, Chicago, IL   |
| 321 Pine St, Houston, TX  |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL   |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ  |
+---------------------------+
10 rows in set (0.00 sec)

결과 집합의 두 번째 요소가 `NULL`로 나타납니다.

하지만, 우리는 주소에 대한 어느 정도의 정보를 얻기 위해 도시와 주를 연결한 결과는 얻고 싶을 수 있습니다. 이런 NULL 값이 있는 경우, CONCAT 함수 대신 CONCAT_WS 함수를 사용할 수 있습니다. 작동 방식을 알아보겠습니다.

CONCAT_WS를 사용하여 연결 시 NULL 값 처리

CONCAT_WS는 연결하려는 필드에 NULL 값이 있을 수 있다고 의심될 때 사용할 수 있는 CONCAT의 대안입니다.

CONCAT_WS 함수의 사용법은 다음과 같습니다.

CONCAT_WS(separator, string_1, string_2,..., string_n)

이제 다음 SELECT 쿼리를 실행해 보겠습니다.

SELECT CONCAT_WS(', ', street, city, state) AS full_address FROM employees;

결과는 다음과 같습니다.

+---------------------------+
| full_address              |
+---------------------------+
| 123 Main St, New York, NY |
| Boston, MA                |
| 789 Oak St, Chicago, IL   |
| 321 Pine St, Houston, TX  |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL   |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ  |
+---------------------------+
10 rows in set (0.01 sec)

보시는 바와 같이, 결과 집합의 두 번째 항목에서 `street` 필드가 NULL 값이므로 'Boston, MA'가 출력되었습니다.

⚠ CONCAT_WS를 사용할 때는 반드시 구분 기호를 지정해야 합니다. 구분 기호를 지정하지 않으면 하나 이상의 열이 NULL일 경우 결과가 NULL이 됩니다(CONCAT과 유사).

마무리

이제까지 배운 내용을 정리해 보겠습니다.

  • 데이터베이스 테이블에서 데이터를 조회할 때, 여러 문자열 열을 연결하여 더 유용하고 읽기 쉬운 쿼리 결과를 만들 수 있습니다. 이를 위해 SQL에서는 CONCAT 함수와 함께 `CONCAT(string_1, string_2, ..., string_n)` 문법을 사용할 수 있습니다.
  • 문자열 리터럴, 열 또는 이들의 조합을 연결할 수 있습니다. 하지만 연결 대상에 하나 이상의 NULL 값이 있는 경우, 해당 레코드의 결과는 NULL이 됩니다. 이러한 문제를 해결하기 위해서는 `CONCAT_WS(separator, string_1, string_2, ..., string_n)` 문법과 함께 CONCAT_WS 함수를 사용할 수 있습니다.
  • CONCAT_WS는 지정된 구분 기호를 사용하여 NULL 값을 건너뛰고 존재하는 문자열만 연결함으로써 NULL 값을 보다 효율적으로 처리합니다.

SQL 명령어와 사용법에 대한 빠른 참조를 위해 이 SQL 치트 시트를 북마크에 추가해 보세요.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.