Saytdan foydalanishda muammoga duch kelsangiz, qo'llab-quvvatlash xizmatiga murojaat qiling: @fast_support_admin
SELECT asoslari3 daqiqa o'qish

NULL bilan ishlash — nega = NULL ishlamaydi

NULL "qiymat yo'q" degani, shuning uchun = NULL hech qachon rost bo'lmaydi. IS NULL, uch qiymatli mantiq, NOT IN tuzog'i va agregatlardagi NULL ni misollar bilan ko'ramiz.

NULL — bu nol ham, bo'sh satr ham emas. Bu "qiymat noma'lum" degani. SQL dagi ko'p sirli xatolar aynan shu farqni unutishdan kelib chiqadi.

Jadval: employees

idnamephonebonus
1Aziz+998901112233500
2MalikaNULLNULL
3Sardor+9989355566770

Nega "= NULL" hech narsa topmaydi

Noto'g'ri yondashuv
SELECT name FROM employees WHERE phone = NULL;

Natija bo'sh. Sababi: noma'lum qiymatni biror narsa bilan solishtirish natijasi ham noma'lum (NULL), WHERE esa faqat rost bo'lgan qatorlarni qoldiradi. Hatto NULL = NULL ham rost emas.

To'g'risi — maxsus operator:

To'g'ri yechim
SELECT name FROM employees WHERE phone IS NULL;
name
Malika

Teskarisi — IS NOT NULL.

Uch qiymatli mantiq

SQL da shart uch xil natija beradi: TRUE, FALSE va NULL (noma'lum).

SELECT name FROM employees WHERE bonus <> 500;
name
Sardor

Malika chiqmadi! Uning bonusi noma'lum, "noma'lum 500 ga teng emasmi?" degan savolga javob ham noma'lum. Malikani ham qo'shish kerak bo'lsa, buni aniq aytish kerak:

To'g'ri yechim
SELECT name FROM employees WHERE bonus <> 500 OR bonus IS NULL;

PostgreSQL da qisqaroq yo'li ham bor: WHERE bonus IS DISTINCT FROM 500 — u NULL ni oddiy qiymat kabi solishtiradi.

Eng xavfli tuzoq: NOT IN va NULL

Vazifa: buyurtma bermagan mijozlar. orders.customer_id ichida bitta NULL bo'lsa:

Noto'g'ri yondashuv
SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);

Natija bo'sh chiqadi, garchi buyurtmasiz mijozlar bo'lsa ham. NOT IN (1, 2, NULL) aslida id <> 1 AND id <> 2 AND id <> NULL, oxirgisi esa doim noma'lum. Xavfsiz variant — NOT EXISTS:

To'g'ri yechim
SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);

Agregatlar NULL ni tashlab ketadi

SELECT AVG(bonus) AS avg_bonus, COUNT(bonus) AS known, COUNT(*) AS total
FROM employees;
avg_bonusknowntotal
25023

O'rtacha (500 + 0) / 2 = 250, uchtaga emas, ikkitaga bo'lindi. Agar noma'lum bonusni 0 deb hisoblash kerak bo'lsa — AVG(COALESCE(bonus, 0)), natija 166.67.

Xulosa

  • NULL bilan solishtirish uchun faqat IS NULL / IS NOT NULL.
  • <>, =, > kabi shartlar NULL li qatorlarni jimgina tashlaydi.
  • NOT IN ichida NULL bo'lsa natija bo'sh — NOT EXISTS dan foydalaning.
  • SUM, AVG, COUNT(ustun) NULL ni hisobga olmaydi; kerak bo'lsa COALESCE bilan almashtiring.

Endi o'zingiz yechib ko'ring

O'rganganingizni mustahkamlang — so'rovingiz brauzerda darhol tekshiriladi.

Telegram'da muhokama qilish