14-bo‘lim
MySQL funksiyalari
Matn, son, sana, shartli va agregat funksiyalar hamda ularning amaliy qo'llanishi.
Ushbu bo‘lim mundarijasi
MySQL yuzlab o'rnatilgan funksiyaga ega. Bu bo'limda eng ko'p kerak bo'ladiganlarini ko'rib chiqamiz.
Matn funksiyalari #
SELECT
CONCAT(ism, ' ', familiya) AS toliq_ism,
CONCAT_WS(', ', shahar, 'O''zbekiston') AS manzil,
UPPER(ism) AS katta,
LOWER(email) AS kichik,
LENGTH(ism) AS baytlar,
CHAR_LENGTH(ism) AS belgilar,
SUBSTRING(ism, 1, 3) AS qisqartma,
LEFT(familiya, 1) AS bosh_harf,
RIGHT(telefon, 4) AS oxirgi_4,
TRIM(ism) AS tozalangan,
REPLACE(telefon, '+998', '') AS raqamsiz,
REVERSE(ism) AS teskari,
LPAD(id, 6, '0') AS kod,
LOCATE('@', email) AS at_joyi
FROM talabalar
LIMIT 1;
| Funksiya | Vazifasi | Misol |
|---|---|---|
CONCAT(a, b) | Birlashtiradi | 'Dil' + 'noza' |
CONCAT_WS(sep, ...) | Ajratgich bilan | 'a, b, c' |
UPPER / LOWER | Registr | SALOM / salom |
CHAR_LENGTH | Belgilar soni | 7 |
LENGTH | Baytlar soni | UTF-8 da farq qiladi |
SUBSTRING(s, p, n) | Qism | SUBSTRING('salom',1,3) → sal |
LEFT / RIGHT | Boshidan/oxiridan | |
TRIM | Bo'shliqlarni olib tashlaydi | |
REPLACE(s, a, b) | Almashtiradi | |
LPAD / RPAD | To'ldiradi | LPAD(7,3,'0') → 007 |
LOCATE(a, s) | Joyini topadi |
LENGTH va CHAR_LENGTH farqiSELECT LENGTH('salom'), CHAR_LENGTH('salom'); -- 5, 5
SELECT LENGTH('o''zbek'), CHAR_LENGTH('o''zbek'); -- 7, 6
UTF-8 da o'zbekcha o' va g' belgilari bir necha bayt egallaydi.
Belgilar sonini bilish uchun har doim CHAR_LENGTH ishlating.
Amaliy misollar #
-- Email dan domenni ajratish
SELECT
email,
SUBSTRING_INDEX(email, '@', -1) AS domen,
SUBSTRING_INDEX(email, '@', 1) AS foydalanuvchi
FROM talabalar;
-- Bosh harflar (initsiallar)
SELECT
CONCAT(LEFT(ism, 1), '.', LEFT(familiya, 1), '.') AS initsiallar
FROM talabalar;
-- Telefonni formatlash
SELECT
CONCAT('+998 ', SUBSTRING(telefon, 5, 2), ' ',
SUBSTRING(telefon, 7, 3), '-',
SUBSTRING(telefon, 10, 2), '-',
SUBSTRING(telefon, 12, 2)) AS formatli
FROM talabalar
WHERE telefon IS NOT NULL;
-- Matnni qisqartirish
SELECT
CASE
WHEN CHAR_LENGTH(tavsif) > 50
THEN CONCAT(SUBSTRING(tavsif, 1, 50), '...')
ELSE tavsif
END AS qisqa_tavsif
FROM mahsulotlar;
Son funksiyalari #
SELECT
ROUND(3.14159, 2) AS yaxlitlangan, -- 3.14
ROUND(2.5) AS yaxlit, -- 3
FLOOR(3.9) AS pastga, -- 3
CEIL(3.1) AS yuqoriga, -- 4
TRUNCATE(3.999, 2) AS kesilgan, -- 3.99
ABS(-42) AS modul, -- 42
MOD(17, 5) AS qoldiq, -- 2
POWER(2, 10) AS daraja, -- 1024
SQRT(144) AS ildiz, -- 12
GREATEST(3, 7, 2) AS eng_katta, -- 7
LEAST(3, 7, 2) AS eng_kichik, -- 2
RAND() AS tasodifiy,
FORMAT(1234567.891, 2) AS formatli; -- 1,234,567.89
-- Foizni hisoblash
SELECT
nomi,
narx,
ROUND(narx * 0.12) AS qqs,
ROUND(narx * 1.12) AS qqs_bilan,
ROUND(narx * 0.85) AS chegirmali,
FORMAT(narx, 0) AS chiroyli_narx
FROM mahsulotlar;
-- Ulushni hisoblash
SELECT
shahar,
COUNT(*) AS soni,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 1) AS foiz
FROM talabalar
GROUP BY shahar;
Sana va vaqt funksiyalari #
SELECT
NOW() AS hozir, -- 2026-09-09 15:30:00
CURDATE() AS bugun, -- 2026-09-09
CURTIME() AS vaqt, -- 15:30:00
YEAR(NOW()) AS yil,
MONTH(NOW()) AS oy,
DAY(NOW()) AS kun,
HOUR(NOW()) AS soat,
DAYOFWEEK(NOW()) AS hafta_kuni, -- 1 = yakshanba
DAYNAME(NOW()) AS kun_nomi,
MONTHNAME(NOW()) AS oy_nomi,
WEEK(NOW()) AS hafta,
QUARTER(NOW()) AS chorak,
LAST_DAY(NOW()) AS oy_oxiri;
Sana bilan amallar #
SELECT
DATE_ADD(NOW(), INTERVAL 7 DAY) AS bir_hafta,
DATE_SUB(NOW(), INTERVAL 1 MONTH) AS oy_oldin,
DATE_ADD(NOW(), INTERVAL 2 YEAR) AS ikki_yil,
DATEDIFF('2026-12-31', CURDATE()) AS qolgan_kunlar,
TIMESTAMPDIFF(YEAR, '2004-05-15', CURDATE()) AS yosh,
TIMESTAMPDIFF(HOUR, boshlanish, tugash) AS davomiylik;
| Interval | Misol |
|---|---|
SECOND, MINUTE, HOUR | INTERVAL 30 MINUTE |
DAY, WEEK, MONTH | INTERVAL 3 MONTH |
QUARTER, YEAR | INTERVAL 1 YEAR |
Sanani formatlash #
SELECT
DATE_FORMAT(NOW(), '%d.%m.%Y') AS uz_format, -- 09.09.2026
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i') AS toliq,
DATE_FORMAT(NOW(), '%d %M %Y') AS matnli,
DATE_FORMAT(NOW(), '%W') AS hafta_kuni,
STR_TO_DATE('09.09.2026', '%d.%m.%Y') AS sanaga;
| Kod | Ma'nosi |
|---|---|
%Y / %y | Yil (2026 / 26) |
%m / %c | Oy (09 / 9) |
%d / %e | Kun (09 / 9) |
%H:%i:%s | Soat:daqiqa:soniya |
%W / %a | Hafta kuni (Tuesday / Tue) |
%M / %b | Oy nomi (September / Sep) |
-- Kunlik
GROUP BY DATE(yaratilgan)
-- Oylik
GROUP BY DATE_FORMAT(yaratilgan, '%Y-%m')
-- Haftalik
GROUP BY YEARWEEK(yaratilgan)
-- Choraklik
GROUP BY YEAR(yaratilgan), QUARTER(yaratilgan)
-- Soatlik (yuklama tahlili uchun)
GROUP BY HOUR(yaratilgan)
Shartli funksiyalar #
SELECT
ism,
-- IF: uch argumentli shart
IF(ortacha_baho >= 4.0, 'yaxshi', 'oddiy') AS daraja,
-- IFNULL: NULL ni almashtirish
IFNULL(telefon, 'kiritilmagan') AS telefon,
-- NULLIF: teng bo'lsa NULL qaytaradi
NULLIF(ortacha_baho, 0) AS baho,
-- COALESCE: birinchi NULL bo'lmagan
COALESCE(telefon, email, 'aloqa yo''q') AS aloqa,
-- CASE: to'liq shart
CASE
WHEN ortacha_baho >= 4.5 THEN 'A''lo'
WHEN ortacha_baho >= 3.5 THEN 'Yaxshi'
WHEN ortacha_baho >= 3.0 THEN 'Qoniqarli'
ELSE 'Qoniqarsiz'
END AS harfli_baho
FROM talabalar;
NULLIF qachon foydali?Nolga bo'lishning oldini olish uchun:
SELECT tushum / NULLIF(buyurtmalar_soni, 0) AS ortacha_chek
FROM statistika;
buyurtmalar_soni nol bo'lsa, NULLIF NULL qaytaradi va bo'lish
xato bermaydi - natija NULL bo'ladi.
Agregat funksiyalar (takrorlash) #
SELECT
COUNT(*) AS jami,
COUNT(telefon) AS telefoni_borlar,
COUNT(DISTINCT shahar) AS shaharlar,
SUM(ortacha_baho) AS yigindi,
AVG(ortacha_baho) AS ortacha,
MIN(ortacha_baho) AS eng_past,
MAX(ortacha_baho) AS eng_yuqori,
STDDEV(ortacha_baho) AS ogish,
GROUP_CONCAT(ism ORDER BY ism SEPARATOR ', ') AS ismlar
FROM talabalar;
Oyna funksiyalari #
MySQL 8.0 / MariaDB 10.2 dan boshlab:
SELECT
ism,
shahar,
ortacha_baho,
-- Umumiy reyting
ROW_NUMBER() OVER (ORDER BY ortacha_baho DESC) AS umumiy_orin,
-- Shahar ichidagi reyting
ROW_NUMBER() OVER (PARTITION BY shahar
ORDER BY ortacha_baho DESC) AS shahar_orin,
-- Teng qiymatlarni bir xil raqamlash
RANK() OVER (ORDER BY ortacha_baho DESC) AS rank_,
DENSE_RANK() OVER (ORDER BY ortacha_baho DESC) AS zich_rank,
-- Shahar bo'yicha o'rtacha (guruhlamasdan!)
ROUND(AVG(ortacha_baho) OVER (PARTITION BY shahar), 2) AS shahar_ortacha,
-- Umumiy yig'indi
SUM(ortacha_baho) OVER () AS umumiy_yigindi,
-- Oldingi va keyingi qator
LAG(ortacha_baho) OVER (ORDER BY ortacha_baho DESC) AS oldingi,
LEAD(ortacha_baho) OVER (ORDER BY ortacha_baho DESC) AS keyingi
FROM talabalar
ORDER BY ortacha_baho DESC;
Odatiy GROUP BY qatorlarni birlashtiradi. Oyna funksiyalari esa
har bir qatorni saqlab qolib, unga guruh bo'yicha hisoblangan qiymat qo'shadi.
"Har bir talabaning bahosi va uning shahri bo'yicha o'rtacha" degan savolga
GROUP BY bilan javob berish uchun ichki so'rov yoki JOIN kerak edi.
Oyna funksiyasi bilan - bitta qator.
-- To'plangan yig'indi (running total)
SELECT
sana,
summa,
SUM(summa) OVER (ORDER BY sana) AS toplangan
FROM kunlik_savdo;
-- Oldingi kun bilan solishtirish
SELECT
sana,
summa,
LAG(summa) OVER (ORDER BY sana) AS kecha,
summa - LAG(summa) OVER (ORDER BY sana) AS farq,
ROUND((summa - LAG(summa) OVER (ORDER BY sana)) * 100.0
/ LAG(summa) OVER (ORDER BY sana), 1) AS foiz_ozgarish
FROM kunlik_savdo
ORDER BY sana;
Boshqa foydali funksiyalar #
-- JSON bilan ishlash
SELECT
JSON_EXTRACT(sozlamalar, '$.til') AS til,
sozlamalar ->> '$.mavzu' AS mavzu
FROM foydalanuvchilar;
-- Xesh va shifrlash
SELECT
MD5('parol'),
SHA2('parol', 256),
UUID() AS noyob_id;
-- Tur o'zgartirish
SELECT
CAST('123' AS UNSIGNED) AS songa,
CAST(123 AS CHAR) AS matnga,
CAST('2026-09-09' AS DATE) AS sanaga;
-- Tizim ma'lumotlari
SELECT DATABASE(), USER(), VERSION(), CONNECTION_ID();
MD5 bilan saqlamang-- XAVFLI
INSERT INTO users (parol) VALUES (MD5('parol123'));
MD5 va SHA1 buzilgan algoritmlar - ularni zamonaviy kompyuterda
soniyalar ichida ochish mumkin.
Parollarni bazada emas, dasturlash tilida xeshlang:
- PHP:
password_hash($parol, PASSWORD_DEFAULT) - Python:
bcryptyokiargon2
Bu funksiyalar "tuz" qo'shadi va ataylab sekin ishlaydi.
Amaliy hisobot #
SELECT
DATE_FORMAT(b.yaratilgan, '%Y-%m') AS oy,
DATE_FORMAT(b.yaratilgan, '%M %Y') AS oy_nomi,
COUNT(DISTINCT b.id) AS buyurtmalar,
COUNT(DISTINCT b.mijoz_id) AS mijozlar,
FORMAT(SUM(be.soni * be.narx), 0) AS tushum,
FORMAT(AVG(be.soni * be.narx), 0) AS ortacha_chek,
CONCAT(ROUND(
SUM(be.soni * be.narx) * 100.0 /
SUM(SUM(be.soni * be.narx)) OVER (), 1), '%') AS ulush
FROM buyurtmalar b
JOIN buyurtma_elementlari be ON be.buyurtma_id = b.id
WHERE b.holat <> 'bekor'
AND b.yaratilgan >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY oy, oy_nomi
ORDER BY oy;
kutubxona bazasida:
CONCATbilan"Kitob nomi - Muallif (yil)"ustunini hosil qiling.UPPERvaLEFTbilan muallif initsiallarini chiqaring.DATE_FORMATbilan ijara sanasinidd.mm.yyyyko'rinishida chiqaring.DATEDIFFbilan kitob necha kun ushlab turilganini hisoblang.CASEbilan kitoblarni "yangi / o'rta / eski" deb tasniflang.IFNULLbilan narx ko'rsatilmaganda "Kelishilgan" deb yozing.ROW_NUMBER() OVER (PARTITION BY janr ...)bilan har bir janrdagi eng qimmat 3 ta kitobni toping.LAGbilan yillik kitob sonini o'tgan yil bilan solishtiring.
Xulosa #
- Matn uchun
CONCAT,SUBSTRING,REPLACE,TRIM; o'zbekcha matndaCHAR_LENGTH. - Son uchun
ROUND,FLOOR,CEIL,FORMAT. - Sana uchun
NOW(),DATE_ADD,DATEDIFF,DATE_FORMAT. - Hisobotlarda
GROUP BY DATE_FORMAT(sana, '%Y-%m')naqshi juda ko'p ishlatiladi. - Shartlar uchun
IF,IFNULL,COALESCE,NULLIFvaCASE. - Oyna funksiyalari qatorlarni saqlab qolib, guruh bo'yicha hisob qo'shadi.
- Parollarni bazada
MD5bilan xeshlamang - dasturlash tilidabcryptishlating.
Keyingi bo'limda ma'lumotlar bazasini to'g'ri loyihalashni - normalizatsiyani o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.