Câu hỏi phỏng vấn SQL
By Huy Nguyễn
648 views
0 likes
0 comments
0/10 rate
Có rất nhiều cách để Optimize SQL tùy vào ngữ cảnh:
1. Sử dụng Paging để cho nhỏ dữ liệu ra và hiển thị cho người dùng. Ví dụ bạn có câu 1 câu Query dùng để hiển thị data cho người dùng (Dữ liệu rất nhiều). Nếu query hết ra 1 lúc sẽ ảnh hưởng tới hiệu suất.
2. Đánh Inbdex cho bảng. Ví dụ bạn có hàng triệu record và hàng ngày phải sử dụng hàng triệu record đó để tính toán. Nếu không đánh Index thì khả năng gây chậm sẽ rất cao. Index cũng có thể áp dụng cho việc Tìm Kiếm với dữ liệu lớn
WITH (NOLOCK)
là một từ khóa được sử dụng trong các truy vấn để cho phép đọc các dòng dữ liệu từ bảng mà không chờ các khóa (locks) để giữ dữ liệu.
Khi bạn thêm WITH (NOLOCK)
vào một câu lệnh SELECT, SQL Server sẽ đọc dữ liệu mà không chờ hoặc chặn bất kỳ lock nào đang được áp dụng lên bảng đó.
Điều này có nghĩa là truy vấn có thể đọc các dòng dữ liệu mà không cần chờ đợi cho đến khi lock được giải phóng, dẫn đến việc truy vấn thực hiện nhanh hơn.
Tuy nhiên, việc sử dụng WITH (NOLOCK)
cũng đi kèm với một số rủi ro:
Các từ khóa JOIN, LEFT JOIN và RIGHT JOIN đều được sử dụng để kết hợp dữ liệu từ hai hoặc nhiều bảng vào một kết quả duy nhất. Dưới đây là giải thích về mỗi loại JOIN:
JOIN:
JOIN là một từ khóa cơ bản trong SQL được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng dựa trên một điều kiện kết nối (join condition).
Khi bạn sử dụng JOIN, chỉ các hàng từ các bảng có điều kiện kết nối phù hợp sẽ được kết hợp và xuất hiện trong kết quả.
LEFT JOIN:
LEFT JOIN là một loại JOIN trong đó tất cả các hàng từ bảng bên trái sẽ được bao gồm trong kết quả, kể cả khi không có hàng nào trong bảng bên phải phù hợp với điều kiện kết nối.
Nếu không có hàng nào trong bảng bên phải phù hợp với điều kiện kết nối, các giá trị NULL sẽ được gán cho cột của bảng bên phải trong kết quả.
RIGHT JOIN:
RIGHT JOIN là một loại JOIN tương tự như LEFT JOIN, nhưng nó đảo ngược vị trí của bảng bên trái và bên phải. Tất cả các hàng từ bảng bên phải sẽ được bao gồm trong kết quả, kể cả khi không có hàng nào trong bảng bên trái phù hợp với điều kiện kết nối.
Nếu không có hàng nào trong bảng bên trái phù hợp với điều kiện kết nối, các giá trị NULL sẽ được gán cho cột của bảng bên trái trong kết quả.
UPDATE A
SET A.column1 = B.column1,
A.column2 = B.column2
FROM A
INNER JOIN B ON A.Id = B.Id;
Toán tử <> và != đều được sử dụng để so sánh giá trị và kiểm tra xem chúng có khác nhau hay không.
<> (Toán tử khác):
Toán tử <> được sử dụng phổ biến trong hầu hết các hệ quản trị cơ sở dữ liệu SQL.
Nó cho phép bạn so sánh giá trị của hai biểu thức và trả về TRUE nếu chúng không bằng nhau và FALSE nếu chúng bằng nhau.
!= (Toán tử khác nhau):
Toán tử != cũng được sử dụng để kiểm tra xem hai giá trị có khác nhau hay không.
Tuy nhiên, không phải tất cả các hệ quản trị cơ sở dữ liệu đều hỗ trợ toán tử này. Đối với một số hệ quản trị cụ thể, như SQL Server, MySQL, PostgreSQL, toán tử != được chấp nhận và có cùng ý nghĩa với toán tử <>.
Tuy nhiên, trong một số hệ quản trị cơ sở dữ liệu khác, như Oracle, toán tử != có thể không được hỗ trợ và bạn phải sử dụng toán tử <> thay thế.
Cả DELETE và TRUNCATE đều là các câu lệnh trong SQL được sử dụng để xóa dữ liệu từ bảng, nhưng chúng có những sự khác biệt quan trọng như sau:
DELETE:
DELETE là một câu lệnh dùng để xóa các hàng từ bảng dựa trên một điều kiện hoặc tất cả các hàng nếu không có điều kiện.
DELETE ghi log cho mỗi hàng mà nó xóa. Điều này có nghĩa là mỗi hoạt động DELETE sẽ tạo ra một bản ghi log, làm tăng tài nguyên và không gian đĩa cần thiết.
DELETE cần thời gian để thực hiện vì nó cần phải xóa từng hàng một trong bảng.
TRUNCATE:
TRUNCATE là một câu lệnh dùng để xóa toàn bộ nội dung của bảng, không cần sử dụng điều kiện.
TRUNCATE không ghi log cho mỗi hàng được xóa. Thay vào đó, nó chỉ ghi một log cho toàn bộ quá trình TRUNCATE, làm giảm tải tài nguyên và không gian đĩa.
TRUNCATE thường nhanh hơn DELETE vì nó không cần phải xóa từng hàng một.
SELECT column_name
FROM table_name
ORDER BY column_name DESC
LIMIT 1 OFFSET 1;
Câu lệnh HAVING được sử dụng trong SQL để lọc dữ liệu được nhóm bởi một mệnh đề GROUP BY dựa trên các điều kiện cụ thể.
HAVING thường được sử dụng để áp dụng các điều kiện lọc cho các nhóm dữ liệu, tương tự như cách WHERE được sử dụng để lọc các hàng trong một bảng.
Ví dụ:
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;
Transaction là một chuỗi các hoạt động cơ sở dữ liệu mà chỉ được xem xét hoàn toàn nếu tất cả các hoạt động đều thành công.
Các hoạt động bao gồm việc đọc hoặc ghi dữ liệu từ hoặc vào cơ sở dữ liệu. Mục đích chính của Transaction là đảm bảo tính nhất quán và độ tin cậy của dữ liệu.
Nếu mọi thứ hoạt động bình thường không gặp lỗi trong quá trình thực hiện, bạn có thể chấp nhận thay đổi bằng cách gọi lệnh Commit
Khi gặp lỗi, cơ chế Rollback của Transaction sử dụng Journaling hoặc Logging để hoàn nguyên dữ liệu về trạng thái trước khi Transaction bắt đầu.