SUBSTR,INSTR,REPLACE,UPPER,LENGTHilə mətni emal etməkdate,strftimevəjuliandayilə tarixləri parçalamaq, dəyişmək və aralarındakı günləri saymaq- Tam ədəd bölməsini, qalığı və yuvarlaqlaşdırmanı düzgün işlətmək və funksiyaları başqa dialektlərə keçirmək
Məlumat nadir hallarda bizə lazım olan formada saxlanılır. E-poçtdan domeni ayırmaq, «A. Məmmədova» kimi qısa ad düzəltmək, ödəniş üçün son tarixi hesablamaq, qiymətə ƏDV əlavə edib yuvarlaqlaşdırmaq — bunları proqram kodunda da etmək olar, amma çox vaxt birbaşa sorğuda etmək daha sadə və sürətlidir. Bu dərsdə üç qrup funksiyanı öyrənəcəyik. Diqqət: funksiyalar SQL-in dialektlərə görə ən çox fərqlənən hissəsidir, ona görə hər birinin MySQL və PostgreSQL qarşılığını da verəcəyik.
Mətn funksiyaları
LENGTH(s)— simvolların sayı;UPPER(s),LOWER(s)— böyük və kiçik hərflər.SUBSTR(s, başlanğıc, uzunluq)— mətnin bir hissəsi; nömrələmə 1-dən başlayır, uzunluq yazılmasa, sona qədər götürülür.INSTR(s, alt)— alt mətnin ilk mövqeyi (yoxdursa, 0);REPLACE(s, köhnə, yeni)— əvəzləmə;TRIM(s)— kənar boşluqları silir.
SELECT UPPER(last_name) AS upper_name,
LENGTH(last_name) AS len,
SUBSTR(first_name, 1, 1) || '. ' || last_name AS short_name,
SUBSTR(email, INSTR(email, '@') + 1) AS domain
FROM students
WHERE id IN (1, 3, 4)
ORDER BY id;▸ Gözlənilən nəticə
upper_name | len | short_name | domain MəMMəDOVA | 9 | A. Məmmədova | example.com HüSEYNOVA | 9 | L. Hüseynova | example.com QULIYEV | 7 | E. Quliyev | NULL
NULL üzərindəki istənilən funksiya yenə NULL verir.Tarix funksiyaları
SQLite-da ayrıca tarix tipi yoxdur: tarixlər YYYY-MM-DD formatında mətn kimi saxlanılır. strftime(format, tarix) tarixin hissələrini çıxarır (%Y — il, %m — ay, %w — həftənin günü, 0 = bazar), date(tarix, dəyişdirici...) isə tarixi sürüşdürür: '+30 days', '-1 month', 'start of month'.
SELECT id, order_date,
strftime('%Y', order_date) AS year,
strftime('%m', order_date) AS month,
strftime('%w', order_date) AS weekday,
date(order_date, '+30 days') AS pay_until
FROM orders
WHERE id <= 4
ORDER BY id;▸ Gözlənilən nəticə
id | order_date | year | month | weekday | pay_until 1 | 2025-01-15 | 2025 | 01 | 3 | 2025-02-14 2 | 2025-01-15 | 2025 | 01 | 3 | 2025-02-14 3 | 2025-02-02 | 2025 | 02 | 0 | 2025-03-04 4 | 2025-02-10 | 2025 | 02 | 1 | 2025-03-12
İki tarix arasındakı günləri saymaq üçün onları julianday ilə ədədə — müəyyən başlanğıcdan keçən günlərin sayına çeviririk və çıxırıq. Aşağıda hər müştərinin qeydiyyatdan ilk sifarişinə qədər neçə gün gözlədiyini tapırıq.
SELECT c.name, c.joined_on,
MIN(o.order_date) AS first_order,
CAST(julianday(MIN(o.order_date)) - julianday(c.joined_on) AS INTEGER)
AS days_to_first_order
FROM customers AS c
JOIN orders AS o ON o.customer_id = c.id
GROUP BY c.id, c.name, c.joined_on
ORDER BY days_to_first_order, c.name;▸ Gözlənilən nəticə
name | joined_on | first_order | days_to_first_order Zəhra Hüseynli | 2025-02-14 | 2025-04-09 | 54 Mehmet Kaya | 2025-04-01 | 2025-06-12 | 72 John Carter | 2024-08-30 | 2025-03-18 | 200 Olga Ivanova | 2024-06-18 | 2025-03-05 | 260 Emre Yılmaz | 2024-05-05 | 2025-02-10 | 281 Lalə Əhmədova | 2024-03-22 | 2025-02-02 | 317 Anar Mustafayev | 2024-01-10 | 2025-01-15 | 371
Riyazi funksiyalar və yuvarlaqlaşdırma
İki tam ədədin bölməsi SQLite, PostgreSQL və SQL Server-də yenə tam ədəddir: 7 / 2 = 3, % isə qalığı verir. Bu, qablaşdırma kimi məsələlərdə faydalıdır: 500 dəftəri 24-lük qutulara yığsaq, 20 tam qutu olur və 20 dəftər artıq qalır. Qiymətə 18% ƏDV əlavə edəndə nəticəni ROUND(x, 2) ilə qəpiyə qədər yuvarlaqlaşdırırıq.
SELECT name, stock,
stock / 24 AS full_boxes,
stock % 24 AS left_over,
ROUND(price * 1.18, 2) AS price_with_vat
FROM products
WHERE category IN ('Stationery', 'Accessories')
ORDER BY id;▸ Gözlənilən nəticə
name | stock | full_boxes | left_over | price_with_vat Notebook | 500 | 20 | 20 | 3.78 Pen set | 300 | 12 | 12 | 9.32 Backpack | 60 | 2 | 12 | 64.9 Water bottle | 120 | 5 | 0 | 14.16
SELECT 7 / 2 AS int_div,
7 / 2.0 AS real_div,
ROUND(2.5) AS half_up,
ROUND(-2.5) AS half_down,
CAST(-12.9 AS INTEGER) AS truncated;▸ Gözlənilən nəticə
int_div | real_div | half_up | half_down | truncated 3 | 3.5 | 3 | -3 | -12
ROUND yarımları sıfırdan uzağa yuvarlaqlaşdırır, CAST(... AS INTEGER) isə kəsr hissəni sadəcə atır.SQRT, POWER, FLOOR, CEIL, LN kimi riyazi funksiyalar PostgreSQL və MySQL-də həmişə var. SQLite-a onlar 3.35 versiyasında əlavə olunub, amma yalnız xüsusi seçimlə yığılmış proqramlarda mövcuddur, ona görə SQLite üçün yazılan portativ sorğularda ROUND, ABS, CAST və % ilə kifayətlənmək daha etibarlıdır.
Dialektlər arasında «lüğət»
| Nə edirik | SQLite | MySQL | PostgreSQL |
|---|---|---|---|
| Simvolların sayı | LENGTH(s) | CHAR_LENGTH(s) | LENGTH(s) |
| Mətnin hissəsi | SUBSTR(s, 2, 3) | SUBSTRING(s, 2, 3) | SUBSTRING(s FROM 2 FOR 3) |
| Alt mətnin yeri | INSTR(s, '@') | LOCATE('@', s) | POSITION('@' IN s) |
| Birləşdirmə | a || b | CONCAT(a, b) | a || b |
| Tarixin ili | strftime('%Y', d) | YEAR(d) | EXTRACT(YEAR FROM d) |
| 30 gün əlavə et | date(d, '+30 days') | DATE_ADD(d, INTERVAL 30 DAY) | d + INTERVAL '30 days' |
| Tarixlər arasında günlər | julianday(b) - julianday(a) | DATEDIFF(b, a) | b - a |
| Ayın başlanğıcı | date(d, 'start of month') | DATE_FORMAT(d, '%Y-%m-01') | date_trunc('month', d) |
| Bu günün tarixi | date('now') | CURDATE() | CURRENT_DATE |
LENGTH simvolları yox, baytları sayır: LENGTH('ə') 2 verir. PostgreSQL-də b - a yalnız DATE tipli sütunlar üçün gün sayı qaytarır.E-poçtu olan hər şagird üçün e-poçtun @ işarəsindən əvvəlki hissəsini (login) və adını (first_name) göstər. Nəticəni login-ə görə düz.
SELECT email, first_name
FROM students
WHERE email IS NOT NULL
ORDER BY email;▸ Gözlənilən nəticə
login | first_name aysel | Aysel fidan | Fidan gunay | Günay kamran | Kamran leyla | Leyla murad | Murad nigar | Nigar orxan | Orxan rashad | Rəşad sabina | Səbinə
Hər ay üçün (month, məsələn, 2025-02) sifarişlərin sayını (orders) və həmin ayın son gününü (month_end) göstər. Nəticəni aya görə düz.
SELECT SUBSTR(order_date, 1, 7) AS month,
COUNT(*) AS orders
-- add month_end
FROM orders
GROUP BY month
ORDER BY month;▸ Gözlənilən nəticə
month | orders | month_end 2025-01 | 2 | 2025-01-31 2025-02 | 2 | 2025-02-28 2025-03 | 2 | 2025-03-31 2025-04 | 2 | 2025-04-30 2025-05 | 1 | 2025-05-31 2025-06 | 2 | 2025-06-30 2025-07 | 1 | 2025-07-31
Əsas fikirlər
SUBSTR,INSTR,REPLACE,TRIM,||mətni kəsir, axtarır və birləşdirir; SQLite-da mövqelər 1-dən sayılır.- SQLite-ın
UPPER/LOWERfunksiyaları yalnız A–Z hərflərini dəyişir; MySQL-dəLENGTHbaytları sayır. strftimetarixi hissələrə ayırır,date(d, '+30 days')sürüşdürür,juliandayfərqi günləri sayır.- Tam ədədlərin bölməsi tam ədəddir (
7 / 2 = 3),%qalığı verir,ROUND(x, 2)qəpiyə qədər yuvarlaqlaşdırır. - Funksiyalar dialektlərdə ən çox fərqlənən hissədir — başqa VBİS-ə keçəndə qarşılıq cədvəlini yoxla.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
SUBSTR('Bakı', 2, 2) nə qaytarır?