MySQL jednostavni upiti — krećemo na putovanje kroz SELECT
Ranije smo opisali kako da kreirate bazu podataka i kako da kreirate tabelu; danas ćemo, na podacima projekta Jishupai, govoriti o MySQL upitima — odnosno o naredbi SELECT.
Krenimo od najjednostavnijeg SELECT upita, postupno i korak po korak, kako biste SELECT potpuno savladali.
U svakodnevnom razvoju, upitne naredbe su i najčešće korišćene — struktura tabele se određuje pri projektovanju i retko se kasnije menja, što znači da je i način umetanja podataka utvrđen, ali se načini prikaza podataka bitno razlikuju. Klijentska strana i admin panel mogu zahtevati raznovrsne podatke, pa MySQL mora da pruži podatke što bliže onom što je potrebno — time se smanjuje obrada konverzije podataka u Java programu i poboljšavaju performanse programa.
Kako pružiti podatke najbliže potrebama? Tu na scenu stupa naredba SELECT.
Podaci projekta Jishupai
Kod projekta Jishupai je otvorenog koda — možete ga preuzeti sa GitHub-a; nakon preuzimanja, dovoljno je lokalno pokrenuti glavni program i odgovarajuće tabele podataka će se automatski generisati.
Naravno, ako želite samo stvarne podatke projekta Jishupai, taj deo nije javno dostupan jer obuhvata korisničke privatne podatke.
Nakon inicijalnog pokretanja projekta Jishupai, tabele podataka su kao što je prikazano ispod; tabela article je glavni objekat upita u ovom članku.

Ako izvorni kod projekta Jishupai otvorite u Intellij IDEA, u datoteci init_data_221209.sql videćete naredbe za umetanje ovih podataka.

Definicija strukture tabele nalazi se u datoteci init_schema_221209.sql.

Dobro, kada su početni podaci pripremljeni, možemo krenuti sa učenjem upitnih naredbi.
Upit jedne kolone
Da bismo pregledali određenu kolonu neke tabele, format je sledeći:
SELECT ime_kolone FROM ime_tabele;Na primer, želimo da pogledamo kolonu title tabele article — upitna naredba glasi:
SELECT title FROM article;Nakon izvršenja ove naredbe, videćemo sledeće podatke.

Alias
Ako rezultujućoj koloni želite da date alias (nadimak), možete koristiti ključnu reč AS, u formatu:
SELECT ime_kolone AS alias FROM ime_tabele;Na primer, ako koloni title želimo da damo alias naslov članka, upitna naredba glasi:
SELECT title AS 'naslov članka' FROM article;Ovo se obično koristi kod združenih upita preko više tabela ili kada se imena kolona u Java programu i MySQL tabeli ne poklapaju.
Na primer, ako se ime polja u Java programu zove articleTitle, ovaj problem možemo rešiti pomoću aliasa.
SELECT title AS articleTitle FROM article;Upit više kolona
Kada su u rezultatu potrebne više kolone, možete ih razdvojiti zarezom ,, u formatu:
SELECT kolona1, kolona2, kolona3 FROM ime_tabele;Na primer, želimo da pogledamo kolone title, user_id, create_time tabele article — upitna naredba glasi:
SELECT title, user_id, create_time FROM article;
Upit svih kolona
Kada u rezultatu želite da upitate sve kolone, možete koristiti džoker *, u formatu:
SELECT * FROM ime_tabele;Na primer, želimo da pogledamo sve kolone tabele article — upitna naredba glasi:
SELECT * FROM article;Pošto je sadržaj nekih kolona obimniji, za prikaz rezultata možemo koristiti \G.

Kada je reč o džokeru *, moramo pomenuti i SELECT COUNT(*), SELECT COUNT(ime_kolone) i SELECT COUNT(1) — ovo je česta tema na intervjuima; o tome ćemo izdvojiti poseban članak, a za sada ostavljamo prečicu.
Razlika između COUNT(*), COUNT(ime_kolone) i COUNT(1)
Naravno, korišćenje džokera * se ne preporučuje, jer dovodi do toga da se upita previše kolona, što nije povoljno za optimizaciju performansi programa. Bolje je upitivati kolone po potrebi — ono što vam trenutno treba to i upitite, a dodatne kolone dodajte tek kad zatreba.
Smanjivanje opterećenja prenosa podataka već na izvoru dobra je navika koju treba poštovati pri pisanju koda.
Uklanjanje duplikata iz rezultata
Kada u rezultatu treba ukloniti duplikate, možete koristiti ključnu reč DISTINCT, u formatu:
SELECT DISTINCT ime_kolone FROM ime_tabele;Na primer, želimo da pogledamo sve oznake tabele tag — upitna naredba glasi:
SELECT DISTINCT tag_name FROM tag;
Sortiranje rezultata
Kada rezultat treba sortirati, možete koristiti ključnu reč ORDER BY, u formatu:
SELECT ime_kolone FROM ime_tabele ORDER BY ime_kolone [ASC|DESC];ASC je rastući redosled, DESC je opadajući; podrazumevano je rastući.
Na primer, želimo da pogledamo kolonu title tabele article i sortiramo ih po koloni create_time u opadajućem redosledu — upitna naredba glasi:
SELECT title,create_time FROM article ORDER BY create_time DESC;
Ako je potrebno sortirati po više kolona, možete ih razdvojiti zarezom ,.
SELECT kolona1, kolona2 FROM ime_tabele ORDER BY kolona1 [ASC|DESC], kolona2 [ASC|DESC];Na primer, želimo da pogledamo kolonu title tabele article i sortiramo po koloni create_time opadajuće; ako je create_time isti, onda sortiramo po koloni update_time rastuće — upitna naredba glasi:
SELECT title,create_time,update_time FROM article ORDER BY create_time DESC, update_time ASC;
Ograničavanje broja redova u rezultatu
Kada u rezultatu treba ograničiti broj vraćenih redova, možete koristiti ključnu reč LIMIT, u formatu:
SELECT ime_kolone FROM ime_tabele LIMIT početni_red,broj_redova;Početni red se naziva i pomeraj (OFFSET); podrazumevano je 0 i može se izostaviti.
Na primer, želimo da pogledamo kolonu title tabele article i ograničimo povrat na 5 redova — upitna naredba glasi:
SELECT title FROM article LIMIT 5;LIMIT je vrlo koristan za straničare (paginaciju). Na primer, želimo da pogledamo kolonu title tabele article i ograničimo povrat na 5 redova, počevši od 6. reda — upitna naredba glasi:
SELECT title FROM article LIMIT 5,5;Početni red je 5 zato što skup podataka pri brojanju kreće od 0.

Međutim, pri straničarenju sa LIMIT-om i velikim pomerajem (OFFSET), MySQL mora da pročita sve podatke od početka do reda koji odgovara pomeraju, a zatim odbaci sve prethodne redove i vrati samo podatke iz traženog opsega. To znači da se sa rastom OFFSET-a performanse postepeno pogoršavaju. Za tabele sa velikom količinom podataka to dovodi do toga da upit postane veoma spor.
Ovde ostavljamo i jednu prečicu:
MySQL straničeni upit: zašto performanse LIMIT OFFSET postepeno opadaju?
Kratak rezime
Danas smo naučili MySQL jednostavne upite — obuhvatili smo upit jedne kolone, upit više kolona, upit svih kolona, uklanjanje duplikata, sortiranje i ograničavanje broja redova rezultata.
Iako je ovo osnova, ostavili smo dve teme za detaljniju obradu: razliku između COUNT(*), COUNT(ime_kolone) i COUNT(1), te razlog postepenog pada performansi LIMIT OFFSET-a.
Ovi jednostavni upiti u svakodnevnom razvoju više ne moraju da se pišu ručno, jer postoje perzistencioni okviri (persistence frameworks) koji to rade za nas.
Na primer, u projektu Jishupai koristi se MyBatis-Plus okvir, koji pruža mnogo zgodnih metoda upita — recimo selectById, selectList, selectPage itd.; sve su one zasnovane na omotaču oko naredbe SELECT.

Ako vas zanima izvorni kod MyBatis-Plus-a, možete proučiti njegovu metodu selectById i videti kako on omota naredbu SELECT.
Iako nam perzistencioni okviri pomažu, i dalje moramo vladati osnovnom upotrebom SQL naredbi, jer neke složene upite okviri možda neće moći da zadovolje — tada ćemo SQL morati da napišemo ručno.

To bi bilo sve za danas; nadam se da će svi početnici moći da pažljivo provježbaju kroz tutorijal i tako prodube razumevanje naredbe SELECT.
