Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

SQL Fundamentals: SELECT, WHERE, ORDER BY

SQL and Data Analysis cho BA Bài 1/60

Mở đầu — vì sao bài này quan trọng

Hãy tưởng tượng bạn là một Business Analyst (BA) tại một sàn thương mại điện tử như Tiki. Sáng thứ Hai, sếp đặt câu hỏi: "Tuần rồi có bao nhiêu khách hàng ở TP.HCM đặt đơn trên 500 nghìn đồng? Sắp xếp theo giá trị đơn cao nhất giúp anh." Bạn có hai lựa chọn: gửi email cho team developer rồi chờ ba ngày, hoặc tự mở công cụ truy vấn, gõ vài dòng và có câu trả lời trong ba phút.

Sự khác biệt giữa hai lựa chọn đó chính là SQL — và đó là lý do SQL được xem là kỹ năng "phải có" của BA hiện đại, ngang hàng với Excel và viết tài liệu nghiệp vụ. Trong rất nhiều mô tả công việc BA tại Việt Nam (FPT, VNG, MoMo, Shopee), dòng "biết SQL cơ bản" gần như luôn xuất hiện.

Bài đầu tiên này tập trung vào ba câu lệnh nền tảng nhất — SELECT, WHERE, ORDER BY. Đây là bộ ba mà bạn sẽ dùng đi dùng lại trong 90% công việc hằng ngày. Nắm vững ba lệnh này, bạn đã có thể tự trả lời phần lớn câu hỏi "lấy dữ liệu gì, lọc điều kiện nào, sắp xếp ra sao". Toàn bộ những bài nâng cao sau này (JOIN, GROUP BY, subquery, window function) đều xây dựng trên nền móng đó.

Khái niệm cốt lõi

SQL là gì và vì sao BA cần nó

SQL (Structured Query Language) là ngôn ngữ để "hỏi chuyện" với cơ sở dữ liệu. Bạn không cần biết lập trình ứng dụng — bạn chỉ cần biết cách mô tả dữ liệu mình muốn lấy. Cú pháp SQL rất gần với tiếng Anh tự nhiên, nên người làm nghiệp vụ tiếp cận khá dễ.

Với một BA, SQL phục vụ bốn mục đích lớn:

  • Tự lấy dữ liệu thay vì chờ developer — chủ động và nhanh hơn nhiều.
  • Kiểm chứng yêu cầu (validate requirements) bằng dữ liệu thực: khi stakeholder nói "hầu hết khách hàng của ta ở Hà Nội", bạn có thể chạy một câu query để xác nhận hoặc bác bỏ.
  • Tạo báo cáo và insight: rút trích con số phục vụ quyết định.
  • Hiểu mô hình dữ liệu (data model): biết hệ thống đang lưu cái gì, ở bảng nào, cột nào — kiến thức quan trọng khi viết tài liệu yêu cầu.

Hình dung dữ liệu dạng bảng

Mọi dữ liệu trong SQL được tổ chức thành bảng (table), giống một sheet Excel: có cột (column) mô tả thuộc tính và dòng (row) là từng bản ghi. Ví dụ một bảng orders (đơn hàng) của sàn TMĐT có thể trông như sau:

order_idcustomer_namecityamountorder_date
1001Nguyễn AnHồ Chí Minh7500002026-06-20
1002Trần BìnhHà Nội3200002026-06-21
1003Lê ChâuĐà Nẵng12000002026-06-21
Khi viết query, bạn đang nói với database: "Từ bảng này, cho tôi những cột này, chỉ những dòng thỏa điều kiện này, và sắp xếp theo thứ tự này."

SELECT — chọn cột bạn muốn xem

SELECT trả lời câu hỏi "tôi muốn nhìn thấy thông tin gì?". Đây là lệnh xương sống của mọi truy vấn đọc dữ liệu.

-- Lấy tất cả các cột của bảng orders
SELECT * FROM orders;

-- Chỉ lấy hai cột cụ thể SELECT customer_name, amount FROM orders;

Dấu nghĩa là "tất cả các cột". Trong thực tế làm việc, bạn nên hạn chế dùng SELECT và chỉ chọn đúng cột cần — vừa chạy nhanh hơn, vừa giúp người đọc query hiểu rõ ý định của bạn.

Lưu ý quan trọng: từ khóa FROM cho biết bạn lấy dữ liệu từ bảng nào. Một câu SELECT để đọc dữ liệu luôn cần FROM.

WHERE — lọc dòng theo điều kiện

WHERE trả lời câu hỏi "tôi chỉ quan tâm những dòng nào?". Đây là nơi bạn áp dụng các điều kiện lọc.

-- Chỉ lấy đơn ở Hồ Chí Minh
SELECT customer_name, amount
FROM orders
WHERE city = 'Hồ Chí Minh';

-- Đơn có giá trị trên 500 nghìn SELECT customer_name, amount FROM orders WHERE amount > 500000;

Một số toán tử so sánh cơ bản bạn sẽ dùng ngay: = (bằng), <> hoặc != (khác), >, <, >=, <=. Khi so sánh với chuỗi văn bản (text), bạn đặt giá trị trong dấu nháy đơn '...'. Khi so sánh với số, không cần nháy.

Bạn có thể kết hợp nhiều điều kiện bằng AND (cả hai cùng đúng) và OR (chỉ cần một đúng):

-- Đơn ở HCM VÀ trên 500 nghìn
SELECT customer_name, amount
FROM orders
WHERE city = 'Hồ Chí Minh' AND amount > 500000;

ORDER BY — sắp xếp kết quả

ORDER BY trả lời câu hỏi "tôi muốn nhìn kết quả theo thứ tự nào?". Mặc định là tăng dần (ASC), bạn dùng DESC để giảm dần.

-- Sắp theo giá trị đơn từ cao xuống thấp
SELECT customer_name, amount
FROM orders
ORDER BY amount DESC;

Thứ tự viết và thứ tự thực thi

Một mẹo ghi nhớ: ba lệnh này luôn được viết theo đúng thứ tự SELECT → FROM → WHERE → ORDER BY. Nếu bạn đặt sai thứ tự (ví dụ viết WHERE trước FROM), database sẽ báo lỗi cú pháp.

Điều thú vị là database lại thực thi theo thứ tự khác: nó đọc FROM trước (xác định bảng), rồi WHERE (lọc dòng), rồi SELECT (chọn cột), cuối cùng mới ORDER BY (sắp xếp). Hiểu điều này giúp bạn không bối rối ở các bài sau.

Tình huống thực tế

Tình huống 1 — BA tại sàn TMĐT trả lời câu hỏi của sếp

Bối cảnh: Bạn là BA tại một sàn giống Tiki. Giám đốc vận hành hỏi: "Cho anh danh sách các đơn ở TP.HCM có giá trị trên 500 nghìn, sắp xếp đơn lớn nhất lên đầu, để team chăm sóc khách VIP gọi điện cảm ơn."

Diễn giải: Đây chính xác là bài toán SELECT + WHERE + ORDER BY:

SELECT order_id, customer_name, amount
FROM orders
WHERE city = 'Hồ Chí Minh' AND amount > 500000
ORDER BY amount DESC;

Bạn chọn ba cột cần (mã đơn, tên khách, giá trị), lọc theo hai điều kiện kết hợp bằng AND, rồi sắp xếp giảm dần theo amount. Kết quả là một danh sách sạch sẽ, đúng nhu cầu, giao cho team chăm sóc trong vài phút.

Bài học rút ra: Phần lớn yêu cầu "lấy dữ liệu" mà BA nhận được trong thực tế đều quy về cùng một khuôn mẫu — chọn cột, lọc điều kiện, sắp xếp. Khi đã nhận diện được khuôn mẫu này, bạn dịch yêu cầu của sếp thành query gần như tức thì.

Tình huống 2 — Kiểm chứng giả định bằng dữ liệu thực

Bối cảnh: Tại một ứng dụng gọi xe giống Be, một stakeholder khẳng định trong cuộc họp: "Giờ cao điểm sáng của mình toàn các chuyến ngắn dưới 3 km thôi, không cần lo các chuyến đường dài." Trước khi viết tài liệu yêu cầu cho tính năng giá động, bạn muốn kiểm chứng giả định này.

Diễn giải: Bạn truy vấn bảng trips (chuyến đi) để xem có bao nhiêu chuyến dài hơn 3 km trong khung 7–9 giờ sáng:

SELECT trip_id, distance_km, fare
FROM trips
WHERE distance_km > 3
ORDER BY distance_km DESC;

Khi chạy, bạn phát hiện có hàng trăm chuyến trên 3 km, trong đó nhiều chuyến lên tới 12–15 km (khách đi từ ngoại thành vào trung tâm). Giả định "toàn chuyến ngắn" là sai.

Bài học rút ra: SQL biến BA từ người "nghe và ghi chép" thành người "kiểm chứng bằng bằng chứng". Một câu query đơn giản có thể ngăn cả team đi sai hướng vì một giả định chưa được kiểm chứng. Đây là giá trị nghề nghiệp lớn nhất mà SQL mang lại cho BA.

Tình huống 3 — Lọc dữ liệu lỗi để báo cho team kỹ thuật

Bối cảnh: Tại một ví điện tử như MoMo, bạn nhận được phản ánh rằng một số giao dịch hiển thị số tiền âm — điều không hợp lý với giao dịch nạp tiền. Bạn cần khoanh vùng để báo lại cho team kỹ thuật.

Diễn giải:

SELECT transaction_id, user_id, amount, created_at
FROM transactions
WHERE amount < 0
ORDER BY created_at ASC;

Câu query lọc đúng các giao dịch có amount âm và sắp xếp theo thời gian tăng dần để bạn thấy giao dịch lỗi xuất hiện sớm nhất từ khi nào — manh mối quan trọng để team kỹ thuật truy ra nguyên nhân (có thể là một bản cập nhật nào đó).

Bài học rút ra: SQL không chỉ để làm báo cáo đẹp, mà còn là công cụ điều tra dữ liệu (data investigation). BA biết SQL có thể tự khoanh vùng vấn đề trước khi gõ cửa team kỹ thuật, giúp trao đổi cụ thể và tiết kiệm thời gian cho cả hai bên.

Hướng dẫn từng bước

Hãy biến một yêu cầu nghiệp vụ thành query theo quy trình năm bước. Ví dụ yêu cầu: "Lấy tên và email của khách hàng ở Hà Nội đã đăng ký trong năm 2026, sắp theo ngày đăng ký mới nhất."

Bước 1 — Xác định bảng dữ liệu (FROM). Thông tin khách hàng nằm ở bảng customers. Đây là điểm khởi đầu:

FROM customers

Bước 2 — Chọn cột cần lấy (SELECT). Yêu cầu cần tên và email:

SELECT customer_name, email
FROM customers

Bước 3 — Viết điều kiện lọc (WHERE). Có hai điều kiện: ở Hà Nội và đăng ký năm 2026. Kết hợp bằng AND:

SELECT customer_name, email
FROM customers
WHERE city = 'Hà Nội' AND registered_date >= '2026-01-01'

Bước 4 — Sắp xếp (ORDER BY). "Mới nhất" nghĩa là ngày lớn nhất lên đầu, tức giảm dần:

SELECT customer_name, email
FROM customers
WHERE city = 'Hà Nội' AND registered_date >= '2026-01-01'
ORDER BY registered_date DESC

Bước 5 — Chạy thử và kiểm tra. Trước khi tin tưởng kết quả, hãy nhìn vài dòng đầu: tên có hợp lý không? Email có đúng định dạng không? Có dòng nào ở thành phố khác lọt vào không? Nếu thấy bất thường, thường là do điều kiện WHERE viết chưa chặt. Thói quen kiểm tra này quan trọng vì BA chịu trách nhiệm về độ chính xác của con số mình đưa ra.

Lỗi thường gặp & mẹo

Nhầm = với ==. Trong SQL, so sánh bằng chỉ dùng một dấu bằng =, không phải == như nhiều ngôn ngữ lập trình. Viết WHERE city == 'Hà Nội' sẽ báo lỗi.

Quên dấu nháy đơn cho chuỗi. Giá trị văn bản phải nằm trong nháy đơn: WHERE city = 'Hà Nội'. Viết WHERE city = Hà Nội (không nháy) sẽ khiến database tưởng "Hà Nội" là tên một cột và báo lỗi.

Dùng nháy kép thay nháy đơn. Trong nhiều hệ quản trị (như PostgreSQL), nháy kép "..." dùng để chỉ tên cột/bảng, còn nháy đơn '...' mới dùng cho giá trị văn bản. Hãy quen dùng nháy đơn cho giá trị.

Phân biệt chữ hoa/thường trong dữ liệu. 'Hà Nội''hà nội' có thể được coi là khác nhau tùy cấu hình database. Nếu query trả về 0 dòng dù bạn chắc chắn có dữ liệu, hãy kiểm tra lại cách viết hoa/thường của giá trị thực trong bảng.

Lẫn lộn ANDOR khi kết hợp điều kiện. AND đòi hỏi mọi điều kiện đều đúng (kết quả hẹp hơn), còn OR chỉ cần một điều kiện đúng (kết quả rộng hơn). Khi trộn cả hai, hãy dùng dấu ngoặc đơn để nhóm cho rõ ràng, ví dụ WHERE city = 'Hà Nội' AND (amount > 500000 OR is_vip = true).

Mẹo dùng LIMIT khi khám phá. Khi làm việc với bảng lớn hàng triệu dòng, thêm LIMIT 10 ở cuối để chỉ lấy 10 dòng đầu, xem cấu trúc dữ liệu trước khi chạy query đầy đủ — vừa nhanh vừa tránh làm nặng hệ thống. (Chúng ta sẽ học sâu về LIMIT và phân trang ở bài 9.)

Mẹo viết query dễ đọc. Hãy xuống dòng mỗi mệnh đề (SELECT, FROM, WHERE, ORDER BY mỗi cái một dòng) và viết từ khóa SQL bằng chữ HOA. Query của bạn sẽ dễ đọc, dễ rà soát hơn nhiều — đặc biệt khi cần đưa cho đồng nghiệp xem lại.

Mẹo dùng comment. Bạn có thể thêm ghi chú bằng -- để giải thích query đang làm gì. Điều này cực kỳ hữu ích khi bạn lưu lại query cho báo cáo định kỳ và quay lại đọc sau vài tuần.

Bài tập thực hành

Giả sử bạn có bảng orders với các cột: order_id, customer_name, city, amount, order_date, status. Hãy viết câu SQL cho từng yêu cầu sau:

  • Lấy tất cả các cột của mọi đơn hàng.
  • Lấy customer_nameamount của tất cả đơn.
  • Lấy các đơn ở 'Đà Nẵng'.
  • Lấy các đơn có giá trị từ 1 triệu đồng trở lên, sắp xếp giảm dần theo giá trị.
  • Lấy các đơn ở 'Hà Nội' có trạng thái 'completed' (kết hợp hai điều kiện).
  • Lấy 5 đơn có giá trị cao nhất (gợi ý: kết hợp ORDER BY với LIMIT).
  • Lấy order_id, customer_name, order_date của các đơn đặt từ ngày '2026-06-01' trở đi, sắp theo ngày đặt cũ nhất lên đầu.
Gợi ý đáp án cho câu 5 và 6:

-- Câu 5
SELECT order_id, customer_name, amount
FROM orders
WHERE city = 'Hà Nội' AND status = 'completed';

-- Câu 6 SELECT order_id, customer_name, amount FROM orders ORDER BY amount DESC LIMIT 5;

Hãy thử tự viết các câu còn lại trước khi xem lại kiến thức bên trên. Khi đã viết thành thạo, hãy tự đặt thêm câu hỏi nghiệp vụ của riêng bạn (ví dụ "đơn nào trên 2 triệu ở miền Trung?") và dịch chúng thành query — đó là cách luyện tập tốt nhất.

Tóm tắt

Trong bài đầu tiên này, bạn đã nắm bộ ba lệnh nền tảng của SQL:

  • SELECT chọn cột bạn muốn xem; dùng * để lấy tất cả, nhưng nên nêu rõ tên cột.
  • WHERE lọc dòng theo điều kiện, dùng các toán tử so sánh (=, >, <, <>) và kết hợp bằng AND / OR.
  • ORDER BY sắp xếp kết quả, mặc định tăng dần (ASC), dùng DESC để giảm dần.
Quan trọng hơn cú pháp, bạn đã thấy SQL thay đổi vai trò của BA như thế nào: từ người chờ dữ liệu thành người chủ động lấy dữ liệu, từ người ghi chép giả định thành người kiểm chứng bằng bằng chứng, và từ người mô tả vấn đề thành người khoanh vùng vấn đề. Ba ví dụ — trả lời câu hỏi của sếp ở sàn TMĐT, kiểm chứng giả định ở app gọi xe, và điều tra dữ liệu lỗi ở ví điện tử — đều cho thấy cùng một bộ ba lệnh giải quyết những bài toán nghiệp vụ rất thật.

Hãy luyện cho thật nhuần nhuyễn SELECT, WHERE, ORDER BY, vì mọi thứ phức tạp hơn — JOIN nhiều bảng, gom nhóm tổng hợp, truy vấn lồng nhau — đều bắt đầu từ chính ba từ khóa này. Ở bài tiếp theo, chúng ta sẽ học cách kết nối dữ liệu từ nhiều bảng với nhau bằng JOIN, mở ra khả năng trả lời những câu hỏi phong phú hơn nhiều.