Giao diện
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.
- 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.
- 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ỉ
SELECTcá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. - Schema thay đổi: Code của bạn có thể bị lỗi nếu ai đó thêm một cột kiểu
BLOBhoặcJSONnặ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
ASdùng để đặt alias cho cột hoặc bảng.ASthực ra là optional (SELECT name full_namecũng hợp lệ), nhưng luôn viếtAScho 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 DISTINCTloạ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.