Chọn cột cụ thể
Bạn sẽ học được
- Vì sao nên liệt kê tên cột thay vì dùng
SELECT *. - Cách chọn nhiều cột, đổi thứ tự cột trong kết quả.
- Sự khác biệt giữa "ít dữ liệu hơn" và "ít dòng hơn" — hai chuyện hoàn toàn khác nhau.
- Một cái bẫy cú pháp khiến truy vấn vẫn chạy nhưng trả về sai cột.
- Hoàn thành bài luyện Chỉ lấy tên và thành phố.
Khái niệm cốt lõi
SELECT * lấy mọi cột. SELECT name, city chỉ lấy hai cột. Nghe đơn giản, nhưng đây là một trong những thói quen phân biệt người mới với người làm nghề.
Khi bạn liệt kê cột, bạn đang viết một hợp đồng rõ ràng: "truy vấn này cần đúng những cột này". Ba lợi ích:
- Ít dữ liệu hơn. Một bảng có 40 cột, mỗi cột chứa chuỗi dài; bạn chỉ cần 3 cột.
SELECT *kéo toàn bộ 40 cột qua mạng, tốn bộ nhớ và thời gian. Với bảng vài triệu dòng, khác biệt có thể từ giây sang phút. - Ý định rõ ràng. Người đọc truy vấn của bạn biết ngay nó cần gì. Sáu tháng sau, chính bạn cũng biết.
- Ít vỡ hơn. Nếu ai đó thêm cột vào bảng,
SELECT *tự động trả thêm cột — code đọc kết quả theo vị trí có thể vỡ. Danh sách cột cố định thì không.
Bảng quyết định nhanh:
| Tình huống | Nên dùng | Lý do |
|---|---|---|
| Vừa mở một bảng lạ, cần xem có gì | SELECT * + LIMIT | Khám phá nhanh, không cần biết trước tên cột |
| Truy vấn đưa vào báo cáo, dashboard | Liệt kê cột | Ổn định, nhẹ, đọc được ý định |
| Truy vấn nằm trong code ứng dụng | Liệt kê cột | Tránh vỡ khi schema thêm cột |
| Đang gỡ lỗi một dòng cụ thể | SELECT * | Thấy toàn bộ ngữ cảnh của dòng đó |
Có một điều cần phân biệt: chọn ít cột không làm giảm số dòng. SELECT name FROM customers vẫn trả về 12 dòng, mỗi dòng chỉ có một cột. Muốn ít dòng, bạn cần WHERE hoặc LIMIT — sẽ học ở chương sau.
Thứ tự cột trong kết quả theo đúng thứ tự bạn viết. SELECT name, city cho hai cột name rồi city; SELECT city, name cho ngược lại. Với người đọc báo cáo, thứ tự này quan trọng: tên trước hay thành phố trước là một quyết định trình bày.
Bạn cũng có thể chọn cùng một cột hai lần, hoặc dùng biểu thức. SQL không giới hạn danh sách SELECT ở tên cột — nhưng đó là nội dung của bài sau. Bài này chỉ làm việc với tên cột.
Ví dụ chạy được
Lấy tên và thành phố của mọi khách hàng:
SELECT name, city
FROM customers;Kết quả gồm 12 dòng. Năm dòng đầu:
| name | city |
|---|---|
| An Nguyễn | Hà Nội |
| Bình Trần | TP. Hồ Chí Minh |
| Chi Lê | Đà Nẵng |
| Dũng Phạm | Hà Nội |
| Em Võ | TP. Hồ Chí Minh |
So với SELECT *, kết quả này gọn hơn nhiều: không còn email, signup_date, segment. Nếu mục đích là in danh sách tên và thành phố, đó chính xác là những gì cần.
Đổi thứ tự cột:
SELECT city, name
FROM customers
ORDER BY id
LIMIT 3;| city | name |
|---|---|
| Hà Nội | An Nguyễn |
| TP. Hồ Chí Minh | Bình Trần |
| Đà Nẵng | Chi Lê |
Dữ liệu không đổi, chỉ cách trình bày đổi. Đây là lý do các công cụ BI cho phép kéo thả cột — nhưng hiểu bản chất vẫn hữu ích khi viết SQL trực tiếp.
Một ví dụ trên bảng sản phẩm, nơi việc chọn cột có ý nghĩa kinh doanh rõ hơn:
SELECT name, category, price
FROM products
ORDER BY price DESC
LIMIT 5;| name | category | price |
|---|---|---|
| Nồi chiên không dầu | Gia dụng | 1690000 |
| Bàn phím cơ | Điện tử | 1250000 |
| Tai nghe Bluetooth | Điện tử | 890000 |
| Chuột không dây | Điện tử | 450000 |
| Giá kê laptop | Gia dụng | 390000 |
Ba cột vừa đủ trả lời câu hỏi "năm sản phẩm đắt nhất là gì, thuộc nhóm nào". Không cần stock, không cần id.
Thực hành
- Chạy
SELECT name, city FROM customers;rồi đổi thànhSELECT city, name FROM customers;. Quan sát thứ tự cột thay đổi, số dòng giữ nguyên. - Chạy
SELECT name, price FROM products WHERE stock = 0;— bạn chưa họcWHEREchính thức, nhưng hãy thử. Kết quả là sản phẩm đã hết hàng. - Mở bài luyện Chỉ lấy tên và thành phố (
select-name-city). Yêu cầu: chọnnamevàcitytừcustomers, sắp xếp theoid. Đáp án làSELECT name, city FROM customers ORDER BY id;.
Khi làm bài luyện, hãy đọc kỹ yêu cầu về thứ tự cột và thứ tự dòng. Bài select-name-city kiểm tra cả hai: cột đúng thứ tự name rồi city, dòng đúng thứ tự id tăng dần.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
syntax error at or near "FROM" | Dấu phẩy thừa sau cột cuối: SELECT name, city, FROM ... | Bỏ dấu phẩy cuối danh sách |
column "names" does not exist | Gõ sai tên cột | Xem tên thật bằng SELECT * ... LIMIT 1 |
Kết quả chỉ có một cột tên name chứa thành phố | Viết SELECT city name — thiếu dấu phẩy, SQL hiểu name là bí danh của city | Luôn có dấu phẩy giữa hai cột: SELECT city, name |
| Truy vấn chạy nhưng kết quả thiếu cột mong đợi | Chỉ chọn một phần cột | Kiểm tra lại danh sách sau SELECT |
| Bài luyện báo sai dù dữ liệu đúng | Thiếu ORDER BY id hoặc đảo thứ tự cột | Đọc yêu cầu, so từng chữ với truy vấn |
Cái bẫy thứ ba đáng nhớ nhất: SELECT city name là cú pháp hợp lệ. SQL hiểu bạn muốn cột city với bí danh name. Không có lỗi nào được báo, chỉ có kết quả sai. Bài sau học AS sẽ giúp bạn nhận ra vì sao cú pháp này tồn tại — và vì sao nên viết AS cho rõ ràng.
Tóm tắt
- Liệt kê cột thay vì
*: ít dữ liệu hơn, ý định rõ hơn, ít vỡ hơn khi schema thay đổi. - Chọn ít cột không làm giảm số dòng; muốn giảm dòng cần
WHEREhoặcLIMIT. - Thứ tự cột trong kết quả theo đúng thứ tự viết sau
SELECT. - Thiếu dấu phẩy giữa hai cột có thể tạo bí danh ngoài ý muốn mà không báo lỗi.
- Luôn đối chiếu yêu cầu về thứ tự cột và thứ tự dòng khi nộp bài luyện.
Use ← → to move between lessons