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ı?
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?
NULLdə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.
NULL-u nəzərə alaraq saymaq:COUNTnü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;
CASEilə şə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.
- Əgər
NULLolmayacağına əminsənsə,INNER JOINistifadə 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.
GO TO FULL VERSION