CodeGym /Các khóa học /SQL SELF /Những lỗi thường gặp khi dùng SELECT

Những lỗi thường gặp khi dùng SELECT

SQL SELF
Mức độ, Bài học
Có sẵn

Giống như bất kỳ lĩnh vực lập trình nào khác, khi làm việc với SELECT thì lỗi là chuyện thường ngày ở huyện. Ngay cả mấy bạn code SQL lâu năm cũng đôi khi dính bug. Hôm nay tụi mình sẽ mổ xẻ các lỗi hay gặp khi dùng SELECT, lý do vì sao và cách né chúng.

SQL là ngôn ngữ rất nghiêm ngặt về cú pháp. Thiếu hoặc thừa dấu phẩy, quên keyword hay sai thứ tự từ khoá là database sẽ "giơ cờ đỏ" ngay.

Quên từ khoá quan trọng

Lỗi phổ biến nhất là quên mất một trong những từ khoá bắt buộc. Ví dụ, thử chạy lệnh sau:

SELECT name age FROM students;

Thiếu gì đó đúng không? Ở đây thiếu dấu phẩy , giữa các trường name và age. Sửa lại nè:

SELECT name, age FROM students;

Lý do lỗi này dễ hiểu: hoặc là bạn mới tập viết truy vấn, hoặc là đang vội quá. SQL không thích vội đâu nha!

Lỗi tên cột và bảng

Lệnh SQL rất nhạy cảm với tên cột và bảng đúng chuẩn. Thử truy vấn này xem:

SELECT naem, agge FROM studnts;

Database nhìn vào sẽ thấy vô nghĩa: cột naem và agge, cũng như bảng studnts đều không tồn tại. Sửa lại cho đúng:

SELECT name, age FROM students;

Mẹo nhỏ: Nếu không chắc tên, dùng lệnh \d table_name trong psql hoặc giao diện pgAdmin để kiểm tra cấu trúc bảng nha.

Quên dấu ngoặc kép

Tên cột hoặc bảng mà có dấu cách hoặc ký tự đặc biệt thì phải để trong dấu ngoặc kép. Ví dụ:

SELECT "first name", age FROM students;

Nếu quên ngoặc kép, SQL sẽ không hiểu bạn muốn gì và báo lỗi liền.

Lỗi logic: Khi mọi thứ chạy nhưng không như bạn nghĩ

Đôi khi truy vấn chạy ngon lành nhưng kết quả lại "kỳ kỳ". Đó là lỗi logic. Loại này nguy hiểm hơn vì database không báo gì đâu.

  1. Dùng sai toán tử so sánh. Giả sử bạn muốn lấy tất cả sinh viên lớn hơn 18 tuổi:
SELECT * FROM students WHERE age > 18;

Giờ thử truy vấn với toán tử khác:

SELECT * FROM students WHERE age = 18;

Truy vấn này chỉ trả về mấy bạn đúng 18 tuổi thôi. Nếu bạn muốn lấy tất cả sinh viên lớn hơn 18 mà lại viết thế này thì dính lỗi logic rồi.

Mẹo: Kiểm tra kỹ mấy chi tiết này nha. Nếu chưa chắc, thử với dữ liệu nhỏ trước (dùng LIMIT chẳng hạn).

Lỗi khi kết hợp điều kiện

Xem ví dụ này:

SELECT * FROM students WHERE age > 18 OR grade = 'A' AND city = 'New York';

Truy vấn này có thể trả về sinh viên không ở New York. Tại sao? Vì thứ tự ưu tiên logic là: SQL xử lý AND trước, rồi mới tới OR. Viết lại với ngoặc cho rõ ràng:

SELECT * FROM students WHERE (age > 18 OR grade = 'A') AND city = 'New York';

Giờ thì chuẩn rồi.

Thiếu lọc dữ liệu

Đôi khi truy vấn kiểu SELECT * FROM students; trả về cả đống dữ liệu, trong khi bạn chỉ muốn tìm sinh viên ở một thành phố nào đó. Giải pháp? Thêm điều kiện với WHERE:

SELECT * FROM students WHERE city = 'New York';

Vấn đề hiệu năng

Khi truy vấn với dữ liệu lớn, tối ưu hóa là cực kỳ quan trọng. Cùng xem mấy lỗi hay làm chậm truy vấn nhé.

Truy vấn kiểu SELECT * thì tiện lúc phát triển, nhưng thực tế lại làm giảm hiệu năng. Nếu chỉ cần một số cột nhất định thì nên ghi rõ ra.

-- Không nên:
SELECT * FROM students;

-- Nên:
SELECT name, age FROM students;

Tại sao vậy? SELECT * lấy tất cả các cột, kể cả khi bạn không dùng tới. Dữ liệu truyền đi sẽ nhiều hơn hẳn.

Mẹo thực tế: Làm sao tránh lỗi

Truy vấn SQL sẽ an toàn hơn nếu bạn nhớ mấy điều sau:

  • Kiểm tra cú pháp trước khi chạy: dùng IDE hoặc gợi ý của pgAdmin để phát hiện lỗi sớm.
  • Bắt đầu với dữ liệu nhỏ. Thêm LIMIT 5 hoặc LIMIT 10 để test trước.
  • Dùng comment để giải thích truy vấn:
    -- Lấy tất cả sinh viên lớn hơn 18 tuổi
    SELECT name, age FROM students WHERE age > 18;
    
  • Test với nhiều dữ liệu khác nhau để kiểm tra logic có đúng không.
  • Đừng lạm dụng SELECT *, nhất là với bảng to.

Bẫy khi phỏng vấn

Một trong những bài tập SQL phổ biến khi phỏng vấn là tìm lỗi trong truy vấn. Ví dụ:

SELECT name FROM employees WHERE salary > 50000 ORDER BY department;

Hỏi bản thân: truy vấn này logic chưa? Nếu đã dùng ORDER BY thì thường nên sắp xếp theo lương:

SELECT name FROM employees WHERE salary > 50000 ORDER BY salary DESC;

Làm việc với SELECT là nền tảng của SQL, và lỗi là chuyện không tránh khỏi lúc mới học. Nhưng dần dần bạn sẽ viết truy vấn mượt như chat với bạn bè, vì coder xịn không chỉ luyện với mèo mà còn luyện với database nữa đó. 😉

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Sửa lỗi cú pháp
Sửa lỗi cú pháp
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Lỗi logic trong truy vấn với lọc và sắp xếp
Lỗi logic trong truy vấn với lọc và sắp xếp
1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Sắp xếp dữ liệu
Sắp xếp dữ liệu
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION