SQL da biz nafaqat ustunlardagi qiymatlarni shunchaki olamiz, balki ularni hisoblab, o'zgartirib ham chiqarishimiz mumkin. Buning uchun funksiyalar dan foydalanamiz. Funksiya — bu qiymatni qabul qilib, undan yangi qiymat qaytaradigan tayyor "vosita".
Bu darsda sonlar bilan ishlaydigan uchta foydali funksiyani o'rganamiz: ROUND (yaxlitlash), ABS (modul) va CAST (tip o'zgartirish).
Misollar uchun bizning mahsulotlar jadvalimizdan foydalanamiz:
| id | nomi | kategoriya | narx | ombor |
|---|---|---|---|---|
| 1 | Telefon | Elektronika | 5000000 | 10 |
| 2 | Noutbuk | Elektronika | 12000000 | 5 |
| 3 | Quloqchin | Elektronika | 300000 | 50 |
| 4 | Kitob | Kitoblar | 50000 | 100 |
| 5 | Daftar | Kanstovar | 8000 | 200 |
| 6 | Ruchka | Kanstovar | 3000 | 500 |
| 7 | Stol | Mebel | 800000 | 15 |
| 8 | Stul | Mebel | 250000 | 40 |
Sonlarni bo'lishda SQL ham xuddi Python dagidek o'zini tutadi: agar ikkala son ham butun (integer) bo'lsa, natija ham butun bo'ladi — kasr qismi tashlab yuboriladi!
SELECT 7 / 2;3Kutgan natija 3.5 edi, lekin biz 3 ni oldik. Sababi: 7 va 2 — butun sonlar, shuning uchun SQL butun bo'lish qiladi.
Haqiqiy (kasrli) natija olish uchun sonlardan kamida bittasini haqiqiy son qilishimiz kerak. Buning eng oson yo'li — maxraj (yoki surat) yoniga .0 qo'shish:
SELECT 7 / 2.0;3.5Muhim: Agar narxni millionga aylantirmoqchi bo'lsangiz,
narx / 1000000emas,narx / 1000000.0deb yozing. Aks holda, masalan,300000 / 1000000natijasi0bo'lib qoladi (butun bo'lish),300000 / 1000000.0esa to'g'ri —0.3ni beradi.
ROUND funksiyasi sonni kerakli xonagacha yaxlitlaydi. U ikkita argument oladi: yaxlitlanadigan son va o'nlik kasrdan keyingi xonalar soni.
SELECT ROUND(3.14159, 2);3.14Ikkinchi argumentni 0 qilsak yoki umuman yozmasak, son butun songa yaxlitlanadi:
SELECT ROUND(3.7);4.0Buni bo'lish bilan birlashtiramiz. Har bir mahsulot narxini million so'mda, 2 xonagacha yaxlitlab ko'raylik:
SELECT nomi, ROUND(narx / 1000000.0, 2) FROM mahsulotlar ORDER BY id;Telefon|5.0
Noutbuk|12.0
Quloqchin|0.3
Kitob|0.05
Daftar|0.01
Ruchka|0.0
Stol|0.8
Stul|0.25ABS funksiyasi sonning modulini — ya'ni manfiy ishorasisiz qiymatini qaytaradi. Manfiy son musbatga aylanadi, musbat son esa o'zgarmaydi.
SELECT ABS(-15);15SELECT ABS(42);42ABS ikki son orasidagi farqni (masofani) hisoblashda juda qulay — chunki kim kimdan katta ekanidan qat'i nazar, natija doim musbat bo'ladi.
CAST funksiyasi qiymatning tipini (turini) o'zgartiradi. Masalan, haqiqiy sonni butun songa aylantirsak, kasr qismi tashlab yuboriladi (yaxlitlanmaydi!):
SELECT CAST(3.99 AS INTEGER);3Yozilishi: CAST(qiymat AS yangi_tip). Eng ko'p ishlatiladigan tiplar — INTEGER (butun son), REAL (haqiqiy son) va TEXT (matn).
CAST ni bo'lish muammosini hal qilish uchun ham ishlatish mumkin — suratni REAL ga aylantirsak, bo'lish haqiqiy bo'ladi:
SELECT CAST(7 AS REAL) / 2;3.5Eslatma:
ROUNDyaxlitlaydi (3.99 → 4),CAST(... AS INTEGER)esa kasr qismini shunchaki tashlab yuboradi (3.99 → 3). Bu ikkisini chalkashtirib yubormang.
Endi navbat sizga. Har bir mahsulot narxini million so'mga aylantirib (narx / 1000000.0), 2 xonagacha yaxlitlab, mahsulot nomi bilan birga, id tartibida chiqaring.