INSERT, SELECT — WHERE, AND, OR, BETWEEN, IN, LIKE, IS NULL
Jadval yaratildi. Endi unga ma'lumot kiritish va o'qish kerak. Bu ikki operatsiya dasturda eng ko'p ishlatiladi — har so'rovda, har sahifada.
INSERT — ma'lumot kiritish
INSERT INTO foydalanuvchilar (ism, email, yosh)
VALUES ('Ali', 'ali@mail.com', 25);
Bir vaqtda bir nechta qator:
INSERT INTO foydalanuvchilar (ism, email, yosh)
VALUES
('Ali', 'ali@mail.com', 25),
('Vali', 'vali@mail.com', 30),
('Soli', 'soli@mail.com', 22);
Kiritilgan qatorni darhol ko'rish — RETURNING:
INSERT INTO foydalanuvchilar (ism, email)
VALUES ('Jasur', 'jasur@mail.com')
RETURNING id, ism;
-- id | ism
-- ----+-------
-- 4 | Jasur
RETURNING ayniqsa foydali — SERIAL bilan yaratilgan id ni bilish uchun qo'shimcha so'rov yozish shart emas.
SELECT — ma'lumot o'qish
SELECT * FROM foydalanuvchilar;
* — barcha ustunlar. Faqat keraklilarini tanlash:
SELECT ism, email FROM foydalanuvchilar;
WHERE — shart bilan filtrlash
SELECT * FROM foydalanuvchilar WHERE yosh = 25;
SELECT * FROM foydalanuvchilar WHERE ism = 'Ali';
AND, OR — bir nechta shart
-- Ikkalasi bajarilishi kerak
SELECT * FROM foydalanuvchilar
WHERE yosh > 20 AND faol = TRUE;
-- Bittasi bajarilsa yetarli
SELECT * FROM foydalanuvchilar
WHERE ism = 'Ali' OR ism = 'Vali';
BETWEEN — oraliqda
SELECT * FROM foydalanuvchilar
WHERE yosh BETWEEN 20 AND 30;
-- 20 va 30 ham kiradi (≥ 20 AND ≤ 30)
Sana oralig'i:
SELECT * FROM buyurtmalar
WHERE sana BETWEEN '2024-01-01' AND '2024-12-31';
IN — ro'yxatdan birida
SELECT * FROM foydalanuvchilar
WHERE yosh IN (20, 25, 30);
SELECT * FROM mahsulotlar
WHERE kategoriya IN ('elektronika', 'kiyim', 'oziq-ovqat');
NOT IN — ro'yxatda bo'lmagan:
SELECT * FROM foydalanuvchilar
WHERE rol NOT IN ('admin', 'moderator');
LIKE — qisman moslik
-- 'A' bilan boshlanuvchilar
SELECT * FROM foydalanuvchilar WHERE ism LIKE 'A%';
-- 'li' bilan tugaydigan
SELECT * FROM foydalanuvchilar WHERE ism LIKE '%li';
-- Ichida 'ali' bo'lganlar
SELECT * FROM foydalanuvchilar WHERE ism LIKE '%ali%';
% — istalgan uzunlikdagi istalgan belgilar
_ — bitta istalgan belgi
-- Ikki harfli ismlar
SELECT * FROM foydalanuvchilar WHERE ism LIKE '__';
-- 'A' bilan boshlanib 3 harfli
SELECT * FROM foydalanuvchilar WHERE ism LIKE 'A__';
ILIKE — katta-kichik harfni farqlamasdan:
SELECT * FROM foydalanuvchilar WHERE ism ILIKE 'ali';
-- 'Ali', 'ALI', 'ali' — hammasi topiladi
IS NULL — bo'sh qiymat
NULL ni = bilan tekshirib bo'lmaydi:
-- ❌ — hech qachon mos kelmaydi
SELECT * FROM foydalanuvchilar WHERE telefon = NULL;
-- ✅
SELECT * FROM foydalanuvchilar WHERE telefon IS NULL;
SELECT * FROM foydalanuvchilar WHERE telefon IS NOT NULL;
Nima uchun = NULL ishlamaydi? NULL — "qiymat yo'q" degani. "Qiymat yo'q" bilan "qiymat yo'q" ni solishtirish — mantiqan noaniq. PostgreSQL bu holda TRUE ham, FALSE ham emas — NULL qaytaradi.
ORDER BY — tartiblash
SELECT * FROM foydalanuvchilar ORDER BY yosh; -- o'sish tartibida
SELECT * FROM foydalanuvchilar ORDER BY yosh DESC; -- kamayish tartibida
SELECT * FROM foydalanuvchilar ORDER BY ism, yosh DESC; -- avval ism, keyin yosh
LIMIT va OFFSET — sahifalash
SELECT * FROM foydalanuvchilar LIMIT 10; -- faqat 10 ta
SELECT * FROM foydalanuvchilar LIMIT 10 OFFSET 20; -- 21-30 chi qatorlar
Sahifa 1: LIMIT 10 OFFSET 0
Sahifa 2: LIMIT 10 OFFSET 10
Sahifa 3: LIMIT 10 OFFSET 20
Hammasini birga
SELECT ism, email, yosh
FROM foydalanuvchilar
WHERE faol = TRUE
AND yosh BETWEEN 18 AND 35
AND ism ILIKE 'a%'
ORDER BY yosh DESC
LIMIT 5;
Tez-tez uchraydigan xatolar
NULL ni = bilan tekshirish
-- ❌ — natija har doim bo'sh
WHERE telefon = NULL
-- ✅
WHERE telefon IS NULL
LIKE da % unutish
-- ❌ — faqat aynan 'Ali' topiladi, LIKE bo'lmasa = bilan bir xil
WHERE ism LIKE 'Ali'
-- ✅ — 'Ali' bilan boshlanganlar
WHERE ism LIKE 'Ali%'
NOT IN da NULL bo'lsa
SELECT * FROM foydalanuvchilar
WHERE rol NOT IN ('admin', NULL);
-- Bu so'rov hech narsa qaytarmaydi!
NOT IN ro'yxatida NULL bo'lsa — PostgreSQL hech bir qatorni moslab bera olmaydi. Ro'yxatda faqat aniq qiymatlar bo'lishi kerak.
Katta jadvalda LIKE '%matn%'
%matn% — boshida % bo'lgani uchun index ishlamaydi, jadval boshidan oxirigacha skanlanadi. Millionlab qatorda bu sekin. Buning yechimi — pg_trgm extension yoki Full-text Search (keyingi darslarda ko'riladi).
Xulosa
INSERT — ma'lumot kiritish. RETURNING — kiritilgan qatorni darhol qaytaradi.
SELECT — ma'lumot o'qish. WHERE bilan filtrlash:
=, !=, <, >, <=, >= — taqqoslash
AND, OR — bir nechta shart
BETWEEN a AND b — oraliq (a va b kiradi)
IN (...) — ro'yxatdan biri
LIKE / ILIKE — qisman moslik, % va _ wildcardlar
IS NULL / IS NOT NULL — bo'sh qiymat tekshirish
Tartiblash va sahifalash: ORDER BY, LIMIT, OFFSET.
Keyingi dars
9-dars: UPDATE, DELETE — RETURNING, xavfli holatlar