Podstawowy przewodnik dla początkujących

Chcesz połączyć dwie lub więcej kolumn ciągów w SQL? Dowiedz się, jak używać funkcji SQL CONCAT do łączenia ciągów.

Podczas wysyłania zapytań do tabeli bazy danych może czasami zaistnieć potrzeba połączenia wielu kolumn tekstowych/ciągów znaków zamiast pobierania danych z pojedynczej kolumny. Jest to przydatne, gdy potrzebny jest łatwiejszy do interpretacji i czytelny wynik.

Na przykład możesz wybrać pole imię i nazwisko, łącząc pola imię i nazwisko. Podobnie możesz uzyskać pełny_adres, łącząc ulicę, miasto, stan i inne niezbędne pola.

W języku SQL można użyć funkcji CONCAT do łączenia ciągów. W tym przewodniku omówimy:

  • Składnia funkcji SQL CONCAT
  • Przykłady użycia
  • Obsługa wartości NULL w jednej lub większej liczbie kolumn podczas łączenia

Zacznijmy!

Składnia funkcji SQL CONCAT

Składnia korzystania z funkcji SQL CONCAT jest następująca:

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

Tutaj string_1, string_2, …, string n oznaczają ciągi, które mają zostać połączone. Mogą to być literały łańcuchowe, kolumny lub kombinacja obu.

Łączenie literałów łańcuchowych za pomocą CONCAT

Ponieważ funkcji CONCAT można również użyć do łączenia literałów łańcuchowych, spróbujmy zakodować prosty przykład.

Tutaj łączymy ciągi „Hello” i „world!” jako ciąg powitalny:

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

Uruchomienie powyższego zapytania da następujące dane wyjściowe:

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

W praktyce jednak możesz chcieć połączyć wymagane kolumny w tabeli bazy danych, a nie literały łańcuchowe. Zakodujmy więc kilka przykładów przy użyciu funkcji CONCAT w języku SQL.

Jak łączyć kolumny w SQL

Następnie przejdźmy do wykonywania zapytań do tabeli bazy danych.

📑 Wszystkie przykładowe zapytania w tym samouczku zostały uruchomione na serwerze MySQL’a tabela bazy danych. Ale możesz także śledzić w innym wybranym RDBMS.

Tworzenie tabeli bazy danych z rekordami

Stwórzmy bazę danych, z której będziemy mogli skorzystać:

CREATE DATABASE db1;
use db1;

Stwórzmy tabelę pracowników w bazie danych db1. Aby to zrobić, uruchom instrukcję CREATE TABLE z następującymi kolumnami i odpowiadającymi im typami danych:

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

Następnie wstawmy kilka rekordów do tabeli pracowników:

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

Przykład 1: Wyświetl pełne imiona i nazwiska

W pierwszym przykładzie połączmy kolumny imię i nazwisko, aby uzyskać pełne imię i nazwisko. Aby to zrobić, możemy użyć funkcji SQL CONCAT w zapytaniu SELECT, jak pokazano:

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

Powinieneś otrzymać następujące dane wyjściowe:

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

Oprócz imienia i nazwiska zauważ, że jako separatora użyliśmy także spacji — określonej przez dosłowny ciąg „ ”.

Przykład 2: Konstruowanie adresów

Weźmy teraz inny przykład.

W tabeli pracowników mamy kolumny ulicy, miasta i stanu. Możemy więc wybrać pełny_adres, łącząc te trzy pola za pomocą przecinka jako separatora:

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

Oto dane wyjściowe:

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

Przykład 3: Utwórz adresy URL profilu

Przypomnijmy, że w tabeli pracowników mamy pole nazwy użytkownika.

Załóżmy, że masz domenę główną https://www.example.com/, a profile użytkowników znajdują się pod adresem https://www.example.com/user. Możesz wygenerować profil_url za pomocą funkcji CONCAT w następujący sposób:

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

Jak widać, otrzymujemy adresy URL profili wszystkich pracowników:

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

Obsługa wartości NULL

W tabeli pracowników wszystkie rekordy mają wszystkie pola. Ale co, jeśli masz jedno lub więcej pól z wartościami NULL?

Weźmy przykład dla tego przypadku. Tutaj aktualizujemy rekord odpowiadający ID = 2, aby ustawić kolumnę ulicy na 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

Teraz używamy CONCAT, aby wybrać pełny_adres:

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

Oto dane wyjściowe:

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

Zauważ, że drugi element w zestawie wyników ma wartość NULL.

Chcielibyśmy jednak, aby wynikiem było połączenie kolumn miasta i stanu, aby uzyskać przybliżony obraz adresu. Jeśli masz takie wartości NULL, możesz użyć CONCAT_WS jako alternatywy dla funkcji CONCAT. Zobaczmy jak to działa.

Używanie CONCAT_WS do obsługi wartości NULL podczas łączenia

CONCAT_WS jest alternatywą dla CONCAT, której można użyć, jeśli podejrzewasz, że jedno lub więcej pól zawiera wartości NULL.

Możesz użyć funkcji CONCAT_WS w następujący sposób:

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

Teraz uruchom następujące zapytanie SELECT:

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

Otrzymasz następujące dane wyjściowe:

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

Jak widać, dla drugiego elementu w zestawie wyników otrzymujemy „Boston MA”, ponieważ pole ulicy ma wartość NULL.

⚠ Używając CONCAT_WS, wymagane jest określenie separatora. Jeśli nie określisz separatora, wynikiem będzie NULL, jeśli jedna lub więcej kolumn ma wartość NULL (podobnie jak CONCAT).

Podsumowanie

Przyjrzyjmy się temu, czego się nauczyliśmy:

  • Kiedy wysyłasz zapytanie do tabeli bazy danych w celu pobrania danych, możesz połączyć wiele kolumn ciągów, aby uzyskać bardziej przydatne i łatwe do zinterpretowania wyniki zapytania. Można w tym celu użyć funkcji CONCAT w języku SQL o składni CONCAT(string_1, string_2, …, string_n).
  • Można łączyć literały łańcuchowe, kolumny lub kombinację obu. Jeśli jednak istnieje jedna lub więcej wartości NULL, wynikiem dla tego konkretnego rekordu będzie NULL. Aby sobie z tym poradzić, możesz użyć CONCAT_WS ze składnią CONCAT_WS(separator, ciąg_1, ciąg_2, …, ciąg_n).
  • CONCAT_WS obsługuje wartości NULL z większą gracją, łącząc tylko te ciągi, które są obecne przy użyciu określonego separatora.

Aby szybko przejrzeć polecenia SQL i ich użycie, możesz dodać tę ściągawkę SQL do zakładek.