Các câu hỏi về SQL được đưa ra trong hầu hết các buổi phỏng vấn vì thao tác với cơ sở dữ liệu rất phổ biến trong các ứng dụng. SQL là viết tắt của Structured Query Language, một ngôn ngữ lập trình chuyên biệt theo lĩnh vực dùng cho giao tiếp cơ sở dữ liệu và quản lý cơ sở dữ liệu quan hệ.

SQL bao gồm các lệnh chuẩn cho tương tác cơ sở dữ liệu như SELECT, INSERT, CREATE, DELETE, UPDATE, DROP… Với những lệnh này, SQL cho phép người dùng truy xuất và tải dữ liệu từ cơ sở dữ liệu, tạo và xóa các phần tử bảng, cũng như triển khai các tương tác cơ sở dữ liệu động giữa máy chủ và chương trình.
Các câu hỏi phỏng vấn SQL phổ biến
Dưới đây là các câu hỏi và câu trả lời phỏng vấn SQL, giúp bạn củng cố kiến thức về SQL và mang lại những góc nhìn, kiến thức mới về ngôn ngữ này. Hãy tham khảo những câu hỏi SQL này để ôn tập trước khi tham gia phỏng vấn.
1. SQL là gì?
SQL là một ngôn ngữ lập trình chuyên biệt cho phép bạn truy vấn và thao tác dữ liệu trong hệ quản trị cơ sở dữ liệu được sắp xếp tối ưu và phân loại. Điều này có thể thực hiện được thông qua các lệnh trong SQL cho phép bạn đọc, ghi, chọn và xóa các bản ghi hoặc thậm chí là các cột trong cùng một thuộc tính hoặc bảng. SQL cũng cung cấp một cách rất hiệu quả để tạo kênh truy cập động giữa chương trình, website hoặc ứng dụng di động và cơ sở dữ liệu.
Ví dụ, khi nhập thông tin đăng nhập trên một website, dữ liệu đăng nhập này sẽ được SQL chuyển vào cơ sở dữ liệu để xác minh và áp dụng các hạn chế cho người dùng.
2. Sự khác biệt giữa Cơ sở dữ liệu và Cơ sở dữ liệu quan hệ là gì?
Cơ sở dữ liệu hoặc Hệ quản trị cơ sở dữ liệu (DBMS) và Hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) đều được SQL sử dụng để lưu trữ dữ liệu và cấu trúc. Tuy nhiên, mỗi loại hệ quản trị được ưu tiên sử dụng trong các tình huống khác nhau. Điểm khác biệt chính là DBMS lưu thông tin dưới dạng file trong khi RDBMS lưu thông tin dưới dạng bảng. Hơn nữa, giống như tên gọi “Relational”, RDBMS cho phép các bảng khác nhau có mối quan hệ với nhau bằng cách sử dụng Khóa chính, Khóa ngoại… Điều này tạo ra một chuỗi quan hệ động giữa các bảng và mang lại những ràng buộc hữu ích. DBMS thì sắp xếp bảng theo dạng phân cấp hoặc điều hướng, điều này phù hợp khi lưu dữ liệu trong các bảng độc lập và bạn không muốn thay đổi các bảng khác khi chỉnh sửa một bảng.
3. Cấu trúc cơ bản của SQL là gì?
SQL được xây dựng dựa trên các phép toán quan hệ, có các chỉnh sửa và cải tiến. Một truy vấn SQL cơ bản có dạng:
SELECT A1, A2, ..., An
FROM R1, R2, ..., Rm
WHERE P;
Trong đó:
- An là các thuộc tính,
- Rm là các quan hệ trong cơ sở dữ liệu,
- P là điều kiện lọc.
4. SQL có các loại lệnh nào?
Các lệnh SQL được chia thành bốn loại sau:
- Ngôn ngữ thao tác dữ liệu – DML (Data Manipulation Language): cung cấp khả năng thao tác dữ liệu.
- Ngôn ngữ định nghĩa dữ liệu – DDL (Data Definition Language): dùng để thao tác cấu trúc cơ sở dữ liệu.
- Ngôn ngữ kiểm soát giao dịch – TCL (Transaction Control Language): quản lý xác minh giao dịch dữ liệu và xử lý lỗi.
- Ngôn ngữ kiểm soát dữ liệu – DCL (Data Control Language): các câu lệnh bảo mật, thiết lập giới hạn truy cập và quyền dữ liệu để bảo vệ dữ liệu.
5. SQL được dùng để làm gì?
SQL rất phổ biến với các lập trình viên phía máy chủ nhờ khả năng xử lý nhanh một lượng lớn bản ghi trong cơ sở dữ liệu một cách dễ dàng. Điều này giúp cải thiện đáng kể hiệu quả truy xuất và thao tác dữ liệu. Cụ thể, SQL cho phép thực thi, truy xuất, chèn, cập nhật, xóa dữ liệu trong cơ sở dữ liệu. Ngoài ra, SQL còn hỗ trợ tạo các cấu trúc như bảng, view, và cơ sở dữ liệu với tên duy nhất.
6. Định nghĩa các từ khóa SELECT, INSERT, CREATE, DELETE, UPDATE, DROP
Các từ khóa SQL cơ bản
- SELECT được sử dụng để truy vấn và lấy các bản ghi trong các hàng từ bảng hoặc view. Nó cũng có thể đi kèm với từ khóa AS để tạo bí danh. Để lọc câu lệnh SELECT, bạn có thể thêm mệnh đề WHERE để cung cấp điều kiện lọc và chỉ chọn những bản ghi thỏa mãn điều kiện.
- INSERT cho phép thêm hoặc chèn một hàng hoặc nhiều hàng vào bảng trong cơ sở dữ liệu. Khi đi kèm với từ khóa VALUES, nó cho phép bạn thêm một hàng với các giá trị cụ thể. INSERT cũng có thể đi kèm với SELECT để chèn các hàng đã được chọn trước.
- CREATE là từ khóa được dùng để tạo các đối tượng trong SQL. Nó thường đi kèm với đối tượng cần tạo, chẳng hạn như CREATE DATABASE, CREATE TABLE, CREATE VIEW…
- DELETE được sử dụng để xóa bản ghi trong cơ sở dữ liệu. Hãy luôn sử dụng cẩn thận để tránh mất dữ liệu ngoài ý muốn. Nếu không muốn xóa nhầm các bản ghi, bạn có thể sử dụng mệnh đề WHERE để chỉ rõ phạm vi của các bản ghi bạn muốn xóa.
- UPDATE dùng để cập nhật hoặc thay đổi dữ liệu hiện có trong một bản ghi đã tồn tại. Lưu ý, bản ghi cần phải tồn tại trước khi có thể cập nhật.
- DROP dùng để xóa bảng trong cơ sở dữ liệu.
7. Sự khác biệt giữa SQL và PL/SQL là gì?
- SQL: ngôn ngữ dùng để giao tiếp với cơ sở dữ liệu quan hệ, cho phép thao tác và tạo cơ sở dữ liệu.
- PL/SQL là một biến thể (dialect) của SQL, được sử dụng để mở rộng khả năng của SQL. Nó được phát triển bởi Oracle Corporation vào đầu những năm 1990. PL/SQL bổ sung các đặc điểm thủ tục của ngôn ngữ lập trình vào trong SQL.
8. Ngôn ngữ định nghĩa dữ liệu (DDL) là gì?
DDL liên quan đến các lệnh SQL tác động trực tiếp đến cấu trúc của cơ sở dữ liệu. DDL là một nhóm trong các phân loại lệnh SQL, ngoài ra còn có DML, Transactions và Security. Một đặc điểm riêng của các lệnh DDL là chúng có thể thao tác với index, đối tượng, bảng, view, trigger…
Ba từ khóa DDL phổ biến trong SQL là:
- CREATE – tạo bảng:
CREATE TABLE tableName (name data_type); - ALTER – chỉnh sửa bảng, thêm/xóa/sửa cột:
ALTER TABLE tableName ADD columnName data_type; - DROP – được dùng để xóa hoặc loại bỏ một bảng hiện có cùng với toàn bộ các bản ghi, ràng buộc, trigger, index và quyền liên quan. Về bản chất, nó sẽ xóa hoàn toàn bảng đó.
DROP TABLE tableName;
9. Ngôn ngữ thao tác dữ liệu (DML) là gì?
DML là một tập hợp các lệnh được phân loại theo khả năng cho phép người dùng thay đổi các bản ghi trong cơ sở dữ liệu. Điều này có thể được thực hiện thông qua việc chèn, truy vấn, xóa hoặc cập nhật dữ liệu trong các bảng. Các câu lệnh DML phổ biến bắt nguồn từ những chức năng cốt lõi này và được liệt kê dưới đây:
SELECT – dùng để truy vấn và lấy một hàng trong bảng.
SELECT [columnName] FROM [tableName]
UPDATE – dùng để cập nhật các bản ghi trong bảng hiện có.
UPDATE [tableName] SET [value]
INSERT – dùng để chèn các bản ghi vào bảng hiện có.
INSERT INTO [tableName]
DELETE – dùng để xóa các bản ghi khỏi bảng hiện có.
DELETE FROM [tableName]
10. Ngôn ngữ điều khiển giao dịch (TCL) là gì?
TCL là một nhóm lệnh SQL chủ yếu xử lý giao dịch trong cơ sở dữ liệu và các điểm lưu (savepoint). Những từ khóa này triển khai các chức năng và logic SQL mà lập trình viên định nghĩa vào trong cấu trúc và hành vi của cơ sở dữ liệu.
Ví dụ về các lệnh TCL:
- COMMIT – dùng để xác nhận một giao dịch.
- ROLLBACK – trong trường hợp xảy ra lỗi, từ khóa này được sử dụng để hoàn tác giao dịch.
- SAVEPOINT – từ khóa đại diện cho điểm khôi phục khi hoàn tác.
- SET TRANSACTION – dùng để thiết lập các đặc tả của giao dịch.
11. Ngôn ngữ điều khiển dữ liệu (DCL) là gì?
DCL giám sát việc cấp quyền truy cập và giới hạn cho người dùng, bao gồm cả các quyền và đặc quyền cần thiết trong các câu lệnh SQL.
Ví dụ về các từ khóa DCL:
- GRANT – từ khóa DCL cung cấp quyền truy cập cơ sở dữ liệu cho người dùng.
- REVOKE – ngược lại với GRANT, dùng để thu hồi hoặc hủy bỏ các đặc quyền đã cấp cho người dùng.
12. Định nghĩa bảng và trường (field) trong cơ sở dữ liệu
Trong ngữ cảnh cơ sở dữ liệu, bảng là một cấu trúc lưu trữ các bản ghi có tổ chức. Bảng được chia thành các ô, mỗi ô chứa các trường của một hàng trong bảng.
Trường là một cấu trúc dữ liệu biểu diễn một đơn vị thông tin duy nhất. Các trường được sắp xếp thành bản ghi. Về cơ bản, mỗi trường lưu giữ một mẩu dữ liệu, là đơn vị cơ bản của phân bổ bộ nhớ cho dữ liệu và có thể truy cập được.
13. Các loại khóa (key) trong SQL
Khóa là một tính năng quan trọng trong RDBMS. Về bản chất, chúng là các trường dùng để liên kết các bảng lại với nhau, đồng thời hỗ trợ truy xuất dữ liệu nhanh chóng và quản lý log thông qua việc quản lý index trên cột.
Các loại khóa khác nhau gồm:
- Primary Key – khóa duy nhất để định danh các bản ghi trong bảng. Khóa này không được Null và phải duy nhất trong bảng.
- Candidate Key – trường duy nhất có thể định danh một cột hoặc nhóm cột một cách độc lập, không cần tham chiếu đến các trường khác.
- Alternate Key – có thể thay thế Primary Key trong một số trường hợp, nhưng được coi là khóa phụ. Khác biệt là Alternate Key có thể chứa giá trị Null, miễn là cột đó có dữ liệu. Đây cũng là một dạng Candidate Key và phải duy nhất.
- Unique Key – khóa áp dụng ràng buộc để ngăn dữ liệu trùng lặp trong các hàng, ngoại trừ các giá trị Null.
- Ngoài ra còn có Foreign Key, Super Key và Composite Key.
14. Các loại index trong SQL và định nghĩa
- Unique Index: Ngăn chặn các bản ghi trùng lặp trong các cột có Unique Index. Chúng tự động được tạo khi có Primary Key.
- Clustered Index: Dùng để tổ chức hoặc sắp xếp dữ liệu trong bảng dựa trên giá trị khóa. Mỗi bảng chỉ được phép có một Clustered Index duy nhất.
- NonClustered Index: Ngược lại, NonClustered Index chỉ quản lý thứ tự logic của các bản ghi, không thay đổi cách sắp xếp dữ liệu trong bảng. Một bảng có thể có nhiều NonClustered Index.
15. Sự khác biệt giữa SQL và MySQL
SQL là một ngôn ngữ lập trình máy chủ cho phép thao tác với các cột và trường dữ liệu trong cơ sở dữ liệu.
Trong khi đó, MySQL là một hệ quản trị cơ sở dữ liệu (DBMS), cụ thể hơn là một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS), chứ không phải là một ngôn ngữ lập trình. Tuy nhiên, MySQL triển khai cú pháp của SQL.
16. UNION và UNION ALL trong SQL là gì, khác nhau như thế nào?
Toán tử UNION trong SQL kết hợp nhiều tập kết quả từ các câu lệnh SELECT. Các điều kiện ràng buộc gồm:
- Số lượng cột phải giống nhau.
- Kiểu dữ liệu của các cột trong tập kết quả phải giống nhau.
- Thứ tự các cột trong các câu lệnh SELECT phải trùng khớp.
UNION sẽ tự động loại bỏ các hàng trùng lặp trong kết quả được trả về bởi câu lệnh SELECT.
UNION ALL cũng thực hiện chức năng giống như UNION, nhưng sẽ giữ lại tất cả các hàng, bao gồm cả các hàng trùng lặp.
Ví dụ:
SELECT C1, C2 FROM T1
UNION
SELECT Cx, Cy FROM T2;
17. Các loại join trong SQL là gì?
Từ khóa JOIN dùng để truy vấn dữ liệu từ nhiều bảng. Nó được sử dụng với các khóa khác nhau để tìm ra các bản ghi này và dựa vào mối liên kết giữa các trường.
- Inner Join: Trả về các hàng có điểm chung giữa các bảng.
- Right Join: Trả về tất cả các hàng của bảng bên phải, bao gồm cả những hàng chung.
- Left Join: Trả về tất cả các hàng của bảng bên trái, bao gồm cả những hàng chung.
- Full Join: Trả về tất cả các hàng, bất kể có chung hay không.
18. Normalization và Denormalization là gì?
Normalization sắp xếp các bảng và các trường hiện có trong cơ sở dữ liệu nhằm giảm thiểu sự trùng lặp. Nó được dùng để đơn giản hóa bảng ở mức tối đa trong khi vẫn duy trì các trường duy nhất.
Denormalization cho phép truy xuất các trường từ tất cả các dạng chuẩn (normal form) trong cơ sở dữ liệu. So với normalization, nó thực hiện ngược lại và đưa sự dư thừa vào bảng.
19. Khi nào chúng ta có thể sử dụng mệnh đề WHERE và HAVING?
Cả hai mệnh đề đều chấp nhận các điều kiện được dùng làm cơ sở để truy xuất trường dữ liệu. Sự khác biệt là mệnh đề WHERE chỉ được sử dụng cho các cột tĩnh không tổng hợp, trong khi HAVING chỉ dùng cho các cột đã được tổng hợp.
Ví dụ:
select order_id, SUM(sale_amount) as TotalSale
from SalesData
where quantity > 1
group by order_id
having SUM(sale_amount) > 100;
20. Sự khác biệt giữa UNION, MINUS và INTERSECT là gì?
- UNION: được dùng trong SQL để kết hợp nhiều câu lệnh SELECT, nhưng sẽ loại bỏ các bản ghi trùng lặp khỏi tập kết quả.
- INTERSECT: chỉ được dùng để truy xuất các hàng chung từ các câu lệnh SELECT giữa nhiều bảng.
- MINUS: về cơ bản dùng để trừ kết quả giữa hai câu lệnh SELECT. Kết quả là sự khác biệt giữa truy vấn đầu tiên và truy vấn thứ hai. Bất kỳ hàng nào chung giữa cả hai tập kết quả sẽ bị loại bỏ khỏi đầu ra cuối cùng.
21. Làm thế nào để chọn 10 bản ghi từ một bảng?
- MySQL: Sử dụng mệnh đề LIMIT, ví dụ:
SELECT * FROM Employee LIMIT 10; - Oracle: Sử dụng mệnh đề ROWNUM, ví dụ:
SELECT * FROM Employee WHERE ROWNUM < 10; - SQL Server: Sử dụng mệnh đề TOP, ví dụ:
SELECT TOP 3 * FROM Employee;
22. Làm thế nào để duy trì tính toàn vẹn của cơ sở dữ liệu trong các trường hợp việc xóa một phần tử ở bảng này dẫn đến xóa phần tử ở bảng khác?
Điều này có thể thực hiện bằng cách gọi một SQL trigger lắng nghe sự kiện khi bất kỳ phần tử nào bị xóa trong Bảng A, sau đó xóa các phần tử liên kết tương ứng trong Bảng B.
23. Quy trình sao chép dữ liệu từ Bảng A sang Bảng B là gì?
INSERT INTO TableB (columnOne, columnTwo, columnThree, ...)
SELECT columnOne, columnTwo, columnThree, ...
FROM TableA
WHERE added_condition;
24. Sự khác biệt giữa mệnh đề IN và EXISTS là gì?
Sự khác biệt rõ ràng giữa hai mệnh đề này là từ khóa EXISTS có tốc độ thực thi nhanh hơn so với IN. Nguyên nhân là vì từ khóa IN phải tìm qua tất cả các bản ghi hiện có, trong khi EXISTS sẽ tự động dừng lại khi đã tìm thấy bản ghi phù hợp. Ngoài ra, câu lệnh IN hoạt động trong ResultSet, còn EXISTS thì hoạt động trên các bảng ảo. Trong ngữ cảnh này, câu lệnh IN cũng không hoạt động trên các truy vấn có liên kết với bảng ảo, trong khi từ khóa EXISTS được sử dụng cho các truy vấn liên kết.
25. Từ viết tắt ACID trong quản trị cơ sở dữ liệu có nghĩa là gì?
ACID là viết tắt của Atomicity, Consistency, Isolation, và Durability. Thuộc tính này chủ yếu đảm bảo tính toàn vẹn của quá trình trong hệ thống cơ sở dữ liệu. Điều này có nghĩa là bất kỳ giao dịch dữ liệu nào mà người dùng gửi đến cơ sở dữ liệu đều phải được thực hiện một cách đầy đủ, chính xác và có khả năng duy trì lâu dài.
26. Trigger trong SQL là gì?
Database trigger là một chương trình tự động được thực thi để phản hồi lại một số sự kiện trên bảng hoặc view, chẳng hạn như thêm, cập nhật hoặc xóa bản ghi. Về cơ bản, trigger trong cơ sở dữ liệu giúp chúng ta duy trì tính toàn vẹn của dữ liệu.
27. Tính năng Auto Increment trong SQL là gì?
Auto increment cho phép người dùng tạo ra một số duy nhất mỗi khi một bản ghi mới được chèn vào bảng. AUTO INCREMENT là từ khóa trong Oracle, AUTO_INCREMENT trong MySQL và từ khóa IDENTITY có thể được sử dụng trong SQL Server để tự động tăng. Phần lớn từ khóa này được dùng để tạo Primary Key cho bảng.
28. Collation là gì?
Collation về cơ bản là một tập hợp các quy tắc xác định cách so sánh và sắp xếp ký tự, mở rộng sang chuỗi. Collation trong MSSQL và MySQL hoạt động gần như giống nhau, ngoại trừ một số tùy chọn collation như UTF-8. Bên cạnh việc so sánh từng ký tự thông thường, collation cũng có thể sắp xếp và so sánh chuỗi theo góc nhìn biểu diễn ASCII.
29. Recursive Stored Procedure là gì?
Stored procedure đệ quy là một thủ tục được gọi chính nó cho đến khi đạt đến một điều kiện giới hạn nào đó. Hàm hoặc thủ tục đệ quy này giúp lập trình viên có thể sử dụng lại cùng một đoạn mã nhiều lần.
30. Toán tử nào trong SQL được dùng cho pattern matching (so khớp mẫu)?
Câu trả lời là toán tử LIKE. Toán tử LIKE được sử dụng để so khớp mẫu và có thể dùng với:
- % – Khớp với 0 hoặc nhiều ký tự.
- _ (gạch dưới) – Khớp chính xác 1 ký tự.
30. Hibernate là gì và mối liên hệ của nó với SQL?
Hibernate là một công cụ Object Relational Mapping (ORM) trong Java. Hibernate cho phép chúng ta viết code theo hướng đối tượng và nội bộ sẽ chuyển đổi chúng thành các truy vấn SQL gốc để thực thi trên cơ sở dữ liệu quan hệ.
Hibernate sử dụng ngôn ngữ riêng tương tự SQL gọi là Hibernate Query Language (HQL). Điểm khác biệt là HQL cho phép truy vấn các entity object của Hibernate. Ngoài ra, Hibernate còn có một ngôn ngữ truy vấn hướng đối tượng gọi là Criteria Query. Điều này rất cần thiết cho các lập trình viên chủ yếu làm việc với đối tượng trong ứng dụng phía front-end, và Criteria Query có thể xử lý các đối tượng đó đồng thời bổ sung các tính năng giống SQL như bảo mật và kiểm soát truy cập.
31. Làm thế nào để giải quyết lỗi SQL: ORA-00904: invalid identifier?
Lỗi này thường xuất hiện do lỗi cú pháp khi gọi tên cột trong cơ sở dữ liệu Oracle, như có thể thấy trong mã lỗi với tiền tố ORA. Do đó, để tránh lỗi này, bạn phải nhập đúng tên cột. Ngoài ra, cần đặc biệt lưu ý đến các bí danh vì chúng thường là nguyên nhân dẫn đến lỗi invalid identifier.
32. SQL Profiler là gì?
SQL Profiler là một giao diện đồ họa (GUI) cho phép các nhà phát triển cơ sở dữ liệu giám sát và theo dõi các hoạt động của SQL database engine. Nó có tính năng ghi log mọi sự kiện xảy ra và cung cấp phân tích khi có sự cố hoặc sai lệch. Về cơ bản, đây là một tính năng chẩn đoán trong SQL, dùng để gỡ lỗi các vấn đề hiệu năng và mang lại cách linh hoạt hơn để xác định phần nào trong tệp trace gây ra tắc nghẽn trong các giao dịch SQL.
33. Làm thế nào để liên kết cơ sở dữ liệu SQL với một ứng dụng Android hiện có?
Điều này yêu cầu một JDBC (Java Database Connectivity) driver để kết nối hai bên. Ngoài ra, bạn cần thêm các phụ thuộc tương ứng vào tệp build.gradle cùng với các quyền và cấp phép cần thiết.
Tham khảo: Wikipedia