Đặt bí danh với AS
Bạn sẽ học được
- Đặt bí danh cho cột bằng
ASđể kết quả dễ đọc hơn. - Đặt bí danh cho bảng và vì sao thói quen này sẽ cứu bạn khi học
JOIN. - Viết biểu thức trong
SELECT: tính giá sau thuế, thành tiền, phần trăm. - Vì sao bí danh dùng được trong
ORDER BYnhưng không dùng được trongWHERE. - Khi nào cần nháy kép cho bí danh có dấu cách hoặc chữ hoa.
Khái niệm cốt lõi
Bí danh (alias) là tên tạm bạn gán cho một cột hoặc một bảng trong phạm vi truy vấn. Cột gốc vẫn tên cũ trong bảng; chỉ kết quả hiển thị tên mới.
Với cột, bí danh giải quyết hai vấn đề. Thứ nhất, tên cột kỹ thuật thường xấu: unit_price, signup_date, submissions_count. Người đọc báo cáo muốn thấy "Đơn giá", "Ngày đăng ký". Thứ hai, khi bạn tính toán, cột kết quả không có tên tự nhiên — price * 0.9 sẽ hiện tiêu đề ?column? nếu bạn không đặt tên.
Với bảng, bí danh là thói quen bắt buộc khi làm việc với nhiều bảng. Thay vì viết customers.name, customers.city, customers.segment mỗi lần, bạn đặt customers AS c rồi viết c.name, c.city. Khi ghép ba bảng với nhau, bí danh ngắn còn giúp tránh nhầm cột trùng tên — orders.id và customers.id là hai cột khác nhau nhưng cùng tên id.
Cú pháp: AS là tuỳ chọn. SELECT name ten_khach hoạt động y như SELECT name AS ten_khach. Nhưng hãy luôn viết AS. Lý do: thiếu AS, một dấu phẩy bị quên sẽ biến hai cột thành một cột kèm bí danh mà không báo lỗi, đúng như bài trước đã cảnh báo. AS làm ý định hiện rõ với cả người đọc lẫn chính bạn.
Có một giới hạn quan trọng cần nhớ: bí danh cột chưa tồn tại khi WHERE chạy. Như đã nói ở bài 3, thứ tự thực thi là FROM → WHERE → SELECT → ORDER BY. Vì SELECT chạy sau WHERE, bạn không thể lọc theo bí danh vừa đặt. ORDER BY chạy sau SELECT nên dùng bí danh được.
Về nháy kép: bí danh chỉ gồm chữ thường, số và dấu gạch dưới thì viết tự do. Bí danh có dấu cách, có chữ hoa, hoặc trùng từ khoá phải bọc trong nháy kép: AS "Tên khách hàng". Trong PostgreSQL, tên không có nháy kép bị chuyển về chữ thường; AS TenKhach sẽ thành tenkhach. Đây là lý do các đội thường thống nhất dùng snake_case cho bí danh.
Ví dụ chạy được
Đặt bí danh tiếng Việt cho cột:
SELECT
name AS ten_khach,
city AS thanh_pho,
signup_date AS ngay_dang_ky
FROM customers
ORDER BY id
LIMIT 5;| ten_khach | thanh_pho | ngay_dang_ky |
|---|---|---|
| An Nguyễn | Hà Nội | 2023-03-12 |
| Bình Trần | TP. Hồ Chí Minh | 2023-07-01 |
| Chi Lê | Đà Nẵng | 2024-01-15 |
| Dũng Phạm | Hà Nội | 2024-02-20 |
| Em Võ | TP. Hồ Chí Minh | 2024-05-05 |
Tiêu đề cột trong kết quả đổi thành tên bạn đặt, dữ liệu giữ nguyên. Lưu ý bài luyện trên DataHọc so khớp tên cột; nếu đề không yêu cầu bí danh, đừng tự thêm, vì tên cột sẽ khác đáp án.
Bí danh cho bảng:
SELECT c.name, c.city
FROM customers AS c
ORDER BY c.id
LIMIT 3;Kết quả giống hệt truy vấn không có bí danh. Giá trị thật nằm ở chỗ bạn có thể viết c.id ở ORDER BY, c.name ở WHERE, và khi ghép bảng thì phân biệt rõ c.id với o.id. Quy ước phổ biến: lấy chữ cái đầu của bảng — c cho customers, o cho orders, oi cho order_items, p cho products.
Bí danh cho biểu thức — đây là phần thú vị nhất:
SELECT
name,
price,
price * 0.9 AS gia_khuyen_mai
FROM products
ORDER BY price DESC
LIMIT 3;| name | price | gia_khuyen_mai |
|---|---|---|
| Nồi chiên không dầu | 1690000 | 1521000.0 |
| Bàn phím cơ | 1250000 | 1125000.0 |
| Tai nghe Bluetooth | 890000 | 801000.0 |
Bạn vừa tính giá sau giảm 10% ngay trong truy vấn. Cột gia_khuyen_mai không tồn tại trong bảng products — nó là kết quả tính toán, và bí danh là thứ duy nhất đặt tên cho nó. Không có AS, cột sẽ hiện tên ?column?, rất khó đọc khi xuất báo cáo.
Một ví dụ nữa trên order_items, tính thành tiền từng dòng hàng:
SELECT
order_id,
product_id,
quantity,
unit_price,
quantity * unit_price AS thanh_tien
FROM order_items
WHERE order_id = 1;| order_id | product_id | quantity | unit_price | thanh_tien |
|---|---|---|---|---|
| 1 | 1 | 2 | 890000 | 1780000 |
| 1 | 4 | 1 | 320000 | 320000 |
Tổng đơn 1 là 2.100.000 — bạn có thể tự cộng hai dòng, hoặc dùng SUM(thanh_tien) ở chương 4. Chú ý: WHERE order_id = 1 dùng tên cột gốc, không dùng bí danh, vì WHERE chạy trước SELECT.
Thực hành
- Chạy truy vấn bí danh tiếng Việt ở trên. Sau đó thử
SELECT name AS "Tên khách" FROM customers LIMIT 3;để thấy nháy kép cho phép dấu cách. - Chạy
SELECT p.name, p.price, p.price * 1.1 AS gia_sau_thue FROM products AS p ORDER BY p.price DESC LIMIT 5;. Kiểm tra một dòng bằng tay: 1.690.000 × 1,1 = 1.859.000. - Thử cố tình viết
SELECT name AS ten FROM customers WHERE ten = 'An Nguyễn';. Quan sát lỗicolumn "ten" does not exist. Sau đó sửa thànhWHERE name = 'An Nguyễn'và thêmORDER BY tenvào cuối — bạn sẽ thấyORDER BYchấp nhận bí danh.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
column "ten" does not exist ở WHERE | Bí danh chưa tồn tại khi WHERE chạy | Dùng tên cột gốc trong WHERE, hoặc bọc truy vấn thành subquery |
syntax error at or near "khach" | Bí danh có dấu cách nhưng thiếu nháy kép | Viết AS "ten khach" hoặc dùng snake_case |
Kết quả hiển thị ?column? | Biểu thức không có bí danh | Thêm AS <tên> |
| Bí danh chữ hoa thành chữ thường | PostgreSQL hạ chữ thường tên không nháy kép | Dùng nháy kép nếu thật sự cần giữ chữ hoa |
| Bài luyện báo sai cột | Tự thêm bí danh khi đề không yêu cầu | Chỉ đặt bí danh khi đề nói rõ |
Tóm tắt
ASđặt tên cho cột hoặc bảng trong phạm vi một truy vấn; luôn viếtAScho rõ ý định.- Bí danh bảng (
customers AS c) là bắt buộc trên thực tế khi ghép nhiều bảng. SELECTcó thể chứa biểu thức (price * 0.9); bí danh đặt tên cho kết quả tính toán.WHEREchạy trướcSELECTnên không thấy bí danh;ORDER BYchạy sau nên thấy được.- Bí danh có dấu cách hoặc chữ hoa cần nháy kép; mặc định hãy dùng
snake_case.
Dùng ← → để chuyển bài