Courses
Dù bạn là người đang tìm việc muốn tìm cơ hội mới để áp dụng kỹ năng SQL hay là quản lý tuyển dụng sắp phỏng vấn ứng viên cho vị trí trong công ty, nắm được các câu hỏi và câu trả lời phỏng vấn SQL thường gặp là điều bắt buộc.
Bài viết này liệt kê 99 câu hỏi và đáp án phỏng vấn SQL cho năm 2026, bao trùm các chủ đề SQL trọng yếu để giúp bạn chuẩn bị, học hỏi và tuyển dụng hiệu quả, bao gồm:
- Kiến thức nền tảng: Định nghĩa rõ ràng về RDBMS, key và các biến thể SQL.
- Làm chủ kỹ thuật: Đào sâu DDL so với DML, ràng buộc (constraints) và lập chỉ mục (indexing).
- Logic truy vấn: Giải thích về Join, Subquery và Hàm Tổng hợp (Aggregate).
- Ứng dụng thực tế: Giải pháp mã hóa đời thực như tìm giá trị cao thứ n hoặc loại bỏ trùng lặp.
- Câu hỏi theo kịch bản: Bài toán kiểu phỏng vấn bao gồm tổng chạy (running total), phát hiện trùng lặp, phân tích khoảng trống (gap analysis), và nhiều hơn nữa.
Nếu bạn muốn nâng cao hơn nữa kiến thức và kỹ năng, hãy cân nhắc khám phá các khóa học toàn diện của chúng tôi về kỹ thuật dữ liệu, công nghệ đám mây, và AWS.
Tổng Quan Câu Hỏi Phỏng Vấn SQL
Các buổi phỏng vấn SQL thường phản chiếu cách mọi người thực sự học ngôn ngữ này.
Giai đoạn đầu là về từ vựng và ngữ pháp, như biết join là gì, cách SELECT hoạt động, và sự khác nhau giữa DDL và DML.
Khi bạn quen thuộc hơn, trọng tâm chuyển từ "bạn có viết được truy vấn không" sang "bạn có viết được truy vấn đúng không." Bạn bắt đầu hiểu khi nào index có ích, tại sao chuẩn hóa quan trọng, và cách các lệnh khác nhau một cách tinh tế như DELETE và TRUNCATE vận hành bên dưới.
Ở cấp cao hơn, cú pháp được mặc định là nắm vững, và bài kiểm tra thực sự là giải quyết vấn đề: xử lý trùng lặp, NULL, đồng hạng (ties) và xếp hạng bằng window function và CTE, cũng như lý luận về giao dịch, đồng thời và hiệu năng.
Dành cho người dùng trung cấp
-
Hàm trong SQL. Bạn nên biết về hàm tổng hợp và hàm vô hướng, cũng như hàm dựng sẵn và hàm do người dùng định nghĩa.
-
Các lệnh nâng cao. Câu hỏi có thể bao trùm chủ đề như join, khóa chính và khóa ngoại, index và quan hệ trong SQL.
-
Thiết kế cơ sở dữ liệu. Hãy kỳ vọng câu hỏi về chuẩn hóa, phi chuẩn hóa, và sự khác nhau giữa các câu lệnh SQL như
DELETE,TRUNCATEvàDROP. -
Truy vấn nâng cao. Bạn có thể được hỏi về subquery, cả lồng nhau và tương quan, cũng như cách thực hiện các tác vụ cụ thể như tìm giá trị cao thứ n trong một cột.
Câu Hỏi Phỏng Vấn SQL Chung
Trước khi hỏi các câu kỹ thuật, người phỏng vấn có thể hỏi bạn một số câu hỏi chung về kinh nghiệm tổng thể của bạn với SQL.\
Đừng lo nếu kinh nghiệm SQL của bạn còn hạn chế: người phỏng vấn có lẽ đã biết điều này từ sơ yếu lý lịch của bạn. Vì họ vẫn muốn nói chuyện với bạn, hồ sơ của bạn đã được coi là phù hợp với công ty của họ. Đồng thời, hoàn toàn ổn nếu bạn chỉ làm việc với một biến thể SQL. Hãy nhớ rằng các biến thể SQL khá giống nhau. Do đó, quen với chỉ một biến thể cũng là nền tảng vững chắc để bạn học các biến thể khác.
1. SQL là gì?
Viết tắt của Structured Query Language, là ngôn ngữ lập trình dùng để tương tác với hệ quản trị cơ sở dữ liệu quan hệ (RDBMS). Bao gồm truy xuất, cập nhật, chèn và xóa dữ liệu khỏi các bảng.
2. Các biến thể (dialect) của SQL là gì? Cho ví dụ.
Các phiên bản SQL khác nhau, cả miễn phí và trả phí, còn được gọi là các biến thể SQL. Tất cả các biến thể của SQL có cú pháp rất giống nhau và chỉ khác không đáng kể ở chức năng bổ sung. Một số ví dụ: Microsoft SQL Server, PostgreSQL, MySQL, SQLite, T-SQL và Oracle.
3. Ứng dụng chính của SQL là gì?
Dùng SQL, chúng ta có thể:
- tạo, xóa và cập nhật bảng trong cơ sở dữ liệu
- truy cập, thao tác và sửa đổi dữ liệu trong một bảng
- truy xuất và tóm tắt thông tin cần thiết từ một hoặc nhiều bảng
- thêm hoặc xóa một số hàng hoặc cột nhất định khỏi bảng
Câu Hỏi Phỏng Vấn SQL cho Người Mới Bắt Đầu
Người phỏng vấn có thể khởi động bằng những câu hỏi dễ hơn:
4. Câu lệnh SQL là gì?
Còn gọi là lệnh SQL. Đó là một chuỗi ký tự được bộ máy SQL diễn giải là lệnh hợp lệ và thực thi tương ứng. Một số ví dụ về câu lệnh SQL là SELECT, CREATE, DELETE, DROP, REVOKE, v.v.
5. Truy vấn SQL là gì?
Truy vấn là một đoạn mã viết bằng SQL để truy cập hoặc sửa đổi dữ liệu từ cơ sở dữ liệu.
Có hai loại truy vấn SQL: truy vấn truy xuất dữ liệu và truy vấn sửa đổi dữ liệu. Loại đầu dùng để lấy dữ liệu cần thiết (bao gồm giới hạn, nhóm, sắp xếp dữ liệu, lấy dữ liệu từ nhiều bảng, v.v.), trong khi loại thứ hai dùng để tạo, thêm, xóa, cập nhật và đổi tên dữ liệu.
6. Subquery (truy vấn con) trong SQL là gì?
Còn gọi là truy vấn bên trong, là truy vấn đặt bên trong một truy vấn khác (truy vấn ngoài). Subquery có thể xuất hiện trong các mệnh đề như SELECT, FROM, WHERE, UPDATE, v.v. Cũng có thể có một subquery bên trong một subquery khác. Subquery trong cùng chạy trước và kết quả của nó được chuyển cho truy vấn (hoặc subquery) bao ngoài.
7. Join trong SQL là gì?
Một mệnh đề dùng để kết hợp và truy xuất bản ghi từ hai hoặc nhiều bảng. Các bảng SQL có thể được join dựa trên mối quan hệ giữa các cột của những bảng đó. Xem hướng dẫn về SQL joins để có thêm ngữ cảnh, cùng với hướng dẫn chuyên sâu về các câu hỏi phỏng vấn về SQL joins.
8. Comment trong SQL là gì?
Một chú thích dễ đọc nhằm làm rõ một đoạn mã cụ thể làm gì. Comment trong SQL có thể là một dòng (đứng trước bởi hai dấu gạch ngang --) hoặc nhiều dòng (như sau: /*comment_text*/). Khi bộ máy SQL chạy, nó bỏ qua comment. Mục đích thêm comment là làm cho mã dễ hiểu hơn với những người sẽ đọc sau này.
9. Alias trong SQL là gì?
Một tên tạm thời gán cho bảng (hoặc cột trong bảng) khi thực thi một truy vấn SQL nhất định. Alias dùng để cải thiện khả năng đọc và làm mã gọn hơn. Alias được giới thiệu bằng từ khóa AS:
SELECT col_1 AS column
FROM table_name;
Câu Hỏi Phỏng Vấn SQL Kỹ Thuật
Giờ hãy chuyển sang các câu hỏi kỹ thuật SQL và một số đáp án khả dĩ.
Khi trả lời câu hỏi kỹ thuật, chiến lược tốt nhất là đưa ra câu trả lời càng chính xác càng tốt. Trả lời vòng vo có thể khiến bạn lệch chủ đề chính và có thể khơi gợi thêm những câu hỏi mà bạn kém tự tin hơn.
Tóm lại, SQL cho phép truy vấn cơ sở dữ liệu theo nhiều cách. Ngoài ra, SQL dễ dàng tích hợp với các ngôn ngữ lập trình khác như Python hoặc R, nên chúng ta có thể tận dụng sức mạnh kết hợp.
10. Bạn biết những loại lệnh SQL nào?
- Data Definition Language (DDL) – để định nghĩa và sửa đổi cấu trúc của cơ sở dữ liệu.
- Data Manipulation Language (DML) – để truy cập, thao tác và sửa đổi dữ liệu trong cơ sở dữ liệu.
- Data Control Language (DCL) – để kiểm soát quyền truy cập dữ liệu trong cơ sở dữ liệu và cấp/thu hồi đặc quyền cho người dùng hoặc nhóm người dùng.
- Transaction Control Language (TCL) – để kiểm soát các giao dịch trong cơ sở dữ liệu.
- Data Query Language (DQL) – để thực hiện truy vấn dữ liệu trong cơ sở dữ liệu nhằm truy xuất thông tin cần thiết.
11. Cho ví dụ về các lệnh SQL thường dùng.
-
DDL:
CREATE,ALTERTABLE,DROP,TRUNCATE, vàADD COLUMN -
DML:
UPDATE,DELETE, vàINSERT -
DCL:
GRANTvàREVOKE -
TCL:
COMMIT,SET TRANSACTION,ROLLBACK, vàSAVEPOINT -
DQL: –
SELECT
12. DBMS là gì, và bạn biết những loại DBMS nào?
Viết tắt của Database Management System, là gói phần mềm dùng để thực hiện các thao tác khác nhau trên dữ liệu lưu trong cơ sở dữ liệu, như truy cập, cập nhật, xử lý, chèn và xóa dữ liệu. Có nhiều loại DBMS, như quan hệ, phân cấp, mạng, đồ thị, hoặc hướng đối tượng. Các loại này dựa trên cách dữ liệu được tổ chức, cấu trúc và lưu trữ trong hệ thống.
13. RDBMS là gì? Cho ví dụ.
Viết tắt của Relational Database Management System. Đây là loại DBMS phổ biến nhất dùng để làm việc với dữ liệu lưu trong nhiều bảng có liên hệ với nhau thông qua key chung. Ngôn ngữ SQL được thiết kế để tương tác với RDBMS. Một số ví dụ: MySQL, PostgreSQL, Oracle, MariaDB, v.v.
14. Bảng và trường (field) trong SQL là gì?
Bảng là tập dữ liệu liên quan được tổ chức dưới dạng bảng, tức theo hàng và cột. Field là thuật ngữ khác chỉ một cột của bảng.
15. Bạn biết những loại subquery SQL nào?
- Single-row – trả về nhiều nhất một hàng.
- Multi-row – trả về tối thiểu hai hàng.
- Multi-column – trả về tối thiểu hai cột.
- Correlated – subquery phụ thuộc vào thông tin từ truy vấn ngoài.
- Nested – subquery bên trong một subquery khác.
16. Constraint là gì, và tại sao dùng constraint?
Tập điều kiện xác định loại dữ liệu có thể nhập vào mỗi cột của bảng. Constraint đảm bảo tính toàn vẹn dữ liệu trong bảng và ngăn chặn hành động không mong muốn.
17. Bạn biết những constraint SQL nào?
-
DEFAULT– cung cấp giá trị mặc định cho một cột. -
UNIQUE– chỉ cho phép giá trị duy nhất. -
NOT NULL– chỉ cho phép giá trị không null. -
PRIMARY KEY– chỉ cho phép giá trị duy nhất và tuyệt đối không null (NOT NULLvàUNIQUE). -
FOREIGN KEY– cung cấp key chung giữa hai hoặc nhiều bảng.
18. Bạn biết những loại join nào?
-
(INNER) JOIN– chỉ trả về những bản ghi thỏa mãn điều kiện join ở cả hai (hoặc tất cả) bảng. Đây là join mặc định của SQL. -
LEFT (OUTER) JOIN– trả về tất cả bản ghi từ bảng trái và các bản ghi từ bảng phải thỏa mãn điều kiện join. -
RIGHT (OUTER) JOIN– trả về tất cả bản ghi từ bảng phải và các bản ghi từ bảng trái thỏa mãn điều kiện join. -
FULL (OUTER) JOIN– trả về tất cả bản ghi từ cả hai (hoặc tất cả) bảng. Có thể xem là kết hợp của left và right join.
Lưu ý: FULL OUTER JOIN được hỗ trợ bởi PostgreSQL, SQL Server, Oracle và MySQL 8.0 trở lên, nhưng MySQL chỉ cho phép thông qua mẫu UNION; trong khi đó, SQLite không hỗ trợ RIGHT JOIN, có thể mô phỏng bằng LEFT JOIN kết hợp với UNION.
19. Khóa chính (primary key) trong SQL là gì?
Một cột (hoặc nhiều cột) của bảng được áp constraint PRIMARY KEY nhằm đảm bảo giá trị duy nhất và không null trong cột đó. Nói cách khác, khóa chính là kết hợp của NOT NULL và UNIQUE. Khóa chính nhận diện duy nhất mỗi bản ghi của bảng.
Khái niệm liên quan — Khóa thay thế (Surrogate key): Là định danh được tạo nhân tạo (thường là số nguyên tuần tự hoặc UUID) gán cho mỗi bản ghi, độc lập với giá trị dữ liệu thực tế. Khác với khóa tự nhiên (ví dụ địa chỉ email), khóa thay thế ổn định khi dữ liệu nghiệp vụ thay đổi, khiến nó phổ biến làm khóa chính trong CSDL sản xuất.
Mỗi bảng có thể định nghĩa tối đa một PRIMARY KEY (có thể là tổng hợp). Một PRIMARY KEY được khuyến nghị mạnh mẽ nhưng không bắt buộc tuyệt đối với mọi bộ máy.
20. Khóa duy nhất (unique key) trong SQL là gì?
Một cột (hoặc nhiều cột) của bảng được áp constraint UNIQUE để đảm bảo giá trị duy nhất trong cột đó, bao gồm một giá trị NULL (duy nhất một giá trị).
Lưu ý:
- SQL Server: Chỉ cho phép một
NULLtrừ khi dùng filtered index. - PostgreSQL / Oracle / MySQL: Cho phép nhiều giá trị
NULLvìNULL <> NULL.
21. Khóa ngoại (foreign key) trong SQL là gì?
Một cột (hoặc nhiều cột) của bảng được áp constraint FOREIGN KEY (hoặc khóa UNIQUE) để liên kết cột này với khóa chính ở bảng khác (hoặc nhiều bảng). Mục đích của khóa ngoại là giữ cho các bảng trong cơ sở dữ liệu được kết nối với nhau.
22. Index trong SQL là gì?
Một cấu trúc dữ liệu đặc biệt liên quan đến bảng và dùng để lưu những phần quan trọng của nó nhằm cho phép tìm kiếm và truy xuất dữ liệu nhanh hơn. Index đặc biệt hiệu quả với cơ sở dữ liệu lớn, nơi chúng giúp cải thiện đáng kể hiệu năng truy vấn.
23. Bạn biết những loại index nào?
- Unique index – không cho phép trùng lặp trong cột và do đó giúp duy trì tính toàn vẹn dữ liệu.
- Clustered index – xác định thứ tự vật lý của bản ghi trong bảng và tìm kiếm dựa trên giá trị khóa. Một bảng chỉ có một clustered index.
- Non-clustered index – giữ thứ tự bản ghi không trùng với thứ tự vật lý của dữ liệu trên đĩa. Nghĩa là dữ liệu lưu một nơi và non-clustered index lưu nơi khác. Một bảng có thể có nhiều non-clustered index.
24. Schema là gì?
Tập hợp các thành phần cấu trúc của cơ sở dữ liệu như bảng, stored procedure, index, hàm và trigger. Nó thể hiện kiến trúc tổng thể của cơ sở dữ liệu, xác định mối quan hệ giữa các đối tượng và định nghĩa quyền truy cập khác nhau cho chúng. Đọc hướng dẫn về database schema để hiểu sâu hơn.
25. Toán tử SQL là gì?
Ký tự dành riêng, tổ hợp ký tự hoặc từ khóa dùng trong truy vấn SQL để thực hiện một thao tác cụ thể. Toán tử SQL thường dùng với mệnh đề WHERE để đặt điều kiện lọc dữ liệu.
26. Bạn biết những loại toán tử SQL nào?
-
Số học (
+,-,*,/, v.v.) -
So sánh (
>,<,=,>=, v.v.) -
Gán mở rộng (
+=,-=,*=,/=, v.v.) -
Logic (
AND,OR,NOT,BETWEEN, v.v.) -
Chuỗi (
%,_,+,^, v.v.) -
Tập hợp (
UNION,UNION ALL,INTERSECT, vàMINUS(hoặcEXCEPT))
27. Clause (mệnh đề) là gì?
Điều kiện áp lên truy vấn SQL để lọc dữ liệu nhằm thu được kết quả mong muốn. Ví dụ: WHERE, LIMIT, HAVING, LIKE, AND, OR, ORDER BY, v.v.
28. Những mệnh đề thường dùng cùng truy vấn SELECT?
Phổ biến nhất là FROM, GROUP BY, JOIN, WHERE, ORDER BY, LIMIT và HAVING.
29. Tạo bảng trong SQL như thế nào?
Dùng câu lệnh CREATE TABLE. Ví dụ, để tạo bảng có ba cột với kiểu dữ liệu định trước, dùng cú pháp sau:
CREATE TABLE table_name (col_1 datatype,
col_2 datatype,
col_3 datatype);
30. Cập nhật bảng như thế nào?
Dùng câu lệnh UPDATE. Cú pháp:
UPDATE table_name
SET col_1 = value_1, col_2 = value_2
WHERE condition;
31. Xóa một bảng khỏi cơ sở dữ liệu thế nào?
Dùng câu lệnh DROP TABLE. Cú pháp: DROP TABLE table_name;.
32. Lấy số lượng bản ghi trong một bảng thế nào?
Dùng hàm tổng hợp COUNT() với dấu hoa thị làm tham số: SELECT COUNT(*) FROM table_name;.
33. Sắp xếp bản ghi trong một bảng thế nào?
Dùng mệnh đề ORDER BY:
SELECT * FROM table_name
ORDER BY col_1;
Có thể chỉ định sắp xếp giảm dần bằng từ khóa DESC; nếu không, mặc định là tăng dần. Cũng có thể sắp xếp theo nhiều cột và chỉ định riêng tăng/giảm cho từng cột. Ví dụ:
SELECT * FROM table_name
ORDER BY col_1 DESC, col_3, col_6 DESC;
34. Chọn tất cả cột từ một bảng như thế nào?
Dùng dấu hoa thị * với câu lệnh SELECT. Cú pháp: SELECT * FROM table_name;.
35. Chọn các bản ghi chung từ hai bảng như thế nào?
Dùng mệnh đề INTERSECT:
SELECT col1, col2 FROM table_1
INTERSECT
SELECT col1, col2 FROM table_2;
Lưu ý: INTERSECT yêu cầu cùng số cột và kiểu tương thích.
36. DISTINCT là gì và dùng thế nào?
Mệnh đề này dùng cùng SELECT để lọc trùng lặp và chỉ trả về giá trị duy nhất từ một cột. Cú pháp:
SELECT DISTINCT col_1
FROM table_name;
37. Quan hệ (relationships) là gì? Cho ví dụ.
Quan hệ là các kết nối và tương quan giữa các thực thể, về cơ bản là cách hai hoặc nhiều bảng trong cơ sở dữ liệu liên quan với nhau. Ví dụ, có thể tìm ID của cùng một khách hàng trong một bảng dữ liệu bán hàng và trong bảng khách hàng.
38. Giá trị NULL là gì? Khác gì với số 0 hoặc khoảng trắng?
Giá trị NULL biểu thị không có dữ liệu cho một ô nào đó của bảng. Trong khi đó, 0 là giá trị số hợp lệ, còn chuỗi rỗng là chuỗi hợp pháp có độ dài bằng 0.
39. Khác biệt giữa SQL và NoSQL?
Cơ sở dữ liệu SQL là quan hệ, có cấu trúc và dùng bảng với schema định nghĩa sẵn, trong khi NoSQL là phi quan hệ, không schema và được thiết kế để xử lý dữ liệu phi cấu trúc hoặc bán cấu trúc.
40. Một số thách thức thường gặp khi làm việc với cơ sở dữ liệu SQL?
Thách thức gồm tinh chỉnh hiệu năng cho tập dữ liệu lớn, quản lý chiến lược lập chỉ mục, đảm bảo toàn vẹn dữ liệu với constraints, xử lý giao dịch đồng thời và tối ưu thực thi truy vấn.
Câu Hỏi Phỏng Vấn SQL Trung Cấp
41. Common Table Expression (CTE) là gì?
Common Table Expression (CTE) là một tập kết quả tạm có tên, có thể tham chiếu trong câu lệnh SELECT, INSERT, UPDATE hoặc DELETE. CTE cải thiện khả năng đọc truy vấn và cho phép bạn chia nhỏ truy vấn phức tạp thành các phần đơn giản, tái sử dụng. Cú pháp dùng từ khóa WITH:
WITH sales_summary AS (
SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id
)
SELECT p.product_name, s.total_sales
FROM products p
JOIN sales_summary s ON p.id = s.product_id
WHERE s.total_sales > 10000;
CTE đặc biệt hữu ích cho truy vấn đệ quy (dữ liệu phân cấp như sơ đồ tổ chức) và khi bạn cần tham chiếu cùng một subquery nhiều lần.
42. Window function là gì, và khác gì với hàm tổng hợp?
Window function thực hiện tính toán trên một tập hàng liên quan đến hàng hiện tại mà không gom kết quả thành một hàng duy nhất như hàm tổng hợp. Chúng dùng mệnh đề OVER() để định nghĩa “cửa sổ” hàng.
Các window function chính gồm:
ROW_NUMBER()– gán số thứ tự duy nhất tuần tự cho mỗi hàngRANK()– gán hạng có khoảng trống khi đồng hạngDENSE_RANK()– gán hạng không có khoảng trống khi đồng hạngLAG()/LEAD()– truy cập dữ liệu từ hàng trước/sauSUM() OVER(),AVG() OVER()– tính toán chạy hoặc lũy kế
Ví dụ: Tính tổng chạy của doanh số
SELECT
order_date,
amount,
SUM(amount) OVER (ORDER BY order_date) AS running_total
FROM orders;
43. Khác biệt giữa RANK(), DENSE_RANK() và ROW_NUMBER()?
Cả ba đều là hàm xếp hạng kiểu window, nhưng xử lý đồng hạng khác nhau:
ROW_NUMBER()– luôn gán số thứ tự duy nhất (1, 2, 3, 4...), kể cả khi đồng hạngRANK()– cho đồng hạng cùng một hạng rồi bỏ qua số tiếp theo (1, 2, 2, 4...)DENSE_RANK()– cho đồng hạng cùng một hạng, không bỏ qua (1, 2, 2, 3...)
SELECT
name,
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num,
RANK() OVER (ORDER BY score DESC) AS rank,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM students;
Dùng DENSE_RANK() khi tìm “giá trị cao thứ n” mà các giá trị đồng hạng nên chia sẻ cùng vị trí.
Trong phần này, chúng ta xem các câu hỏi trung cấp phổ biến nhất để bạn biết kỳ vọng từ người phỏng vấn.
44. Hàm trong SQL là gì?
Một đối tượng cơ sở dữ liệu đại diện cho tập câu lệnh SQL thường dùng cho một nhiệm vụ. Hàm nhận tham số đầu vào, thực hiện tính toán hoặc thao tác khác và trả về kết quả. Hàm giúp mã dễ đọc và tránh lặp lại đoạn mã giống nhau.
45. Bạn biết những loại hàm SQL nào?
- Hàm tổng hợp – hoạt động trên nhiều bản ghi (thường được nhóm) cho các cột cung cấp và trả về một giá trị (thường theo nhóm).
- Hàm vô hướng – hoạt động trên từng giá trị riêng lẻ và trả về một giá trị.
Mặt khác, hàm SQL có thể là dựng sẵn (do hệ thống định nghĩa) hoặc do người dùng tự định nghĩa (tạo cho nhu cầu cụ thể).
46. Bạn biết những hàm tổng hợp SQL nào?
-
AVG()– trả về giá trị trung bình -
SUM()– trả về tổng -
MIN()– trả về giá trị nhỏ nhất -
MAX()– trả về giá trị lớn nhất -
COUNT()– trả về số hàng, bao gồm cả hàng có giá trị null
47. Bạn biết những hàm vô hướng SQL nào?
-
LEN()(ở biến thể khác –LENGTH()) – trả về độ dài chuỗi, bao gồm khoảng trắng -
UCASE()(ở biến thể khác –UPPER()) – trả về chuỗi chuyển thành chữ hoa -
LCASE()(ở biến thể khác –LOWER()) – trả về chuỗi chuyển thành chữ thường -
INITCAP() – trả về chuỗi chuyển sang kiểu tiêu đề (mỗi từ bắt đầu bằng chữ hoa) -
MID()(ở biến thể khác –SUBSTR()) – trích xuất chuỗi con -
ROUND()– làm tròn giá trị số đến số chữ số thập phân chỉ định -
NOW()– trả về ngày giờ hiện tại
48. Các hàm thay đổi kiểu chữ trong SQL là gì?
Là nhóm con của hàm ký tự, dùng để thay đổi kiểu chữ dữ liệu văn bản. Với các hàm này, ta có thể chuyển dữ liệu sang chữ hoa, chữ thường hoặc kiểu tiêu đề.
-
UCASE()(ở biến thể khác –UPPER()) – trả về chuỗi chữ hoa -
LCASE()(ở biến thể khác –LOWER()) – trả về chuỗi chữ thường -
INITCAP()– trả về chuỗi kiểu tiêu đề
49. Các hàm thao tác ký tự trong SQL là gì?
Là nhóm con của hàm ký tự, dùng để chỉnh sửa dữ liệu văn bản.
-
CONCAT()– nối hai hoặc nhiều chuỗi, thêm chuỗi thứ hai vào cuối chuỗi thứ nhất -
SUBSTRING()/SUBSTR()– trả về một phần chuỗi theo điểm bắt đầu và kết thúc cho trước -
LENGTH()(ở biến thể khác –LEN()) – trả về độ dài chuỗi, gồm cả khoảng trắng -
REPLACE()– thay thế mọi lần xuất hiện của chuỗi con xác định trong chuỗi cho trước bằng chuỗi con khác -
INSTR()– trả về vị trí số của chuỗi con trong chuỗi cho trước -
LPAD()vàRPAD()– thêm ký tự đệm bên trái/phải cho giá trị canh phải/trái -
TRIM()– loại bỏ mọi ký tự xác định, cũng như khoảng trắng, từ bên trái, bên phải hoặc cả hai đầu của chuỗi
50. Khác biệt giữa biến cục bộ và biến toàn cục?
Biến cục bộ chỉ truy cập được bên trong hàm nơi nó được khai báo. Ngược lại, biến toàn cục, được khai báo ngoài mọi hàm, lưu trong cấu trúc bộ nhớ cố định và có thể dùng trong toàn bộ chương trình.
51. Khác biệt giữa SQL và PL/SQL?
SQL là ngôn ngữ tiêu chuẩn để truy vấn và quản lý cơ sở dữ liệu quan hệ, chủ yếu dùng cho thao tác và truy xuất dữ liệu. PL/SQL (Procedural Language/SQL) là phần mở rộng của SQL dùng trong cơ sở dữ liệu Oracle, bao gồm các cấu trúc lập trình thủ tục như vòng lặp, điều kiện và xử lý ngoại lệ, cho phép hiện thực hóa logic nghiệp vụ phức tạp ngay trong cơ sở dữ liệu. Chúng tôi có một bài viết khác về Top 20 Câu Hỏi Phỏng Vấn PL/SQL và Đáp Án, rất hữu ích nếu bạn biết mình sẽ được hỏi về Oracle.
52. Khác biệt giữa LEFT JOIN và LEFT OUTER JOIN?
Không có khác biệt giữa LEFT JOIN và LEFT OUTER JOIN. Chúng có thể dùng thay thế cho nhau. SQL cho phép từ khóa OUTER là tùy chọn, nên LEFT JOIN chỉ là viết tắt của LEFT OUTER JOIN. Cả hai trả về tất cả bản ghi từ bảng bên trái và các bản ghi khớp từ bảng bên phải.
53. Indexing trong SQL là gì và nó cải thiện hiệu năng ra sao?
Indexing tạo ra một cấu trúc dữ liệu đặc biệt giúp tăng tốc truy xuất dữ liệu bằng cách cho phép cơ sở dữ liệu tìm hàng hiệu quả hơn. Nó giống như một bảng tra cứu tối ưu, giảm nhu cầu quét toàn bộ bảng. Tuy nhiên, lập chỉ mục quá nhiều có thể làm chậm thao tác chèn, cập nhật và xóa do cần bảo trì index.
54. Stored procedure là gì, và khác gì với function?
Stored procedure là tập hợp câu lệnh SQL được biên dịch trước, thực thi như một đơn vị để thực hiện một tác vụ. Procedure có thể sửa đổi dữ liệu hoặc đối tượng schema, quản lý giao dịch và trả về 0 hoặc nhiều tập kết quả. Function, ngược lại, thường dùng trong biểu thức SQL, bắt buộc trả về giá trị (vô hướng hoặc dạng bảng) và trong nhiều cơ sở dữ liệu bị hạn chế tác dụng phụ. Hành vi chính xác tùy CSDL (ví dụ, T-SQL có function vô hướng và dạng bảng; PostgreSQL phân biệt function và procedure).
55. Thứ tự sắp xếp mặc định với ORDER BY là gì, và thay đổi thế nào?
Mặc định là tăng dần (NULLS FIRST/LAST tùy CSDL). Dùng từ khóa ASC/DESC theo từng cột như sau:
SELECT * FROM table_name
ORDER BY col_1 DESC;
56. Toán tử tập hợp trong SQL là gì?
-
UNION– trả về các bản ghi có được từ ít nhất một trong hai truy vấn (loại bỏ trùng lặp) -
UNION ALL– trả về các bản ghi có được từ ít nhất một trong hai truy vấn (bao gồm trùng lặp) -
INTERSECT– trả về các bản ghi có ở cả hai truy vấn -
EXCEPT(gọi làMINUStrong MySQL và Oracle) – chỉ trả về bản ghi có trong truy vấn thứ nhất nhưng không có trong truy vấn thứ hai
57. Toán tử nào dùng để khớp mẫu (pattern matching)?
Toán tử LIKE kết hợp wildcard % và _. Wildcard % đại diện cho bất kỳ số lượng ký tự nào (kể cả 0), còn _ – đúng một ký tự.
58. Khác biệt giữa khóa chính và khóa duy nhất trong SQL?
Cả hai đều đảm bảo giá trị duy nhất trong một cột, nhưng khóa chính nhận diện duy nhất mỗi bản ghi của bảng, còn khóa duy nhất ngăn trùng lặp ở cột đó.
59. Khóa chính tổng hợp (composite primary key) là gì?
Khóa chính của bảng dựa trên nhiều cột.
60. Thứ tự điển hình của các mệnh đề trong câu lệnh SELECT?
SELECT – FROM – JOIN – ON – WHERE – GROUP BY – HAVING – ORDER BY – LIMIT
61. Trình thông dịch thực thi các mệnh đề trong truy vấn SELECT theo thứ tự nào?
Đây là thứ tự thực thi của SQL:
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT/OFFSET (FETCH)
62. View trong SQL là gì?
Một bảng ảo chứa tập dữ liệu con được truy xuất từ một hoặc nhiều bảng (hoặc view khác). View chuẩn không lưu dữ liệu; materialized view thì có. View có thể đơn giản hóa truy vấn, đóng gói logic và, kết hợp với quyền hạn, giới hạn cột/hàng. View có thể join/tổng hợp dữ liệu từ nhiều bảng.
63. Có thể tạo view dựa trên view khác trong SQL không?
Có. Đây còn gọi là view lồng nhau. Tuy nhiên, nên tránh lồng quá nhiều view vì mã sẽ khó đọc và gỡ lỗi.
64. Có thể tiếp tục dùng view nếu bảng gốc bị xóa không?
Không. Mọi view dựa trên bảng đó sẽ trở nên không hợp lệ sau khi xóa bảng gốc. Nếu vẫn cố dùng, bạn sẽ nhận thông báo lỗi.
65. Bạn biết những loại quan hệ SQL nào?
- Một-một – mỗi bản ghi ở bảng này tương ứng với một bản ghi ở bảng kia
- Một-nhiều – mỗi bản ghi ở bảng này tương ứng với nhiều bản ghi ở bảng kia
- Nhiều-nhiều – mỗi bản ghi ở cả hai bảng tương ứng với nhiều bản ghi ở bảng còn lại
66. Các giá trị khả dĩ của trường dữ liệu BOOLEAN?
Ở một số biến thể SQL như PostgreSQL, kiểu BOOLEAN tồn tại rõ ràng và nhận giá trị TRUE, FALSE hoặc NULL. Ở biến thể khác như Microsoft SQL Server, dùng kiểu BIT để lưu Boolean dưới dạng số nguyên 1 (đúng) hoặc 0 (sai).
67. Chuẩn hóa (normalization) trong SQL là gì?
Là quy trình thiết kế cơ sở dữ liệu bao gồm tổ chức và tái cấu trúc dữ liệu nhằm giảm dư thừa, phụ thuộc, trùng lặp và không nhất quán. Điều này giúp tăng tính toàn vẹn dữ liệu, có nhiều bảng hơn, truy cập hiệu quả hơn, kiểm soát bảo mật tốt hơn và linh hoạt truy vấn cao hơn.
68. Phi chuẩn hóa (denormalization) trong SQL là gì?
Phi chuẩn hóa là quy trình ngược với chuẩn hóa: đưa vào dư thừa dữ liệu và kết hợp dữ liệu từ nhiều bảng. Phi chuẩn hóa tối ưu hiệu năng hạ tầng cơ sở dữ liệu khi đọc quan trọng hơn ghi, vì giúp tránh join phức tạp và giảm thời gian chạy truy vấn.
69. Khác biệt giữa đổi tên cột và đặt alias cho cột?
Đổi tên cột là thay đổi vĩnh viễn tên thực của nó trong bảng gốc. Đặt alias là cho nó tên tạm thời trong lúc thực thi truy vấn SQL, nhằm giúp mã dễ đọc và gọn hơn.
70. Khác biệt giữa subquery lồng nhau và subquery tương quan?
Subquery tương quan là truy vấn con trong truy vấn lớn hơn mà tham chiếu giá trị từ truy vấn ngoài để thực thi, tức phụ thuộc vào truy vấn ngoài. Ngược lại, subquery không tương quan không dựa vào dữ liệu từ truy vấn ngoài và có thể chạy độc lập.
71. Khác biệt giữa clustered và non-clustered index?
Clustered index xác định thứ tự vật lý của bản ghi trong bảng và tìm kiếm dựa trên giá trị khóa, còn non-clustered index giữ thứ tự bản ghi không trùng với thứ tự vật lý dữ liệu trên đĩa. Một bảng chỉ có một clustered index nhưng có thể có nhiều non-clustered index.
72. Hàm CASE() là gì?
Cách hiện thực logic if-then-else trong SQL. Hàm lần lượt kiểm tra các điều kiện trong mệnh đề WHEN và trả về giá trị ở THEN tương ứng khi điều kiện đầu tiên thỏa mãn. Nếu không điều kiện nào thỏa mãn, hàm trả về giá trị ở ELSE (nếu có), nếu không sẽ trả về NULL. Cú pháp:
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
WHEN condition_3 THEN value_3
...
ELSE value
END;
73. Khác biệt giữa DELETE và TRUNCATE?
DELETE là lệnh DML dùng để xóa một hoặc nhiều hàng khỏi bảng dựa trên điều kiện trong mệnh đề WHERE. Có thể đảo ngược nếu bọc trong giao dịch (qua ROLLBACK).
TRUNCATE là lệnh DDL xóa tất cả hàng khỏi bảng bằng cách giải phóng các trang dữ liệu. Nhanh hơn nhưng thường không thể đảo ngược, và không thể dùng trên bảng được tham chiếu bởi khóa ngoại.
74. Khác biệt giữa DROP và TRUNCATE?
DROP xóa hoàn toàn một bảng khỏi cơ sở dữ liệu, bao gồm cấu trúc bảng và mọi constraint, quan hệ với bảng khác và quyền truy cập liên quan. TRUNCATE xóa tất cả hàng khỏi bảng mà không ảnh hưởng cấu trúc và constraint. Cả hai đều là DDL. DROP loại bỏ bảng và metadata; TRUNCATE xóa mọi hàng nhưng giữ định nghĩa bảng. Hiệu năng và hành vi giao dịch tùy bộ máy CSDL.
75. Khác biệt giữa HAVING và WHERE?
HAVING hoạt động trên dữ liệu đã được tổng hợp sau khi nhóm, còn WHERE kiểm tra từng hàng riêng lẻ. Nếu cả hai cùng xuất hiện trong truy vấn, thứ tự sẽ là:WHERE – GROUP BY – HAVING. Bộ máy SQL cũng diễn giải theo thứ tự này.
76. Thêm một bản ghi vào bảng như thế nào?
Dùng câu lệnh INSERT INTO kết hợp VALUES. Cú pháp:
INSERT INTO table_name
VALUES (value_1, value_2, ...);
77. Xóa một bản ghi khỏi bảng như thế nào?
Dùng câu lệnh DELETE. Cú pháp:
DELETE FROM table_name
WHERE condition;
Bằng cách này, ta cũng có thể xóa nhiều bản ghi nếu thỏa điều kiện.
78. Thêm một cột vào bảng như thế nào?
Dùng câu lệnh ALTER TABLE kết hợp ADD. Cú pháp:
ALTER TABLE table_name
ADD column_name datatype;
79. Đổi tên một cột của bảng như thế nào?
Dùng câu lệnh ALTER TABLE kết hợp RENAME COLUMN ... TO .... Cú pháp:
ALTER TABLE table_name
RENAME COLUMN old_column_name TO new_column_name;
80. Xóa một cột khỏi bảng như thế nào?
Dùng câu lệnh ALTER TABLE kết hợp DROP COLUMN. Cú pháp:
ALTER TABLE table_name
DROP COLUMN column_name;
81. Chọn tất cả bản ghi chẵn hoặc lẻ trong một bảng như thế nào?
Bằng cách kiểm tra phần dư khi chia cho 2. Ở một số phiên bản SQL (ví dụ PostgreSQL và MySQL), dùng hàm MOD, ở phiên bản khác (Microsoft SQL Server và SQLite) – dùng toán tử modulo (%). Để chọn bản ghi chẵn dùng MOD:
SELECT * FROM table_name
WHERE MOD(ID_column, 2) = 0;
Để chọn bản ghi chẵn dùng %:
SELECT * FROM table_name
WHERE ID_column % 2 = 0;
Để chọn bản ghi lẻ, cú pháp giống hệt nhưng dùng toán tử khác <> thay vì =.
82. Ngăn trùng lặp khi truy vấn thế nào?
Dùng mệnh đề DISTINCT cùng với SELECT hoặc tạo khóa duy nhất cho bảng đó.
83. Chèn nhiều hàng vào bảng như thế nào?
Dùng câu lệnh INSERT INTO kết hợp VALUES. Cú pháp:
INSERT INTO table_name
VALUES (value_1, value_2, ...),
(value_3, value_4, ...),
(value_5, value_6, ...),
...;
84. Tìm giá trị cao thứ n trong một cột như thế nào?
Dùng window function để xử lý đồng hạng chính xác:
SELECT column_name
FROM (
SELECT column_name, DENSE_RANK() OVER (ORDER BY column_name DESC) AS rnk
FROM table_name
) t
WHERE rnk = :n;
Để lấy hàng thứ n theo thứ tự (bỏ qua đồng hạng): ORDER BY column_name DESC OFFSET n-1 ROWS FETCH NEXT 1 ROW ONLY.
85. Tìm các giá trị trong cột văn bản bắt đầu bằng một chữ cái nhất định như thế nào?
Dùng toán tử LIKE với wildcard % và _. Ví dụ, cần tìm tất cả họ trong bảng bắt đầu bằng "A". Truy vấn:
SELECT * FROM table_name
WHERE surname LIKE 'A_';
Ở đây, giả định họ có ít nhất hai chữ cái. Nếu không có giả định này (tức họ có thể chỉ là A), truy vấn như sau:
SELECT * FROM table_name
WHERE surname LIKE 'A%';
86. Tìm id cuối cùng trong một bảng như thế nào?
Cách đơn giản nhất là dùng hàm tổng hợp MAX().
SELECT MAX(id) AS highest_id
FROM table_name;
Dùng ORDER BY với LIMIT hoặc TOP
SELECT id
FROM table_name
ORDER BY id DESC
LIMIT 1;
87. Chọn các hàng ngẫu nhiên từ một bảng như thế nào?
Dùng hàm RAND() kết hợp với ORDER BY và LIMIT. Ở một số biến thể như PostgreSQL, gọi là RANDOM(). Ví dụ, đoạn mã sau sẽ trả về 5 hàng ngẫu nhiên trong MySQL:
SELECT * FROM table_name
ORDER BY RAND()
LIMIT 5;
Câu Hỏi Phỏng Vấn SQL Theo Kịch Bản
Các câu hỏi theo kịch bản kiểm tra khả năng giải quyết vấn đề nghiệp vụ thực tế bằng SQL. Nhà tuyển dụng dùng chúng để đánh giá không chỉ kiến thức cú pháp mà còn cách tiếp cận giải quyết vấn đề và khả năng xử lý các tình huống biên như trùng lặp, giá trị NULL và đồng hạng.
88. Tìm và xóa bản ghi trùng lặp khỏi bảng như thế nào?
Tìm trùng lặp:
SELECT email, COUNT(*) AS duplicate_count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
Xóa trùng lặp (giữ lại một bản ghi):
WITH duplicates AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users
WHERE id IN (SELECT id FROM duplicates WHERE rn > 1);
Cách này dùng CTE với ROW_NUMBER() để xác định trùng lặp, giữ bản ghi có ID nhỏ nhất.
89. Tính tổng chạy (cumulative sum) như thế nào?
Dùng hàm SUM() kiểu window với mệnh đề ORDER BY:
SELECT
transaction_date,
amount,
SUM(amount) OVER (ORDER BY transaction_date) AS running_total
FROM transactions;
Cho tổng chạy theo danh mục (ví dụ theo khách hàng):
SELECT
customer_id,
transaction_date,
amount,
SUM(amount) OVER (
PARTITION BY customer_id
ORDER BY transaction_date
) AS customer_running_total
FROM transactions;
90. Tìm nhân viên có lương cao hơn mức trung bình trong phòng ban như thế nào?
Đây là bài toán subquery tương quan kinh điển:
SELECT e.name, e.department, e.salary
FROM employees e
WHERE e.salary > (
SELECT AVG(salary)
FROM employees
WHERE department = e.department
);
Hoặc dùng window function:
SELECT name, department, salary
FROM (
SELECT
name,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees
) t
WHERE salary > dept_avg;
91. Tìm khoảng trống trong dãy số (ví dụ thiếu số hóa đơn) như thế nào?
Dùng LEAD() để so sánh mỗi giá trị với giá trị kế tiếp:
SELECT
invoice_number,
LEAD(invoice_number) OVER (ORDER BY invoice_number) AS next_invoice,
LEAD(invoice_number) OVER (ORDER BY invoice_number) - invoice_number - 1 AS gap_size
FROM invoices
WHERE LEAD(invoice_number) OVER (ORDER BY invoice_number) - invoice_number > 1;
Điều này xác định nơi khoảng cách giữa hai số hóa đơn liên tiếp lớn hơn 1.
92. Tìm khách hàng mua hàng trong các tháng liên tiếp như thế nào?
Dùng LAG() để so sánh với hàng trước:
WITH monthly_purchases AS (
SELECT
customer_id,
DATE_TRUNC('month', purchase_date) AS purchase_month,
LAG(DATE_TRUNC('month', purchase_date)) OVER (
PARTITION BY customer_id
ORDER BY DATE_TRUNC('month', purchase_date)
) AS prev_month
FROM purchases
GROUP BY customer_id, DATE_TRUNC('month', purchase_date)
)
SELECT DISTINCT customer_id
FROM monthly_purchases
WHERE purchase_month = prev_month + INTERVAL '1 month';
93. Pivot dữ liệu từ hàng thành cột như thế nào?
Dùng tổng hợp có điều kiện với câu lệnh CASE:
SELECT
product_name,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 1 THEN amount ELSE 0 END) AS jan_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 2 THEN amount ELSE 0 END) AS feb_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 3 THEN amount ELSE 0 END) AS mar_sales
FROM sales
GROUP BY product_name;
Một số cơ sở dữ liệu (SQL Server, Oracle) có cú pháp PIVOT gốc cho thao tác này.
94. Tìm top 3 sản phẩm theo doanh số trong mỗi danh mục như thế nào?
Dùng DENSE_RANK() với PARTITION BY:
WITH ranked_products AS (
SELECT
category,
product_name,
SUM(sales_amount) AS total_sales,
DENSE_RANK() OVER (
PARTITION BY category
ORDER BY SUM(sales_amount) DESC
) AS sales_rank
FROM sales
GROUP BY category, product_name
)
SELECT category, product_name, total_sales
FROM ranked_products
WHERE sales_rank <= 3
ORDER BY category, sales_rank;
95. Thuộc tính ACID trong giao dịch cơ sở dữ liệu là gì?
ACID là viết tắt của bốn thuộc tính then chốt đảm bảo giao dịch cơ sở dữ liệu đáng tin cậy:
- Tính nguyên tử (Atomicity): Giao dịch là “tất cả hoặc không gì cả” – hoặc mọi thao tác đều thành công, hoặc không thao tác nào được thực hiện
- Tính nhất quán (Consistency): Giao dịch đưa cơ sở dữ liệu từ một trạng thái hợp lệ sang trạng thái hợp lệ khác, duy trì mọi quy tắc và ràng buộc đã định
- Tính cô lập (Isolation): Các giao dịch đồng thời không can thiệp lẫn nhau; mỗi giao dịch thấy một ảnh chụp nhất quán của dữ liệu
- Tính bền vững (Durability): Khi giao dịch được commit, các thay đổi sẽ tồn tại ngay cả khi hệ thống gặp sự cố
Ví dụ giao dịch:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
96. Deadlock là gì và làm sao ngăn chặn?
Deadlock xảy ra khi hai hoặc nhiều giao dịch chờ nhau nhả khóa, tạo phụ thuộc vòng tròn khiến không giao dịch nào tiếp tục được.
Ví dụ: Giao dịch A khóa Bảng X và chờ Bảng Y, trong khi Giao dịch B khóa Bảng Y và chờ Bảng X.
Chiến lược phòng ngừa:
- Thứ tự khóa nhất quán: Luôn lấy khóa theo cùng một thứ tự ở mọi giao dịch
- Giữ giao dịch ngắn: Commit hoặc rollback nhanh nhất có thể
- Dùng mức cô lập phù hợp: Mức cô lập thấp hơn giảm tranh chấp khóa
- Chỉ truy cập dữ liệu cần thiết: Tránh khóa những hàng không cần
- Xử lý thử lại khi deadlock: Hầu hết CSDL tự động phát hiện và giải quyết deadlock bằng cách rollback một giao dịch
97. Tối ưu một truy vấn SQL chạy chậm như thế nào?
Chiến lược chính:
-
Thêm index phù hợp: Tạo index trên các cột dùng trong
WHERE,JOINvàORDER BY -
Phân tích kế hoạch thực thi: Dùng
EXPLAIN(PostgreSQL/MySQL) hoặcEXPLAIN PLAN(Oracle) để tìm nút thắt -
Tránh SELECT *: Chỉ truy xuất các cột cần thiết
-
Dùng JOIN thay cho subquery:
JOINthường hiệu quả hơn subquery tương quan -
Giới hạn tập kết quả: Dùng
LIMIT/TOPkhi không cần tất cả hàng -
Tránh hàm trên cột có index:
WHERE YEAR(date_col) = 2026không dùng được index; thay bằngWHERE date_col >= '2026-01-01' -
Cân nhắc phân vùng (partitioning): Với bảng rất lớn, phân vùng theo ngày hoặc danh mục
98. Xử lý giá trị NULL trong tính toán và so sánh như thế nào?
NULL đại diện dữ liệu thiếu hoặc không biết và cần xử lý đặc biệt:
-
So sánh: Dùng
IS NULLhoặcIS NOT NULLthay vì= NULL -
COALESCE(): Trả về giá trị đầu tiên không
NULL:COALESCE(column, 'default') -
NULLIF(): Trả về
NULLnếu hai giá trị bằng nhau:NULLIF(a, b) -
ISNULL() / NVL(): Hàm đặc thù từng CSDL để thay thế giá trị
NULL
SELECT
name,
COALESCE(phone, email, 'No contact') AS contact_info,
CASE WHEN status IS NULL THEN 'Unknown' ELSE status END AS status
FROM customers;
99. Tìm chuỗi ngày đăng nhập liên tiếp dài nhất cho một người dùng như thế nào?
Đây là bài toán “đảo và khoảng trống” nâng cao:
WITH login_groups AS (
SELECT
user_id,
login_date,
login_date - ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY login_date
) * INTERVAL '1 day' AS group_id
FROM user_logins
)
SELECT
user_id,
MIN(login_date) AS streak_start,
MAX(login_date) AS streak_end,
COUNT(*) AS streak_length
FROM login_groups
GROUP BY user_id, group_id
ORDER BY streak_length DESC
LIMIT 1;
Mẹo là trừ số thứ tự hàng khỏi mỗi ngày – các ngày liên tiếp sẽ cho cùng “group_id”.
Nâng Cao Kỹ Năng SQL Cho Đội Ngũ Của Bạn
Trong khi việc chuẩn bị phỏng vấn SQL là rất quan trọng với ứng viên và quản lý tuyển dụng, các doanh nghiệp cũng cần đầu tư đào tạo SQL liên tục cho đội ngũ. Khả năng làm việc với dữ liệu quan trọng hơn bao giờ hết, nên đảm bảo nhân viên có kỹ năng SQL vững vàng có thể tạo ra khác biệt lớn cho thành công của công ty bạn.
Nếu bạn là trưởng nhóm hoặc chủ doanh nghiệp muốn đảm bảo cả đội thành thạo SQL, DataCamp for Business cung cấp chương trình đào tạo phù hợp giúp nhân viên của bạn làm chủ kỹ năng SQL, từ cơ bản đến nâng cao. Chúng tôi có thể cung cấp:
- Lộ trình học tập có mục tiêu: Tùy chỉnh theo trình độ hiện tại và nhu cầu kinh doanh của đội bạn.
- Thực hành trực tiếp: Kịch bản và bài tập thực tế giúp củng cố và ghi nhớ kiến thức.
- Theo dõi tiến độ: Công cụ giám sát và đánh giá tiến trình học tập, đảm bảo đạt mục tiêu đề ra.
Đầu tư nâng cao kỹ năng SQL qua các nền tảng như DataCamp không chỉ tăng năng lực đội ngũ mà còn mang lại lợi thế chiến lược cho doanh nghiệp, giúp bạn duy trì sức cạnh tranh và tạo ra kết quả. Hãy trao đổi với đội ngũ của chúng tôi và yêu cầu bản demo ngay hôm nay.
Kết Luận
Tóm lại, chúng tôi đã thảo luận 99 câu hỏi phỏng vấn SQL thiết yếu cho người mới bắt đầu, trung cấp và theo kịch bản cùng đáp án phù hợp. Hy vọng thông tin này sẽ giúp bạn sẵn sàng cho buổi phỏng vấn và tự tin hơn, dù bạn đang tìm việc liên quan đến SQL hay tuyển dụng ứng viên cho vị trí SQL trung cấp.
Nếu bạn thấy cần luyện tập thêm để chuẩn bị tốt hơn, hãy xem toàn bộ danh sách các khóa học SQL của chúng tôi:
FAQs
Làm sao tôi có thể bắt đầu học SQL?
Để bắt đầu học SQL, hãy nắm các khái niệm cơ bản về cơ sở dữ liệu và hệ quản trị cơ sở dữ liệu quan hệ. DataCamp có nhiều tài nguyên giúp bạn khởi đầu, như khóa Introduction to SQL, Lộ trình Nghề nghiệp Data Analyst in SQL và cheat sheet SQL. Hoặc truy cập trang SQL courses để duyệt tất cả tài nguyên.
Tôi có thể tìm các bài toán SQL thực tế để luyện tập ở đâu?
Trên nền tảng DataCamp có nhiều dự án SQL để bạn rèn luyện kỹ năng, phù hợp cho mọi cấp độ.
Một số câu hỏi phỏng vấn SQL thường gặp cho người mới là gì?
Người mới thường được hỏi giải thích các khái niệm SQL cơ bản, như sự khác nhau giữa câu lệnh SELECT và INSERT, mục đích của key trong cơ sở dữ liệu (khóa chính và khóa ngoại), và các truy vấn đơn giản để lấy dữ liệu từ một bảng với điều kiện (WHERE).
Một số câu hỏi phỏng vấn SQL thường gặp cho người dùng trung cấp là gì?
Người dùng trung cấp có thể gặp câu hỏi về các khái niệm SQL phức tạp hơn như join (INNER, LEFT, RIGHT, FULL), subquery, tổng hợp và nhóm dữ liệu (GROUP BY), và dùng toán tử tập hợp như UNION, INTERSECT và EXCEPT. Họ cũng có thể được yêu cầu giải bài toán cần tối ưu truy vấn hiệu năng.
Tôi nên chuẩn bị gì cho một buổi phỏng vấn SQL?
Chuẩn bị cho phỏng vấn SQL nên bao gồm:
- Ôn lại kiến thức SQL cơ bản và nâng cao.
- Luyện viết truy vấn để giải các bài toán thường gặp.
- Hiểu thiết kế cơ sở dữ liệu và chuẩn hóa.
- Làm quen với biến thể SQL cụ thể mà nhà tuyển dụng dùng (ví dụ PostgreSQL, MySQL, SQL Server).
- Giải các câu hỏi và bài toán phỏng vấn mẫu có sẵn trực tuyến.
Tôi nên mong đợi điều gì trong một buổi phỏng vấn SQL kỹ thuật và làm sao thể hiện tốt nhất kỹ năng?
Trong phỏng vấn SQL kỹ thuật, bạn có thể gặp câu hỏi kiểm tra kiến thức về cú pháp SQL, thiết kế cơ sở dữ liệu, tối ưu truy vấn và khả năng giải quyết vấn đề bằng SQL. Để thể hiện kỹ năng của bạn:
- Luyện trình bày tư duy của bạn khi giải bài toán SQL.
- Sẵn sàng viết truy vấn SQL không lỗi trên bảng trắng hoặc môi trường mã hóa trực tuyến.
- Thể hiện hiểu biết về các khái niệm phức tạp như join, subquery và transaction bằng ví dụ.
- Thảo luận trải nghiệm thực tế của bạn khi làm việc với cơ sở dữ liệu, nêu bật thách thức bạn đã vượt qua hoặc tối ưu hóa bạn đã thực hiện.
DataCamp có tài nguyên MIỄN PHÍ bổ sung để chuẩn bị phỏng vấn SQL không?
Có! Nếu bạn hiện là giảng viên hoặc sinh viên đại học, bạn có thể dùng DataCamp Classrooms để nhận miễn phí toàn bộ danh mục nội dung cao cấp của chúng tôi. Bao gồm các lộ trình SQL và chứng chỉ.
Bạn cũng có thể xem SQL Basics cheat sheet miễn phí của chúng tôi.
Những chủ đề SQL quan trọng nhất cần học cho phỏng vấn năm 2026 là gì?
Tập trung vào những mảng chính: (1) Join và subquery – hiểu INNER, LEFT, RIGHT, FULL và subquery tương quan vs không tương quan; (2) Window function – ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD và tổng chạy; (3) CTE (Common Table Expressions) – để viết truy vấn dễ đọc, dễ bảo trì; (4) Tổng hợp và GROUP BY – bao gồm cách dùng HAVING; (5) Tối ưu truy vấn – chiến lược lập chỉ mục và kế hoạch thực thi.
Khác biệt giữa ROW_NUMBER, RANK và DENSE_RANK là gì?
Cả ba đều là hàm xếp hạng kiểu window nhưng xử lý đồng hạng khác nhau: ROW_NUMBER() gán số thứ tự duy nhất kể cả khi đồng hạng (1, 2, 3, 4); RANK() cho đồng hạng cùng một hạng nhưng bỏ qua số tiếp theo (1, 2, 2, 4); DENSE_RANK() cho đồng hạng cùng hạng mà không bỏ qua (1, 2, 2, 3). Dùng DENSE_RANK khi tìm “giá trị cao thứ n” mà các đồng hạng nên chia sẻ cùng vị trí.
What is the difference between ROW_NUMBER, RANK, and DENSE_RANK?
All three are ranking window functions, but they handle ties differently: ROW_NUMBER() assigns unique sequential numbers even for ties (1, 2, 3, 4); RANK() gives the same rank to ties but skips subsequent numbers (1, 2, 2, 4); DENSE_RANK() gives the same rank to ties without skipping (1, 2, 2, 3). Use DENSE_RANK when finding the "nth highest" value where ties should share the same position.

Nhà khoa học dữ liệu được chứng nhận bởi IBM (2020), trước đây là Nhà địa chất/Người xây dựng mô hình địa chất cho các mỏ dầu khí trên toàn thế giới với hơn 12 năm kinh nghiệm làm việc quốc tế. Thành thạo Python, R và SQL. Lĩnh vực chuyên môn: làm sạch dữ liệu, xử lý dữ liệu, trực quan hóa dữ liệu, phân tích dữ liệu, mô hình hóa dữ liệu, thống kê, kể chuyện bằng dữ liệu, học máy. Có nhiều kinh nghiệm trong quản lý cộng đồng khoa học dữ liệu và viết/biên tập bài viết, hướng dẫn về khoa học dữ liệu và định hướng nghề nghiệp.