SQL’da NULL: IS NULL, COALESCE va odatiy tuzoqlar
Asoslar4 daqInnovialabs tahririyati
Qisqacha
NULL noma’lum qiymatni bildiradi, shuning uchun u bilan har qanday taqqoslash true yoki false emas, UNKNOWN beradi; uni IS NULL bilan tekshiring, COALESCE bilan almashtiring va qiymat doim bo‘lishi kerak bo‘lgan joyda NOT NULL bilan taqiqlang.
Qisqa javob
NULL — bu nol ham, bo‘sh satr ham emas. U «qiymat noma’lum yoki yo‘q» degani. Qiymat noma’lum ekan, SQL uning biror narsaga — hatto boshqa NULL’ga — tengligini ayta olmaydi. Shuning uchun:
SELECT * FROM users WHERE phone = NULL; -- doim bo‘sh
SELECT * FROM users WHERE phone IS NULL; -- to‘g‘ri
Tekshirish uchun — IS NULL va IS NOT NULL, qiymat qo‘yish uchun — COALESCE, bo‘shliqlardan himoya uchun — NOT NULL cheklovi.
Uch qiymatli mantiq
SQL’da shartlarning uchta natijasi bor: TRUE, FALSE va UNKNOWN. NULL bilan har qanday taqqoslash (=, <>, >, <) UNKNOWN beradi. WHERE faqat sharti TRUE bo‘lgan qatorlarni qoldiradi, shuning uchun UNKNOWN qatorlar jimgina yo‘qoladi.
| Ifoda | Natija |
|---|---|
NULL = NULL | UNKNOWN |
NULL <> 5 | UNKNOWN |
TRUE AND UNKNOWN | UNKNOWN |
FALSE AND UNKNOWN | FALSE |
TRUE OR UNKNOWN | TRUE |
NOT UNKNOWN | UNKNOWN |
Odatiy kutilmagan holat: WHERE status <> 'blocked' status NULL bo‘lgan qatorlarni qaytarmaydi. Ular kerak bo‘lsa, buni aniq yozing: WHERE status <> 'blocked' OR status IS NULL. PostgreSQL va boshqa ayrim MBBT’larda IS DISTINCT FROM bor — u NULL’ni oddiy qiymat kabi taqqoslaydi.
Agregatlarda NULL
COUNT(*)qatorlarni sanaydi.COUNT(column)faqat NULL bo‘lmagan qiymatlarni sanaydi. Bitta hisobotdagi turli raqamlar ko‘pincha shu bilan izohlanadi.SUMvaAVGNULL’ni e’tiborga olmaydi.AVG(discount)barcha buyurtmalarni emas, faqat chegirma to‘ldirilganlarini o‘rtachalaydi.- Barcha qiymatlar NULL bo‘lsa (yoki qator yo‘q bo‘lsa),
SUM0 emas, NULL qaytaradi.
SELECT
COUNT(*) AS orders,
COUNT(discount) AS orders_with_discount,
AVG(discount) AS avg_among_discounted,
AVG(COALESCE(discount, 0)) AS avg_across_all_orders,
COALESCE(SUM(discount), 0) AS total_discount
FROM orders;
Qaysi AVG to‘g‘riligi biznes savoliga bog‘liq. Buni NULL’ga qoldirmasdan, aniq hal qiling.
JOIN’da NULL
- NULL kalitlar birlashtirishda hech qachon mos kelmaydi, hatto NULL bilan NULL ham.
manager_id’si yo‘q qatorlar hech narsaga ulanmaydi. LEFT JOINo‘ng jadvalning yetishmayotgan ustunlarini NULL bilan to‘ldiradi. Agar keyinWHERE’da o‘ng jadval ustuni bo‘yicha filtr qo‘ysangiz (WHERE p.status = 'paid'), bu qatorlar tashlab yuboriladi va LEFT JOIN sezdirmay ichki birlashtirishga aylanadi. Barcha chap qatorlarni saqlash uchun bunday shartlarniON’ga o‘tkazing.
NOT IN tuzog‘i
SELECT * FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
Agar orders’da hech bo‘lmasa bitta customer_id NULL bo‘lsa, so‘rov birorta ham qator qaytarmaydi: har bir mijoz uchun id <> NULL UNKNOWN bo‘ladi. Kutilganidek ishlaydigan NOT EXISTS’dan foydalaning:
SELECT * FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
NULL va UNIQUE cheklovi
Ko‘pchilik MBBT’larda (PostgreSQL, MySQL, SQLite) unikal ustunda ko‘plab NULL bo‘lishi mumkin, chunki NULL’lar teng hisoblanmaydi. SQL Server unikal cheklovda faqat bitta NULL’ga ruxsat beradi. Agar «qiymatsiz qator ko‘pi bilan bitta» kerak bo‘lsa, standart qiymatli NOT NULL yoki MBBT’ning maxsus opsiyasidan foydalaning (PostgreSQL’ning yangi versiyalarida NULLS NOT DISTINCT bor).
Hisobotlarni tuzatadigan vositalar
- COALESCE(a, b, c) birinchi NULL bo‘lmagan qiymatni qaytaradi:
COALESCE(nickname, first_name, 'Mehmon'). - NULLIF(a, b) a va b teng bo‘lsa, NULL qaytaradi. Klassik qo‘llanilishi — nolga bo‘lishdan himoya:
revenue / NULLIF(visits, 0). - Sxemada DEFAULT bilan NOT NULL:
is_active BOOLEAN NOT NULL DEFAULT true,qty INTEGER NOT NULL DEFAULT 0. NULL bilan eng yaxshi ishlash — uni ma’nosi yo‘q joyda saqlamaslik. - Satrlarni yodda tuting: standart bo‘yicha
'a' || NULLNULL beradi, MySQL’dagiCONCATistalgan argument NULL bo‘lsa NULL qaytaradi, Oracle esa bo‘sh satrni NULL deb hisoblaydi. - Saralash ham farq qiladi: ba’zi MBBT’lar NULL’ni boshiga, boshqalari oxiriga qo‘yadi. Qo‘llab-quvvatlansa,
NULLS FIRST/NULLS LAST’ni ko‘rsating.
Yangi jadval uchun chek-list
- NULL’ga faqat «noma’lum» haqiqiy holat bo‘lgan joyda ruxsat bering.
- Bayroqlar, hisoblagichlar va summalarga standart qiymatli NOT NULL bering.
- Hisobotlarda har bir metrika uchun NULL nimani anglatishini hal qiling: 0, «chiqarib tashlash» yoki «ma’lumot yo‘q».
NOT IN (ichki so‘rov)’niNOT EXISTSbilan almashtiring.