Tehnologija Vodič

Izbegnite greške u pisanju SQL query-a

sql query greške

Svi mi grešimo, pogotovo kada učimo nešto novo. Za sve one koji još uče SQL, u ovom tekstu ćemo prikazati neke od najčešćih grešaka sa kojima se početnici susreću i objasniti na koji način da ih rešite. Kao primer ćemo uzeti neke izmišljene podatke koji mogu odgovarati realnoj situaciji. Na primer, podatke prodaje, pa ćemo imati kolone ID proizvoda, iznos i datum (SalesId, SalesAmount i SalesDate).

Hajde sada da vidimo neke najčešće greške koje možemo učiniti u pisanju SQL query-a.

Redosled izvršavanja query-a

Jedno od najvažnijih pravila koja ne možete ignorisati je redosled po kojem se izvršava neki query. Redosled treba da bude u formatu kako je prikazano ispod, inače nećete dobiti željeni rezultat query-a.

Dobijanje podataka (From, Join)
Filtriranje Reda (Where)
Grupisanje (Group by)
Filter grupisanja (Having)
Vraćanje izraza (Select)
Redosled (Order by & Limit / Offset)

Važno je da planirate i pravilno struktuirate format query-a, a ako ste u prilici i da testirate query prvo na testnim podacima.

sql

Izaberite pravi tip podatka

Odabir pravog tipa podatka za svaku kolonu je ključan za dobijanje željenog rezutata. Naravno, moguće je raditi on-the-fly konverziju iz jednog tipa u drugi, ali to obično nije dobra ideja jer povećava vreme potrebno za izvršavanje query-a. Iz tog razloga je dobra praksa izbegavati konverziju tipova podataka kada god je to moguće.

Nikada ne koristite Select *

Korišćenje select * query-a za sve kolone povećava vreme koje je potrebno za izvršavanje query-a. Pored toga, korišćenje select * nije dobra ideja ni sa stanovišta performansi, ali ni sa stanovišta bezbednosti.

Evo jednog primera pogrešno i ispravno napisanog query-a:

# Pogrešan način
SELECT * FROM Sales

U ovom slučaju umesto navedenog primera ispravno bi bilo selektovati sve relevantne kolone:

# Ispravan način
SELECT SalesID, SalesAmount FROM Sales

Na primer, ako želite da dobijete SalesID iz tabele Sales, onda bi trebalo da odaberete samo kolonu SalesID, umesto da selektujete kolone korišćenjem select * query-a. Na taj način ćete izvršiti query za veoma kratko vreme. Statement koji je prikazan iznad definiše svaku kolonu i takođe limitira veličinu svakog zapisa.

Ne koristite Distinct

Distinct statement pronalazi jedinstvene redove koji se odnose na određenu kolonu, izbacujući duplirane redove iz tabele. To može da potraje, a srećom postoji i bolje rešenje.

# Pogrešan način
SELECT count(distinct SalesID)
FROM Sales

Umesto ovog query-a možemo upotrebiti grupisanje da bismo ubrzali proces. Na primer, query-ji ispod pronalaze jedninstvene SalesID iz tabele Sales.
# Ispravan način
SELECT count(*)
FROM
(SELECT SalesID
FROM Sales
group by SalesID)

Zamislite da pokrećete matematički query koji vraća milione redova, da biste na kraju shvatili da ste iskalkulisali pogrešno i da ne dobijate željeni rezultat.

# Pogrešan način
SELECT SalesID, SalesAmount FROM Sales

Da biste rešili ovaj problem, dobro je koristiti TOP / LIMIT da biste imali uvid u rezultate, pre svega da biste bili sigurni da dobijate željeni rezultat i da ne gubite vreme.

# Ispravan način
SELECT TOP 100
SalesID, SalesAmount
FROM Sales

Ne koristite Having

Uglavnom koristimo having da bismo primenili filter na zbirne kolone sa operacijama kao što su (sum, min, max, itd) kreirane korišćenjem group by operacije. Ipak, ponekad koristimo having umesto where, da bismo filtrirali podatke iz tabele.

# Pogrešan način
SELECT count(SalesId), SalesAmount, SalesDate
FROM Sales
group by SalesDate
having EmployeeID = 5

Na primer, da bismo pronašli ukupnu prodaju svih prodavaca koji imaju ID 5, možemo upotrebiti group by da bismo dobili rezultat

# Ispravan način
SELECT count(SalesId), SalesAmount, SalesDate
FROM Sales
where EmployeeID = 5
group by SalesDate

Koristite exists() umesto count()

Iako možete koristiti i EXIST() i COUNT() da biste otkrili da li tabela ima neki određeni zapis, korišćenje EXIST() je mnogo efikasnije. Dok će COUNT() pretražiti celu tabelu da bi obezbedio ukupan broj zapisa koji odgovaraju upitu, EXIST() će pretraživati samo dok ne locira prvi ulaz zapisa u tabeli. To će vam sačuvati vreme, a ujedno će i ppmoći da optimizujete svoje SQL query-je.

Poštujte redosled računskih operacija

Ovo naravno važi uvek i u svakoj prilici. Ipak nije na odmet naglasiti, jer se često dogovodi da problem sa određenim upitom nastane upravo iz ovog razloga. Jednostavno, kao i kod bilo koje druge matematičke operacije, moramo poštovati redosled izvršavanja operacija. U suprotnom, dobićemo pogrešan rezultat.

Zaključak

Videli smo da SQL query može biti napisan na lošiji i na bolji način. U nekim slučajevima pisanje na lošiji način neće značajno uticati na performanse i rezultat, ali u nekim slučajevima i te kako hoće. Pogotovo ukoliko radite sa velikom količinom podataka.

Zato obratite pažnju da kod pisanja SQL query-ja:

  • koristite odgovarajući redosled pisanja upita,
  • koristite zagrade na odgovarajučim mestima jer to određuje format,
  • poštujete redosled logičkih i matematičkih operatora.

Ostavi komentar

Vaša adresa neće biti objavljena