Asosiy kontentga o‘tish
Innovialabs

SQL’da NULL: IS NULL, COALESCE va odatiy tuzoqlar

Asoslar4 daq

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.

IfodaNatija
NULL = NULLUNKNOWN
NULL <> 5UNKNOWN
TRUE AND UNKNOWNUNKNOWN
FALSE AND UNKNOWNFALSE
TRUE OR UNKNOWNTRUE
NOT UNKNOWNUNKNOWN

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.
  • SUM va AVG NULL’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), SUM 0 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 JOIN o‘ng jadvalning yetishmayotgan ustunlarini NULL bilan to‘ldiradi. Agar keyin WHERE’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 shartlarni ON’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' || NULL NULL beradi, MySQL’dagi CONCAT istalgan 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)’ni NOT EXISTS bilan almashtiring.

Ko‘p beriladigan savollar

Yo‘q. Bo‘sh satr — uzunligi nol bo‘lgan ma’lum qiymat, NULL esa qiymatning yo‘qligi. Sezilarli istisno — Oracle, unda bo‘sh satr NULL sifatida saqlanadi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.