JonH telah membahas dengan sangat baik bagian tentang bagaimana menulis query. Namun, ada masalah signifikan lain yang harus disebutkan juga, yang merupakan karakteristik kinerja kueri tersebut. Mari ulangi di sini (disesuaikan dengan Oracle):
SELECT EmployeeName FROM EmployeeTable WHERE LENGTH(EmployeeName) > 4;
Kueri ini membatasi hasil dari fungsi yang diterapkan ke nilai kolom (hasil penerapan LENGTHfungsi ke EmployeeNamekolom). Di Oracle, dan mungkin di semua RDBMS lainnya, ini berarti indeks reguler pada EmployeeName tidak akan berguna untuk menjawab pertanyaan ini; database akan melakukan pemindaian tabel lengkap, yang bisa sangat mahal.
Namun, berbagai database menawarkan fitur indeks fungsi yang dirancang untuk mempercepat kueri seperti ini. Misalnya, di Oracle, Anda dapat membuat indeks seperti ini:
CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));
Ini mungkin masih tidak membantu dalam kasus Anda, karena indeks mungkin tidak terlalu selektif untuk kondisi Anda. Maksud saya sebagai berikut: Anda meminta baris yang panjang namanya lebih dari 4. Mari kita asumsikan bahwa 80% dari nama karyawan dalam tabel itu lebih panjang dari 4. Nah, maka database kemungkinan akan menyimpulkan ( dengan benar) bahwa tidak ada gunanya menggunakan indeks, karena itu mungkin harus membaca sebagian besar blok dalam tabel.
Namun, jika Anda mengubah kueri menjadi LENGTH(EmployeeName) <= 4, atau LENGTH(EmployeeName) > 35, dengan asumsi bahwa sangat sedikit karyawan yang memiliki nama kurang dari 5 karakter atau lebih dari 35, maka indeks akan dipilih dan meningkatkan kinerja.
Singkatnya: waspadalah terhadap karakteristik kinerja kueri seperti yang Anda coba tulis.
ANDpernyataan- misalnyaSELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;