Giới thiệu
Dùng CONCAT() nối FirstName và CountryName, kết hợp HAVING lọc trên cột alias vừa tạo.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
FirstName VARCHAR(100),
CountryName VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES
('Adam', 'US'), ('David', 'AUS'), ('Chris', 'UK'), ('John', 'US'), ('Carol', 'AUS');
Truy vấn CONCAT + HAVING
mysql> SELECT CONCAT(FirstName, ' ', CountryName) AS NameWithCountry FROM DemoTable HAVING NameWithCountry LIKE '%John%';
Kết quả
+-----------------+ | NameWithCountry | +-----------------+ | John US | +-----------------+
Giải thích
CONCAT(FirstName, ' ', CountryName): Nối 2 cột với dấu cách.AS NameWithCountry: Đặt bí danh cho cột kết quả.HAVING NameWithCountry LIKE '%John%': Lọc trên kết quả đã CONCAT. HAVING dùng cho điều kiện trên aggregate/alias, WHERE dùng cho cột gốc.
⚠️ HAVING vs WHERE
| Đặc điểm | WHERE | HAVING |
|---|---|---|
| Lọc trên | Cột gốc / biểu thức đơn giản | Cột aggregate / alias SELECT |
| Thứ tự thực thi | Trước GROUP BY | Sau GROUP BY / SELECT |
| Hiệu năng | Tốt (có thể dùng index) | Kém (sau khi đã tính toán) |
Ví dụ này **nên dùng WHERE** vì lọc trên FirstName (cột gốc):
SELECT CONCAT(FirstName, ' ', CountryName) AS NameWithCountry FROM DemoTable WHERE FirstName = 'John';
Khi nào bắt buộc dùng HAVING
- Lọc trên hàm tổng hợp:
HAVING COUNT(*) > 1. - Lọc trên alias phức tạp:
HAVING full_name LIKE '%John%'(nếu full_name là expression phức tạp).