0%

📊 Agregātfunkcijas un grupēšana

Agregātfunkcijas apstrādā vairākas rindas un atgriež vienu vērtību. Ar GROUP BY un HAVING var analizēt datus pa grupām — piemēram, pārdošanas apjomu pa kategorijām.

sql

COUNT, SUM, AVG, MAX, MIN

Teksts
-- COUNT – skaitīt rindas
SELECT COUNT(*)       FROM products;          -- Visas rindas
SELECT COUNT(id)      FROM products;          -- Rindas, kur id nav NULL
SELECT COUNT(DISTINCT category) FROM products; -- Unikālo kategoriju skaits

-- SUM – summa
SELECT SUM(price)  FROM products;
SELECT SUM(price)  FROM products WHERE category = 'Elektronika';

-- AVG – vidējā vērtība
SELECT AVG(price)           FROM products;
SELECT ROUND(AVG(price), 2) FROM products;   -- Noapaļot uz 2 zīmēm

-- MAX un MIN
SELECT MAX(price)       FROM products;   -- Dārgākais
SELECT MIN(price)       FROM products;   -- Lētākais
SELECT MAX(created_at)  FROM orders;     -- Jaunākais pasūtījums
SELECT MIN(created_at)  FROM orders;     -- Vecākais pasūtījums

-- Visi kopā
SELECT
    COUNT(*)         AS kopā,
    MIN(price)       AS lētākais,
    MAX(price)       AS dārgākais,
    ROUND(AVG(price), 2) AS vidējā_cena,
    SUM(price)       AS kopējā_vērtība
FROM products
WHERE in_stock = 1;

GROUP BY – grupēšana

Teksts
-- Produktu skaits pa kategorijām
SELECT category, COUNT(*) AS skaits
FROM products
GROUP BY category;

-- Vidējā cena pa kategorijām, sakārtots
SELECT
    category,
    COUNT(*)             AS skaits,
    ROUND(AVG(price), 2) AS vide_cena,
    MIN(price)           AS lētākais,
    MAX(price)           AS dārgākais
FROM products
GROUP BY category
ORDER BY vide_cena DESC;

-- Pārdošana pa gadiem/mēnešiem
SELECT
    YEAR(created_at)  AS gads,
    MONTH(created_at) AS mēnesis,
    SUM(total)        AS kopā,
    COUNT(*)          AS pasūtījumi
FROM orders
GROUP BY YEAR(created_at), MONTH(created_at)
ORDER BY gads DESC, mēnesis DESC;

-- Pasūtījumu skaits pa lietotājiem
SELECT
    user_id,
    COUNT(*)   AS pasūtījumu_skaits,
    SUM(total) AS kopējā_summa
FROM orders
GROUP BY user_id
ORDER BY kopējā_summa DESC;

-- GROUP BY ar JOIN (lietotāja vārds)
SELECT
    u.username,
    COUNT(o.id)   AS pasūtījumi,
    SUM(o.total)  AS kopā_€
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.username
ORDER BY kopā_€ DESC;

HAVING – filtrēšana pēc grupēšanas

WHERE filtrē rindas pirms grupēšanas. HAVING filtrē grupas pēc grupēšanas.

Teksts
-- Kategorijas, kurās ir vairāk nekā 5 produkti
SELECT category, COUNT(*) AS skaits
FROM products
GROUP BY category
HAVING skaits > 5;          -- HAVING izmanto aliasu no SELECT

-- HAVING ar agregātfunkciju tieši
SELECT category, COUNT(*) AS skaits
FROM products
GROUP BY category
HAVING COUNT(*) >= 3
ORDER BY skaits DESC;

-- WHERE + HAVING kombinācija
-- WHERE filtrē PIRMS grupēšanas, HAVING – PĒC
SELECT
    category,
    COUNT(*)         AS skaits,
    AVG(price)       AS vidusmērs
FROM products
WHERE in_stock = 1               -- Vispirms filtrē pieejamos
GROUP BY category
HAVING AVG(price) > 50           -- Tad atstāj kategorijas ar vidējo cenu > 50
ORDER BY vidusmērs DESC;

-- Lietotāji, kas pasūtījuši vairāk nekā 3 reizes
SELECT user_id, COUNT(*) AS reizes
FROM orders
GROUP BY user_id
HAVING reizes > 3;

-- Dienas ar vairāk nekā 10 pasūtījumiem
SELECT DATE(created_at) AS datums, COUNT(*) AS pasūtājumi
FROM orders
GROUP BY DATE(created_at)
HAVING pasūtājumi > 10
ORDER BY datums DESC;

Teksta un datuma funkcijas

Teksts
-- TEKSTS
SELECT UPPER(name) FROM products;               -- LIELOS BURTUS
SELECT LOWER(email) FROM users;                  -- mazos burtus
SELECT LENGTH(name) FROM products;               -- Rakstzīmju skaits
SELECT CHAR_LENGTH(name) FROM products;          -- UTF-8 drošs garums
SELECT TRIM(name) FROM products;                 -- Noņemt sākuma/beigu atstarpes
SELECT LTRIM(name) FROM products;                -- Tikai kreiso
SELECT RTRIM(name) FROM products;                -- Tikai labo

SELECT SUBSTRING(name, 1, 10) FROM products;     -- Pirmie 10 simboli
SELECT LEFT(name, 5)   FROM products;             -- Pirmie 5
SELECT RIGHT(name, 5)  FROM products;             -- Pēdējie 5

SELECT REPLACE(name, 'Pro', 'Professional') FROM products;
SELECT CONCAT(first_name, ' ', last_name)  AS pilnais FROM users;
SELECT CONCAT_WS(', ', city, country) AS adrese FROM contacts;

-- DATUMS
SELECT NOW()          AS tagad;          -- 2025-03-06 14:30:00
SELECT CURDATE()      AS šodien;         -- 2025-03-06
SELECT CURTIME()      AS laiks;          -- 14:30:00

SELECT DATE(created_at)   FROM orders;   -- Tikai datuma daļa
SELECT YEAR(created_at)   FROM orders;   -- 2025
SELECT MONTH(created_at)  FROM orders;   -- 3
SELECT DAY(created_at)    FROM orders;   -- 6
SELECT DAYNAME(created_at) FROM orders;  -- Thursday

SELECT DATE_FORMAT(created_at, '%d.%m.%Y') AS formatets FROM orders;

-- Datumu aritmētika
SELECT DATE_ADD(NOW(), INTERVAL 7  DAY)   AS pec_nedelas;
SELECT DATE_SUB(NOW(), INTERVAL 30 DAY)   AS pirms_menesa;
SELECT DATEDIFF('2025-12-31', NOW())      AS dienas_lidz_gada_beigas;

-- Filtrēt pēdējo mēnesi
SELECT * FROM orders
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY);