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

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

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

Наприклад, можна сформувати поле `повне_ім’я`, поєднавши стовпці `ім’я` та `прізвище`. Аналогічно, можна створити `повну_адресу`, з’єднавши вулицю, місто, область та інші необхідні поля.

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

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

Розпочнімо!

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

Синтаксис функції `SQL CONCAT` виглядає так:

CONCAT(рядок_1, рядок_2, ..., рядок_n);

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

З’єднання текстових констант за допомогою CONCAT

Функція `CONCAT` підходить також для з’єднання текстових констант, давайте розглянемо це на простому прикладі.

Тут ми об’єднуємо рядки “Привіт,” та “світ!” в один привітальний рядок:

SELECT CONCAT('Привіт, ', 'світ!') AS привітання;

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

+----------------+
| привітання      |
+----------------+
| Привіт, світ! |
+----------------+
1 рядок у наборі (0.00 сек)

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

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

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

📑 Усі приклади запитів у цьому посібнику були виконані в MySQL базі даних. Але ви можете використовувати будь-яку іншу СУБД.

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

Створимо базу даних для нашої роботи:

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
    ('Іван', 'Петренко', 'вул. Шевченка 12', 'Київ', 'КВ', 'ivan123'),
    ('Олена', 'Сидоренко', 'вул. Хрещатик 24', 'Харків', 'ХА', 'olena456'),
    ('Петро', 'Мельник', 'вул. Садова 36', 'Львів', 'ЛЬ', 'petro789'),
    ('Марія', 'Ковальчук', 'вул. Липова 48', 'Одеса', 'ОД', 'maria456'),
    ('Андрій', 'Ткаченко', 'вул. Вишнева 60', 'Дніпро', 'ДН', 'andriy789'),
    ('Софія', 'Бондаренко', 'вул. Польова 72', 'Вінниця', 'ВН', 'sofia123'),
    ('Михайло', 'Кравченко', 'вул. Паркова 84', 'Полтава', 'ПО', 'mykhailo456'),
     ('Вікторія', 'Марченко', 'вул. Зелена 96', 'Черкаси', 'ЧК', 'viktoria789'),
    ('Назар', 'Костенко', 'вул. Берегова 108', 'Чернігів', 'ЧГ', 'nazar123'),
    ('Тетяна', 'Романенко', 'вул. Сонячна 120', 'Херсон', 'ХС', 'tetiana456');

Приклад 1: Відображення повних імен

Розглянемо приклад об’єднання стовпців `first_name` і `last_name` для отримання повного імені. Для цього ми застосуємо функцію `SQL CONCAT` у запиті `SELECT`:

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

Результат буде наступним:

+------------------+
| full_name        |
+------------------+
| Іван Петренко    |
| Олена Сидоренко  |
| Петро Мельник    |
| Марія Ковальчук  |
| Андрій Ткаченко  |
| Софія Бондаренко |
| Михайло Кравченко|
| Вікторія Марченко|
| Назар Костенко   |
| Тетяна Романенко |
+------------------+
10 рядків у наборі (0.00 сек)

Зауважте, що окрім `first_name` і `last_name` ми використали пробіл як роздільник, визначений текстовою константою ‘ ‘.

Приклад 2: Формування адрес

Перейдемо до наступного прикладу.

У таблиці `співробітники` є стовпці з назвою вулиці, міста та області. Ми можемо сформувати `повну_адресу`, з’єднавши ці три поля з комою як роздільником:

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

Ось результат:

+--------------------------------+
| full_address                   |
+--------------------------------+
| вул. Шевченка 12, Київ, КВ     |
| вул. Хрещатик 24, Харків, ХА   |
| вул. Садова 36, Львів, ЛЬ      |
| вул. Липова 48, Одеса, ОД      |
| вул. Вишнева 60, Дніпро, ДН   |
| вул. Польова 72, Вінниця, ВН   |
| вул. Паркова 84, Полтава, ПО   |
| вул. Зелена 96, Черкаси, ЧК    |
| вул. Берегова 108, Чернігів, ЧГ|
| вул. Сонячна 120, Херсон, ХС  |
+--------------------------------+
10 рядків у наборі (0.00 сек)

Приклад 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/ivan123             |
| https://www.example.com/user/olena456            |
| https://www.example.com/user/petro789            |
| https://www.example.com/user/maria456            |
| https://www.example.com/user/andriy789           |
| https://www.example.com/user/sofia123            |
| https://www.example.com/user/mykhailo456         |
| https://www.example.com/user/viktoria789         |
| https://www.example.com/user/nazar123            |
| https://www.example.com/user/tetiana456          |
+------------------------------------------------+
10 рядків у наборі (0.00 сек)

Обробка значень NULL

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

Розглянемо приклад. Оновимо запис із `ID = 2`, встановивши для стовпця вулиці значення `NULL`:

UPDATE employees
SET street = NULL
WHERE ID = 2; -- Оновлення запису з ID 2
Запит OK, 1 рядок змінено (0.05 сек)
Рядків знайдено: 1 Змінено: 1 Попередження: 0

Тепер застосуємо `CONCAT` для отримання `full_address`:

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

Результат буде наступним:

+--------------------------------+
| full_address                   |
+--------------------------------+
| вул. Шевченка 12, Київ, КВ     |
| NULL                           |
| вул. Садова 36, Львів, ЛЬ      |
| вул. Липова 48, Одеса, ОД      |
| вул. Вишнева 60, Дніпро, ДН   |
| вул. Польова 72, Вінниця, ВН   |
| вул. Паркова 84, Полтава, ПО   |
| вул. Зелена 96, Черкаси, ЧК    |
| вул. Берегова 108, Чернігів, ЧГ|
| вул. Сонячна 120, Херсон, ХС  |
+--------------------------------+
10 рядків у наборі (0.00 сек)

Зверніть увагу, що другий елемент у вибірці має значення `NULL`.

Проте, нам потрібен результат об’єднання міста та області, щоб хоч приблизно зрозуміти адресу. У таких випадках, коли є значення `NULL`, можна скористатись функцією `CONCAT_WS` як альтернативою `CONCAT`. Розглянемо, як це працює.

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

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

Функція `CONCAT_WS` використовується так:

CONCAT_WS(роздільник, рядок_1, рядок_2,..., рядок_n)

Виконаємо наступний запит `SELECT`:

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

Отримаємо такий результат:

+--------------------------------+
| full_address                   |
+--------------------------------+
| вул. Шевченка 12, Київ, КВ     |
| Харків, ХА                     |
| вул. Садова 36, Львів, ЛЬ      |
| вул. Липова 48, Одеса, ОД      |
| вул. Вишнева 60, Дніпро, ДН   |
| вул. Польова 72, Вінниця, ВН   |
| вул. Паркова 84, Полтава, ПО   |
| вул. Зелена 96, Черкаси, ЧК    |
| вул. Берегова 108, Чернігів, ЧГ|
| вул. Сонячна 120, Херсон, ХС  |
+--------------------------------+
10 рядків у наборі (0.01 сек)

Як бачимо, для другого елемента набору ми отримали “Харків, ХА”, оскільки поле “вулиця” має значення `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.