Skip to content

SELECT: Truy vấn dữ liệu

SELECT là lệnh cơ bản nhất trong SQL, dùng để lấy dữ liệu từ cơ sở dữ liệu. Hãy coi nó như việc bạn chọn những món hàng cần mua từ kệ siêu thị.

Cú pháp (Syntax)

sql
SELECT column1, column2, ...
FROM table_name;

Ví dụ thực tế (Real-world Example)

Giả sử bạn có bảng users chứa thông tin khách hàng trên trang thương mại điện tử.

Yêu cầu: Lấy danh sách tên và email của khách hàng để gửi marketing.

sql
SELECT full_name, email
FROM users;

💡 HPN Pro Tip: Tại sao SELECT * là "Kẻ thù" của Performance?

Khi bạn viết SELECT * FROM users, database sẽ phải quét và trả về tất cả các cột.

  1. Lãng phí băng thông (Bandwidth): Nếu bảng có 50 cột nhưng bạn chỉ cần 2, bạn đang tải rác về server.
  2. Mất Index Coverage: Các database hiện đại (Postgres, MySQL) có tính năng "Index Only Scan". Nếu bạn chỉ SELECT các cột có trong Index, database không cần đọc đĩa, tốc độ cực nhanh. SELECT * sẽ phá vỡ cơ chế này.
  3. Schema thay đổi: Code của bạn có thể bị lỗi nếu ai đó thêm một cột kiểu BLOB hoặc JSON nặng vào bảng mà bạn không biết.

Lời khuyên: Luôn chỉ định rõ tên cột cần lấy (Explicit Columns).

⚠️ Common Mistake

Sai: Dùng SELECT * trong production code vì "tiện tay".

sql
-- Đừng làm thế này trong Backend Service
SELECT * FROM orders WHERE user_id = 1;

Đúng:

sql
-- Chỉ lấy những gì service cần
SELECT id, order_status, total_amount FROM orders WHERE user_id = 1;

🧠 Quiz

Câu 1: SELECT * có vấn đề gì trong production?

  • [ ] A) Gây lỗi cú pháp
  • [ ] B) Chỉ hoạt động với bảng nhỏ
  • [x] C) Lấy dư cột không cần thiết, tốn bandwidth và giảm khả năng dùng covering index
  • [ ] D) Không thể dùng với WHERE

💡 Giải thích: SELECT * lấy toàn bộ cột, bao gồm cả những cột service không cần. Điều này tốn bandwidth, memory và ngăn database tận dụng covering index — nơi index chứa đủ dữ liệu mà không cần đọc table.

Câu 2: Column alias được khai báo bằng cú pháp nào?

  • [ ] A) SELECT name CALLED full_name
  • [x] B) SELECT name AS full_name
  • [ ] C) SELECT name => full_name
  • [ ] D) SELECT ALIAS name full_name

💡 Giải thích: Từ khóa AS dùng để đặt alias cho cột hoặc bảng. AS thực ra là optional (SELECT name full_name cũng hợp lệ), nhưng luôn viết AS cho rõ ràng.

Câu 3: DISTINCT dùng để làm gì?

  • [ ] A) Sắp xếp kết quả theo thứ tự
  • [ ] B) Giới hạn số dòng trả về
  • [x] C) Loại bỏ các dòng trùng lặp trong kết quả
  • [ ] D) Lọc dữ liệu theo điều kiện

💡 Giải thích: SELECT DISTINCT loại bỏ các dòng có giá trị hoàn toàn giống nhau. Lưu ý: DISTINCT so sánh tất cả cột trong SELECT list, không chỉ một cột.