Başqa proqramlaşdırma sahələrində olduğu kimi, SELECT ilə işləyəndə də səhvlər qaçılmazdır. Hətta ən təcrübəli developer-lər belə bəzən SQL-sorğularında bug-lar buraxır. Bu gün SELECT istifadə edəndə tipik səhvləri, onların səbəblərini və necə qarşısını almaq lazım olduğunu danışacağıq.
SQL — qaydalara çox ciddi əməl edən bir dildir. Bir vergülün unudulması, artıq operator, ya da sözlərin səhv ardıcıllığı — və database dərhal "qırmızı bayraq" qaldıracaq.
Unudulmuş açar sözlər
Ən yayılmış səhv — sadəcə vacib açar sözlərdən birini unutmaqdır. Məsələn, belə bir komanda işlətməyə çalışaq:
SELECT name age FROM students;
Nəsə çatışmır, düzdür? Burada name və age sahələrinin arasında , açar sözü unudulub. Səhvi düzəldirik:
SELECT name, age FROM students;
Belə səhvlərin səbəbi aydındır: ya hələ sorğu yazmağı öyrənirsən, ya da sadəcə tələsirsən. SQL tələskənliyi sevmir!
Sütun və cədvəl adlarında səhvlər
SQL-komandalar sütun və cədvəl adlarının düzgün yazılmasına həssasdır. Gəlin belə bir sorğuya baxaq:
SELECT naem, agge FROM studnts;
Database bunu mənasızlıq kimi görəcək: naem və agge sütunları, eləcə də studnts cədvəli sadəcə mövcud deyil. Düzəldirik:
SELECT name, age FROM students;
Məsləhət: Əgər adlarda əmin deyilsənsə, psql-da \d table_name komandasından və ya pgAdmin interfeysindən istifadə et, cədvəlin strukturunu yoxla.
Unudulmuş dırnaqlar
Sütun və cədvəl adlarında boşluq və ya başqa xüsusi simvol varsa, onları mütləq ikiqat dırnaq işarəsinə almaq lazımdır. Məsələn:
SELECT "first name", age FROM students;
Əgər dırnaqları unutsaq, SQL nə demək istədiyini başa düşməyəcək və səhv verəcək.
Məntiqi səhvlər: hər şey işləyir, amma gözlədiyin kimi deyil
Bəzən sorğular uğurla işləyir, amma nəticə "qəribə" olur. Bu, məntiqi səhvlərdir. Onlar daha təhlükəlidir, çünki database sənə heç nə deməyəcək ki, nəsə səhvdir.
- Müqayisə operatorlarının səhv istifadəsi. Təsəvvür et, bütün 18 yaşdan böyük tələbələri seçmək istəyirsən:
SELECT * FROM students WHERE age > 18;
İndi başqa operatorla sorğu edək:
SELECT * FROM students WHERE age = 18;
Bu sorğu yalnız dəqiq 18 yaşı olanları qaytaracaq. Əgər sən 18-dən böyük olanları gözləyirdinsə, bu artıq məntiqi səhvdir.
Məsləhət: Belə detallara diqqətlə bax. Əmin deyilsənsə, kiçik seçimlərlə başla (məsələn, LIMIT ilə).
Şərtləri birləşdirəndə səhvlər
Misala baxaq:
SELECT * FROM students WHERE age > 18 OR grade = 'A' AND city = 'New York';
Bu sorğu gözlənilmədən Nyu-Yorkda yaşamayan tələbələri də qaytara bilər. Niyə? Çünki məntiqi operatorların ardıcıllığı belədir: SQL əvvəlcə AND-i, sonra OR-u işləyir. Sorğunu mötərizələrlə düzəldək:
SELECT * FROM students WHERE (age > 18 OR grade = 'A') AND city = 'New York';
İndi hər şey qaydasındadır.
Filtrasiyanın olmaması
Bəzən SELECT * FROM students; kimi sorğu çoxlu məlumat qaytarır, halbuki sən konkret nəsə axtarırdın, məsələn, müəyyən şəhərdən olan tələbələri. Həll? WHERE ilə filter əlavə et:
SELECT * FROM students WHERE city = 'New York';
Performans problemləri
Sorğular çoxlu məlumatla işləyəndə, onları optimallaşdırmaq kritik olur. Gəlin performansı aşağı salan tipik səhvlərə baxaq.
SELECT * tipli sorğular development zamanı rahatdır, amma real həyatda performansa pis təsir edir. Əgər sənə yalnız müəyyən sütunlar lazımdırsa — onları göstər.
-- Pis:
SELECT * FROM students;
-- Yaxşı:
SELECT name, age FROM students;
Niyə bu vacibdir? SELECT * bütün sütunları çıxarır, hətta istifadə etməsən də. Bu, ötürülən məlumatın həcmini artırır.
Praktik məsləhətlər: səhvlərdən necə qaçmaq olar
SQL-sorğuları daha etibarlı etmək üçün bir neçə qaydaya əməl et:
- Sintaksisi yoxla icra etməzdən əvvəl: IDE və ya
pgAdminpodskazkalarından istifadə et, onlar səhvləri əvvəlcədən göstərə bilər. - Kiçik seçimlərlə başla. Test üçün
LIMIT 5və yaLIMIT 10əlavə et. - Şərhlərdən istifadə et, sorğunun nə etdiyini başa düşmək üçün:
-- 18 yaşdan böyük bütün tələbələri çıxart SELECT name, age FROM students WHERE age > 18; - Fərqli məlumatlarla test et, məntiqin düzgünlüyünü yoxlamaq üçün.
SELECT *-dən çox istifadə etmə, xüsusən böyük cədvəllərdə.
Müsahibə tələləri
SQL-müsahibələrdə məşhur tapşırıqlardan biri — sorğuda səhvləri tapmaqdır. Məsələn:
SELECT name FROM employees WHERE salary > 50000 ORDER BY department;
Özündən soruş: bu sorğu məntiqcə düzgündür? Əgər ORDER BY istifadə olunubsa, çox güman ki, sıralama maaşa görə olmalı idi:
SELECT name FROM employees WHERE salary > 50000 ORDER BY salary DESC;
SELECT ilə işləmək SQL-in əsas hissəsidir və ilk vaxtlar burada səhvlər qaçılmazdır. Amma zamanla sorğuları elə rahat yazacaqsan ki, sanki messencer-də mesaj yazırsan — axı əsl proqramçılar təkcə pişiklərdə yox, database-lərdə də məşq edir. 😉
GO TO FULL VERSION