Основно ръководство за начинаещи

Искате ли да свържете две или повече низови колони в 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);

Тук 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)

На практика обаче може да искате да свържете необходимите колони в таблица на база данни, а не низови литерали. Така че нека кодираме някои примери с помощта на функцията 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: Конструиране на адреси

Сега нека вземем друг пример.

  7 Надеждно API решение за времето за вашите интелигентни продукти

Имаме колони улица, град и държава в таблицата на служителите. Така че можем да изберем 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.

  Увеличете „Код на грешка 10004“ в минути

Но бихме искали изходът да бъде конкатенацията на колоните за град и щат, за да добием груба представа за адреса. Когато имате такива 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“, тъй като полето street е 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 Cheat Sheet.