SQLite Upit: Odaberite, Gdje, LIMIT, OFFSET, Broj, Grupiraj po
โก Pametni saลพetak
SQLite Upiti dohvaฤaju i filtriraju podatke pomoฤu klauzula SELECT, FROM, WHERE, GROUP BY, ORDER BY i LIMIT. Kombiniranje ovih klauzula s operatorima, agregatima, podupitima i operacijama skupova omoguฤuje vam ฤitanje, oblikovanje i saลพimanje zapisa iz bilo kojeg SQLite baza podataka.

U donjim odjeljcima opisano je ฤitanje podataka pomoฤu SELECT i FROM, filtriranje redaka pomoฤu WHERE i njegovih operatora, sortiranje i ograniฤavanje rezultata, agregacijske funkcije, GROUP BY i HAVING, podupiti, operacije s skupovima, rukovanje NULL vrijednostima, CASE izrazi i uobiฤajeni tabliฤni izrazi.
Napisati SQL upita u SQLite baze podataka, morate znati kako rade klauzule SELECT, FROM, WHERE, GROUP BY, ORDER BY i LIMIT i kako ih koristiti.
Tijekom ovog tutorijala nauฤit ฤete kako koristiti te reฤenice i kako pisati SQLite klauzule.
ฤitanje podataka s odabirom
Klauzula SELECT glavna je izjava koju koristite za postavljanje upita SQLite baza podataka. U klauzuli SELECT navodite ลกto odabrati. Ali prije klauzule odabira, da vidimo odakle moลพemo odabrati podatke pomoฤu klauzule FROM.
Klauzula FROM koristi se za odreฤivanje gdje ลพelite odabrati podatke. U klauzuli from moลพete navesti jednu ili viลกe tablica ili podupita iz kojih ฤete odabrati podatke, kao ลกto ฤemo vidjeti kasnije u vodiฤima.
Imajte na umu da za sve sljedeฤe primjere morate pokrenuti sqlite3.exe i otvoriti vezu s oglednom bazom podataka kao protoฤnu:
Korak 1) U ovom koraku
Otvorite Moje raฤunalo i idite do sljedeฤeg direktorija "C:\sqlite", a zatim otvorite "sqlite3.exe":
Korak 2) Otvorite bazu podataka โTutorialsSampleDB.dbโ sljedeฤom naredbom:
Sada ste spremni pokrenuti bilo koju vrstu upita u bazi podataka.
U klauzuli SELECT moลพete odabrati ne samo naziv stupca, veฤ imate i puno drugih opcija za odreฤivanje ลกto odabrati. Kao ลกto slijedi:
IZABERI *
Ova naredba ฤe odabrati sve stupce iz svih referentnih tablica (ili podupita) u klauzuli FROM. Na primjer:
SELECT * FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Ovo ฤe odabrati sve stupce iz tablica studenti i tablica odjela:
SELECT naziv tablice.*
Ovo ฤe odabrati sve stupce samo iz tablice "tablename". Na primjer:
SELECT Students.* FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Ovo ฤe odabrati sve stupce samo iz tablice uฤenika:
Doslovna vrijednost
Literalna vrijednost je konstantna vrijednost koja se moลพe specificirati u naredbi select. Literalne vrijednosti moลพete normalno koristiti na isti naฤin na koji koristite nazive stupaca u klauzuli SELECT. Ove literalne vrijednosti bit ฤe prikazane za svaki red iz redaka koje je vratio SQL upit.
Evo nekoliko primjera razliฤitih literalnih vrijednosti koje moลพete odabrati:
- Numeriฤki literal โ brojevi u bilo kojem formatu poput 1, 2.55, โฆ itd.
- String literali โ Bilo koji niz 'USA', 'ovo je ogledni tekst', โฆ itd.
- NULL โ vrijednost NULL.
- Current_TIME โ Dat ฤe vam trenutno vrijeme.
- CURRENT_DATE โ ovo ฤe vam dati trenutni datum.
Ovo moลพe biti zgodno u nekim situacijama kada morate odabrati konstantnu vrijednost za sve vraฤene retke. Na primjer, ako ลพelite odabrati sve studente iz tablice Studenti, s novim stupcem pod nazivom zemlja koji sadrลพi vrijednost "SAD", moลพete uฤiniti sljedeฤe:
SELECT *, 'USA' AS Country FROM Students;
Ovo ฤe vam dati sve stupce uฤenika, plus novi stupac "Drลพava" poput ovog:
Imajte na umu da ovaj novi stupac Drลพava zapravo nije novi stupac dodan u tablicu. To je virtualni stupac, kreiran u upitu za prikaz rezultata i neฤe se kreirati na tablici.
Imena i aliasi
Alias โโje novi naziv za stupac koji vam omoguฤuje odabir stupca s novim nazivom. Zamjenska imena stupaca navedena su pomoฤu kljuฤne rijeฤi "AS".
Na primjer, ako ลพelite odabrati da se stupac StudentName vrati s "Student Name" umjesto "StudentName", moลพete mu dati pseudonim poput ovog:
SELECT StudentName AS 'Student Name' FROM Students;
Ovo ฤe vam dati imena uฤenika s imenom โStudent Nameโ umjesto โStudentNameโ ovako:
Imajte na umu da je naziv stupca i dalje โImeStudentaโ; stupac ImeStudenta je i dalje isti, ne mijenja se zbog aliasa.
Alias โโneฤe promijeniti naziv stupca; samo ฤe promijeniti ime za prikaz u klauzuli SELECT.
Takoฤer, imajte na umu da je kljuฤna rijeฤ "AS" izborna, moลพete staviti alias ime bez nje, otprilike ovako:
SELECT StudentName 'Student Name' FROM Students;
I dat ฤe vam toฤno isti rezultat kao prethodni upit:
Takoฤer moลพete dati pseudonime tablicama, ne samo stupcima. S istom kljuฤnom rijeฤi "AS". Na primjer, moลพete uฤiniti sljedeฤe:
SELECT s.* FROM Students AS s;
Ovo ฤe vam dati sve stupce u tablici Uฤenici:
Ovo moลพe biti vrlo korisno ako se pridruลพujete viลกe od jedne tablice; umjesto ponavljanja punog naziva tablice u upitu, svakoj tablici moลพete dati kratko zamjensko ime. Na primjer, u sljedeฤem upitu:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Ovaj ฤe upit odabrati ime svakog studenta iz tablice "Studenti" s nazivom odjela iz tablice "Odjeli":
Meฤutim, isti se upit moลพe napisati ovako:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Tablici Studenti dali smo alias "s", a tablici odjela alias "d". Zatim smo umjesto koriลกtenja punog naziva tablice koristili njihove aliase za pozivanje na njih. INNER JOIN spaja dvije ili viลกe tablica pomoฤu uvjeta. U naลกem primjeru, spojili smo tablicu Studenti s tablicom Odjela sa stupcem DepartmentId. Takoฤer postoji detaljno objaลกnjenje za INNER JOIN u "SQLite Pridruลพuje"tutorial".
Ovo ฤe vam dati toฤan rezultat kao prethodni upit:
GDJE
Pisanje SQL upita samo pomoฤu klauzule SELECT s klauzulom FROM, kao ลกto smo vidjeli u prethodnom odjeljku, dat ฤe vam sve retke iz tablica. Meฤutim, ako ลพelite filtrirati vraฤene podatke, morate dodati klauzulu "WHERE".
Klauzula WHERE se koristi za filtriranje skupa rezultata koje vraฤa SQL upit. Ovako funkcionira klauzula WHERE:
- U klauzuli WHERE moลพete navesti "izraz".
- Taj ฤe izraz biti procijenjen za svaki redak vraฤen iz tablica(a) navedenih u klauzuli FROM.
- Izraz ฤe se procijeniti kao Boolean izraz, s rezultatom istinitim, laลพnim ili null.
- Tada ฤe se vratiti samo redovi za koje je izraz procijenjen s toฤnom vrijednoลกฤu, a oni s laลพnim ili nultim rezultatima bit ฤe zanemareni i neฤe biti ukljuฤeni u skup rezultata.
Za filtriranje skupa rezultata koriลกtenjem WHERE klauzule, morate koristiti izraze i operatore.
Popis operatera u SQLite i kako ih koristiti
U sljedeฤem odjeljku objasnit ฤemo kako moลพete filtrirati pomoฤu izraza i operatora.
Izraz je jedna ili viลกe literalnih vrijednosti ili stupaca meฤusobno kombiniranih s operatorom.
Imajte na umu da izraze moลพete koristiti i u klauzuli SELECT i u klauzuli WHERE.
U sljedeฤim primjerima isprobat ฤemo izraze i operatore u klauzuli odabira i klauzuli WHERE. Kako bismo vam pokazali kako rade.
Postoje razliฤite vrste izraza i operatora koje moลพete navesti na sljedeฤi naฤin:
SQLite operator ulanฤavanja โ||โ
Ovaj se operator koristi za meฤusobno spajanje jedne ili viลกe literalnih vrijednosti ili stupaca. Proizvodit ฤe jedan niz rezultata iz svih spojenih literalnih vrijednosti ili stupaca. Na primjer:
SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName FROM Students;
Ovo ฤe se spojiti u novi alias โStudentIdWithNameโ:
- Doslovna vrijednost niza znakova โId s nazivom: โ
- s vrijednoลกฤu stupca โStudentIdโ i
- s vrijednoลกฤu iz stupca "ImeStudenta"
SQLite CAST operator:
CAST operator se koristi za pretvaranje vrijednosti iz tip podataka na drugi tip podataka.
Na primjer, ako imate numeriฤku vrijednost pohranjenu kao niz znakova poput ovog โ'12.5'โ i ลพelite je pretvoriti u numeriฤku vrijednost, moลพete upotrijebiti operator CAST da biste to uฤinili ovako โCAST('12.5' โโAS REAL)โ. Ili ako imate decimalnu vrijednost poput 12.5 i trebate dobiti samo cjelobrojni dio, moลพete je pretvoriti u cijeli broj poput ovog โCAST(12.5 AS INTEGER)โ.
Primjer
U sljedeฤoj naredbi pokuลกat ฤemo pretvoriti razliฤite vrijednosti u druge tipove podataka:
SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;
Ovo ฤe vam dati:
Rezultat je sljedeฤi:
- CAST('12.5' โโAS REAL) โ vrijednost '12.5' โโje vrijednost niza, bit ฤe pretvorena u REAL vrijednost.
- CAST(12.5 AS INTEGER) โ vrijednost 12.5 je decimalna vrijednost, pretvorit ฤe se u cjelobrojnu vrijednost. Decimalni dio bit ฤe skraฤen i postaje 12.
SQLite Aritmetika Operatorovi:
Uzmite dvije ili viลกe numeriฤkih literalnih vrijednosti ili numeriฤkih stupaca i vratite jednu numeriฤku vrijednost. Aritmetiฤki operatori podrลพani u SQLite je:
- Zbrajanje "+" โ daje zbroj dvaju operanda.
- ispodtraccija โโโ โ podnaslovtracts dva operanda i rezultira razlikom.
- Mnoลพenje "*" โ produkt dvaju operanda.
- Podsjetnik (modulo) "%" โ daje ostatak koji se dobije dijeljenjem jednog operanda s drugim operandom.
- Dijeljenje "/" โ vraฤa koliฤnik dijeljenja lijevog operanda desnim operandom.
Primjer:
U sljedeฤem primjeru isprobat ฤemo pet aritmetiฤkih operatora s doslovnim numeriฤkim vrijednostima u istoj select klauzuli:
SELECT 25+6, 25-6, 25*6, 25%6, 25/6;
Ovo ฤe vam dati:
Primijetite kako smo ovdje koristili naredbu SELECT bez klauzule FROM. I ovo je dozvoljeno unutra SQLite sve dok odabiremo doslovne vrijednosti.
SQLite Operatori usporedbe
Usporedite dva operanda jedan s drugim i vratite true ili false na sljedeฤi naฤin:
- โ<โ โ vraฤa vrijednost true ako je lijevi operand manji od desnog operanda.
- โ<=โ โ vraฤa vrijednost true ako je lijevi operand manji ili jednak desnom operandu.
- โ>โ โ vraฤa vrijednost true ako je lijevi operand veฤi od desnog operanda.
- โ>=" โ vraฤa vrijednost true ako je lijevi operand veฤi ili jednak desnom operandu.
- โ=โ i โ==โ โ vraฤa vrijednost true ako su dva operanda jednaka. Imajte na umu da su oba operatora ista i da nema razlike meฤu njima.
- โ!=" i โ<>" โ vraฤa vrijednost true ako dva operanda nisu jednaka. Imajte na umu da su oba operatora ista i da nema razlike meฤu njima.
Imajte na umu da, SQLite izraลพava pravu vrijednost s 1, a laลพnu s 0.
Primjer:
SELECT 10<6 AS '<', 10<=6 AS '<=', 10>6 AS '>', 10>=6 AS '>=', 10=6 AS '=', 10==6 AS '==', 10!=6 AS '!=', 10<>6 AS '<>';
Ovo ฤe dati neลกto poput ovoga:
SQLite Operatori podudaranja uzorka
โLIKEโ โ koristi se za usklaฤivanje uzoraka. Pomoฤu โLikeโ moลพete pretraลพivati โโvrijednosti koje odgovaraju uzorku odreฤenom pomoฤu zamjenskog znaka.
Operand s lijeve strane moลพe biti ili literalna vrijednost niza ili stupac niza. Uzorak se moลพe odrediti na sljedeฤi naฤin:
- Sadrลพi uzorak. Na primjer, ImeStudenta LIKE '%a%' โ ovo ฤe traลพiti imena studenata koja sadrลพe slovo "a" na bilo kojoj poziciji u stupcu ImeStudenta.
- Poฤinje s uzorkom. Na primjer, โImeUฤenika KAO 'a%'โ โ traลพi imena uฤenika koja poฤinju slovom โaโ.
- Zavrลกava uzorkom. Na primjer, โImeUฤenika KAO '%a'โ โ Pretraลพite imena uฤenika koja zavrลกavaju slovom โaโ.
- Pronalaลพenje bilo kojeg pojedinaฤnog znaka u nizu pomoฤu podcrte "_". Na primjer, "ImeStudenta KAO 'J___'" - Traลพi imena studenata duljine 4 znaka. Mora zapoฤeti slovom "J" i moลพe imati bilo koja tri dodatna znaka nakon slova "J".
Primjeri podudaranja uzoraka:
Dobijte imena uฤenika koja poฤinju slovom 'j':
SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';
Rezultat:
Neka imena uฤenika zavrลกavaju slovom 'y':
SELECT StudentName FROM Students WHERE StudentName LIKE '%y';
Rezultat:
Dobijte imena uฤenika koja sadrลพe slovo 'n':
SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';
Rezultat:
โGLOBโ โ ekvivalentno je operatoru LIKE, ali GLOB razlikuje velika i mala slova, za razliku od operatora LIKE. Na primjer, sljedeฤe dvije naredbe vratit ฤe razliฤite rezultate:
SELECT 'Jack' GLOB 'j%'; SELECT 'Jack' LIKE 'j%';
Ovo ฤe vam dati:
Prva izjava vraฤa 0(false) jer operator GLOB razlikuje velika i mala slova, pa 'j' nije jednako 'J'. Meฤutim, druga izjava vratit ฤe 1 (true) jer operator LIKE ne razlikuje velika i mala slova, pa je 'j' jednako 'J'.
Ostali operateri:
SQLite I
Logiฤki operator koji kombinira jedan ili viลกe izraza. Vratit ฤe true samo ako svi izrazi daju vrijednost "true". Meฤutim, vratit ฤe false samo ako svi izrazi daju "false" vrijednost.
Primjer:
Sljedeฤi upit traลพit ฤe studente koji imaju StudentId > 5 i StudentName poฤinje slovom N, vraฤeni studenti moraju ispunjavati dva uvjeta:
SELECT * FROM Students WHERE (StudentId > 5) AND (StudentName LIKE 'N%');
Kao rezultat, na gornjoj snimci zaslona, โโto ฤe vam dati samo "Nancy". Nancy je jedina studentica koja ispunjava oba uvjeta.
SQLite OR
Logiฤki operator koji kombinira jedan ili viลกe izraza, tako da ako jedan od kombiniranih operatora daje true, onda ฤe vratiti true. Meฤutim, ako svi izrazi daju false, vratit ฤe false.
Primjer:
Sljedeฤi upit traลพit ฤe studente koji imaju StudentId > 5 ili StudentName poฤinje slovom N, vraฤeni studenti moraju ispunjavati barem jedan od uvjeta:
SELECT * FROM Students WHERE (StudentId > 5) OR (StudentName LIKE 'N%');
Ovo ฤe vam dati:
Kao rezultat, na gornjoj snimci zaslona, โโovo ฤe vam dati ime uฤenika sa slovom "n" u imenu plus ID uฤenika koji ima vrijednost>5.
Kao ลกto vidite, rezultat se razlikuje od upita s operatorom AND.
SQLite IZMEฤU
BETWEEN se koristi za odabir vrijednosti koje su unutar raspona od dvije vrijednosti. Na primjer, โX BETWEEN Y AND Zโ vratit ฤe true (1) ako je vrijednost X izmeฤu dvije vrijednosti Y i Z. U suprotnom, vratit ฤe false (0). โX BETWEEN Y AND Zโ je ekvivalentno โX >= Y AND X <= Zโ, X mora biti veฤi ili jednak Y, a X je manji ili jednak Z.
Primjer:
U sljedeฤem primjeru upita, napisat ฤemo upit za dobivanje uฤenika s Id vrijednoลกฤu izmeฤu 5 i 8:
SELECT * FROM Students WHERE StudentId BETWEEN 5 AND 8;
Ovo ฤe dati samo studentima s ID-ovima 5, 6, 7 i 8:
SQLite IN
Uzima jedan operand i popis operanda. Vratit ฤe true ako je vrijednost prvog operanda jednaka jednoj od vrijednosti operanda s popisa. Operator IN vraฤa true (1) ako popis operanda sadrลพi prvu vrijednost operanda unutar svojih vrijednosti. U suprotnom ฤe vratiti false (0).
Ovako: โcol IN(x, y, z)โ. Ovo je ekvivalentno sa โ(col=x) ili (col=y) ili (col=z)โ.
Primjer:
Sljedeฤi upit ฤe odabrati samo studente s ID-ovima 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId IN(2, 4, 6, 8);
Kao ovo:
Prethodni upit ฤe dati toฤan rezultat kao sljedeฤi upit jer su ekvivalentni:
SELECT * FROM Students WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);
Oba upita daju toฤan rezultat. Meฤutim, razlika izmeฤu ova dva upita je ลกto smo prvi upit koristili operatorom "IN". U drugom upitu koristili smo viลกe operatora "ILI".
Operator IN ekvivalentan je koriลกtenju viลกe operatora OR. Operator "WHERE StudentId IN(2, 4, 6, 8)" ekvivalentan je operatoru "WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);"
Kao ovo:
SQLite NE U
Operand โNOT INโ je suprotan operatoru IN. Ali s istom sintaksom; uzima jedan operand i popis operanada. Vratit ฤe vrijednost true ako vrijednost prvog operanda nije jednaka vrijednosti jedne od operanada s popisa, tj. vratit ฤe vrijednost true (0) ako popis operanada ne sadrลพi prvi operand. Ovako: โcol NOT IN(x, y, z)โ. Ovo je ekvivalentno operatoru โ(col<>x) AND (col<>y) AND (col<>z)โ.
Primjer:
Sljedeฤi upit ฤe odabrati studente s ID-ovima koji nisu jednaki jednom od ovih ID-ova 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId NOT IN(2, 4, 6, 8);
Ovako
Prethodnom upitu dajemo toฤan rezultat kao sljedeฤi upit jer su ekvivalentni:
SELECT * FROM Students WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);
Kao ovo:
Na gornjoj snimci zaslona,
Koristili smo viลกe nejednakih operatora โ<>โ da dobijemo popis uฤenika koji nisu jednaki nijednom od sljedeฤih ID-ova 2, 4, 6 ili 8. Ovaj upit ฤe vratiti sve ostale studente osim ovih popisa ID-ova.
SQLite POSTOJI
Operatori EXISTS ne uzimaju nikakve operande; potrebna je samo SELECT klauzula nakon njega. Operator EXISTS ฤe vratiti true (1) ako ima redaka vraฤenih iz klauzule SELECT, i vratit ฤe false (0) ako uopฤe nema redaka vraฤenih iz klauzule SELECT.
Primjer:
U sljedeฤem primjeru odabrat ฤemo naziv odjela, ako ID odjela postoji u tablici studenata:
SELECT DepartmentName FROM Departments AS d WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Ovo ฤe vam dati:
Vratit ฤe se samo tri odjela: โIT, Fizika i Umjetnostโ. Naziv odjela โMatematikaโ neฤe se vratiti jer u tom odjelu nema studenata, pa ID odjela ne postoji u tablici studenata. Zato je operator EXISTS ignorirao odjel โMatematikaโ.
SQLite NE
Reverses je rezultat prethodnog operatora koji dolazi nakon njega. Na primjer:
- NOT BETWEEN โ Vratit ฤe true ako BETWEEN vrati false i obrnuto.
- NOT LIKE โ Vratit ฤe true ako LIKE vrati false i obrnuto.
- NIJE GLOB โ Vratit ฤe true ako GLOB vrati false i obrnuto.
- NOT EXISTS โ Vratit ฤe true ako EXISTS vrati false i obrnuto.
Primjer:
U sljedeฤem primjeru koristit ฤemo operator NOT s operatorom EXISTS kako bismo dobili nazive odjela koji ne postoje u tablici Studenti, ลกto je obrnuti rezultat operatora EXISTS. Dakle, pretraga ฤe se vrลกiti kroz DepartmentId koji ne postoji u tablici odjela.
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Izlaz:
Vratit ฤe se samo odjel "Matematika". Buduฤi da je odjel "Matematika" jedini odjel, on ne postoji u tablici studenata.
Ograniฤenje i naruฤivanje
SQLite Narudลพba
SQLite Redoslijed je sortiranje rezultata prema jednom ili viลกe izraza. Da biste poredali skup rezultata, morate koristiti klauzulu ORDER BY na sljedeฤi naฤin:
- Prvo, morate navesti klauzulu ORDER BY.
- Klauzula ORDER BY mora biti navedena na kraju upita; samo klauzula LIMIT moลพe biti specificirana nakon njega.
- Odredite izraz po kojem ฤete poredati podatke, ovaj izraz moลพe biti naziv stupca ili izraz.
- Nakon izraza moลพete navesti izborni smjer sortiranja. Ili DESC, za redoslijed podataka silazno ili ASC za poredak podataka uzlazno. Ako niste naveli nijedan od njih, podaci bi bili poredani uzlazno.
- Moลพete navesti viลกe izraza koristeฤi "," izmeฤu sebe.
Primjer
U sljedeฤem primjeru odabrat ฤemo sve studente poredane prema njihovim imenima, ali silaznim redoslijedom, zatim prema nazivu odjela u rastuฤem redoslijedu:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ORDER BY d.DepartmentName ASC , s.StudentName DESC;
Ovo ฤe vam dati:
- SQLite prvo ฤe poredati sve uฤenike prema nazivu odjela uzlaznim redoslijedom
- Tada ฤe za svaki naziv odjela biti prikazani svi studenti pod tim nazivom odjela prema njihovim imenima silaznim redoslijedom
SQLite Ograniฤiti:
Moลพete ograniฤiti broj redaka koje vraฤa vaลก SQL upit pomoฤu klauzule LIMIT. Na primjer, LIMIT 10 ฤe vam dati samo 10 redaka i zanemariti sve ostale retke.
U klauzuli LIMIT moลพete odabrati odreฤeni broj redaka poฤevลกi od odreฤene pozicije pomoฤu klauzule OFFSET. Na primjer, โLIMIT 4 OFFSET 4โ ฤe zanemariti prva 4 retka i vratiti 4 retka poฤevลกi od petog retka, pa ฤete dobiti retke 5, 6, 7 i 8.
Imajte na umu da je klauzula OFFSET opcionalna, moลพete je napisati poput โLIMIT 4, 4โ i dat ฤe vam toฤne rezultate.
Primjer:
U sljedeฤem primjeru vratit ฤemo samo 3 uฤenika poฤevลกi od ID-a uฤenika 5 pomoฤu upita:
SELECT * FROM Students LIMIT 4,3;
Ovo ฤe vam dati samo tri uฤenika poฤevลกi od retka 5. Dakle, to ฤe vam dati retke s StudentId 5, 6 i 7:
Uklanjanje duplikata
Ako vaลก SQL upit vraฤa duplicirane vrijednosti, moลพete upotrijebiti kljuฤnu rijeฤ "DISTINCT" za uklanjanje tih duplikata i vraฤanje razliฤitih vrijednosti. Moลพete navesti viลกe od jednog stupca nakon ลกto kljuฤ DISTINCT funkcionira.
Primjer:
Sljedeฤi upit vratit ฤe duple "vrijednosti naziva odjela": Ovdje imamo duple vrijednosti s nazivima IT, Physics i Arts.
SELECT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Ovo ฤe vam dati duplicirane vrijednosti za naziv odjela:
Primijetite kako postoje dvostruke vrijednosti za naziv odjela. Sada ฤemo koristiti kljuฤnu rijeฤ DISTINCT s istim upitom kako bismo uklonili te duplikate i dobili samo jedinstvene vrijednosti. Kao ovo:
SELECT DISTINCT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
To ฤe vam dati samo tri jedinstvene vrijednosti za stupac naziva odjela:
skupina
SQLite Agregati su ugraฤene funkcije definirane u SQLite koji ฤe grupirati viลกe vrijednosti viลกe redaka u jednu vrijednost.
Ovdje su podrลพani agregati SQLite:
SQLite AVG()
Vraฤen je prosjek za sve x vrijednosti.
Primjer:
U sljedeฤem primjeru dobit ฤemo prosjeฤnu ocjenu koju ฤe studenti dobiti na svim ispitima:
SELECT AVG(Mark) FROM Marks;
To ฤe vam dati vrijednost "18.375":
Ovi rezultati dolaze iz zbroja svih vrijednosti ocjena podijeljenog njihovim brojem.
COUNT() โ COUNT(X) ili COUNT(*)
Vraฤa ukupan broj pojavljivanja x vrijednosti. Evo nekoliko opcija koje moลพete koristiti s COUNT:
- COUNT(x): Broji samo x vrijednosti, gdje je x naziv stupca. Ignorirat ฤe NULL vrijednosti.
- COUNT(*): Broji sve retke iz svih stupaca.
- BROJ (DISTINCT x): moลพete navesti kljuฤnu rijeฤ DISTINCT prije x koja ฤe dobiti broj razliฤitih vrijednosti x.
Primjer
U sljedeฤem primjeru dobit ฤemo ukupan broj odjela s COUNT(DepartmentId), COUNT(*) i COUNT(DISTINCT DepartmentId) i po ฤemu se oni razlikuju:
SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;
Ovo ฤe vam dati:
Kao ลกto slijedi:
- COUNT(DepartmentId) ฤe vam dati broj svih ID-ova odjela, a zanemarit ฤe nulte vrijednosti.
- COUNT(DISTINCT DepartmentId) daje vam razliฤite vrijednosti DepartmentId-a, koje su samo 3. To su tri razliฤite vrijednosti naziva odjela. Primijetite da postoji 8 vrijednosti naziva odjela u imenu uฤenika. Ali samo razliฤite tri vrijednosti koje su matematika, informatika i fizika.
- COUNT(*) broji broj redaka u tablici uฤenika koji su 10 redaka za 10 uฤenika.
GROUP_CONCAT() โ GROUP_CONCAT(X) ili GROUP_CONCAT(X,Y)
Skupna funkcija GROUP_CONCAT spaja viลกestruke vrijednosti u jednu vrijednost sa zarezom koji ih razdvaja. Ima sljedeฤe moguฤnosti:
- GROUP_CONCAT(X): Ovo ฤe ulanฤati sve vrijednosti x u jedan niz, sa zarezom โ,โ koji se koristi kao razdjelnik izmeฤu vrijednosti. NULL vrijednosti ฤe se zanemariti.
- GROUP_CONCAT(X, Y): Ovo ฤe ulanฤati vrijednosti x u jedan niz, s vrijednoลกฤu y koja se koristi kao razdjelnik izmeฤu svake vrijednosti umjesto zadanog razdjelnika ','. NULL vrijednosti takoฤer ฤe biti zanemarene.
- GROUP_CONCAT(DISTINCT X): ovo ฤe spojiti sve razliฤite vrijednosti x u jedan niz, sa zarezom โ,โ koji se koristi kao razdjelnik izmeฤu vrijednosti. NULL vrijednosti ฤe se zanemariti.
GROUP_CONCAT(DepartmentName) Primjer
Sljedeฤi upit spojit ฤe sve vrijednosti naziva odjela iz tablice studenata i odjela u jedan niz odvojen zarezom. Dakle, umjesto vraฤanja popisa vrijednosti, jedna vrijednost u svakom retku. Vratit ฤe samo jednu vrijednost u jednom retku, sa svim vrijednostima odvojenim zarezom:
SELECT GROUP_CONCAT(d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Ovo ฤe vam dati:
Ovo ฤe vam dati popis od 8 vrijednosti naziva odjela spojenih u jedan niz odvojenih zarezima.
GROUP_CONCAT(DISTINCT DepartmentName) Primjer
Sljedeฤi upit spojit ฤe razliฤite vrijednosti naziva odjela iz tablice studenata i odjela u jedan niz odvojen zarezima:
SELECT GROUP_CONCAT(DISTINCT d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Ovo ฤe vam dati:
Primijetite kako se rezultat razlikuje od prethodnog rezultata; vraฤene su samo tri vrijednosti koje su razliฤita imena odjela, a duplicirane vrijednosti su uklonjene.
GROUP_CONCAT(DepartmentName ,'&') Primjer
Sljedeฤi upit spojit ฤe sve vrijednosti stupca naziva odjela iz tablice studenata i odjela u jedan niz, ali sa znakom '&' umjesto zarezom kao razdjelnikom:
SELECT GROUP_CONCAT(d.DepartmentName, '&') FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Ovo ฤe vam dati:
Primijetite kako se znak "&" koristi umjesto zadanog znaka "," za razdvajanje izmeฤu vrijednosti.
SQLite MAX() & MIN()
MAX(X) vraฤa najveฤu vrijednost od X vrijednosti. MAX ฤe vratiti NULL vrijednost ako su sve vrijednosti x null. Dok MIN(X) vraฤa najmanju vrijednost od X vrijednosti. MIN ฤe vratiti NULL vrijednost ako su sve vrijednosti X null.
Primjer
U sljedeฤem upitu koristit ฤemo funkcije MIN i MAX kako bismo dobili najviลกu i najniลพu ocjenu iz tablice โOcjeneโ:
SELECT MAX(Mark), MIN(Mark) FROM Marks;
Ovo ฤe vam dati:
SQLite SUM(x), Ukupno(x)
Obje ฤe vratiti zbroj svih x vrijednosti. Ali razlikuju se u sljedeฤem:
- SUM ฤe vratiti null ako su sve vrijednosti null, ali Total ฤe vratiti 0.
- TOTAL uvijek vraฤa vrijednosti s pomiฤnim zarezom. SUM vraฤa vrijednost cijelog broja ako su sve vrijednosti x cijeli broj. Meฤutim, ako vrijednosti nisu cijeli broj, vratit ฤe vrijednost s pomiฤnim zarezom.
Primjer
U sljedeฤem upitu koristit ฤemo SUM i total kako bismo dobili zbroj svih bodova u tablicama โBodoviโ:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks;
Ovo ฤe vam dati:
Kao ลกto vidite, TOTAL uvijek vraฤa pokretni zarez. Ali SUM vraฤa vrijednost cijelog broja jer vrijednosti u stupcu "Oznaฤi" mogu biti u cijelim brojevima.
Primjer razlike izmeฤu SUM i TOTAL:
U sljedeฤem upitu pokazat ฤemo razliku izmeฤu SUM i TOTAL kada dobiju SUM vrijednosti NULL:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;
Ovo ฤe vam dati:
Imajte na umu da nema ocjena za TestId = 4, tako da postoje nulte vrijednosti za taj test. SUM vraฤa nultu vrijednost kao prazno mjesto, dok TOTAL vraฤa 0.
Grupiraj BY
Klauzula GROUP BY koristi se za odreฤivanje jednog ili viลกe stupaca koji ฤe se koristiti za grupiranje redaka u grupe. Redovi s istim vrijednostima bit ฤe skupljeni (rasporeฤeni) u grupe.
Za bilo koji drugi stupac koji nije ukljuฤen u grupu po stupcima, moลพete koristiti agregatnu funkciju za njega.
Primjer:
Sljedeฤi upit ฤe vam dati ukupan broj uฤenika prisutnih u svakom odjelu.
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName;
Ovo ฤe vam dati:
Klauzula GROUPBY DepartmentName ฤe grupirati sve uฤenike u grupe po jednu za svaki naziv odjela. Za svaku grupu โodjelaโ raฤunat ฤe studente na njoj.
HAVING klauzula
Ako ลพelite filtrirati grupe koje vraฤa klauzula GROUP BY, tada moลพete navesti klauzulu "HAVING" s izrazom nakon GROUP BY. Izraz ฤe se koristiti za filtriranje ovih grupa.
Primjer
U sljedeฤem upitu ฤemo odabrati one odjele koji imaju samo dva studenta:
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName HAVING COUNT(s.StudentId) = 2;
Ovo ฤe vam dati:
Klauzula HAVING COUNT(S.StudentId) = 2 ฤe filtrirati vraฤene grupe i vratiti samo one grupe koje sadrลพe toฤno dva uฤenika. U naลกem sluฤaju, umjetniฤki odjel ima 2 studenta, tako da je prikazan u ispisu.
SQLite Upit i podupit
Unutar bilo kojeg upita, moลพete koristiti drugi upit bilo u SELECT, INSERT, DELETE, UPDATE ili unutar drugog podupita.
Ovaj ugnijeลพฤeni upit naziva se podupit. Sada ฤemo vidjeti neke primjere koriลกtenja podupita u klauzuli SELECT. Meฤutim, u vodiฤu za modificiranje podataka vidjet ฤemo kako moลพemo koristiti podupit s naredbom INSERT, DELETE i UPDATE.
Koriลกtenje podupita u primjeru FROM klauzule
U sljedeฤi upit ukljuฤit ฤemo podupit unutar klauzule FROM:
SELECT s.StudentName, t.Mark FROM Students AS s INNER JOIN ( SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId ) ON s.StudentId = t.StudentId;
Upit:
SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId
Gore navedeni upit ovdje se naziva podupit jer je ugnijeลพฤen unutar klauzule FROM. Primijetite da smo mu dali pseudonim "t" kako bismo se mogli pozvati na stupce koje je vratio u upitu.
Ovaj upit ฤe vam dati:
Dakle, u naลกem sluฤaju,
- s.StudentName odabire se iz glavnog upita koji daje imena studenata i
- t.Mark je odabran iz podupita; koji daje ocjene koje je postigao svaki od ovih uฤenika
Koriลกtenje podupita u primjeru WHERE klauzule
U sljedeฤi upit ฤemo ukljuฤiti podupit u klauzulu WHERE:
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Upit:
SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId
Gore navedeni upit ovdje se naziva podupit jer je ugnijeลพฤen u klauzulu WHERE. Podupit ฤe vratiti vrijednosti DepartmentId koje ฤe koristiti operator NOT EXISTS.
Ovaj upit ฤe vam dati:
U gornjem upitu odabrali smo odjel na kojem nema upisanog studenta. ล to je ovdje odjel za matematiku.
Postaviti Operacije โ UNION, Intersect
SQLite podrลพava sljedeฤe SET operacije:
UNIJA & UNION SVI
Kombinira jedan ili viลกe skupova rezultata (grupa redaka) vraฤenih iz viลกe naredbi SELECT u jedan skup rezultata.
UNION ฤe vratiti razliฤite vrijednosti. Meฤutim, UNION ALL neฤe i ukljuฤivat ฤe duplikate.
Imajte na umu da ฤe naziv stupca biti naziv stupca naveden u prvoj izjavi SELECT.
Primjer UNIJE
U sljedeฤem primjeru dobit ฤemo popis DepartmentId iz tablice studenata i popis DepartmentId iz tablice odjela u istom stupcu:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION SELECT DepartmentId FROM Departments;
Ovo ฤe vam dati:
Upit vraฤa samo 5 redaka koji su razliฤite vrijednosti ID-a odjela. Primijetite prvu vrijednost koja je nulta vrijednost.
SQLite UNIJA SVE Primjer
U sljedeฤem primjeru dobit ฤemo popis DepartmentId iz tablice studenata i popis DepartmentId iz tablice odjela u istom stupcu:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION ALL SELECT DepartmentId FROM Departments;
Ovo ฤe vam dati:
Upit ฤe vratiti 14 redaka, 10 redaka iz tablice uฤenika i 4 iz tablice odjela. Imajte na umu da postoje duplikati u vraฤenim vrijednostima. Takoฤer imajte na umu da je naziv stupca bio onaj naveden u prvoj izjavi SELECT.
Sada, da vidimo kako ฤe UNION all dati razliฤite rezultate ako zamijenimo UNION ALL s UNION:
SQLite PRESJEKATI
Vraฤa vrijednosti koje postoje u oba kombinirana skupa rezultata. Vrijednosti koje postoje u jednom od kombiniranih skupova rezultata bit ฤe zanemarene.
Primjer
U sljedeฤem upitu odabrat ฤemo vrijednosti DepartmentId koje postoje u tablicama Studenti i Odjeli u stupcu DepartmentId:
SELECT DepartmentId FROM Students Intersect SELECT DepartmentId FROM Departments;
Ovo ฤe vam dati:
Upit vraฤa samo tri vrijednosti 1, 2 i 3. To su vrijednosti koje postoje u objema tablicama.
Meฤutim, vrijednosti null i 4 nisu ukljuฤene jer vrijednost null postoji samo u tablici uฤenika, a ne u tablici odjela. A vrijednost 4 postoji u tablici odjela, a ne u tablici uฤenika.
Zbog toga su obje vrijednosti NULL i 4 zanemarene i nisu ukljuฤene u vraฤene vrijednosti.
OSIM
Pretpostavimo da imate dva popisa redaka, popis1 i popis2, i ลพelite retke samo s popisa1 koji ne postoji na popisu2, moลพete koristiti klauzulu โEXCEPTโ. Klauzula EXCEPT usporeฤuje dva popisa i vraฤa one retke koji postoje u popisu1, a ne postoje u popisu2.
Primjer
U sljedeฤem upitu odabrat ฤemo vrijednosti DepartmentId koje postoje u tablici odjela i ne postoje u tablici studenata:
SELECT DepartmentId FROM Departments EXCEPT SELECT DepartmentId FROM Students;
Ovo ฤe vam dati:
Upit vraฤa samo vrijednost 4. To je jedina vrijednost koja postoji u tablici odjela, a ne postoji u tablici uฤenika.
NULL rukovanje
Vrijednost "NULL" je posebna vrijednost u SQLiteKoristi se za predstavljanje vrijednosti koja je nepoznata ili nedostaje. Imajte na umu da je null vrijednost potpuno drugaฤija od "0" ili prazne vrijednosti "". Buduฤi da su 0 i prazna vrijednost poznate vrijednosti, null vrijednost je nepoznata.
NULL vrijednosti zahtijevaju posebno rukovanje SQLite, sada ฤemo vidjeti kako postupati s NULL vrijednostima.
Traลพi NULL vrijednosti
Ne moลพete koristiti normalni operator jednakosti (=) za pretraลพivanje nultih vrijednosti. Na primjer, sljedeฤi upit traลพi studente koji imaju vrijednost null DepartmentId:
SELECT * FROM Students WHERE DepartmentId = NULL;
Ovaj upit neฤe dati nikakav rezultat:
Buduฤi da NULL vrijednost nije jednaka nijednoj drugoj vrijednosti koja ukljuฤuje samu null vrijednost, to je razlog zaลกto nije vratio nikakav rezultat.
Meฤutim, da bi upit radio, morate koristiti operator "IS NULL" za pretraลพivanje null vrijednosti na sljedeฤi naฤin:
SELECT * FROM Students WHERE DepartmentId IS NULL;
Ovo ฤe vam dati:
Upit ฤe vratiti one studente koji imaju nultu vrijednost DepartmentId.
Ako ลพelite dobiti vrijednosti koje nisu null, morate koristiti operator "IS NOT NULL" ovako:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;
Ovo ฤe vam dati:
Upit ฤe vratiti one studente koji nemaju vrijednost NULL DepartmentId.
Uvjetni rezultati
Ako imate popis vrijednosti i ลพelite odabrati bilo koju od njih na temelju nekih uvjeta. Za to bi uvjet za tu odreฤenu vrijednost trebao biti istinit kako bi bio odabran.
CASE izraz ฤe procijeniti ovaj popis uvjeta za sve vrijednosti. Ako je uvjet istinit, vratit ฤe tu vrijednost.
Na primjer, ako imate stupac "Ocjena" i ลพelite odabrati tekstualnu vrijednost na temelju vrijednosti ocjene na sljedeฤi naฤin:
โ โOdliฤanโ ako je ocjena veฤa od 85.
โ โVrlo dobarโ ako je ocjena izmeฤu 70 i 85.
โ โDobarโ ako je ocjena izmeฤu 60 i 70.
Tada moลพete koristiti izraz CASE da to uฤinite.
Ovo se moลพe koristiti za definiranje neke logike u SELECT klauzuli tako da moลพete odabrati odreฤene rezultate ovisno o odreฤenim uvjetima kao ลกto je na primjer if izjava.
CASE operator moลพe se definirati razliฤitim sintaksama na sljedeฤi naฤin:
Moลพete koristiti razliฤite uvjete:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN condition3 THEN result3 โฆ ELSE resultn END
Ili, moลพete koristiti samo jedan izraz i staviti razliฤite moguฤe vrijednosti za odabir:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 WHEN value3 THEN result3 โฆ ELSE restuln END
Imajte na umu da je klauzula ELSE opcionalna.
Primjer
U sljedeฤem primjeru, koristit ฤemo CASE izraz s NULL vrijednoลกฤu u stupcu ID odjela u tablici Studenti kako bismo prikazali tekst 'Nema odjela' na sljedeฤi naฤin:
SELECT StudentName, CASE WHEN DepartmentId IS NULL THEN 'No Department' ELSE DepartmentId END AS DepartmentId FROM Students;
- Operator CASE ฤe provjeriti vrijednost DepartmentId-a je li null ili nije.
- Ako je vrijednost NULL, tada ฤe odabrati literalnu vrijednost 'No Department' umjesto vrijednosti DepartmentId.
- Ako nije vrijednost null, tada ฤe odabrati vrijednost stupca DepartmentId.
Ovo ฤe vam dati izlaz kao ลกto je prikazano u nastavku:
Uobiฤajeni tabliฤni izraz
Uobiฤajeni tabliฤni izrazi (CTE) su podupiti koji su definirani unutar SQL naredbe s danim imenom.
Ima prednost nad podupitima jer je definiran iz SQL naredbi i uฤinit ฤe upite lakลกim za ฤitanje, odrลพavanje i razumijevanje.
Uobiฤajeni tabliฤni izraz moลพe se definirati stavljanjem klauzule WITH ispred naredbi SELECT na sljedeฤi naฤin:
WITH CTEname AS ( SELECT statement ) SELECT, UPDATE, INSERT, or update statement here FROM CTE
โCTEnameโ je bilo koji naziv koji moลพete dati CTE-u, moลพete ga koristiti za kasnije pozivanje na njega. Imajte na umu da moลพete definirati naredbe SELECT, UPDATE, INSERT ili DELETE na CTE-ovima.
Sada, da vidimo primjer kako koristiti CTE u SELECT klauzuli.
Primjer
U sljedeฤem primjeru definirat ฤemo CTE iz naredbe SELECT, a zatim ฤemo ga kasnije upotrijebiti u drugom upitu:
WITH AllDepartments AS ( SELECT DepartmentId, DepartmentName FROM Departments ) SELECT s.StudentId, s.StudentName, a.DepartmentName FROM Students AS s INNER JOIN AllDepartments AS a ON s.DepartmentId = a.DepartmentId;
U ovom upitu definirali smo CTE i dali mu naziv โSvi odjeliโ. Ovaj CTE je definiran iz SELECT upita:
SELECT DepartmentId, DepartmentName FROM Departments
Nakon ลกto smo definirali CTE, upotrijebili smo ga u SELECT upitu koji dolazi nakon njega.
Imajte na umu da Uobiฤajeni izrazi tablice ne utjeฤu na izlaz upita. To je naฤin definiranja logiฤkog pogleda ili podupita kako bi se ponovno upotrijebili u istom upitu. Uobiฤajeni tabliฤni izrazi su poput varijable koju deklarirate i ponovno je koristite kao podupit. Samo izjava SELECT utjeฤe na izlaz upita.
Ovaj upit ฤe vam dati:
Napredni upiti
Napredni upiti su oni upiti koji sadrลพe sloลพene spojeve, podupite i neke agregate. U sljedeฤem odjeljku vidjet ฤemo primjer naprednog upita:
Gdje dobivamo,
- Nazivi odjela sa svim studentima za svaki odjel
- Imena uฤenika odvojena zarezom i
- Prikazuje odjel s najmanje tri uฤenika
SELECT d.DepartmentName, COUNT(s.StudentId) StudentsCount, GROUP_CONCAT(StudentName) AS Students FROM Departments AS d INNER JOIN Students AS s ON s.DepartmentId = d.DepartmentId GROUP BY d.DepartmentName HAVING COUNT(s.StudentId) >= 3;
Dodali smo klauzulu JOIN kako bismo dobili DepartmentName iz tablice Departments. Nakon toga smo dodali klauzulu GROUP BY s dvije agregacijske funkcije:
- โBROJโ za brojanje uฤenika za svaku grupu odjela.
- GROUP_CONCAT za spajanje uฤenika za svaku grupu s zarezom odvojenim u jednom nizu.
Nakon GROUP BY, koristili smo klauzulu HAVING za filtriranje odjela i odabir samo onih odjela koji imaju najmanje 3 uฤenika.
Rezultat ฤe biti sljedeฤi:




















































