DHDataHọc
Lý thuyếtBài 4/305 phút đọc+10 XP

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:

  1. Í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.
  2. Ý đị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.
  3. Í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ốngNên dùngLý do
Vừa mở một bảng lạ, cần xem có gìSELECT * + LIMITKhá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, dashboardLiệt kê cộtỔn định, nhẹ, đọc được ý định
Truy vấn nằm trong code ứng dụngLiệt kê cộtTrá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:

code
SELECT name, city
FROM customers;

Kết quả gồm 12 dòng. Năm dòng đầu:

namecity
An NguyễnHà Nội
Bình TrầnTP. Hồ Chí Minh
Chi LêĐà Nẵng
Dũng PhạmHà 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:

code
SELECT city, name
FROM customers
ORDER BY id
LIMIT 3;
cityname
Hà NộiAn Nguyễn
TP. Hồ Chí MinhBình Trần
Đà NẵngChi 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:

code
SELECT name, category, price
FROM products
ORDER BY price DESC
LIMIT 5;
namecategoryprice
Nồi chiên không dầuGia dụng1690000
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ê laptopGia dụng390000

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

  1. Chạy SELECT name, city FROM customers; rồi đổi thành SELECT city, name FROM customers;. Quan sát thứ tự cột thay đổi, số dòng giữ nguyên.
  2. Chạy SELECT name, price FROM products WHERE stock = 0; — bạn chưa học WHERE chính thức, nhưng hãy thử. Kết quả là sản phẩm đã hết hàng.
  3. Mở bài luyện Chỉ lấy tên và thành phố (select-name-city). Yêu cầu: chọn name và city từ customers, sắp xếp theo id. Đá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ứngNguyên nhânCá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 existGõ sai tên cộtXem 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 cityLuô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 đợiChỉ chọn một phần cộtKiểm tra lại danh sách sau SELECT
Bài luyện báo sai dù dữ liệu đúngThiế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 WHERE hoặc LIMIT.
  • 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.

Dùng ← → để chuyển bài