JonH, sorgunun nasıl yazılacağıyla ilgili kısmı çok iyi ele aldı. Bununla birlikte, bahsedilmesi gereken önemli bir konu daha var, bu tür bir sorgunun performans özellikleri. Burada tekrarlayalım (Oracle'a uyarlanmıştır):
SELECT EmployeeName FROM EmployeeTable WHERE LENGTH(EmployeeName) > 4;
Bu sorgu, engel olup bir sütun değere tatbik edilen bir fonksiyonun sonucunu (uygulanması sonucu LENGTHfonksiyonu EmployeeNamekolon). Oracle'da ve muhtemelen diğer tüm RDBMS'lerde bu, EmployeeName üzerinde düzenli bir dizinin bu sorguyu yanıtlamak için işe yaramayacağı anlamına gelir; veritabanı, gerçekten maliyetli olabilecek tam bir tablo taraması yapacaktır.
Bununla birlikte, çeşitli veritabanları, bunun gibi sorguları hızlandırmak için tasarlanmış bir işlev dizini özelliği sunar . Örneğin, Oracle'da şöyle bir dizin oluşturabilirsiniz:
CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));
Yine de bu durum sizin durumunuzda yardımcı olmayabilir, çünkü indeks durumunuz için çok seçici olmayabilir. Bununla şunu kastediyorum: Adın uzunluğunun 4'ten fazla olduğu satırları soruyorsunuz. Bu tablodaki çalışan adlarının% 80'inin 4'ten daha uzun olduğunu varsayalım. O zaman veritabanı muhtemelen son bulacaktır ( doğru), indeksi kullanmaya değmeyecektir, çünkü muhtemelen tablodaki blokların çoğunu okumak zorunda kalacak.
Ancak, sorguyu söyleyecek şekilde değiştirirseniz LENGTH(EmployeeName) <= 4veya LENGTH(EmployeeName) > 35çok az çalışanın 5 karakterden az veya 35'ten fazla adlara sahip olduğunu varsayarak, dizin seçilir ve performansı artırır.
Neyse, kısaca: yazmaya çalıştığınız sorgu gibi sorguların performans özelliklerine dikkat edin.
ANDifade ekleyinSELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;