Podstawowy przewodnik dla początkujących

Photo of author

By maciekx

Czy zastanawiałeś się, jak scalić ze sobą dwie lub więcej kolumn tekstowych w SQL? Odkryj, jak funkcja SQL CONCAT umożliwia łączenie ciągów znaków.

Podczas pracy z bazą danych, niekiedy zachodzi potrzeba połączenia zawartości kilku kolumn tekstowych, zamiast operowania na pojedynczej kolumnie. Taka operacja jest szczególnie użyteczna, gdy chcemy uzyskać bardziej zrozumiały i czytelny rezultat.

Przykładowo, można stworzyć pole z pełnym imieniem i nazwiskiem, łącząc dane z kolumn „imię” i „nazwisko”. Podobnie, możliwe jest uzyskanie pełnego adresu poprzez zestawienie pól takich jak ulica, miasto, województwo oraz inne potrzebne informacje.

W SQL, funkcję CONCAT stosuje się do łączenia ciągów znaków. W niniejszym przewodniku omówimy:

  • Strukturę funkcji SQL CONCAT
  • Przykłady jej zastosowania
  • Sposoby radzenia sobie z wartościami NULL w kolumnach podczas łączenia

Zacznijmy!

Struktura funkcji SQL CONCAT

Sposób użycia funkcji SQL CONCAT prezentuje się następująco:

CONCAT(ciąg_1, ciąg_2, ..., ciąg_n);

Gdzie `ciąg_1`, `ciąg_2`, …, `ciąg_n` reprezentują elementy tekstowe, które chcemy ze sobą połączyć. Mogą to być zarówno dosłowne ciągi znaków, odwołania do kolumn z tabeli, jak i ich kombinacja.

Łączenie literałów tekstowych za pomocą CONCAT

Funkcję CONCAT możemy wykorzystać również do łączenia stałych tekstowych. Spójrzmy na prosty przykład.

Złączmy ciągi „Witaj,” i „świecie!” w jeden napis powitalny:

SELECT CONCAT('Witaj, ', 'świecie!') AS powitanie;

Powyższe zapytanie zwróci następujący wynik:

+----------------+
| powitanie      |
+----------------+
| Witaj, świecie! |
+----------------+
1 row in set (0.00 sec)

W praktyce jednak częściej będziemy chcieli łączyć dane z kolumn tabeli, a nie stałe tekstowe. Przyjrzyjmy się zatem przykładom użycia funkcji CONCAT na bazie danych.

Jak łączyć kolumny w SQL

Przejdźmy do wykonywania zapytań na tabeli bazy danych.

📑 Przykładowe zapytania z tego poradnika zostały wykonane na serwerze MySQL. Jednakże, możesz korzystać z innego RDBMS, jeśli wolisz.

Tworzenie tabeli bazy danych z danymi

Stwórzmy bazę danych, której będziemy używać:

CREATE DATABASE baza_danych1;
use baza_danych1;

Utwórzmy tabelę z danymi o pracownikach w bazie `baza_danych1`. Aby tego dokonać, wykonaj polecenie `CREATE TABLE` z odpowiednimi kolumnami i typami danych:

CREATE TABLE pracownicy (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50),
    ulica VARCHAR(100),
    miasto VARCHAR(50),
    wojewodztwo VARCHAR(2),
    nazwa_uzytkownika VARCHAR(20)
);

Następnie, wstawmy kilka przykładowych rekordów do tabeli `pracownicy`:

INSERT INTO pracownicy (imie, nazwisko, ulica, miasto, wojewodztwo, nazwa_uzytkownika) VALUES
    ('Jan', 'Kowalski', 'ul. Główna 123', 'Warszawa', 'MA', 'jan123'),
    ('Alicja', 'Nowak', 'ul. Zielona 456', 'Kraków', 'MP', 'alicja456'),
    ('Robert', 'Lewandowski', 'ul. Dębowa 789', 'Poznań', 'WP', 'robert789'),
    ('Maria', 'Wiśniewska', 'ul. Sosnowa 321', 'Gdańsk', 'PM', 'maria456'),
    ('Jakub', 'Jankowski', 'ul. Brzozowa 555', 'Wrocław', 'DL', 'jakub789'),
    ('Emilia', 'Woźniak', 'ul. Klonowa 777', 'Katowice', 'SL', 'emilia123'),
    ('Michał', 'Dąbrowski', 'ul. Lipowa 999', 'Lublin', 'LU', 'michal456'),
    ('Jessica', 'Kaczmarek', 'ul. Akacjowa 111', 'Łódź', 'LD', 'jessica789'),
    ('William', 'Zieliński', 'ul. Kwiatowa 222', 'Szczecin', 'ZP', 'william123'),
    ('Sara', 'Szymańska', 'ul. Polna 444', 'Białystok', 'PD', 'sara456');

Przykład 1: Wyświetlanie pełnych imion i nazwisk

W pierwszym przykładzie połączymy kolumny `imie` i `nazwisko`, aby uzyskać pełne imię i nazwisko pracownika. Użyjemy do tego funkcji SQL CONCAT w zapytaniu `SELECT`, w następujący sposób:

SELECT CONCAT(imie, ' ', nazwisko) AS pelne_imie FROM pracownicy;

Wynik tego zapytania będzie wyglądał tak:

+-------------------+
| pelne_imie        |
+-------------------+
| Jan Kowalski      |
| Alicja Nowak      |
| Robert Lewandowski|
| Maria Wiśniewska  |
| Jakub Jankowski   |
| Emilia Woźniak    |
| Michał Dąbrowski  |
| Jessica Kaczmarek |
| William Zieliński |
| Sara Szymańska    |
+-------------------+
10 rows in set (0.00 sec)

Zwróć uwagę, że oprócz połączenia imienia i nazwiska użyliśmy spacji jako separatora, przekazując ją jako literał łańcuchowy „ ”.

Przykład 2: Tworzenie adresów

Rozważmy inny przykład.

W tabeli `pracownicy` znajdują się kolumny z adresem: `ulica`, `miasto` i `wojewodztwo`. Możemy stworzyć pełny adres, łącząc te trzy pola z przecinkiem jako separatorem:

SELECT CONCAT(ulica, ', ', miasto, ', ', wojewodztwo) AS pelny_adres FROM pracownicy;

Oto rezultat:

+--------------------------------+
| pelny_adres                    |
+--------------------------------+
| ul. Główna 123, Warszawa, MA   |
| ul. Zielona 456, Kraków, MP    |
| ul. Dębowa 789, Poznań, WP     |
| ul. Sosnowa 321, Gdańsk, PM    |
| ul. Brzozowa 555, Wrocław, DL  |
| ul. Klonowa 777, Katowice, SL  |
| ul. Lipowa 999, Lublin, LU     |
| ul. Akacjowa 111, Łódź, LD     |
| ul. Kwiatowa 222, Szczecin, ZP |
| ul. Polna 444, Białystok, PD   |
+--------------------------------+
10 rows in set (0.00 sec)

Przykład 3: Tworzenie adresów URL profili

Przypomnijmy, że w tabeli `pracownicy` mamy kolumnę z nazwą użytkownika.

Załóżmy, że domena strony to `https://www.przyklad.com/`, a profile użytkowników są pod adresem `https://www.przyklad.com/user`. Możemy wygenerować adres URL profilu za pomocą funkcji CONCAT w następujący sposób:

SELECT CONCAT('https://www.przyklad.com/user/', nazwa_uzytkownika) AS adres_profilu FROM pracownicy;

W ten sposób uzyskujemy adresy URL profili wszystkich pracowników:

+--------------------------------------------+
| adres_profilu                             |
+--------------------------------------------+
| https://www.przyklad.com/user/jan123       |
| https://www.przyklad.com/user/alicja456    |
| https://www.przyklad.com/user/robert789    |
| https://www.przyklad.com/user/maria456     |
| https://www.przyklad.com/user/jakub789     |
| https://www.przyklad.com/user/emilia123    |
| https://www.przyklad.com/user/michal456    |
| https://www.przyklad.com/user/jessica789   |
| https://www.przyklad.com/user/william123   |
| https://www.przyklad.com/user/sara456      |
+--------------------------------------------+
10 rows in set (0.00 sec)

Obsługa wartości NULL

W naszej tabeli `pracownicy` wszystkie rekordy mają wypełnione wszystkie pola. Co jednak w sytuacji, gdy jedna lub więcej kolumn zawiera wartość NULL?

Rozważmy taki scenariusz. Zaktualizujmy rekord o ID = 2, ustawiając kolumnę `ulica` na NULL:

UPDATE pracownicy
SET ulica = NULL
WHERE ID = 2; -- Aktualizuj rekord o ID równym 2
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Teraz, wykorzystajmy CONCAT, aby wybrać pełny adres:

SELECT CONCAT(ulica, ', ', miasto, ', ', wojewodztwo) AS pelny_adres FROM pracownicy;

Oto wyniki:

+--------------------------------+
| pelny_adres                    |
+--------------------------------+
| ul. Główna 123, Warszawa, MA   |
| NULL                           |
| ul. Dębowa 789, Poznań, WP     |
| ul. Sosnowa 321, Gdańsk, PM    |
| ul. Brzozowa 555, Wrocław, DL  |
| ul. Klonowa 777, Katowice, SL  |
| ul. Lipowa 999, Lublin, LU     |
| ul. Akacjowa 111, Łódź, LD     |
| ul. Kwiatowa 222, Szczecin, ZP |
| ul. Polna 444, Białystok, PD   |
+--------------------------------+
10 rows in set (0.00 sec)

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

Chcielibyśmy jednak, aby w takim przypadku wynikiem było połączenie miasta i województwa, aby uzyskać chociaż przybliżony adres. Jeżeli masz do czynienia z wartościami NULL, jako alternatywę dla CONCAT możesz wykorzystać CONCAT_WS. Zobaczmy, jak to działa.

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

CONCAT_WS jest alternatywą dla CONCAT, którą można zastosować, gdy istnieje podejrzenie, że jedno lub więcej pól może zawierać wartości NULL.

Funkcję CONCAT_WS stosujemy w następujący sposób:

CONCAT_WS(separator, ciąg_1, ciąg_2,..., ciąg_n)

Teraz, wykonajmy poniższe zapytanie `SELECT`:

SELECT CONCAT_WS(', ', ulica, miasto, wojewodztwo) AS pelny_adres FROM pracownicy;

Wynikiem będzie:

+--------------------------------+
| pelny_adres                    |
+--------------------------------+
| ul. Główna 123, Warszawa, MA   |
| Kraków, MP                     |
| ul. Dębowa 789, Poznań, WP     |
| ul. Sosnowa 321, Gdańsk, PM    |
| ul. Brzozowa 555, Wrocław, DL  |
| ul. Klonowa 777, Katowice, SL  |
| ul. Lipowa 999, Lublin, LU     |
| ul. Akacjowa 111, Łódź, LD     |
| ul. Kwiatowa 222, Szczecin, ZP |
| ul. Polna 444, Białystok, PD   |
+--------------------------------+
10 rows in set (0.01 sec)

Jak widać, dla drugiego elementu zestawu wyników otrzymujemy „Kraków, MP”, ponieważ kolumna `ulica` miała wartość NULL.

⚠ Używając CONCAT_WS, musimy określić separator. Jeżeli nie podamy separatora, wynik będzie NULL, jeśli jedna lub więcej kolumn ma wartość NULL (podobnie jak w przypadku CONCAT).

Podsumowanie

Spójrzmy na to, czego się nauczyliśmy:

  • Podczas pobierania danych z tabeli w bazie danych, możesz połączyć wiele kolumn tekstowych, aby uzyskać bardziej praktyczne i czytelne wyniki. W tym celu możemy użyć funkcji CONCAT w SQL o składni `CONCAT(ciąg_1, ciąg_2, …, ciąg_n)`.
  • Możemy łączyć ze sobą literały tekstowe, kolumny lub ich kombinację. Jeżeli jednak wystąpi jedna lub więcej wartości NULL, wynikiem dla danego rekordu będzie NULL. Aby sobie z tym poradzić, możemy zastosować CONCAT_WS o składni `CONCAT_WS(separator, ciąg_1, ciąg_2, …, ciąg_n)`.
  • CONCAT_WS lepiej obsługuje wartości NULL, łącząc tylko te ciągi, które mają wartość, używając zadanego separatora.

Aby szybko powrócić do poleceń SQL, możesz dodać ten ściągawkę SQL do zakładek.


newsblog.pl