JonH đã trình bày rất tốt phần về cách viết truy vấn. Tuy nhiên, có một vấn đề quan trọng khác cũng phải được đề cập, đó là các đặc điểm hiệu suất của một truy vấn như vậy. Hãy lặp lại nó ở đây (thích ứng với Oracle):
SELECT EmployeeName FROM EmployeeTable WHERE LENGTH(EmployeeName) > 4;
Truy vấn này giới hạn kết quả của một hàm được áp dụng cho một giá trị cột (kết quả của việc áp dụng LENGTH
hàm choEmployeeName
cột). Trong Oracle, và có thể trong tất cả các RDBMS khác, điều này có nghĩa là một chỉ mục thông thường trên EmployeeName sẽ vô dụng để trả lời truy vấn này; cơ sở dữ liệu sẽ thực hiện quét toàn bộ bảng, điều này có thể thực sự tốn kém.
Tuy nhiên, các cơ sở dữ liệu khác nhau cung cấp tính năng chỉ mục chức năng được thiết kế để tăng tốc các truy vấn như thế này. Ví dụ, trong Oracle, bạn có thể tạo một chỉ mục như sau:
CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));
Tuy nhiên, điều này vẫn có thể không hữu ích trong trường hợp của bạn, bởi vì chỉ số có thể không được chọn lọc cho tình trạng của bạn. Ý tôi là như sau: bạn đang yêu cầu các hàng có độ dài của tên hơn 4. Hãy giả sử rằng 80% tên nhân viên trong bảng đó dài hơn 4. Chà, cơ sở dữ liệu có khả năng sẽ kết luận ( chính xác) rằng nó không đáng để sử dụng chỉ mục, bởi vì nó có thể sẽ phải đọc hầu hết các khối trong bảng.
Tuy nhiên, nếu bạn thay đổi truy vấn để nói LENGTH(EmployeeName) <= 4
hoặc LENGTH(EmployeeName) > 35
, giả sử rằng rất ít nhân viên có tên có ít hơn 5 ký tự hoặc hơn 35, thì chỉ mục sẽ được chọn và cải thiện hiệu suất.
Nói tóm lại: hãy cẩn thận với các đặc điểm hiệu suất của các truy vấn như truy vấn mà bạn đang cố gắng viết.
AND
Câu lệnh ví dụSELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;