VieLang
Lộ trình nghềPhỏng vấnCông cụViệc làm IT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
Cẩm nang · Phỏng vấn

Câu hỏi phỏng vấn SQL thường gặp (kèm đáp án)

Các câu hỏi SQL về JOIN, GROUP BY, index, transaction hay gặp ở vòng fresher và junior, kèm đáp án và ví dụ trên Oracle.

Cập nhật 27/09/2026.

Checklist: 0/5 đã xong
Nội dung bài · 6 mục
  1. 1.Chuẩn bị trước buổi phỏng vấn
  2. 2.Truy vấn
  3. 3.Thiết kế
  4. 4.Hiệu năng
  5. 5.Transaction
  6. 6.Bảo mật

Ví dụ dùng database mẫu của khoá SQL với Oracle: customers, products, orders, order_lines. Vòng SQL thường có cả câu hỏi lý thuyết và một bài viết truy vấn tại chỗ.

Chuẩn bị trước buổi phỏng vấn

Truy vấn

INNER JOIN và LEFT JOIN khác nhau thế nào?

INNER JOIN chỉ giữ dòng khớp ở cả hai bảng. LEFT JOIN giữ mọi dòng của bảng bên trái; cột bên phải là NULL khi không khớp.

Khách chưa đặt đơn nào:

SELECT c.customer_id, c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
WHERE o.order_id IS NULL;

WHERE và HAVING khác nhau thế nào?

WHERE lọc từng dòng trước khi gom nhóm. HAVING lọc nhóm sau GROUP BY, dùng được hàm tổng hợp.

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) >= 3;

Lấy sản phẩm có giá cao thứ hai.

SELECT name, price
FROM products
ORDER BY price DESC
OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY;

Nếu nhiều sản phẩm cùng giá cao nhất, hỏi lại người phỏng vấn "cao thứ hai" tính theo dòng hay theo mức giá. Theo mức giá thì dùng DENSE_RANK().

DELETE, TRUNCATE, DROP khác nhau thế nào?

  • DELETE: xoá dòng, có WHERE, rollback được.
  • TRUNCATE: xoá mọi dòng, nhanh hơn, không có WHERE. Trong Oracle đây là lệnh DDL, tự commit, không rollback được.
  • DROP: xoá cả bảng.

UNION và UNION ALL khác nhau thế nào? UNION bỏ dòng trùng (tốn thêm bước sắp xếp hoặc so sánh), UNION ALL giữ nguyên.

Thiết kế

Primary key và foreign key là gì?

Primary key định danh duy nhất mỗi dòng, không được NULL. Foreign key là cột tham chiếu tới primary key của bảng khác, đảm bảo không có đơn hàng trỏ tới khách không tồn tại.

Chuẩn hoá là gì?

Tách dữ liệu thành các bảng để mỗi thông tin chỉ lưu một chỗ. Ví dụ không lưu tên khách trong orders mà chỉ lưu customer_id. Sửa tên khách thì sửa một dòng.

Hiệu năng

Index là gì?

Cấu trúc phụ (thường là B-tree) giúp tìm dòng theo cột mà không phải quét cả bảng. Đổi lại, INSERT, UPDATE, DELETE chậm hơn và tốn thêm dung lượng.

Khi nào có index mà database không dùng?

  • Bọc cột trong hàm: WHERE UPPER(name) = 'PEN' không dùng được index thường trên name.
  • Điều kiện trả về phần lớn bảng: quét cả bảng có thể nhanh hơn.
  • LIKE '%pen': ký tự đại diện ở đầu.

Làm sao biết câu truy vấn chậm ở đâu? Xem execution plan. Trong Oracle: EXPLAIN PLAN FOR <câu lệnh>; rồi SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);.

Transaction

ACID là gì?

  • Atomicity: transaction chạy hết hoặc không chạy gì.
  • Consistency: dữ liệu luôn thoả các ràng buộc.
  • Isolation: các transaction chạy song song không thấy trạng thái dở của nhau.
  • Durability: đã commit thì không mất, kể cả khi server sập.

Isolation level mặc định của Oracle là gì? READ COMMITTED: mỗi câu lệnh chỉ thấy dữ liệu đã commit trước khi câu lệnh bắt đầu.

Bảo mật

SQL injection là gì, chống thế nào?

Kẻ tấn công chèn SQL vào dữ liệu nhập khi code nối chuỗi thành câu lệnh. Chống bằng parameter: giá trị được gửi riêng, không bao giờ thành SQL.

// SAI: nối chuỗi
var sql = "SELECT * FROM customers WHERE email = '" + email + "'";

// ĐÚNG: EF Core tự tạo parameter
var customer = await db.Customers.FirstOrDefaultAsync(c => c.Email == email);

Nguồn

  • Oracle — SQL Language Reference (19c) docs.oracle.com
  • Oracle — Indexes and Index-Organized Tables (Database Concepts 19c) docs.oracle.com
  • PostgreSQL — Transaction Isolation postgresql.org
  • Use The Index, Luke — SQL indexing and tuning use-the-index-luke.com

Nội dung bài

  1. 1.Chuẩn bị trước buổi phỏng vấn
  2. 2.Truy vấn
  3. 3.Thiết kế
  4. 4.Hiệu năng
  5. 5.Transaction
  6. 6.Bảo mật