3.1 GROUP BY operatori
SQL tili juda kuchli. U oddiy ma'lumotlarni tanlashdan tashqari, so'rov paytida ma'lumotlarni guruhlashga imkon beradi. Misol uchun, bizda qaysi brendning qancha turdagi mahsuloti borligini bilmoqchimiz, buni qanday qilsak bo'ladi?
Buning uchun maxsus GROUP BY operatori mavjud, mana qanday yoziladi.
GROUP BY kolonka
Keling, SQLdan har bir brendning turli xil mahsulot sonini ko'rsatishni so'rab so'rov yozamiz. Bunday so'rov taxminan quyidagicha ko'rinadi:
SELECT brand, COUNT(*)
FROM product
GROUP BY brand
Quyidagi so'rov natijalarini olasiz:
| brand | count(*) |
|---|---|
| (NULL) | 2 |
| Bosch | 4 |
| IKEA | 6 |
| LG | 2 |
| SmartFlower | 1 |
Yozilgan so'rovni diqqat bilan tahlil qilaylik va natijani ko'rib chiqaylik. Natijada biz ikki ustunni ko'ramiz. Birinchisi brendlar ro'yxati bilan, bu mantiqiy. Biz shunday juftliklar to'plamini olishni xohlagandik "brend --> miqdor".
Brendlar orasida NULL so'zi borligiga e'tibor ber. Haqiqatan ham bizda NULL yozilgan mahsulotlar bor va biz ularni bu yerda ko'ramiz. Biroz kutilmaganda, lekin foydali. Bizda brendsiz qancha mahsulot borligini ko'rishimiz mumkin.
Endi so'rovga diqqat bilan qaraylik. Har bir brendning mahsulotlar sonini bilmoqchi edik, shuning uchun GROUP BY brand yozdik va SELECT da brand va COUNT(*) ifodasini yozdik.
COUNT(*) – bu guruhlangan qatorlarga nisbatan bajariladigan agregat funksiyadir. Bizning holatda, u oddiygina ularning sonini hisoblaydi. Bunday funksiyalar juda ko'p bo'lib, ularni birozdan keyin ko'rib chiqamiz.
3.2 GROUP BY bilan murakkab so'rovlar
Endi keling, narxi 10 dan kam bo'lgan mahsulotlarni chiqarib tashlab, so'ngra ularni guruhlaydigan so'rov yozamiz. Bunday so'rov taxminan quyidagicha ko'rinadi:
SELECT brand, COUNT(*)
FROM product
WHERE price > 10
GROUP BY brand
Quyidagi so'rov natijalarini olasiz:
| brand | count(*) |
|---|---|
| Bosch | 4 |
| IKEA | 5 |
| LG | 2 |
| SmartFlower | 1 |
Bizning natija jadvalimizdan barcha NULL-mahsulotlar yo'qoldi, chunki ular juda arzon bo'lib, shuningdek IKEA mahsulotlari soni 1 ga kamaydi. 6 edi, 5 bo'ldi.
Bu WHERE ni birinchi kerakli qatorlarni filtratsiya qilish uchun qo'llashni, keyin esa natijaga guruhlash qo'llashni anglatadi.
3.3 Natijaviy ustunlarning nomlari
Aytgancha, natijaviy ustunlarga nomlar qo'yishingiz mumkin. Qarang, oxirgi ustun nomi sifatida server count(*) nomini taklif qildimi? Keling, uni total ga o'zgartiramiz. Bunday so'rov taxminan quyidagicha ko'rinadi:
SELECT brand, COUNT(*) AS total
FROM product
WHERE price > 10
GROUP BY brand
Quyidagi so'rov natijalarini olasiz:
| brand | total |
|---|---|
| Bosch | 4 |
| IKEA | 5 |
| LG | 2 |
| SmartFlower | 1 |
Siz mavjud ustunlarni ham qayta nomlashingiz mumkin. Keling, ilgari ishlatilgan so'rovlardan birini olamiz va ustunlarga yangi nomlar qo'shamiz.
SELECT
id AS product_id,
name AS product_name,
price
FROM product
WHERE price < 20 AND brand IS NOT NULL
Quyidagi so'rov natijalarini olasiz:
| product_id | product_name | price |
|---|---|---|
| 2 | Stul | 5.00 |
| 8 | Lampa | 15.00 |
GO TO FULL VERSION