Təsəvvür elə, universitetin database-ində işləyirsən və sənə müəyyən kurslarda oxuyan tələbələri tapmaq lazımdır. Məsələn, "Proqramlaşdırma", "Riyaziyyat" və "Fizika" kurslarında. Əlbəttə, bir çox şərtlə uzun bir sorğu yaza bilərsən, məsələn:
SELECT *
FROM students
WHERE course = 'Proqramlaşdırma'
OR course = 'Riyaziyyat'
OR course = 'Fizika';
Amma düzünü desək, belə yazmaq həm yorucudur, həm də çox da şık görünmür. Xoşbəxtlikdən, IN operatoru köməyə gəlir və eyni sorğunu daha qısa və rahat yaza bilərik:
SELECT *
FROM students
WHERE course IN ('Proqramlaşdırma', 'Riyaziyyat', 'Fizika');
Elə bil magiyadır, düzdür? Bir çox OR şərti əvəzinə sadəcə SQL-ə deyirik ki, bu siyahıdakı dəyərləri axtar. Əgər yoxlamaq istəyirsən ki, dəyər daxil deyil siyahıya, NOT IN istifadə edirik — Bu siyahıda olmayan hər şeyi tap.
IN operatorunun sintaksisi
IN operatorunun ümumi sintaksisi belədir:
SELECT kolonlar
FROM cədvəl
WHERE kolon IN (dəyər1, dəyər2, dəyər3, ...);
İndi isə bir neçə nümunəyə baxaq.
Nümunə 1: Bir neçə kurs oxuyan tələbələr
Fərz elə, bizdə students cədvəli var:
| id | name | course |
|---|---|---|
| 1 | Anna | Proqramlaşdırma |
| 2 | Mello | Fizika |
| 3 | Kate | Riyaziyyat |
| 4 | Dan | Kimya |
| 5 | Olly | Biologiya |
"Proqramlaşdırma", "Riyaziyyat" və ya "Fizika" oxuyan bütün tələbələri tapmaq istəyirik. IN istifadə edirik:
SELECT name, course
FROM students
WHERE course IN ('Proqramlaşdırma', 'Riyaziyyat', 'Fizika');
Nəticə:
| name | course |
|---|---|
| Anna | Proqramlaşdırma |
| Mello | Fizika |
| Kate | Riyaziyyat |
Gördüyün kimi, IN operatoru işi xeyli asanlaşdırdı. Uzun-uzadı OR şərtləri yazmağa ehtiyac yoxdur, sadəcə maraqlandığın dəyərləri siyahıda göstərirsən.
Nümunə 2: Müəyyən kursları oxumayan tələbələr
İndi isə fərz elə ki, "Proqramlaşdırma", "Riyaziyyat" və "Fizika" oxumayan tələbələri tapmaq istəyirsən. Bunun üçün NOT IN operatoru kömək edir:
SELECT name, course
FROM students
WHERE course NOT IN ('Proqramlaşdırma', 'Riyaziyyat', 'Fizika');
Nəticə:
| name | course |
|---|---|
| Dan | Kimya |
| Olly | Biologiya |
Beləliklə, NOT IN operatoru course sütunundakı dəyərlər siyahıda yoxdursa həmin sətrləri qaytarır.
IN və NOT IN operatorlarının subquery ilə istifadəsi
IN və NOT IN operatorları xüsusilə iki cədvəl arasında məlumatları müqayisə etmək lazım olanda çox rahatdır. Məsələn, bizdə iki cədvəl var:
students cədvəli:
| id | name | course_id |
|---|---|---|
| 1 | Anna | 101 |
| 2 | Mello | 102 |
| 3 | Kate | 103 |
| 4 | Dan | 104 |
courses cədvəli:
| id | name |
|---|---|
| 101 | Proqramlaşdırma |
| 102 | Fizika |
| 103 | Riyaziyyat |
| 105 | Kimya |
Tutaq ki, bizə lazımdır ki, yalnız courses cədvəlində olan kurslara yazılmış tələbələri tapaq. Burada IN ilə subquery köməyə gəlir:
SELECT name
FROM students
WHERE course_id IN (
SELECT id
FROM courses
);
Bu sorğu belə işləyir: SELECT id FROM courses subquery-si bütün kurs id-lərini qaytarır. Sonra IN operatoru yoxlayır ki, course_id bu siyahıdadırmı.
Nəticə:
| name |
|---|
| Anna |
| Mello |
| Kate |
Bəs Dan niyə çıxmadı? Çünki onun course_id (104) courses cədvəlində yoxdur.
NULL ilə işləməyin özəllikləri
IN operatorunun bir vacib özəlliyi var: əgər siyahıda NULL varsa, bu sorğunun nəticəsinə təsir edə bilər. Nümunəyə baxaq.
grades cədvəli:
| student_id | course_id | grade |
|---|---|---|
| 1 | 101 | A |
| 2 | 102 | NULL |
| 3 | 103 | B |
('A', 'B', 'C') qiymətləri olan tələbələri tapmaq üçün sorğu belə ola bilər:
SELECT student_id
FROM grades
WHERE grade IN ('A', 'B', 'C');
Nəticə:
| student_id |
|---|
| 1 |
| 3 |
grade sütununda NULL olan sətr nəzərə alınmır, çünki NULL heç bir siyahının hissəsi sayılmır.
İndi təsəvvür elə ki, NOT IN operatoru istifadə edirsən. Məsələn:
SELECT student_id
FROM grades
WHERE grade NOT IN ('A', 'B', 'C');
Gözləyirsən ki, student_id = 2 sətrini görəsən, amma nəticə boş olacaq! Niyə? Çünki NULL siyahıdakı hər bir dəyərlə müqayisə olunur və bu müqayisənin nəticəsi həmişə qeyri-müəyyəndir (UNKNOWN). Bu davranış çaşdırıcı ola bilər, ona görə də NOT IN istifadə edəndə NULL olan sütunlara diqqət yetir. Belə hallarda ən yaxşısı NULL-u ayrıca yoxlamaqdır:
SELECT student_id
FROM grades
WHERE grade NOT IN ('A', 'B', 'C')
OR grade IS NULL;
Nəticə:
| student_id |
|---|
| 2 |
IN və NOT IN istifadə üçün tövsiyələr
IN istifadə et, SQL kodunun oxunaqlılığını artır
Əgər bir sütunun müəyyən siyahıdakı dəyərlərdən biri olub-olmadığını yoxlamaq lazımdırsa, həmişə IN istifadə et, bir çox OR şərti yazmaq əvəzinə.
NOT IN və NULL ilə ehtiyatlı ol
Əgər məlumatlarda NULL olan sütunlar varsa, onlar gözlənilməz nəticələr verə bilər. NOT IN istifadə edəndə NULL-u ayrıca yoxlamaq daha yaxşıdır.
Subquery-ləri sürətləndirmək üçün indekslərdən istifadə et
Əgər IN subquery ilə istifadə olunursa, subquery-dəki sütunun indeksli olduğuna əmin ol, yoxsa performans problemi ola bilər.
Real task nümunəsi
Təsəvvür elə, sən internet mağaza sistemində işləyirsən. Səndə orders və users cədvəlləri var. Heç vaxt sifariş verməmiş bütün istifadəçiləri tapmaq istəyirsən.
users cədvəli:
| id | name |
|---|---|
| 1 | Anna |
| 2 | Mello |
| 3 | Kate |
| 4 | Dan |
orders cədvəli:
| id | user_id | total |
|---|---|---|
| 1 | 1 | 500 |
| 2 | 3 | 300 |
Taskı həll etmək üçün NOT IN istifadə edirik:
SELECT name
FROM users
WHERE id NOT IN (
SELECT user_id
FROM orders
);
Nəticə:
| name |
|---|
| Mello |
| Dan |
Bu sorğu belə işləyir: əvvəlcə SELECT user_id FROM orders subquery-si sifariş vermiş istifadəçilərin id-lərini qaytarır (1 və 3). Sonra NOT IN onları çıxarır və yalnız sifariş verməyənləri saxlayır (Mello və Dan).
GO TO FULL VERSION