DHDataHọc
TheoryLesson 5/305 min read+10 XP

Đặ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 BY nhưng không dùng được trong WHERE.
  • 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:

code
SELECT
  name AS ten_khach,
  city AS thanh_pho,
  signup_date AS ngay_dang_ky
FROM customers
ORDER BY id
LIMIT 5;
ten_khachthanh_phongay_dang_ky
An NguyễnHà Nội2023-03-12
Bình TrầnTP. Hồ Chí Minh2023-07-01
Chi LêĐà Nẵng2024-01-15
Dũng PhạmHà Nội2024-02-20
Em VõTP. Hồ Chí Minh2024-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:

code
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:

code
SELECT
  name,
  price,
  price * 0.9 AS gia_khuyen_mai
FROM products
ORDER BY price DESC
LIMIT 3;
namepricegia_khuyen_mai
Nồi chiên không dầu16900001521000.0
Bàn phím cơ12500001125000.0
Tai nghe Bluetooth890000801000.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:

code
SELECT
  order_id,
  product_id,
  quantity,
  unit_price,
  quantity * unit_price AS thanh_tien
FROM order_items
WHERE order_id = 1;
order_idproduct_idquantityunit_pricethanh_tien
1128900001780000
141320000320000

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

  1. 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.
  2. 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.
  3. Thử cố tình viết SELECT name AS ten FROM customers WHERE ten = 'An Nguyễn';. Quan sát lỗi column "ten" does not exist. Sau đó sửa thành WHERE name = 'An Nguyễn' và thêm ORDER BY ten vào cuối — bạn sẽ thấy ORDER BY chấp nhận bí danh.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
column "ten" does not exist ở WHEREBí danh chưa tồn tại khi WHERE chạyDù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épViế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í danhThêm AS <tên>
Bí danh chữ hoa thành chữ thườngPostgreSQL hạ chữ thường tên không nháy képDùng nháy kép nếu thật sự cần giữ chữ hoa
Bài luyện báo sai cộtTự thêm bí danh khi đề không yêu cầuChỉ đặ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ết AS cho 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.
  • SELECT có thể chứa biểu thức (price * 0.9); bí danh đặt tên cho kết quả tính toán.
  • WHERE chạy trước SELECT nên không thấy bí danh; ORDER BY chạ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.

Use ← → to move between lessons