Базовий посібник для початківців

Хочете об’єднати два чи більше рядкових стовпців у SQL? Дізнайтеся, як використовувати функцію SQL CONCAT для об’єднання рядків.

Коли ви надсилаєте запит до таблиці бази даних, іноді може знадобитися об’єднати кілька текстових/рядкових стовпців замість того, щоб отримувати дані з одного стовпця. Це корисно, коли вам потрібен простий для тлумачення та читабельний вихід.

Наприклад, ви можете вибрати поле full_name, об’єднавши поля first_name і last_name. Подібним чином ви можете отримати full_address, об’єднавши вулицю, місто, штат та інші необхідні поля.

У SQL ви можете використовувати функцію CONCAT для об’єднання рядків. У цьому посібнику ми розглянемо:

  • Синтаксис функції SQL CONCAT
  • Приклади використання
  • Обробка значень NULL в одному або кількох стовпцях під час конкатенації

Давайте розпочнемо!

Синтаксис функції SQL CONCAT

Синтаксис використання функції SQL CONCAT такий:

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

Тут рядок_1, рядок_2, …, рядок n позначають рядки, які потрібно об’єднати. Це можуть бути рядкові літерали або стовпці або їх комбінація.

Конкатенація рядкових літералів за допомогою CONCAT

Оскільки функцію CONCAT також можна використовувати для конкатенації рядкових літералів, давайте спробуємо закодувати простий приклад.

Тут ми об’єднуємо рядки «Hello,» і «world!» як рядок привітання:

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

Виконання наведеного вище запиту дасть вам такі результати:

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

Однак на практиці ви можете об’єднати необхідні стовпці в таблиці бази даних, а не рядкові літерали. Отже, давайте напишемо кілька прикладів за допомогою функції CONCAT у SQL.

Як об’єднати стовпці в SQL

Далі перейдемо до запиту до таблиці бази даних.

📑 Усі приклади запитів у цьому підручнику виконано на a MySQL таблиця бази даних. Але ви також можете слідувати в іншій RDBMS на ваш вибір.

Створення таблиці бази даних із записами

Давайте створимо базу даних, яку ми зможемо використовувати:

CREATE DATABASE db1;
use db1;

Давайте створимо таблицю співробітників у базі даних db1. Для цього запустіть інструкцію CREATE TABLE із такими стовпцями та відповідними типами даних:

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)
);

Далі вставимо кілька записів у таблицю співробітників:

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: Створення адрес

Тепер візьмемо інший приклад.

У нас є стовпці вулиці, міста та штату в таблиці працівників. Отже, ми можемо вибрати 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-адрес профілю

Згадайте, що в таблиці співробітників є поле імені користувача.

Скажімо, у вас є кореневий домен https://www.example.com/, а профілі користувачів знаходяться за адресою https://www.example.com/user. Ви можете створити profile_url за допомогою функції CONCAT таким чином:

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

У таблиці співробітників усі записи мають усі поля. Але що, якщо у вас є одне або кілька полів із значеннями NULL?

Візьмемо приклад для цього випадку. Тут ми оновлюємо запис, що відповідає ID = 2, щоб встановити для стовпця вулиці значення NULL:

UPDATE employees
SET street = NULL
WHERE ID = 2; -- Update the record with 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_WS як альтернативу функції CONCAT. Давайте подивимося, як це працює.

Використання CONCAT_WS для обробки значень NULL під час конкатенації

CONCAT_WS — це альтернатива CONCAT, яку можна використовувати, якщо ви підозрюєте, що одне або кілька полів містять значення NULL.

Ви можете використовувати функцію 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)

Як бачимо, для другого елемента в наборі результатів ми отримуємо «Boston MA», оскільки поле «вулиця» має значення NULL.

⚠ При використанні CONCAT_WS необхідно вказати роздільник. Якщо ви не вкажете роздільник, тоді результатом буде NULL, якщо один або кілька стовпців мають значення NULL (подібно до CONCAT).

Підведенню

Давайте повторимо, що ми навчилися:

  • Коли ви надсилаєте запит до таблиці бази даних для отримання даних, ви можете об’єднати кілька рядкових стовпців, щоб отримати більш корисні та прості для інтерпретації результати запиту. Для цього ви можете використовувати функцію CONCAT у SQL із синтаксисом CONCAT(рядок_1, рядок_2, …, рядок_n).
  • Ви можете об’єднувати рядкові літерали, стовпці або їх комбінацію. Однак, якщо є одне або більше значень NULL, результат для цього конкретного запису буде NULL. Для цього можна використовувати CONCAT_WS із синтаксисом CONCAT_WS(роздільник, рядок_1, рядок_2, …, рядок_n).
  • CONCAT_WS обробляє значення NULL більш витончено, об’єднуючи лише ті рядки, які присутні, використовуючи вказаний роздільник.

Щоб швидко ознайомитися з командами SQL та їх використанням, ви можете створити закладку для цієї шпаргалки SQL.