Kursevi › Odlučivanje na osnovu podataka: od pitanja do odgovora

Vaš prvi pravi upit nad Alpenkorbovim porudžbinama

Lekcija 5 od 8 · 13 min

Oblik svakog upita

U prve četiri vežbe pokretali ste male upite. Ova lekcija stavlja delove u red, jer skoro svaki analitički upit ima isti skelet.

Text
SELECT   columns or calculations
FROM     table
WHERE    conditions on rows
ORDER BY sort columns
LIMIT    number of rows;

SQL izvršava klauzule u drugačijem redosledu od onog u kom ih pišete. Prvo FROM bira tabelu, zatim WHERE uklanja redove, potom SELECT izračunava kolone, a ORDER BY sortira i LIMIT seče. Zato WHERE ne može da filtrira po imenu koje sami napravite u SELECT, dok ORDER BY po njemu može da sortira.

Filteri koji odgovaraju poslovanju

Lena želi da zna da li kodovi za popust donose veće korpe. U tabeli orders, discount_code sadrži kodove poput WELCOME10 za prvu porudžbinu ili AFFILIATE15 sa partnerskih sajtova, a prazan je kada kod nije korišćen. U SQL-u je prazna vrednost NULL, što znači nepoznato, i zahteva sopstveni test.

SQL
SELECT order_id, order_date, source, discount_code, net_amount
FROM orders
WHERE status = 'delivered'
  AND discount_code IS NOT NULL
  AND order_date >= '2026-01-01'
ORDER BY net_amount DESC
LIMIT 3;

discount_code = NULL ne bi vratio nijedan red. Poređenje bilo čega sa nepoznatim daje nepoznato, a WHERE zadržava samo redove u kojima je uslov tačan. Umesto toga koristite IS NULL i IS NOT NULL.

  • AND zahteva svaki uslov, OR bar jedan. Kada ih mešate, dodajte zagrade: WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').
  • IN je skraćeni oblik za nekoliko OR-ova: region IN ('Bern', 'Basel').
  • Poređenja teksta zahtevaju jednostruke navodnike i tačan pravopis. Regioni se pišu 'Zurich', 'Geneva' i 'St. Gallen'.

Tri male greške izazivaju većinu neuspelih prvih upita. Tekstualne vrednosti koriste jednostruke navodnike: u DuckDB-u "delivered" u dvostrukim navodnicima znači kolonu po imenu delivered, i upit ne uspeva. Datumi se pišu kao tekst u ISO obliku, '2026-01-01', koji DuckDB ispravno poredi sa kolonom tipa datum. A nedostajuća ili suvišna zapeta između kolona proizvodi sintaksnu grešku blizu sledeće reči.

Zamka statusa

Tabela orders sadrži svaku porudžbinu ikada napravljenu, uključujući 67 otkazanih i 80 vraćenih. Njihov net_amount je i dalje popunjen, jer je iznos bio poznat u trenutku kada je porudžbina napravljena. Ako zaboravite status = 'delivered', prihod je previsok. U prvom kvartalu 2026. ta greška pretvara CHF 37'107.20 u CHF 38'787.67. Greška nije ni ravnomerno raspoređena: otkazivanja i povraćaji su češći kod nekih izvora nego kod drugih.

Šta je pokazalo pitanje o popustu? U prvom kvartalu 2026, 90 od 648 isporučenih porudžbina koristilo je kod. Njihova prosečna vrednost bila je CHF 57.16, naspram CHF 57.28 za porudžbine bez koda. Na osnovu ovog dokaza, kodovi ne donose veće korpe. Možda i dalje osvajaju nove kupce, što je drugo pitanje i zahteva drugačiji upit. Pre nego što poverujete bilo kom rezultatu, uporedite broj njegovih redova sa brojem koji već znate: vežba u lekciji 2 vratila je 648 isporučenih porudžbina za ovaj kvartal, pa filter za isti kvartal nikada ne može vratiti više od toga.

💡 Gradite upit u koracima. Počnite sa SELECT * FROM orders LIMIT 10, dodajte jedan filter, pokrenite ga, proverite broj redova, pa dodajte sledeći. Dugačak upit napisan odjednom i pokrenut jednom skriva svoje greške.
Provera znanja
Zašto WHERE discount_code = NULL ne vraća nijedan red?

Prijavi se da odgovoriš i prattiš napredak.

Prijava
</>
Babala Software Netzwerk — Apps, Websites & KI-Lösungen aus Füllinsdorf BL
© 2026 Babala Özdemir · UID CHE-322.105.560 babala.ch info@babala.ch 076 792 63 50 Facebook Instagram