CodeGym /Kurslar /SQL SELF /Məlumatların filtrasiyası INNOT ...

Məlumatların filtrasiyası INNOT IN ilə

SQL SELF
Səviyyə , Dərs
Mövcuddur

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.

INNOT IN operatorlarının subquery ilə istifadəsi

INNOT 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

INNOT 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 INNULL 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ə ordersusers 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).

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION