CodeGym /Kurslar /SQL SELF /Məlumatları birləşdirəndə NULL dəyərlərlə i...

Məlumatları birləşdirəndə NULL dəyərlərlə işləmək

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

Təsəvvür elə, iki cədvəli birləşdirirsən: students (tələbələr) və enrollments (kurslara yazılışlar). Əgər enrollments cədvəlində hansısa tələbə haqqında info yoxdursa, amma sən məsələn, LEFT JOIN istifadə edirsənsə, students cədvəlindən olan sətirlər yenə də çıxacaq, amma enrollments-dən info olmayacaq. Belə hallarda konkret data yerinə NULL çıxır.

Təxminən belə görünür:

students cədvəli:

id name
1 Eva
2 Peter
3 Anna

enrollments cədvəli:

student_id course_name
1 Riyaziyyat
1 İnformatika
2 Fizika

LEFT JOIN ilə sorğu:

SELECT students.id, students.name, enrollments.course_name
FROM students
LEFT JOIN enrollments ON students.id = enrollments.student_id;

Nəticə:

id name course_name
1 Eva Riyaziyyat
1 Eva İnformatika
2 Peter Fizika
3 Anna NULL

Salaam, NULL! Gördüyün kimi, heç bir kursa yazılmayan Anna üçün kurs haqqında info yoxdur və orada NULL çıxır.

NULL sorğulara necə təsir edir?

NULL — nə "sıfır"dır, nə də "boş sətir", bu dəyərin olmamasıdır. Bu davranış bir neçə maraqlı (və bəzən əsəbləşdirici) nəticələr verir:

NULL ilə müqayisələr:

Əgər belə bir şey yazsan: WHERE course_name = NULL, sorğu NULL olan sətirləri qaytarmayacaq. Niyə? Çünki NULL ilə birbaşa müqayisə etmək olmur.

NULL olub-olmadığını yoxlamaq üçün xüsusi operatorlardan istifadə etmək lazımdır:

WHERE course_name IS NULL

Riyazi əməliyyatlar:

NULL ilə istənilən əməliyyat nəticədə NULL verir. Məsələn:

SELECT 5 + NULL; -- nəticə: NULL

Aqreqat funksiyalar:

Əksər aqreqat funksiyalar, məsələn SUM(), AVG(), NULL-u saymır, amma COUNT(*) onları "mövcud sətir" kimi sayır.

NULL ilə necə mübarizə aparmalı?

  1. COALESCE() ilə NULL-u başa düşülən dəyərlə əvəz et

COALESCE() funksiyası NULL-u başqa bir dəyərlə əvəz etməyə imkan verir. Məsələn, kurs yoxdursa, "Kurs yoxdur" yazmaq olar:

SELECT
    students.id, 
    students.name, 
    COALESCE(enrollments.course_name, 'Kurs yoxdur') AS course_name
FROM 
    students LEFT JOIN enrollments 
    ON students.id = enrollments.student_id;

Nəticə:

id name course_name
1 Eva Riyaziyyat
1 Eva İnformatika
2 Peter Fizika
3 Anna Kurs yoxdur

İndi daha yaxşı görünür, düzdür?

  1. NULL dəyərləri filtrləmək

Əgər NULL olan sətirləri görmək istəmirsənsə, WHERE ... IS NOT NULL şərtindən istifadə edə bilərsən. Məsələn:

SELECT
    students.id, 
    students.name, 
    enrollments.course_name
FROM 
    students LEFT JOIN enrollments 
    ON students.id = enrollments.student_id
WHERE 
    enrollments.course_name IS NOT NULL;

Nəticə:

id name course_name
1 Eva Riyaziyyat
1 Eva İnformatika
2 Peter Fizika

Anna nəticədən yox olur, çünki onun kurslara yazılışı yoxdur.

  1. NULL-u nəzərə alaraq saymaq: COUNT nümunəsi

Daha əvvəl dediyimiz kimi, bəzi funksiyalar NULL-u saymır, bəziləri isə sayır. Məsələn:

Bütün sətirləri saymaq üçün, hətta NULL olanları da:

SELECT COUNT(*) FROM students; -- BÜTÜN sətirləri sayır (hətta `course_name` = NULL olanları da)

Yalnız NULL olmayan sətirləri saymaq üçün:

SELECT COUNT(course_name) FROM enrollments;
  1. CASE ilə şərti ifadələr

Əgər COALESCE() xoşuna gəlmirsə və ya daha çox çeviklik istəyirsənsə, CASE istifadə et. Məsələn:

SELECT
    students.id, 
    students.name,
    CASE
        WHEN enrollments.course_name IS NULL THEN 'Kurs yoxdur'
        ELSE enrollments.course_name
    END AS course_name
FROM 
    students LEFT JOIN enrollments 
    ON students.id = enrollments.student_id;

Nəticə COALESCE() ilə eyni olacaq, amma CASE daha mürəkkəb qaydalar yazmağa imkan verir.

  1. Əgər NULL olmayacağına əminsənsə, INNER JOIN istifadə et

NULL-dan qaçmağın ən radikal yolu — onların yaranmasına imkan verməmək, yəni INNER JOIN istifadə etməkdir. Bu join tipi yalnız hər iki cədvəldə uyğunluq olan sətirləri qaytarır:

SELECT
    students.id, 
    students.name, 
    enrollments.course_name
FROM 
    students INNER JOIN enrollments 
    ON students.id = enrollments.student_id;

Heç bir sürpriz yoxdur — yalnız kurslara yazılan tələbələr çıxır.

Nəticə:

id name course_name
1 Eva Riyaziyyat
1 Eva İnformatika
2 Peter Fizika

Əgər datanda bütün dəyərləri, o cümlədən NULL olanları göstərmək lazımdırsa, INNER JOIN uyğun deyil, amma bəzən bu, tam istədiyindir.

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