Základní průvodce pro začátečníky

Chcete zřetězit dva nebo více sloupců řetězců v SQL? Naučte se používat funkci SQL CONCAT ke zřetězení řetězců.

Při dotazu na databázovou tabulku může být někdy nutné zřetězit více sloupců textu/řetězce namísto načítání dat z jednoho sloupce. To je užitečné, když potřebujete snadněji interpretovatelný a čitelný výstup.

Můžete například vybrat pole full_name zřetězením polí first_name a last_name. Podobně můžete získat úplnou_adresu zřetězením ulice, města, státu a dalších nezbytných polí.

V SQL můžete ke zřetězení řetězců použít funkci CONCAT. V této příručce projdeme:

  • Syntaxe funkce SQL CONCAT
  • Příklady použití
  • Zpracování hodnot NULL v jednom nebo více sloupcích během zřetězení

Začněme!

Syntaxe funkce SQL CONCAT

Syntaxe pro použití funkce SQL CONCAT je následující:

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

Řetězec_1, řetězec_2, …, řetězec n zde označují řetězce, které mají být zřetězeny. Mohou to být řetězcové literály nebo sloupce nebo kombinace obou.

Zřetězení řetězcových literálů pomocí CONCAT

Protože funkci CONCAT lze použít i ke zřetězení řetězcových literálů, zkusme si nakódovat jednoduchý příklad.

Zde zřetězujeme řetězce ‚Ahoj,‘ a ‚svět!‘ jako pozdravný řetězec:

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

Spuštěním výše uvedeného dotazu získáte následující výstup:

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

V praxi však možná budete chtít zřetězit požadované sloupce v databázové tabulce a ne řetězcové literály. Pojďme tedy kódovat některé příklady pomocí funkce CONCAT v SQL.

Jak zřetězit sloupce v SQL

Dále přejdeme k dotazování databázové tabulky.

📑 Všechny ukázkové dotazy v tomto tutoriálu byly spuštěny na a MySQL databázová tabulka. Ale můžete také pokračovat v jiném RDBMS dle vašeho výběru.

  Jak zobrazit uložená hesla na Macu

Vytvoření databázové tabulky se záznamy

Vytvořme databázi, kterou můžeme použít:

CREATE DATABASE db1;
use db1;

Vytvořme tabulku zaměstnanců v databázi db1. Chcete-li tak učinit, spusťte příkaz CREATE TABLE s následujícími sloupci a odpovídajícími datovými typy:

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

Dále vložíme několik záznamů do tabulky zaměstnanců:

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

Příklad 1: Zobrazení celých jmen

Jako první příklad zřetězíme sloupce first_name a last_name, abychom získali celé jméno. K tomu můžeme použít funkci SQL CONCAT v dotazu SELECT, jak je znázorněno:

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

Měli byste získat následující výstup:

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

Všimněte si, že kromě křestního_jména a příjmení jsme jako oddělovač použili také mezeru – určenou doslovným řetězcem ‚ ‚.

Příklad 2: Sestavte adresy

Nyní si uveďme další příklad.

V tabulce zaměstnanců máme sloupce ulice, město a stát. Můžeme tedy vybrat úplnou_adresu zřetězením těchto tří polí čárkou jako oddělovačem:

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

Zde je výstup:

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

Příklad 3: Vytvořte adresy URL profilu

Připomeňme, že v tabulce zaměstnanců máme pole uživatelského jména.

  Jak změnit ikonu složky na Macu

Řekněme, že máte kořenovou doménu https://www.example.com/ a uživatelské profily jsou na https://www.example.com/user. Profil_url můžete vygenerovat pomocí funkce CONCAT takto:

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

Jak je vidět, dostáváme adresy URL profilu pro všechny zaměstnance:

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

Zpracování hodnot NULL

V tabulce zaměstnanců mají všechny záznamy všechna pole. Ale co když máte jedno nebo více polí s hodnotami NULL?

Vezměme si příklad pro tento případ. Zde aktualizujeme záznam odpovídající ID = 2, abychom nastavili sloupec ulice 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

Nyní použijeme CONCAT k výběru úplné_adresy:

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

Zde je výstup:

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

Všimněte si, že druhý prvek v sadě výsledků má hodnotu NULL.

  Jak blokovat přímé zasílání zpráv na Instagramu

Byli bychom ale rádi, kdyby výstup byl zřetězením sloupců města a státu, abychom získali přibližnou představu o adrese. Pokud máte takové hodnoty NULL, můžete použít CONCAT_WS jako alternativu k funkci CONCAT. Pojďme se podívat, jak to funguje.

Použití CONCAT_WS ke zpracování hodnot NULL během zřetězení

CONCAT_WS je alternativou k CONCAT, kterou lze použít, pokud se domníváte, že jedno nebo více polí obsahuje hodnoty NULL.

Funkci CONCAT_WS můžete použít takto:

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

Nyní spusťte následující dotaz SELECT:

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

Získáte následující výstup:

+---------------------------+
| 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 je vidět, pro druhou položku v sadě výsledků dostaneme ‚Boston MA‘, protože pole ulice je NULL.

⚠ Při použití CONCAT_WS je nutné zadat oddělovač. Pokud nezadáte oddělovač, bude výsledkem NULL, pokud je jeden nebo více sloupců NULL (podobně jako CONCAT).

Zabalit se

Zopakujme si, co jsme se naučili:

  • Když dotazujete databázovou tabulku za účelem načtení dat, možná budete chtít zřetězit více sloupců řetězců, abyste získali užitečnější a snáze interpretovatelné výsledky dotazu. K tomu můžete použít funkci CONCAT v SQL se syntaxí CONCAT(řetězec_1, řetězec_2, …, řetězec_n).
  • Můžete zřetězit řetězcové literály, sloupce nebo kombinaci obou. Pokud však existuje jedna nebo více hodnot NULL, výsledek pro tento konkrétní záznam je NULL. Chcete-li to zvládnout, můžete použít CONCAT_WS se syntaxí CONCAT_WS(separátor, řetězec_1, řetězec_2, …, řetězec_n).
  • CONCAT_WS zpracovává hodnoty NULL elegantněji tím, že zřetězí pouze ty řetězce, které jsou přítomny, pomocí zadaného oddělovače.

Pro rychlý přehled SQL příkazů a jejich použití si můžete tento SQL Cheat Sheet uložit do záložek.