Hướng dẫn cơ bản cho người mới bắt đầu

Spread the love

Bạn muốn nối hai hoặc nhiều cột chuỗi trong SQL? Tìm hiểu cách sử dụng hàm SQL CONCAT để nối chuỗi.

Khi truy vấn một bảng cơ sở dữ liệu, đôi khi bạn có thể cần nối nhiều cột văn bản/chuỗi thay vì truy xuất dữ liệu từ một cột duy nhất. Điều này rất hữu ích khi bạn cần một kết quả đầu ra dễ hiểu và dễ đọc hơn.

Ví dụ: bạn có thể chọn trường full_name bằng cách nối các trường first_name và Last_name. Tương tự, bạn có thể lấy full_address bằng cách ghép đường phố, thành phố, tiểu bang và các trường cần thiết khác.

Trong SQL, bạn có thể sử dụng hàm CONCAT để nối các chuỗi. Trong hướng dẫn này, chúng ta sẽ đi qua:

  • Cú pháp của hàm SQL CONCAT
  • Ví dụ sử dụng
  • Xử lý các giá trị NULL trong một hoặc nhiều cột trong quá trình nối

Bắt đầu nào!

Cú pháp của hàm CONCAT trong SQL

Cú pháp sử dụng hàm CONCAT trong SQL như sau:

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

Ở đây string_1, string_2, …, string n biểu thị các chuỗi cần nối. Đây có thể là chuỗi ký tự hoặc cột hoặc kết hợp cả hai.

Nối các chuỗi ký tự bằng CONCAT

Vì hàm CONCAT cũng có thể được sử dụng để nối các chuỗi ký tự bằng chữ, chúng ta hãy thử viết mã một ví dụ đơn giản.

Ở đây chúng ta nối các chuỗi ‘Xin chào, ‘ và ‘world!’ như chuỗi lời chào:

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

Chạy truy vấn trên sẽ cho bạn kết quả đầu ra sau:

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

Tuy nhiên, trong thực tế, bạn có thể muốn nối các cột bắt buộc trong bảng cơ sở dữ liệu chứ không phải chuỗi ký tự. Vì vậy, hãy viết mã một số ví dụ bằng cách sử dụng hàm CONCAT trong SQL.

  2 cách dễ dàng để xóa kho lưu trữ GitHub

Cách nối các cột trong SQL

Tiếp theo, hãy chuyển sang truy vấn bảng cơ sở dữ liệu.

📑 Tất cả các truy vấn mẫu trong hướng dẫn này đều được chạy trên một MySQL bảng cơ sở dữ liệu. Nhưng bạn cũng có thể theo dõi một RDBMS khác mà bạn chọn.

Tạo bảng cơ sở dữ liệu với các bản ghi

Hãy tạo một cơ sở dữ liệu mà chúng ta có thể sử dụng:

CREATE DATABASE db1;
use db1;

Hãy tạo một bảng nhân viên trong cơ sở dữ liệu db1. Để làm như vậy, hãy chạy câu lệnh CREATE TABLE với các cột sau và kiểu dữ liệu tương ứng:

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

Tiếp theo, hãy chèn một vài bản ghi vào bảng nhân viên:

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

Ví dụ 1: Hiển thị tên đầy đủ

Ví dụ đầu tiên, hãy ghép các cột first_name và Last_name để có được full_name. Để làm như vậy, chúng ta có thể sử dụng hàm SQL CONCAT trong truy vấn SELECT như sau:

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

Bạn sẽ nhận được kết quả đầu ra sau:

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

Ngoài first_name và Last_name, hãy lưu ý rằng chúng tôi cũng đã sử dụng khoảng trắng làm dấu phân cách—được chỉ định bởi chuỗi ký tự ‘ ‘.

Ví dụ 2: Xây dựng địa chỉ

Bây giờ hãy lấy một ví dụ khác.

Chúng ta có các cột đường phố, thành phố và tiểu bang trong bảng nhân viên. Vì vậy, chúng ta có thể chọn full_address bằng cách nối ba trường này bằng dấu phẩy làm dấu phân cách:

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

Đây là đầu ra:

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

Ví dụ 3: Tạo URL hồ sơ

Hãy nhớ rằng chúng ta có trường tên người dùng trong bảng nhân viên.

  Cách thêm số liên lạc vào mục ưa thích trên iPhone

Giả sử bạn có miền gốc https://www.example.com/ và hồ sơ người dùng có tại https://www.example.com/user. Bạn có thể tạo profile_url bằng hàm CONCAT như sau:

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

Như đã thấy, chúng tôi nhận được URL hồ sơ của tất cả nhân viên:

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

Xử lý giá trị NULL

Trong bảng nhân viên, tất cả các bản ghi đều có tất cả các trường. Nhưng nếu bạn có một hoặc nhiều trường có giá trị NULL thì sao?

Hãy lấy một ví dụ cho trường hợp này. Ở đây chúng ta cập nhật bản ghi tương ứng với ID=2 để thiết lập cột đường phố về 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

Bây giờ chúng tôi sử dụng CONCAT để chọn full_address:

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

Đây là đầu ra:

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

Lưu ý rằng phần tử thứ hai trong tập kết quả là NULL.

  Cách nhấp chuột phải trên bất kỳ máy Mac nào bằng bàn di chuột, chuột hoặc bàn phím

Nhưng chúng tôi muốn kết quả đầu ra là sự kết hợp giữa các cột thành phố và tiểu bang để có được ý tưởng sơ bộ về địa chỉ. Khi bạn có các giá trị NULL như vậy, bạn có thể sử dụng CONCAT_WS thay thế cho hàm CONCAT. Hãy xem nó hoạt động như thế nào.

Sử dụng CONCAT_WS để xử lý các giá trị NULL trong quá trình nối

CONCAT_WS là một giải pháp thay thế cho CONCAT có thể được sử dụng nếu bạn nghi ngờ một hoặc nhiều trường chứa giá trị NULL.

Bạn có thể sử dụng hàm CONCAT_WS như sau:

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

Bây giờ hãy chạy truy vấn CHỌN sau:

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

Bạn sẽ nhận được kết quả đầu ra sau:

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

Như đã thấy, đối với mục thứ hai trong tập kết quả, chúng ta nhận được ‘Boston MA’ vì trường đường phố là NULL.

⚠ Khi sử dụng CONCAT_WS bắt buộc phải chỉ định dấu phân cách. Nếu bạn không chỉ định dấu phân cách thì kết quả là NULL nếu một hoặc nhiều cột là NULL (tương tự như CONCAT).

Kết thúc

Hãy xem lại những gì chúng ta đã học được:

  • Khi truy vấn một bảng cơ sở dữ liệu để truy xuất dữ liệu, bạn có thể muốn nối nhiều cột chuỗi để nhận được kết quả truy vấn hữu ích và dễ hiểu hơn. Để thực hiện, bạn có thể sử dụng hàm CONCAT trong SQL với cú pháp CONCAT(string_1, string_2, …, string_n).
  • Bạn có thể nối chuỗi ký tự, cột hoặc kết hợp cả hai. Tuy nhiên, nếu có một hoặc nhiều giá trị NULL thì kết quả của bản ghi cụ thể đó là NULL. Để xử lý việc này, bạn có thể sử dụng CONCAT_WS với cú pháp CONCAT_WS(dấu phân cách, chuỗi_1, chuỗi_2, …, chuỗi_n).
  • CONCAT_WS xử lý các giá trị NULL một cách duyên dáng hơn bằng cách chỉ nối những chuỗi có mặt bằng dấu phân cách đã chỉ định.

Để xem nhanh các lệnh SQL và cách sử dụng chúng, bạn có thể đánh dấu trang SQL Cheat Sheet này.

x