Kako podesiti pametne telefone i računare. Informativni portal

Sql upiti agregatne funkcije. Agregatne funkcije MIN i MAX

GROUP BY klauzula(Izraz SELECT) vam omogućava grupiranje podataka (redova) prema vrijednosti stupca ili više stupaca ili izraza. Rezultat će biti skup sažetih redova.

Svaki stupac na listi za odabir mora biti prisutan u klauzuli GROUP BY, jedini izuzeci su konstante i stupci - operandi agregatnih funkcija.

Tabela se može grupirati prema bilo kojoj kombinaciji svojih kolona.

Agregatne funkcije se koriste za dobivanje jedne ukupne vrijednosti iz grupe redova. Sve agregatne funkcije izvode izračune na jednom argumentu, koji može biti ili stupac ili izraz. Svaka agregatna funkcija procjenjuje se na konstantnu vrijednost koja je prikazana u zasebnom stupcu u rezultatu.

Agregatne funkcije su specificirane u listi stupaca izraza SELECT, koji također može sadržavati klauzulu GROUP BY. Ako izraz SELECT ne sadrži klauzulu GROUP BY, a lista stupaca za odabir sadrži barem jednu agregatnu funkciju, tada ne smije sadržavati jednostavne stupce. S druge strane, odabrana lista stupaca može sadržavati nazive stupaca koji nisu argumenti agregatnoj funkciji ako se ti stupci koriste kao argumenti klauzule GROUP BY.

Ako upit sadrži klauzulu WHERE, agregatne funkcije izračunavaju vrijednost za rezultate odabira.

Agregatne funkcije MIN i MAX izračunavaju se najmanja i najveća vrijednost stupca, respektivno. Argumenti mogu biti brojevi, nizovi i datumi. Sve null vrijednosti uklonjeno prije izračuna (tj. nije uzeto u obzir).

Zbirna funkcija SUM izračunava ukupni zbir vrijednosti stupca. Samo brojevi mogu biti argumenti. Korištenje parametra DISTINCT uklanja sve duple vrijednosti u stupcu prije primjene funkcije SUM. Isto tako, uklonite sve NULL vrijednosti prije primjene ove agregatne funkcije.

Agregatna funkcija AVG vraća prosjek svih vrijednosti u koloni. Argumenti također mogu biti samo brojevi, a sve NULL vrijednosti se uklanjaju prije evaluacije.

Agregatna funkcija COUNT ima dva različita oblika:

  • COUNT (col_name) - broji broj vrijednosti u koloni Col_name, NULL vrijednosti se ne broje
  • COUNT (*) - broji broj redova u tabeli, uzimaju se u obzir i NULL vrijednosti

Ako upit koristi ključnu riječ DISTINCT, sve duplicirane vrijednosti stupaca se uklanjaju prije nego što se koristi funkcija COUNT.

COUNT_BIG funkcija ista funkcija kao COUNT. Jedina razlika između njih je u tipu rezultata koji vraćaju: COUNT_BIG uvijek vraća BIGINT vrijednosti, dok COUNT vraća INTEGER vrijednosti podataka.

V HAVING ponudu definira uvjet koji se primjenjuje na grupu redova. Ima isto značenje za grupe redova kao klauzula WHERE za sadržaj odgovarajuće tabele (WHERE se primenjuje pre grupisanja, HAVING posle).

Sljedeći pododjeljci opisuju druge prijedloge SELECT izraz koji se mogu koristiti u upitima, kao i agregatne funkcije i skupove operatora. Dozvolite mi da vas podsjetim ovog trenutka pokrili smo upotrebu klauzule WHERE, au ovom članku ćemo pogledati klauzule GROUP BY, ORDER BY i HAVING i dati neke primjere kako se ove klauzule mogu koristiti u sprezi sa agregatnim funkcijama koje su podržane u Transactu -SQL.

GROUP BY klauzula

Rečenica GROUP BY grupiše odabrani skup redova da dobije skup sažetih redova na osnovu vrijednosti jedne ili više kolona ili izraza. Jednostavan slučaj upotrebe klauzule GROUP BY prikazan je u primjeru ispod:

USE SampleDb; SELECT Job FROM Works_On GROUP BY Job;

U ovom primjeru, pozicije zaposlenika su uzorkovane i grupisane.

U gornjem primjeru, klauzula GROUP BY stvara zasebnu grupu za sve moguće vrijednosti (uključujući NULL) za stupac Zadatak.

Upotreba stupaca u klauzuli GROUP BY mora ispunjavati određene uvjete. Konkretno, svaka kolona u odabranoj listi upita također se mora pojaviti u klauzuli GROUP BY. Ovaj zahtjev se ne odnosi na konstante i stupce koji su dio agregatne funkcije. (O agregatnim funkcijama se govori u sljedećem pododjeljku.) Ovo ima smisla jer samo kolone u klauzuli GROUP BY imaju zagarantovanu jednu vrijednost po grupi.

Tabela se može grupirati prema bilo kojoj kombinaciji svojih kolona. Primjer ispod pokazuje grupiranje redova u tabeli Works_on po dvije kolone:

USE SampleDb; SELECT ProjectNumber, Job FROM Works_On GROUP BY ProjectNumber, Job;

Rezultat ovog upita:

Na osnovu rezultata upita možete vidjeti da postoji devet grupa s različitim kombinacijama broja projekta i naziva. Redoslijed naziva stupaca u klauzuli GROUP BY ne mora biti isti kao u SELECT listi stupaca.

Agregatne funkcije

Agregatne funkcije se koriste za dobivanje vrijednosti sume. Sve agregatne funkcije mogu se podijeliti u sljedeće kategorije:

    obične agregatne funkcije;

    statističke agregatne funkcije;

    korisnički definirane agregatne funkcije;

    analitičke agregatne funkcije.

Ovdje ćemo pogledati prve tri vrste agregatnih funkcija.

Redovne agregatne funkcije

Transact-SQL podržava sljedećih šest agregatnih funkcija: MIN, MAX, SUMA, AVG, COUNT, COUNT_BIG.

Sve agregatne funkcije izvode izračune na jednom argumentu, koji može biti ili stupac ili izraz. (Jedini izuzetak je drugi oblik od dvije funkcije, COUNT i COUNT_BIG, odnosno COUNT (*) i COUNT_BIG (*).) Svaka agregatna funkcija procjenjuje se na konstantnu vrijednost koja se pojavljuje u zasebnoj koloni rezultata.

Agregatne funkcije su specificirane u listi stupaca izraza SELECT, koji također može sadržavati klauzulu GROUP BY. Ako izraz SELECT ne uključuje klauzulu GROUP BY, a lista odabranih stupaca sadrži barem jednu agregatnu funkciju, tada ne smije sadržavati jednostavne stupce (osim stupaca koji se koriste kao argumenti agregatnoj funkciji). Stoga je kod u primjeru ispod netačan:

USE SampleDb; SELECT Prezime, MIN (Id) FROM Employee;

Ovdje kolona Prezime u tablici Employee ne bi trebala biti na popisu stupaca odabira jer nije argument agregatnoj funkciji. S druge strane, odabrana lista stupaca može sadržavati nazive stupaca koji nisu argumenti agregatnoj funkciji ako se ti stupci koriste kao argumenti klauzule GROUP BY.

Argumentu agregatne funkcije može prethoditi jedna od dvije moguće ključne riječi:

SVE

Označava da se proračuni izvode za sve vrijednosti u koloni. Ovo je zadana postavka.

DISTINCT

Određuje da se za proračune koriste samo jedinstvene vrijednosti stupaca.

Agregatne funkcije MIN i MAX

Funkcije agregata MIN i MAX izračunavaju najmanju i najveću vrijednost u stupcu, respektivno. Ako upit sadrži klauzulu WHERE, funkcije MIN i MAX vraćaju najmanju i najveću vrijednost reda koje odgovaraju navedenim uvjetima. Primjer u nastavku pokazuje upotrebu agregatne funkcije MIN:

USE SampleDb; - Vraća 2581 SELECT MIN (Id) AS "Minimalna vrijednost ID-a" IZ Employee;

Rezultat vraćen u gornjem primjeru nije baš informativan. Na primjer, prezime zaposlenika koji posjeduje ovaj broj nije poznato. Ali ovo prezime ne možete dobiti na uobičajen način, jer, kao što je ranije spomenuto, ne možete eksplicitno navesti kolonu Prezime. Da bi se dobilo prezime ovog radnika zajedno sa najmanjim kadrovskim brojem zaposlenog, koristi se potupit. Primjer ispod pokazuje upotrebu takvog potupita, gdje potupit sadrži naredbu SELECT iz prethodnog primjera:

Rezultat izvršavanja upita:

Upotreba MAX agregatne funkcije prikazana je u primjeru ispod:

Funkcije MIN i MAX također mogu prihvatiti nizove i datume kao argumente. U slučaju argumenta string, vrijednosti se uspoređuju koristeći stvarni redoslijed sortiranja. Za sve argumente privremenih podataka tipa datuma, najniža vrijednost stupca je najraniji datum, a najviša vrijednost je najnoviji.

Ključna riječ DISTINCT može se koristiti s funkcijama MIN i MAX. Sve NULL vrijednosti se uklanjaju iz kolona argumenata prije upotrebe agregatnih funkcija MIN i MAX.

Zbirna funkcija SUM

Agregat Funkcija SUM izračunava ukupni zbir vrijednosti stupca. Argument ove agregatne funkcije uvijek mora biti numeričkog tipa podataka. Upotreba agregatne funkcije SUM prikazana je u primjeru ispod:

USE SampleDb; SELECT SUM (Budžet) "Ukupni budžet" IZ projekta;

Ovaj primjer izračunava ukupne budžete za sve projekte. Rezultat izvršavanja upita:

U ovom primjeru, agregatna funkcija grupiše sve vrijednosti budžeta projekta i određuje njihov ukupni iznos. Iz tog razloga, upit sadrži implicitnu funkciju grupiranja (kao i svi slični upiti). Implicitna funkcija grupisanja iz gornjeg primjera može se eksplicitno specificirati, kao što je prikazano u primjeru ispod:

USE SampleDb; SELECT SUM (Budžet) "Ukupni budžet" IZ Project GROUP BY ();

Korištenje parametra DISTINCT uklanja sve duple vrijednosti u stupcu prije primjene funkcije SUM. Isto tako, uklonite sve NULL vrijednosti prije primjene ove agregatne funkcije.

Agregatna funkcija AVG

Agregat AVG funkcija vraća aritmetičku sredinu svih vrijednosti u koloni. Argument ove agregatne funkcije uvijek mora biti numeričkog tipa podataka. Sve NULL vrijednosti se uklanjaju iz argumenta prije nego što se primijeni funkcija AVG.

Upotreba AVG agregatne funkcije prikazana je u primjeru ispod:

USE SampleDb; - Vraća 133833 SELECT AVG (budžet) "Prosečan budžet za projekat" IZ projekta;

Ovdje se izračunava aritmetički prosjek budžeta za sve budžete.

Agregatne funkcije COUNT i COUNT_BIG

Agregat COUNT funkcija ima dva različita oblika:

COUNT (naziv_kolca) COUNT (*)

Prvi oblik funkcije broji broj vrijednosti u stupcu col_name. Ako upit koristi ključnu riječ DISTINCT, sve duplicirane vrijednosti stupaca se uklanjaju prije nego što se koristi funkcija COUNT. Ovaj oblik funkcije COUNT ne uzima u obzir NULL vrijednosti prilikom brojanja vrijednosti stupaca.

Upotreba prvog oblika agregatne funkcije COUNT prikazana je u primjeru ispod:

USE SampleDb; SELECT ProjectNumber, COUNT (DISTINCT Job) "Poslovi u projektu" FROM Works_on GROUP BY ProjectNumber;

Ovdje se računa broj različitih pozicija za svaki projekat. Rezultat ovog upita:

Kao što možete vidjeti iz upita u primjeru, NULL vrijednosti nisu uzete u obzir od strane funkcije COUNT. (Zbroj svih vrijednosti u koloni posla je 7, a ne 11 kako bi trebao biti.)

Drugi oblik funkcije COUNT, tj. funkcija COUNT (*) broji broj redova u tabeli. I ako uputstvo SELECT upit sa funkcijom COUNT (*) sadrži klauzulu WHERE sa uslovom, funkcija vraća broj redova koji zadovoljava navedenom stanju... Za razliku od prve verzije funkcije COUNT, drugi oblik ne zanemaruje NULL vrijednosti jer ova funkcija radi na nizovima, a ne na stupcima. Primjer ispod pokazuje korištenje funkcije COUNT (*):

USE SampleDb; SELECT Job AS "Tip posla", COUNT (*) "Potrebni radnici" FROM Works_on GRUPA PO Zadatku;

Ovdje se računa broj postova u svim projektima. Rezultat izvršavanja upita:

COUNT_BIG funkcija ista funkcija kao COUNT. Jedina razlika između njih je u tipu rezultata koji vraćaju: COUNT_BIG uvijek vraća BIGINT vrijednosti, dok COUNT vraća INTEGER vrijednosti podataka.

Statističke agregatne funkcije

Sljedeće funkcije čine grupu statističkih agregatnih funkcija:

VAR

Izračunava statističku varijansu svih vrijednosti u stupcu ili izrazu.

VARP

Izračunava statističku varijansu populacije svih vrijednosti u stupcu ili izrazu.

STDEV

Izračunava standardnu ​​devijaciju (koja se izračunava kao Kvadratni korijen iz odgovarajuće varijanse) svih vrijednosti stupca ili izraza.

STDEVP

Izračunava standardnu ​​devijaciju kolekcije svih vrijednosti u stupcu ili izrazu.

Korisnički definirane agregatne funkcije

Database Engine također podržava implementaciju korisnički definiranih funkcija. Ova mogućnost omogućava korisnicima da dopune sistemske agregatne funkcije funkcijama koje mogu sami implementirati i instalirati. Ove funkcije predstavljaju posebnu klasu korisnički definiranih funkcija i o njima će se kasnije raspravljati.

HAVING klauzula

U rečenici HAVING definira uvjet koji se primjenjuje na grupu redova. Dakle, ova klauzula ima isto značenje za grupe redova kao klauzula WHERE za sadržaj odgovarajuće tabele. Sintaksa IMATI ponude sljedeći:

HAVING stanje

Ovdje parametar uvjeta predstavlja uvjet i sadrži agregatne funkcije ili konstante.

Upotreba klauzule HAVING u sprezi sa agregatnom funkcijom COUNT (*) prikazana je u primjeru ispod:

USE SampleDb; - Vraća "p3" SELECT ProjectNumber FROM Works_on GRUPA PO ProjectNumber HAVING COUNT (*)

U ovom primjeru, sistem koristi klauzulu GROUP BY da grupiše sve redove prema vrijednostima u stupcu ProjectNumber. Zatim se broj redova u svakoj grupi i odabiru grupe koje sadrže manje od četiri reda (tri ili manje).

Klauzula HAVING se također može koristiti bez agregatnih funkcija, kao što je prikazano u primjeru ispod:

USE SampleDb; - Vratiće "Konsultant" SELECT Job FROM Works_on GRUPA PO POSAO IMA POSAO KAO "K%";

Ovaj primjer grupiše redove tabele Works_on prema naslovu posla i eliminiše poslove koji ne počinju slovom "K".

Klauzula HAVING se također može koristiti bez klauzule GROUP BY, iako to nije uobičajena praksa. U ovom slučaju, svi redovi tabele se vraćaju u istoj grupi.

ORDER BY klauzula

Rečenica POREDAK PO određuje redoslijed sortiranja redova u skupu rezultata koji vraća upit. Ova klauzula ima sljedeću sintaksu:

Redoslijed sortiranja je specificiran u parametru col_name. Col_number je alternativni indikator redoslijeda sortiranja koji identificira stupce redoslijedom kojim se pojavljuju na listi odabira SELECT izraza (1 je prva kolona, ​​2 druga kolona, ​​itd.). ASC parametar definira uzlazni red, i DESC parametar- nizvodno. Podrazumevano je ASC.

Imena kolona u klauzuli ORDER BY ne moraju biti na listi odabranih kolona. Ali ovo se ne odnosi na upite poput SELECT DISTINCT, jer u takvim upitima, nazivi stupaca specificirani u ORDER BY klauzuli također se moraju pojaviti na listi odabranih stupaca. Osim toga, ova klauzula ne može sadržavati nazive stupaca iz tablica koje nisu specificirane u klauzuli FROM.

Kao što možete vidjeti iz sintakse ORDER BY klauzule, sortiranje skupa rezultata može se obaviti na više kolona. Ovo sortiranje je prikazano u primjeru ispod:

U ovom primjeru se biraju brojevi odjeljenja i prezimena i imena zaposlenih za zaposlenike čiji je broj osoblja manji od 20.000, kao i sortiranje po prezimenu i imenu. Rezultat ovog upita:

Kolone u ORDER BY klauzuli mogu se specificirati ne njihovim imenima, već redoslijedom na listi za odabir. Shodno tome, rečenica u gornjem primjeru može se prepisati na sljedeći način:

Takve alternativni način specificiranje stupaca po njihovoj poziciji umjesto imena koristi se ako kriterij naručivanja sadrži agregatnu funkciju. (Drugi način je da koristite nazive stupaca, koji se zatim pojavljuju u ORDER BY klauzuli.) Međutim, u ORDER BY klauzuli, preporučuje se da navedete stupce njihovim imenima, a ne brojevima, kako biste olakšali ažuriranje upita ako trebate dodati ili ukloniti stupce na popisu odabira. Određivanje stupaca u ORDER BY klauzuli njihovim brojevima prikazano je u primjeru ispod:

USE SampleDb; SELECT ProjectNumber, COUNT (*) "Broj zaposlenih" IZ Works_on GROUP BY ProjectNumber ORDER BY 2 DESC;

Ovdje se za svaki projekat odabire broj projekta i broj zaposlenih koji u njemu učestvuju, slijeđujući rezultat u opadajućem redoslijedu prema broju zaposlenih.

Transact-SQL postavlja NULL vrijednosti na vrh liste kada se sortiraju rastućim redoslijedom, a NULL vrijednosti na kraju liste kada se sortiraju u opadajućem redoslijedu.

Korištenje ORDER BY klauzule za paginaciju rezultata

Prikazivanje rezultata upita na trenutnoj stranici može se implementirati u prilagođena aplikacija, ili naložite poslužitelju baze podataka da to učini. U prvom slučaju, svi redovi baze podataka se šalju aplikaciji, čiji je zadatak da odabere tražene redove i prikaže ih. U drugom slučaju, sa strane servera, samo redovi potrebni za trenutna stranica... Kao što možete očekivati, kreiranje stranice na strani servera obično omogućava bolje performanse pošto klijentu se šalju samo linije koje su potrebne za prikaz.

Za podršku kreiranju stranice na strani servera u SQL Server 2012 uvodi dvije nove SELECT klauzule: OFFSET i FETCH. Primjena ove dvije rečenice prikazana je u primjeru ispod. Ovdje, iz baze podataka AdventureWorks2012 (koju možete pronaći u izvoru), izvlači poslovni ID, naziv radnog mjesta i rođendan svih zaposlenih žena, sortiran po nazivu radnog mjesta u rastućem redoslijedu. Rezultirajući skup redova se dijeli na stranice od 10 redova i prikazuje se treća stranica:

U rečenici OFFSET specificira broj redova rezultata koje treba preskočiti u prikazanom rezultatu. Ovaj iznos se izračunava nakon što se redovi sortiraju pomoću ORDER BY klauzule. U rečenici DETCH NEXT specificira broj WHERE i sortiranih redova koje treba vratiti. Parametar ove klauzule može biti konstanta, izraz ili rezultat drugog upita. FETCH NEXT klauzula je slična klauzuli PETCH FETCH.

Glavni cilj pri kreiranju stranica na strani servera je biti u mogućnosti implementirati uobičajene forme stranica koristeći varijable. Ovaj zadatak se može postići putem SQL Server paketa.

SELECT izjava i IDENTITY svojstvo

IDENTITY svojstvo omogućava vam da odredite vrijednosti za određeni stupac tablice u obliku automatski inkrementalnog brojača. Stupci numeričkog tipa podataka kao što su TINYINT, SMALLINT, INT i BIGINT mogu imati ovo svojstvo. Za takvu kolonu tabele, Database Engine automatski generiše sekvencijalne vrednosti počevši od navedene početne vrednosti. Dakle, svojstvo IDENTITY se može koristiti za kreiranje nedvosmislenog numeričke vrijednosti za odabranu kolonu.

Tablica može sadržavati samo jedan stupac sa svojstvom IDENTITY. Vlasnik tabele ima mogućnost da odredi početnu vrednost i inkrement, kao što je prikazano u donjem primeru:

USE SampleDb; KREIRAJ TABELU Proizvod (Id INT IDENTITETA (10000, 1) NIJE NULL, Ime NVARCHAR (30) NOT NULL, Cijena NOVAC) UMETNI U PROIZVOD (IME, Cijena) VRIJEDNOSTI ("Proizvod1", 10), ("Proizvod2", 15) , ("Proizvod3", 8), ("Proizvod4", 15), ("Proizvod5", 40); - Vratiće 10004 SELECT IDENTITYCOL FROM Product WHERE Name = "Proizvod5"; - Analogno prethodnom iskazu SELECT $ identity FROM Product WHERE Naziv = "Proizvod5";

Ovaj primjer prvo kreira tablicu proizvoda koja sadrži stupac Id sa svojstvom IDENTITY. Vrijednosti u koloni Id sistem kreira automatski, počevši od 10.000 i povećavajući se u jednom koraku za svaku narednu vrijednost: 10.000, 10.001, 10.002, itd.

Nekoliko sistemskih funkcija i varijabli pridruženo je svojstvu IDENTITY. Na primjer, primjer koda koristi sistemska varijabla $ identitet... Kao što možete vidjeti iz rezultata pokretanja ovog koda, ova varijabla se automatski poziva na svojstvo IDENTITY. Umjesto toga možete koristiti i sistemsku funkciju IDENTITYCOL.

Početna vrijednost i prirast stupca sa svojstvom IDENTITY mogu se pronaći pomoću funkcija IDENT_SEED i IDENT_INCR respektivno. Ove funkcije se primjenjuju na sljedeći način:

USE SampleDb; SELECT IDENT_SEED ("Proizvod"), IDENT_INCR ("Proizvod")

Kao što je spomenuto, IDENTITY vrijednosti postavlja sistem automatski. Ali korisnik može eksplicitno odrediti njihove vrijednosti za određene nizove dodjeljivanjem parametru IDENTITY_INSERT vrijednost ON prije umetanja eksplicitne vrijednosti:

SET IDENTITY INSERT ime tablice ON

Budući da se parametar IDENTITY_INSERT može koristiti za postavljanje bilo koje vrijednosti, uključujući duplicirane vrijednosti, na stupcu sa svojstvom IDENTITY, svojstvo IDENTITY obično ne provodi jedinstvenost vrijednosti stupca. Stoga, ograničenja UNIQUE ili PRIMARY KEY treba primijeniti da bi se nametnula jedinstvenost vrijednosti stupca.

Kada umetnete vrijednosti u tabelu nakon postavljanja IDENTITY_INSERT na uključeno, sistem kreira sljedeću vrijednost u koloni IDENTITY, povećavajući najvišu trenutnu vrijednost u toj koloni.

Izjava CREATE SEQUENCE

Upotreba svojstva IDENTITY ima nekoliko značajnih nedostataka, od kojih su najznačajniji:

    svojstvo je ograničeno na navedenu tabelu;

    nova vrijednost kolone se ne može dobiti na bilo koji drugi način, osim njenom primjenom;

    svojstvo IDENTITY se može specificirati samo prilikom kreiranja stupca.

Iz ovih razloga, SQL Server 2012 uvodi sekvence koje imaju istu semantiku kao svojstvo IDENTITY, ali bez prethodno navedenih nedostataka. U ovom kontekstu, sekvenca se odnosi na funkcionalnost baze podataka koja vam omogućava da odredite vrijednosti brojača za različite objekte baze podataka, kao što su stupci i varijable.

Sekvence se kreiraju pomoću instrukcije CREATE SEQUEENCE... Izraz CREATE SEQUENCE definiran je u SQL standardu i podržan je od drugih sistema relacijskih baza podataka kao što su IBM DB2 i Oracle.

Primjer ispod pokazuje kako kreirati sekvencu u SQL Serveru:

USE SampleDb; CREATE SEQUENCE dbo.Sequence1 KAO INT POČINJE SA 1 POVEĆANJEM ZA 5 MIN VRIJEDNOSTI 1 MAKSIMALNA VRIJEDNOST 256 CIKLUS;

U gornjem primjeru, vrijednosti Sequence1 se generišu automatski od strane sistema, počevši od vrijednosti od 1 i u koracima od 5 za svaku uzastopnu vrijednost. Dakle, u klauzulu START naznačena je početna vrijednost i in INCREMENT ponuda- korak. (Korak može biti pozitivan ili negativan.)

U sljedeće dvije fakultativne rečenice MINVRIJEDNOST i MAXVALUE minimum i maksimalna vrijednost sekvencijalni objekat. (Imajte na umu da MINVALUE mora biti manji ili jednak početnoj vrijednosti, a MAXVALUE ne može biti veći od gornje granice tipa podataka specificiranog za niz.) U rečenici CIKLUS označava da se sekvenca ponavlja od početka kada se prekorači maksimalna (ili minimalna za sekvencu sa negativnim korakom) vrijednost. Po defaultu, ova klauzula je postavljena na NO CYCLE, što znači da prekoračenje maksimalne ili minimalne vrijednosti sekvence izaziva izuzetak.

Glavna karakteristika sekvenci je njihova nezavisnost od tabela, tj. mogu se koristiti sa bilo kojim objektom baze podataka kao što su stupci tablice ili varijable. (Ovo svojstvo ima pozitivan učinak na pohranu, a samim tim i na performanse. Određeni niz ne mora biti pohranjen; pohranjuje se samo njegova posljednja vrijednost.)

Nove vrijednosti sekvence se kreiraju sa SLJEDEĆA VRIJEDNOST ZA izraze, čija je primjena prikazana u primjeru ispod:

USE SampleDb; - Vraća 1 SELECT SLJEDEĆA VRIJEDNOST ZA dbo.sequence1; - Vraća 6 (sljedeći korak) SELECT SLJEDEĆA VRIJEDNOST ZA dbo.sequence1;

Možete koristiti izraz SLJEDEĆA VRIJEDNOST FOR da dodijelite rezultat niza varijabli ili ćeliji stupca. Donji primjer ilustruje upotrebu ovog izraza za dodjelu rezultata koloni:

USE SampleDb; CREATE TABLE Proizvod (Id INT NOT NULL, Naziv NVARCHAR (30) NOT NULL, Cijena NOVAC) UMETNI U VRIJEDNOSTI proizvoda (SLJEDEĆA VRIJEDNOST ZA dbo.sequence1, "Proizvod1", 10); UMETNI U VRIJEDNOSTI proizvoda (SLJEDEĆA VRIJEDNOST ZA dbo.sequence1, "Proizvod2", 15); - ...

Gornji primjer prvo kreira tablicu pod nazivom Proizvod sa četiri stupca. Zatim, dva INSERT izraza ubacuju dva reda u ovu tabelu. Prve dvije ćelije prve kolone bit će 11 i 16.

Primjer ispod pokazuje korištenje kataloškog pogleda sys.sequences da vidite trenutnu vrijednost sekvence bez korištenja:

Tipično, izraz NEXT VALUE FOR se koristi u INSERT izrazu za instrukciju sistemu da ubaci generirane vrijednosti. Ovaj izraz se također može koristiti kao dio višelinijskog upita koji koristi klauzulu OVER.

Da biste promijenili svojstvo postojeće sekvence, primijenite ALTER SEQUENCE izraz... Jedna od najvažnijih upotreba ove naredbe je opcija RESTART WITH, koja resetuje navedeni niz. Primjer u nastavku pokazuje upotrebu naredbe ALTER SEQUENCE za resetiranje gotovo svih svojstava Sequence1:

USE SampleDb; ALTER SEQUENCE dbo.sequence1 RESTART SA 100 POVEĆANJA ZA 50 MIN VRIJEDNOSTI 50 MAKSIMALNE VRIJEDNOSTI 200 BEZ CIKLUSA;

Slijed se briše pomoću instrukcije DROP SEQUENCE.

Postavite operatore

Pored operatora o kojima smo ranije govorili, Transact-SQL podržava tri druga skupa operatora: UNION, INTERSECT i EXCEPT.

UNION operater

UNION operater kombinuje rezultate dva ili više upita u jedan skup rezultata koji uključuje sve redove koji pripadaju svim upitima u uniji. Posljedično, rezultat spajanja dvije tablice je nova tablica koja sadrži sve redove u jednoj ili obje originalne tablice.

Opšti oblik UNION operatora izgleda ovako:

select_1 UNION select_2 (select_3]) ...

Opcije select_1, select_2, ... su SELECT izjave koje kreiraju spajanje. Ako se koristi parametar ALL, prikazuju se svi redovi, uključujući duplikate. U naredbi UNION, parametar ALL ima isto značenje kao u SELECT, s jednom razlikom: za SELECT, ovaj parametar je zadani, a za UNION mora biti eksplicitno specificiran.

U svom originalnom obliku, SampleDb nije prikladan za demonstraciju upotrebe UNION operatora. Stoga, ovaj odjeljak kreira novu tablicu EmployeeEnh koja je identična postojećoj tablici Employee, ali ima dodatni stupac Grad. Ova kolona označava mjesto prebivališta zaposlenih.

Kreiranje tabele EmployeeEnh pruža nam priliku da demonstriramo upotrebu klauzule. INTO u SELECT izrazu. Naredba SELECT INTO izvodi dvije operacije. Prvo se kreira nova tabela sa stupcima navedenim na listi SELECT. Zatim se redovi iz originalne tabele ubacuju u novu tabelu. Ime nove tablice je navedeno u INTO klauzuli, a ime izvorne tablice navedeno je u klauzuli FROM.

Primjer ispod prikazuje kreiranje tabele EmployeeEnh iz tabele Employee:

USE SampleDb; SELECT * INTO EmployeeEnh FROM Employee; ALTER TABLE EmployeeEnh DODAJ Grad NCHAR (40) NULL;

U ovom primjeru, naredba SELECT INTO kreira tablicu EmployeeEnh, u nju umeće sve redove iz izvorne tablice Employee, a zatim naredba ALTER TABLE dodaje stupac City u novu tablicu. Ali dodana kolona Grad ne sadrži nikakve vrijednosti. Vrijednosti se mogu umetnuti u ovu kolonu pomoću Upravljačko okruženje Studio ili sa sljedećim kodom:

USE SampleDb; UPDATE EmployeeEnh SET Grad = "Kazan" GDJE Id = 2581; UPDATE EmployeeEnh SET City = "Moskva" GDJE Id = 9031; UPDATE EmployeeEnh SET Grad = "Jekaterinburg" GDJE Id = 10102; UPDATE EmployeeEnh SET Grad = "Sankt Peterburg" GDJE Id = 18316; UPDATE EmployeeEnh SET Grad = "Krasnodar" GDJE Id = 25348; UPDATE EmployeeEnh SET Grad = "Kazan" GDJE Id = 28559; UPDATE EmployeeEnh SET Grad = "Perm" GDJE Id = 29346;

Sada smo spremni da demonstriramo upotrebu izjave UNIJE. Primjer u nastavku prikazuje upit za kreiranje spajanja između EmployeeEnh i Department tablica koristeći ovu naredbu:

USE SampleDb; ODABERITE Grad KAO "Grad" IZ UNIONA EmployeeEnh ODABIRITE lokaciju IZ Odjela;

Rezultat ovog upita:

Samo kompatibilne tablice mogu se spojiti pomoću UNION izraza. Pod kompatibilnim tabelama podrazumijevamo da obje liste kolona u selekciji moraju sadržavati isti broj kolona, ​​a odgovarajuće kolone moraju imati kompatibilne tipove podataka. (U smislu kompatibilnosti, tipovi podataka INT i SMALLINT nisu kompatibilni.)

Rezultat konkatenacije se može poredati samo pomoću ORDER BY klauzule u posljednjoj SELECT naredbi, kao što je prikazano u primjeru ispod. GROUP BY i HAVING klauzule se mogu koristiti sa odvojena uputstva SELECT, ali ne u samom sindikatu.

Upit u ovom primjeru odabire zaposlenike koji ili rade u odjelu d1 ili koji su počeli raditi na projektu prije 1. januara 2008.

UNION operator podržava opciju SVE. Ova opcija ne uklanja duplikate iz skupa rezultata. OR operator se može koristiti umjesto UNION operatora ako se svi SELECT izrazi spojeni s jednim ili više UNION operatora odnose na istu tablicu. U ovom slučaju, skup SELECT izraza je zamijenjen jednim SELECT izrazom sa skupom OR naredbi.

INTERSECT i EXCEPT operatori

Dva druga operatera za rad sa setovima, INTERSECT i OSIM, definiraju sjecište i razliku, respektivno. Ispod presjeka, u ovom kontekstu, nalazi se skup redova koji pripadaju objema tablicama. A razlika između dvije tablice je definirana kao sve vrijednosti koje pripadaju prvoj tablici, a nisu prisutne u drugoj. Primjer ispod pokazuje upotrebu INTERSECT operatora:

Transact-SQL ne podržava upotrebu parametra ALL sa INTERSECT ili EXCEPT operatorima. Upotreba operatora EXCEPT prikazana je u primjeru ispod:

Treba imati na umu da ova tri operatora na skupovima imaju različit prioritet izvršenja: INTERSECT operator ima najveći prioritet, nakon čega slijedi operator EXCEPT, a operator UNION ima najmanji prioritet. Nepažnja prema prioritetu izvršenja kada se koristi višestruko različiti operateri rad sa setovima može dovesti do neočekivanih rezultata.

CASE izrazi

U oblasti aplikativnog programiranja baze podataka, ponekad je potrebno modificirati prezentaciju podataka. Na primjer, ljudi se mogu podijeliti prema njihovoj društvenoj klasi, koristeći vrijednosti 1, 2 i 3, koje označavaju muškarce, žene, odnosno djecu. Ova tehnika programiranja može smanjiti vrijeme potrebno za implementaciju programa. CASE izraz Transact-SQL vam omogućava da lako implementirate ovu vrstu kodiranja.

Za razliku od većine programskih jezika, CASE nije izjava, već izraz. Stoga se izraz CASE može koristiti gotovo bilo gdje gdje Transact-SQL dozvoljava korištenje izraza. Izraz CASE ima dva oblika:

    jednostavan CASE izraz;

    izraz za pretragu CASE.

Sintaksa za jednostavan CASE izraz je sljedeća:

Naredba s jednostavnim CASE izrazom prvo pretražuje listu svih izraza u WHEN klauzula prvi izraz koji odgovara izrazu_1, a zatim izvršava odgovarajući THEN klauzula... Ako na listi WHEN ne postoji odgovarajući izraz, onda ELSE klauzula.

Sintaksa za CASE izraz za pretraživanje je sljedeća:

V u ovom slučaju traži se prvi podudarni uslov, a zatim se izvršava odgovarajuća klauzula THEN. Ako nijedan od uslova ne ispunjava uslove, ELSE klauzula se izvršava. Upotreba izraza za pretragu CASE prikazana je u primjeru ispod:

USE SampleDb; SELECT ProjectName, CASE WHEN Budget> 0 I Budžet 100000 I Budžet 150000 I Budžet

Rezultat ovog upita:

Ovaj primjer ponderira budžete svih projekata i prikazuje izračunate težine zajedno s odgovarajućim nazivima projekata.

Primjer ispod pokazuje drugi način korištenja izraza CASE gdje klauzula WHEN sadrži potupite koji su dio izraza:

USE SampleDb; SELECT ProjectName, CASE WHEN p1.Budget (IZABRAJTE AVG (p2.Budget) IZ Projekta p2) ONDA "iznad proseka" KRAJ "Kategorija budžeta" IZ Projekta p1;

Rezultat ovog upita je sljedeći:

Lekcija će pokriti temu sql preimenovanja kolone (polja) koristeći AS funkciju riječi; također je pokrio temu agregatnih funkcija u sql. Analizirat će se konkretni primjeri zahtjeva

Možete preimenovati imena kolona u upitima. Ovo čini rezultate čitljivijim.

V SQL jezik preimenovanje polja je povezano sa upotrebom ključna riječ AS koji se koristi za preimenovanje imena polja u skupovima rezultata

sintaksa:

SELECT<имя поля>AS<псевдоним>OD ...

Pogledajmo primjer preimenovanja u SQL-u:

Primjer DB "Institut": Prikažite imena nastavnika i njihove plate, za one nastavnike čije su plate ispod 15000 preimenujte polje zarplata u "niska_plata"


✍ Rješenje:

Preimenovanje stupaca u SQL-u je često potrebno prilikom izračunavanja vrijednosti povezanih s više polja stolovi. Razmotrimo primjer:

Primjer DB "Institut": Iz tabele nastavnika ispišite ime polja i izračunajte iznos plate i bonusa, imenujući polje "Plata_ nagrada"


✍ Rješenje:
1 2 SELECT ime, (zarplata + premia) AS zarplata_premia OD nastavnika;

SELECT ime, (zarplata + premia) AS zarplata_premia OD nastavnika;

rezultat:

Agregatne funkcije u SQL-u

Agregatne funkcije u sql-u se koriste za dobivanje zbroja i izračunavanje izraza:

Sve agregatne funkcije vraćaju jednu vrijednost.

Funkcije COUNT, MIN i MAX primjenjuju se na bilo koji tip podataka.

Funkcije SUM i AVG koriste se samo za numerička polja.
Postoji razlika između funkcija COUNT (*) i COUNT (): druga ne uzima u obzir NULL vrijednosti prilikom brojanja.

Bitan: kada se radi sa agregatnim funkcijama u SQL-u, koristi se posebna riječ AS


Primjer DB "Institut": Dobijte vrijednost najveće plate među nastavnicima, prikažite rezultat kao "Max_zp"


✍ Rješenje:
SELECT MAX (zarplata) AS max_zp FROM nastavnika;

SELECT MAX (zarplata) AS max_zp FROM nastavnika;

Rezultati:

Razmotrite više složen primjer koristeći agregatne funkcije u sql.


✍ Rješenje:

GROUP BY klauzula u SQL-u

Grupa po klauzuli u sql-u se obično koristi u sprezi sa agregatnim funkcijama.

Agregatne funkcije se izvode na svim rezultujućim redovima upita. Ako upit sadrži GROUP BY klauzulu, svaki skup redova specificiranih u GROUP BY klauzuli čini grupu i agregatne funkcije se izvršavaju za svaku grupu posebno.

Razmotrite primjer s tabelom lekcija:

primjer:

Bitan: Dakle, kao rezultat korištenja GROUP BY, svi izlazni redovi upita su podijeljeni u grupe koje karakteriziraju iste kombinacije vrijednosti u ovim stupcima (tj. agregatne funkcije se izvode za svaku grupu posebno).

Treba imati na umu da kada se grupišu po polju koje sadrži NULL vrijednosti, svi takvi zapisi će pasti u jednu grupu.

Za različite tipove štampača, definirajte ih prosječna cijena i količinu (tj. odvojeno za laser, inkjet i matricu). Koristite agregatne funkcije. Rezultat bi trebao izgledati ovako:

Imati SQL izjavu

Klauzula HAVING u SQL-u je potrebna za provjeru vrijednosti, koji se dobijaju pomoću agregatne funkcije nakon grupisanja(nakon upotrebe GROUP BY). Takav ček ne može biti sadržan u klauzuli WHERE.

primjer: DB prodavnica računara... Izračunajte prosječnu cijenu računara sa istom brzinom procesora. Računajte samo za one grupe čija je prosječna cijena manja od 30.000.

prema vrijednosti stupca Disciplina. Dobit ćemo 4 grupe za koje možemo izračunati neke grupne vrijednosti, na primjer, broj torki u grupi, maksimalnu ili minimalnu vrijednost stupca Score. Tabela 5.7. Agregatne funkcije
Funkcija Rezultat
COUNT Broj redova ili vrijednosti polja koje nisu prazne koje je upit odabrao
SUMA Zbir svih odabranih vrijednosti za ovo polje
AVG Aritmetička sredina svih odabranih vrijednosti u ovom polju
MIN Najmanja od svih odabranih vrijednosti za ovo polje
MAX Najveća od svih odabranih vrijednosti za ovo polje
R1
Puno ime Disciplina Ocjena
Grupa 1 Petrov F.I. Baza podataka 5
K. A. Sidorov Baza podataka 4
Mironov A.V. Baza podataka 2
Stepanova K.E. Baza podataka 2
Krylova T.S. Baza podataka 5
Vladimirov V.A. Baza podataka 5
Grupa 2 K. A. Sidorov Teorija informacija 4
Stepanova K.E. Teorija informacija 2
Krylova T.S. Teorija informacija 5
Mironov A.V. Teorija informacija Null
Grupa 3 Trofimov P.A. Mreže i telekomunikacije 4
Ivanova E.A. Mreže i telekomunikacije 5
N. V. Utkina Mreže i telekomunikacije 5
Grupa 4 Vladimirov V.A. engleski jezik 4
Trofimov P.A. engleski jezik 5
Ivanova E.A. engleski jezik 3
Petrov F.I. engleski jezik 5

Agregatne funkcije se koriste kao imena polja u SELECT izrazu, s jednim izuzetkom: uzimaju ime polja kao argument. Samo SUM i AVG se mogu koristiti sa numerička polja... I numerička i karakterna polja mogu se koristiti sa funkcijama COUNT, MAX i MIN. Kada se koriste sa znakovnim poljima, MAX i MIN će ih prevesti u ASCII ekvivalent i obraditi ih u abecedni red... Neki DBMS-ovi dozvoljavaju upotrebu ugniježđenih agregata, ali to je odstupanje od ANSI standarda sa svim posljedicama koje iz toga proizlaze.

Na primjer, možete izračunati broj studenata koji su položili ispite iz svake discipline. Da biste to učinili, potrebno je izvršiti upit grupiran po polju "Disciplina" i kao rezultat prikazati naziv discipline i broj redova u grupi za ovu disciplinu. Upotreba znaka * kao argumenta funkciji COUNT znači da se broje svi redovi u grupi.

SELECT R1 Discipline, COUNT (*) IZ R1 GRUPE PO R1 Discipline

rezultat:

Ako želimo da izbrojimo broj onih koji su položili ispit u bilo kojoj disciplini, onda moramo isključiti nedefinirane vrijednosti iz početnog omjera prije grupisanja. U ovom slučaju, zahtjev će izgledati ovako:

Dobijamo rezultat:

U ovom slučaju, linija sa učenikom

Mironov A.V. Teorija informacija Null

neće pasti u skup torki prije grupisanja, tako da je broj torki u grupi za disciplinu " Teorija informacija"biće 1 manje.

Može se primijeniti agregatne funkcije takođe bez operacije preliminarnog grupisanja, u ovom slučaju se cela relacija smatra jednom grupom i za ovu grupu se može izračunati jedna vrednost po grupi.

Ponovo se osvrnuvši na bazu podataka Session (tabele R1, R2, R3), naći ćemo broj uspješno položenih ispita:

Ovo se, naravno, razlikuje od odabira polja, jer se uvijek vraća jedna vrijednost, bez obzira koliko redova ima u tabeli. Argument agregatne funkcije mogu postojati odvojene kolone tabela. Ali da biste izračunali, na primjer, broj različitih vrijednosti određene kolone u grupi, potrebno je koristiti ključnu riječ DISTINCT zajedno s nazivom kolone. Izračunajmo broj različitih ocjena dobijenih za svaku disciplinu:

rezultat:

Rezultat može uključivati ​​vrijednost polja za grupisanje i nekoliko agregatne funkcije, a više polja se mogu koristiti u uslovima grupisanja. U ovom slučaju, grupe se formiraju skupom specificiranih polja za grupisanje. Agregatne operacije se mogu primijeniti na spajanje više izvornih tablica. Na primjer, postavimo pitanje: odredite za svaku grupu i svaku disciplinu broj onih koji su uspješno položili ispit i prosječan rezultat za disciplinu.

rezultat:

Ne možemo koristiti agregatne funkcije u klauzuli WHERE jer se predikati procjenjuju u smislu jednog reda, i agregatne funkcije- u smislu grupa linija.

Klauzula GROUP BY vam omogućava da definirate podskup vrijednosti u određenom polju u smislu drugog polja i primijenite agregatnu funkciju na podskup. Ovo omogućava kombinovanje polja i agregatne funkcije u jednoj SELECT klauzuli. Agregatne funkcije može se koristiti kako u izrazu za izlaz rezultata SELECT reda, tako iu izrazu uslova za obradu formiranih HAVING grupa. U ovom slučaju, svaka agregatna funkcija se izračunava za svaku odabranu grupu. Izračunate vrijednosti agregatne funkcije, može se koristiti za prikaz relevantnih rezultata ili za uvjete odabira grupe.

Napravimo upit koji prikazuje grupe u kojima je na ispitima dobijeno više od jedne dvojke u jednoj disciplini:

U nastavku, kao primjer, nećemo raditi s bazom podataka "Session", već sa bazom podataka "Banka", koja se sastoji od jedne tabele F, koja pohranjuje relaciju F koja sadrži informacije o računima u filijalama određenog banka:

F = (N, puni naziv, Filijala, Datum otvaranja, Datum zatvaranja, Stanje); Q = (Filijala, Grad);

jer na ovoj osnovi možete bolje ilustrirati rad sa agregatnim funkcijama i grupiranjem.

Na primjer, pretpostavimo da želimo pronaći ukupno stanje računa u filijalama. Možete napraviti poseban upit za svaku od njih odabirom SUM (preostalo) iz tabele za svaku granu. GROUP BY će vam, međutim, omogućiti da ih sve stavite u jednu naredbu:

SELECT Grana, ZBIR (Stanje) FROM F GRUPA PO Ogranak;

GROUP BY se primjenjuje agregatne funkcije nezavisno za svaku grupu, identifikovano po vrednosti polja Grana. Grupa se sastoji od linija sa istu vrijednost Područja grane, i

ISO standard definira sljedećih pet funkcije agregiranja:

COUNT- vraća broj vrijednosti u navedenoj koloni;

SUMA- vraća zbir vrijednosti u navedenoj koloni;

AVG- vraća prosječnu vrijednost u navedenoj koloni;

MIN- vraća minimalnu vrijednost u navedenoj koloni;

MAX- vraća maksimalnu vrijednost u navedenoj koloni.

Sve ove funkcije rade na vrijednostima u jednoj koloni tablice i vraćaju jednu vrijednost. Funkcije COUNT, MIN i MAX primjenjuju se i na numerička i na nenumerička polja, dok se funkcije SUM i AVG mogu koristiti samo u slučaju numeričkih polja. Sa izuzetkom COUNT (*), prilikom evaluacije rezultata bilo koje funkcije, prvo se isključuju sve nulte vrijednosti, nakon čega se potrebna operacija primjenjuje samo na preostale vrijednosti kolona koje nisu nule. Opcija COUNT (*) je posebna upotreba funkcije COUNT — njena svrha je da prebroji sve redove u tabeli, bilo da sadrže prazne vrijednosti, duplirane vrijednosti ili bilo koju drugu vrijednost. Ako želite eliminirati duple vrijednosti prije korištenja agregatne funkcije, stavite ključnu riječ DISTINCT ispred naziva stupca u definiciji funkcije. ISO standard dozvoljava korištenje ključne riječi ALL da eksplicitno naznači da eliminacija duplih vrijednosti nije potrebna, iako se ova ključna riječ pretpostavlja po defaultu ako nije naveden drugi kvalifikator. Ključna riječ DISTINCT je besmislena za funkcije MIN i MAX. Međutim, njegova upotreba može uticati na rezultate izvršavanja funkcija SUM i AVG, tako da bi trebalo unapred razmisliti da li treba da bude prisutan u svakom konkretnom slučaju. Osim toga, ključna riječ DISTINCT može biti specificirana najviše jednom u svakom zahtjevu.

Treba napomenuti da se agregatne funkcije mogu koristiti samo u SELECT listi iu klauzuli HAVING (pogledajte odjeljak 5.3.4). U svim ostalim slučajevima upotreba ovih funkcija je nevažeća. Ako SELECT lista sadrži funkciju agregacije, a tekst upita ne sadrži GROUP BY klauzulu koja obezbjeđuje agregaciju podataka u grupe, tada nijedan od elemenata SELECT liste ne može uključivati ​​reference na stupce, osim ako se ovaj stupac ne koristi kao parametar funkcija agregacije. Na primjer, sljedeći zahtjev je nevažeći:

SELECTosobljeNe,COUNT (plata)

ODOsoblje;

Greška je što je u ovaj zahtjev nema izgradnje GROUP BY, a pristup stupcu staffNo na SELECT listi se izvodi bez upotrebe agregatne funkcije.

Primjer 13. Upotreba funkcije COUNT (*).Odredite koliko nekretnina za iznajmljivanje ima stopu zakupa veću od 350£ mjesečno,

SELECT COUNT(*) AS count

ODPropertyForRent

GDJEnajam> 350;

Klauzula WHERE ograničena je na brojanje samo predmeta za iznajmljivanje koji su veći od 350£ mjesečno. Ukupan broj nekretnina za iznajmljivanje koje ispunjavaju specificirani uvjet može se odrediti korištenjem agregatne funkcije COUNT. Rezultati izvršenja upita prikazani su u tabeli. 23.

Tabela 23

count

Primjer 14. Korištenje funkcije COUNT (DISTINCT).Odredite koliko su različitih nekretnina za iznajmljivanje pregledali kupci u maju 2001.

ODABIR BROJ (DISTINCTpropertyNo) AS count

ODGledanje

Opet, ograničavanje rezultata upita na analizu samo onih zakupa koji su pregledani u maju 2001. postiže se upotrebom klauzule WHERE. Ukupan broj ispitanih objekata koji ispunjavaju specificirani uvjet može se odrediti korištenjem agregatne funkcije COUNT. Međutim, budući da isti objekt mogu vidjeti različiti klijenti nekoliko puta, morate navesti ključnu riječ DISTINCT u definiciji funkcije da biste isključili duple vrijednosti iz izračunavanja. Rezultati izvršenja upita prikazani su u tabeli. 24.

Tabela 24

Primjer 16. Korištenje funkcija MIN, MAXnAVG.Izračunajte vrijednost minimalne, maksimalne i prosječne plate.

ODABIR MIN(plata) AS min, MAX(plata) AS max, AVG(plata) AS avg

ODOsoblje;

U ovom primjeru, trebate obraditi informacije o cijelom osoblju kompanije, tako da ne morate koristiti klauzulu WHERE. Tražene vrijednosti se mogu izračunati pomoću funkcija MIN, MAX i AVG primijenjenih na kolonu plata u tabeli osoblja. Rezultati izvršenja upita prikazani su u tabeli. 26.

Tabela 26.

Rezultat upita

min max avg
9000.00 30000.00 17000.00

Grupiranje rezultata (GROUP BY klauzula). Gore navedeni primjeri sažetih podataka slični su redovima sažetka koji se obično nalaze na kraju izvještaja. U zbrojima, svi detaljni podaci izvještaja su komprimirani u jedan sažetak. Međutim, vrlo često se u izvještajima traži formiranje međuzbroja. U tu svrhu, klauzula GROUP BY može biti specificirana u SELECT izrazu. Poziva se upit koji sadrži klauzulu GROUP BY grupni upit jer grupiše podatke koji su rezultat operacije SELECT, a zatim kreira jedan sažeti red za svaku pojedinačnu grupu. Kolone navedene u klauzuli GROUP BY su imenovane grupisane kolone. ISO standard zahtijeva da klauzule SELECT i GROUP BY budu blisko povezane. Kada koristite klauzulu GROUP BY u SELECT izrazu, svaka stavka liste na SELECT listi mora imati jedino značenje za cijelu grupu.Štaviše, SELECT klauzula može uključivati ​​samo sljedeće tipove elemenata:

Imena kolona;

funkcije agregiranja;

Konstante;

Izrazi koji uključuju kombinacije gore navedenog.

Sva imena stupaca navedena na listi SELECT moraju se pojaviti i u klauzuli GROUP BY, osim ako se ime stupca ne koristi samo u agregatnoj funkciji. Suprotno nije uvijek tačno — klauzula GROUP BY može sadržavati nazive stupaca koji se ne nalaze na listi SELECT. Ako se klauzula WHERE koristi zajedno s klauzulom GROUP BY, tada se prvo obrađuje i grupišu se samo oni redovi koji zadovoljavaju uvjet pretraživanja. ISO standard navodi da kada se izvrši grupisanje, sve nedostajuće vrijednosti se tretiraju kao jednake. Ako dva reda tabele u istoj koloni grupisanja sadrže nulte vrednosti i identične vrednosti u svim drugim nepraznim grupisanim kolonama, oni se stavljaju u istu grupu.

Primjer 17. Upotreba klauzule GROUP BY.Odredite broj osoblja koje radi u svakom od odjela kompanije, kao i njihove ukupne plate.

SELECTbr. COUNT(nema osoblja) AS broji, SUMA(plata) AS suma

ODOsoblje

GROUP BYbr

POREDAK PObr.grana;

Nije potrebno uključiti nazive stupaca staffNo i salary u GROUP BY klauzulu, jer se oni pojavljuju samo na SELECT listi sa agregatnim funkcijama. U isto vrijeme, stupac branchNo na popisu klauzule SELECT nije pridružen nijednoj funkciji agregiranja i iz tog razloga mora biti specificiran u klauzuli GROUP BY. Rezultati izvršenja upita prikazani su u tabeli. 27.

Tabela 27

Rezultat upita

br Count Suma
B003 54000.00
B005 39000.00
B007 9000.00

Konceptualno, prilikom obrade ovog zahtjeva, poduzimaju se sljedeći koraci.

1. Redovi tabele osoblja su podeljeni u grupe u skladu sa vrednostima u koloni broj odeljenja kompanije. Unutar svake od grupa nalaze se podaci o cijelom osoblju jednog od odjela kompanije. U našem primjeru biće kreirane tri grupe, kao što je prikazano na Sl. jedan.

2. Za svaku od grupa izračunava se ukupan broj redova, jednak broju zaposlenih u odeljenju, kao i zbir vrednosti u koloni zarada, koji je zbir plata svih zaposlenima odjeljenja za koje smo zainteresovani. Zatim se generiše jedan red sa sažetkom za cijelu grupu izvornih redova.

3. Rezultirajući redovi rezultirajuće tablice sortirani su uzlaznim redoslijedom prema broju grane naznačenom u stupcu br.

br broj osoblja Plata
V00Z SG37 12000.00
V00Z SG14 18000.00
V00Z SG5 24000.00
B005 SL21 30000.00
B005 SL41 9000.00
B007 SA9 9000.00
COUNT (broj osoblja) SUM (plata)
54000.00
39000.00
9000.00

Rice. 1. Tri grupe zapisa kreirane prilikom izvršavanja upita

SQL standard dozvoljava postavljanje podupita u SELECT listu. Stoga se gornji upit može predstaviti i na sljedeći način:

SELECTbr. grane, (ODABIR BROJ (broj osoblja)AS count

ODStaff s

GDJEbr. filijale = br. br. filijale),

(IZABIR ZBIR (plata) KAO zbroj

ODStaff s

GDJEs.branchNo = b.branchNo)

ODFilijala b

POREDAK PObr.grana;

Ali u ovoj verziji upita, za svaki od odjela kompanije opisanih u tablici podružnica, generiraju se dva rezultata izračunavanja funkcija agregacije, pa se u nekim slučajevima mogu pojaviti redovi koji sadrže nulte vrijednosti.

Ograničenja grupisanja (klauzula HAVING). HAVING klauzula je namijenjena da se koristi zajedno s klauzulom GROUP BY za specificiranje ograničenja navedenih za odabir onih grupe, koji će biti postavljen u rezultujuću tabelu upita. Iako klauzule HAVING i WHERE imaju sličnu sintaksu, njihova svrha je drugačija. Klauzula WHERE je dizajnirana za odabir pojedinačnih redova za popunjavanje rezultirajuće tabele upita, dok se klauzula HAVING koristi za odabir grupe, postavljen u rezultujuću tabelu upita. ISO standard zahtijeva da se nazivi stupaca koji se koriste u klauzuli HAVING pojavljuju na listi stavki GROUP BY ili da se koriste u agregatnim funkcijama. U praksi, pojmovi za pretraživanje u HAVING klauzuli uvijek uključuju barem jednu agregatnu funkciju; u suprotnom, ovi uslovi pretraživanja moraju biti stavljeni u klauzulu WHERE i primijenjeni na odabir pojedinačnih redova. (Zapamtite da se agregatne funkcije ne mogu koristiti u klauzuli WHERE.) Klauzula HAVING nije neophodan dio SQL jezika — svaki upit napisan korištenjem klauzule HAVING može se drugačije predstaviti bez korištenja.

Primjer 18. Upotreba konstrukcije HAVING.Za svako odeljenje kompanije sa više zaposlenih odredite broj zaposlenih i visinu njihovih plata.

SELECTbr. COUN T (broj osoblja) AS broji, SUMA(plata) AS suma

ODOsoblje

GROUP BYbr

HAVING COUNT(broj osoblja)> 1

POREDAK PObr.grana;

Ovaj primjer je sličan prethodnom, ali se ovdje koriste dodatna ograničenja koja ukazuju na to da nas zanimaju samo podaci o onim odjelima kompanije u kojima radi više osoba. Sličan zahtjev je nametnut i grupama, tako da se u upitu treba koristiti klauzula HAVING. Rezultati izvršenja upita prikazani su u tabeli. 28.

Tabela 28

granaNe broji zbroj
V00Z 3 54000,00
B005 2 39000,00

Podupiti. U ovom odjeljku ćemo raspravljati o upotrebi kompletnih SELECT izraza ugrađenih u tijelo drugog SELECT izraza. Eksterni(drugi) SELECT izraz koristi rezultat izvršenja interni(prvi) operator za određivanje sadržaja konačnog rezultata cijele operacije. Unutrašnji upiti se mogu naći u klauzulama WHERE i HAVING vanjskog SELECT izraza - u ovom slučaju, oni su imenovani podupiti, ili ugniježđeni upiti. Dodatno, unutrašnji SELECT izrazi se mogu koristiti u INSERT, UPDATE i DELETE izrazima . Postoje tri vrste podupita.

Skalarni podupit vraća vrijednost odabranu iz preseka jedne kolone sa jednim redom, tj. jedino značenje. U principu, skalarni podupit se može koristiti gdje god je potrebna jedna vrijednost. Primjeri skalarnih potupita prikazani su u primjerima 13 i 14.

Podupit niza vraća vrijednosti nekoliko kolona tabele, ali kao jedan red. Potupit stringova se može koristiti gdje god se koristi konstruktor vrijednosti niza — obično predikati. Varijanta podupita stringova prikazana je u primjeru 15.

Podupit tabele vraća vrijednosti jedne ili više kolona tabele raspoređene na više od jednog reda. Potupit tablice se može koristiti gdje god se tablica može specificirati, na primjer, kao operand IN predikata.

Primjer 19. Korištenje potupita s provjerom jednakosti.Šminka spisak osoblja koje radi u poslovnici kompanije koja se nalazi na adresi Main St1 463.

SELECT

ODOsoblje

GDJEbr. grane = (ODABIR br

ODFilijala

GDJEulica = "163 Main S t");

Interni SELECT izraz (SELECT branchNo FROM Branch ...) koristi se za određivanje broja podružnice kompanije koja se nalazi na adresi Main St. (Postoji samo jedna takva grana kompanije, tako da je ovaj primjer primjer skalarnog podupita.) Nakon dobivanja broja potrebne grane, izvršava se vanjski podupit za odabir detalji o zaposlenima u ovom odjeljenju. Drugim riječima, unutrašnji operater SELECT vraća tablicu s jednom vrijednošću "BOOV. Ovo je broj podružnice kompanije koja se nalazi na 163 Main St1. Kao rezultat, vanjski SELECT izraz postaje sljedeći:

SELECTbroj osoblja, fIme, Iname, pozicija

ODOsoblje

GDJEbr. grane = "B0031;

Rezultati ovog upita prikazani su u tabeli. 29.

Tabela 29

Rezultat upita

broj osoblja fName IName pozicija
SG37 Ann Beech Asistent
SG14 David Ford Supervizor
SG5 Susan Brand Menadžer

Potupit je alat za kreiranje privremene tabele, čiji sadržaj preuzima i obrađuje eksterni operater. Potupit se može navesti odmah nakon operatora poređenja (tj. operatori =,<, >, <=, >=, <>) u klauzuli WHERE ili HAVING. Tekst potupita mora biti zatvoren u zagradama.

Primjer 20. Korištenje potupita sa agregatnim funkcijama. Navedite sve zaposlene sa iznadprosječnim platama, navodeći koliko je njihova plata veća od prosječne plate za preduzeće.

SELECTbroj osoblja, fIme, Ime, pozicija, plata - ( SELECT AVG(plata) OD osoblje) AS salDiff

ODOsoblje

GDJEplata> ( SELECT AVG(plata) OD S t a f f);

Treba napomenuti da se ne može direktno uključiti u izraz upita"GDJE plata> AVG (plata)", od upotrebe agregiranja funkcije u klauzuli WHERE su zabranjene. Da biste postigli željeni rezultat, kreirajte potupit koji izračunava prosječnu godišnju platu, a zatim ga koristite u eksternom SELECT naredbi za dohvaćanje informacija o onim zaposlenima u kompaniji čije su plate veće od ovog prosjeka. Drugim riječima, potupit vraća prosječnu godišnju platu kompanije, koja iznosi 17.000 funti.

Rezultat ovog skalarnog potupita se koristi u vanjskom SELECT izrazu za izračunavanje varijanse plata od prosjeka i za odabir informacija o zaposlenicima. Stoga, vanjski SELECT izraz postaje:

SELECTbroj osoblja, ime, ime, pozicija, plata - 17000 As salDiff

ODOsoblje

GDJEplata> 17000;

Rezultati izvršenja upita prikazani su u tabeli. trideset.

Tabela 30.

Rezultat upita

broj osoblja fName IName pozicija salDiff
SL21 John Bijelo Menadžer 13000.00
SG14 David Ford Supervizor 1000.00
SG5 Susan Brand Menadžer 7000.00

Primijenite na potupite slijedeći pravila i ograničenja.

1. ORDER BY klauzulu ne treba koristiti u potupitima, iako se može pojaviti u vanjskom SELECT izrazu.

2. SELECT lista potupita mora se sastojati od imena pojedinačnih stupaca ili izraza sastavljenih od njih, osim ako se ključna riječ EXISTS ne koristi u potupitu.

3. Po defaultu, imena stupaca u potupitu odnose se na tablicu imenovanu u FROM klauzuli potupita. Međutim, možete se pozvati i na stupce tablice navedene u FROM klauzuli vanjskog upita korištenjem kvalificiranih naziva stupaca (kao što je opisano u nastavku).

4. Ako je potupit jedan od dva operanda uključena u operaciju poređenja, onda potupit mora biti specificiran na desnoj strani ove operacije. Na primjer, sljedeći primjer pisanja upita iz prethodnog primjera je netačan jer je potupit postavljen na lijevu stranu operacije poređenja sa vrijednošću kolone plaće.

SELECT

ODOsoblje

GDJE(ODABERITE PROSJ. (platu) OD osoblja)< salary;

Primjer 21... Ugniježđeni potupiti i upotreba IN predikata. Napravite listu nekretnina za iznajmljivanje za koje su zaposleni odgovorni u poslovnici koja se nalazi na adresi Glavna st1 163.

SELECTbroj nekretnine, ulica, grad, poštanski broj, tip, sobe, najam

ODPropertyForRent

Poglavlje 5... SQL jezik: manipulisanje podacima 189

GDJEbroj osoblja IN (ODABIR br. osoblja

ODOsoblje

GDJEbrancliNo = (ODABIR br. grane

ODFilijala

GDJEulica = "163 Main S t"));

Prvi, najviše interni, upit ima za cilj da odredi broj podružnice kompanije koja se nalazi na adresi Main St 463. Drugi, međuupit, dohvaća informacije o osoblju koje radi u ovom odjelu. U ovom slučaju, više od jednog reda podataka je odabrani i stoga u eksternom upitu ne možete koristiti operator poređenja =. Umjesto toga morate koristiti ključnu riječ IN. Spoljni upit dohvaća informacije o zakupima za koje su odgovorni zaposleni u kompaniji, a podaci o kojima su dobijeni kao rezultat međuupita Rezultati upita su prikazani u tabeli 31.

Tabela 31

Rezultat upita

imovine br ulica grad poštanski broj tip sobe najam
PG16 5 Novar Dr Glasgow G129AX Stan
PG36 2 Manor Rd Glasgow G324QX Stan
PG21 18 Dale Rd Glasgow G12 Kuća

Ključne riječi BILO i SVE. Ključne riječi ANY i ALL mogu se koristiti s potupitima koji vraćaju jednu kolonu brojeva. Ako podupitu prethodi ključna riječ ALL, uvjet usporedbe je zadovoljen samo ako je zadovoljen za sve vrijednosti u koloni rezultata potupita. Ako tekstu potupita prethodi ključna riječ ANY, tada će se smatrati da je uvjet poređenja ispunjen ako je zadovoljen za barem jednu (jednu ili više) vrijednosti u rezultirajućem stupcu potupita. Ako potupit rezultira prazna vrijednost, tada će se uvjet poređenja smatrati ispunjenim za SVE ključnu riječ, a ne ispunjenim za BILO KOJU ključnu riječ. Prema ISO standardu, možete dodatno koristiti ključnu riječ SOME, koja je sinonim za BILO KOJU ključnu riječ.

Primjer 22. Koristeći ključne riječi ANY i SOME. Pronađite sve zaposlene čija je plata barem veća od plate jedan uposlenik filijale kompanije sa brojem "booz".

SELECTbroj osoblja, fIme, INime, pozicija, plata

ODOsoblje

GDJEplata> NEKI (ODABERITE platu

ODOsoblje

GDJEbr. grane = "B003");

Iako se ovaj upit može napisati pomoću potupita koji određuje minimalnu plaću osoblja odjeljenja sa brojem "BOOZ", nakon čega se eksternim podupitom mogu odabrati podaci o cijelom osoblju kompanije čija je plata veća od ove vrijednosti (vidi primjer 20), moguć je i drugi pristup koji se sastoji u korištenju ključnih riječi SOME / ANY. U ovom slučaju, unutrašnji potupit kreira skup vrijednosti (12000, 18000, 24000), a vanjski upit odabire informacije o onim zaposlenicima čija je plata veća od bilo koje vrijednosti u ovom

set (zapravo više od minimalne vrijednosti - 12000). Sviđa mi se alternativna metoda može se smatrati prirodnijim od definicije u potupitu minimalne plate. Ali u oba slučaja, isti rezultati izvršenje upita, koji su prikazani u tabeli. 32 .

Tabela 32

Rezultat upita

broj osoblja fName IName pozicija plata
SL21 John Bijelo Menadžer 30000.00
SG14 David Ford Supervizor 18000.00
SG5 Susan Brand Menadžer 24000.00

Primjer 23. Korištenje ključne riječi SVE. Pronađite sve zaposlene čije su plate veće od plaće bilo kojeg zaposlenika u ogranku kompanije.

SELECTbroj osoblja, fIme, INarae, pozicija, plata

ODOsoblje

GDJEplata> SVE(ODABIR plata

ODOsoblje

GDJEbr. grane = "BOG3");

Generalno, ovaj zahtjev je sličan prethodnom. I u ovom slučaju bi se mogao koristiti potupit koji određuje maksimalnu vrijednost plate osoblja odjeljenja pod brojem "WOOZ", a zatim se pomoću eksternog upita odabrati podaci o svim zaposlenima kompanije čije plate premašuju ovu vrijednost. Međutim, u ovaj primjer odabran je pristup koji koristi ključnu riječ ALL. Rezultati izvršenja upita prikazani su u tabeli. 33 .

Tabela 33

Rezultat upita

broj osoblja IName fName pozicija plata
SL21 Bijelo John Menadžer 30000,00

Upiti sa više tablica. Svi gornji primjeri imaju isto važno ograničenje: kolone smještene u rezultirajuću tablicu uvijek se biraju iz jedne tabele. Međutim, u mnogim slučajevima to nije dovoljno. Da biste kombinovali kolone iz nekoliko izvornih tabela u rezultujućoj tabeli, morate izvršiti operaciju veze. U SQL-u se operacija spajanja koristi za kombiniranje informacija iz dvije tablice formiranjem parova povezanih redova odabranih iz svake tablice. Parovi redova koji se nalaze u kombinovanoj tabeli sastavljaju se prema jednakosti vrednosti navedenih kolona uključenih u njih.

Ako trebate dobiti informacije iz nekoliko tablica, možete primijeniti podupit ili izvršiti spajanje između tabela. Ako rezultirajuća tablica upita mora sadržavati stupce iz različitih izvornih tabela, tada je preporučljivo koristiti mehanizam spajanja tablice. Da biste izvršili spajanje, dovoljno je navesti imena dvije ili više tablica u klauzuli FROM, odvojivši ih zarezima, a zatim uključiti u upit klauzulu WHERE koja definira stupce koji se koriste za spajanje navedenih tabela. Osim toga, umjesto imena tablica, možete koristiti alijasi, dodijeljena im u klauzuli FROM. U ovom slučaju, imena tablica i pseudonimi koji su im dodijeljeni moraju biti odvojeni razmacima. Pseudonimi se mogu koristiti za kvalificiranje imena stupaca kad god postoji nejasnoća o tome kojoj tablici određena kolona pripada. Osim toga, aliasi se mogu koristiti za skraćivanje imena tablica. Ako je pseudonim definiran za tablicu, može se koristiti bilo gdje gdje je potrebno ime te tablice.

Primjer 24. Jednostavna veza. Navedite imena svih kupaca koji su pogledali barem jednu nekretninu za iznajmljivanje i dali povratne informacije o njoj.

SELECTc.clientNo, fName, INName, propertyNo, komentar

ODKlijent c, Pregled v

GDJEc.clientNo = v.clientNo;

Ovaj izveštaj zahteva informacije i iz tabele klijenta i iz tabele pregleda, tako da ćemo koristiti mehanizam spajanja tabele kada pravimo upit. SELECT klauzula navodi sve kolone koje treba staviti u rezultirajuću tablicu upita. Imajte na umu da kolonu broja klijenta (clientNo) treba precizirati, budući da takva kolona može biti prisutna iu drugoj tabeli koja učestvuje u pridruživanju. Stoga je potrebno eksplicitno naznačiti koje vrijednosti tabele nas zanimaju. (U ovom primjeru, isto tako ste mogli odabrati vrijednosti za stupac clientNo iz tabele Pregled). Ime se specificira prefiksom imena kolone sa imenom odgovarajuće tabele (ili njenim alias-om). U našem primjeru se koristi vrijednost "c", specificirana kao pseudonim za tablicu Client. Za formiranje rezultirajućih redova koriste se oni redovi izvornih tabela koji imaju identičnu vrijednost u stupcu clientNo. Ovaj uslov je određen postavljanjem uslova pretrage sa.clientNo = v.clientNo. Slične kolone u originalnim tabelama se pozivaju kompatibilne kolone. Opisana operacija je ekvivalentna operaciji ravnopravnost spaja relacione algebre. Rezultati izvršenja upita prikazani su u tabeli. 34.

Tabela 34

Rezultat upita

klijent br fName IName imovine br komentar
CR56 Aline Stewart PG36
CR56 Aline Stewart PA14 premali
CR56 Aline Stewart PG4
CR62 Mary Tregear PA14 nema trpezarije
CR76 John Kej PG4 previše udaljeno

Najčešće se upiti za više tablica izvode na dvije tabele povezane odnosom jedan-prema-više (1: *) ili odnosom roditelj-dijete. U gornjem primjeru, koji uključuje pristup tablicama Client i Viewing, potonje su povezane upravo takvim odnosom. Svaki red u tabeli Pregledanje (podređeni) je povezan samo sa jednim redom u tabeli Klijent (roditelj), dok isti red u tabeli Klijent (roditelj) može biti povezan.

sa mnogo redova tabele za gledanje (dijete). Parovi redova koji se generiraju kada se upit izvrši su rezultat svih važećih kombinacija redova u podređenoj i nadređenoj tablici. U odeljku 3.2.5 detaljno je opisano kako u relaciona baza podataka, primarni i strani ključ tabela stvaraju odnos "roditelj-dijete". Tabela koja sadrži strani ključ je obično podređena, dok će tabela koja sadrži primarni ključ uvijek biti roditelj. Da biste koristili odnos roditelj-dijete u SQL upitu, morate navesti uvjet pretraživanja u kojem će se strani i primarni ključ uspoređivati. Primer 24 poredi primarni ključ tabele klijenta (sa br. klijenta) sa stranim ključem tabele pregleda (v. br. klijenta).

SQL standard dodatno pruža sljedeće načine definiranja ovo jedinjenje:

ODKlijent sa PRIDRUŽITE SE Pregled v ON c.clientNo = v.clientNo

ODKlijent J OIN Gledanje KORIŠĆENJE klijent br

ODKlijent NATURAL JOIN Gledanje

U svakom slučaju, klauzula FROM zamjenjuje originalne klauzule FROM i WHERE. Međutim, prva opcija kreira tablicu s dvije identične kolone clientNo, dok će u druga dva slučaja rezultirajuća tablica sadržavati samo jedan stupac clientNo.

Primjer 25. Sortiranje rezultata spajanja tabela. Za svaku filijalu kompanije navedite kadrovske brojeve i imena zaposlenih koji su zaduženi za sve objekte zakupljene, kao i objekte za

na koje odgovaraju.

SELECTbr. filijale, br. osoblja, fName, INName, br

ODStaff s, PropertyForRent str

GDJEs.staffNo = p.staffNo

POREDAK PObr. filijale, br. osoblja, br. imovine;

Da bi se rezultati lakše čitali, izlaz se sortira koristeći broj odjela kao glavni ključ sortiranja i broj osoblja i broj imovine kao sporedni ključ. Rezultati izvršenja upita prikazani su u tabeli. 35.

Tabela 35

Rezultat upita

br Broj osoblja fName IName imovine br
SZO SG14 David Ford PG16
SZO SG37 Ann Beech PG21
SZO SG37 Ann Beech PG36
BOO5 SL41 Mary Lee PL94
SBI7 SA9 Julie Howe PA14

Primjer 26. Spoj tri stola. Za svaku filijalu kompanije navedite kadrovske brojeve i imena zaposlenih zaduženih za sve iznajmljene objekte, navodeći grad u kojem se filijala nalazi i brojeve objekata za koje je svaki zaposlenik odgovoran.

SELECT b.br.filijale, b.grad, broj osoblja, fNaziv, INaziv, broj imovine

OD Filijala b, Osoblje s, PropertyForRent str

GDJE b.branchNo = s.branchNo I s.staffNo = p.staffNo

POREDAK PO b.br.filijale, br.s.osoblja, br. imovine;

Kolone iz tri izvorne tabele - Branch, Staff i PropertyForRent - moraju biti smeštene u rezultujuću tabelu, tako da biste trebali spojiti ove tabele u svom upitu. Tabele ogranaka i osoblja mogu se povezati pomoću klauzule b.branchNo = * s .branchNo, koja će povezati filijale kompanije sa osobljem koje u njima radi. Tablice Staff i PropertyForRent mogu se povezati korištenjem uvjeta s.staffNo = p.staffNo. Kao rezultat toga, svaki zaposlenik će biti povezan sa nekretninama za iznajmljivanje za koje je odgovoran. Rezultati izvršenja upita prikazani su u tabeli. 36.

Tabela 36

Rezultati upita

br grad staffMo fName IName imovine br
B003 Glasgow SG14 David Ford PG16
B003 Glasgow SG37 Ann Beech PG21
B003 Glasgow SG37 Ann Beech PG36
B005 London SL41 Julie Lee PL94
B007 Aberdeen SA9 Mary Howe PA14

Imajte na umu da vam SQL standard omogućava korištenje alternativne formulacije klauzula FROM i WHERE:

OD(Ogranak b PRIDRUŽITE se osoblju s KORIŠTENJEM podružnice) AS bs

PRIDRUŽITE SEPropertyForRent str KORIŠĆENJE broj osoblja

Primjer 27. Grupiranje po više kolona. Odredite broj nekretnina za iznajmljivanje za koje je odgovoran svaki zaposlenik.

SELECTbr. filijale, br. COUNT(*) AS count

FROM Staff s, PropertyForRent str

GDJE S.staffNo = p.staffNo

GROUP BYbr. filijale, br

POREDAK PObr. filijale, br. osoblja;

Da biste sastavili traženi izvještaj, prije svega morate saznati ko je od zaposlenih u kompaniji odgovoran za iznajmljene objekte. Ovaj zadatak se može riješiti spajanjem tablica Staff i PropertyForRent pomoću stupca staffNo u klauzulama FROM / WHERE. Zatim je potrebno formirati grupe koje se sastoje od broja odjeljenja i kadrovskih brojeva njegovih zaposlenih, za koje treba primijeniti klauzulu GROUP BY. Konačno, rezultirajuća tabela mora biti sortirana navođenjem ORDER BY klauzule. Rezultati izvršenja upita prikazani su u tabeli. 37.

Tabela 37

Rezultat upita

br broj osoblja count
V00Z SG14
V00Z SG37
B005 SL41
B007 SA9

Uspostavljanje veza. Spoj je podskup općenitije kombinacije podataka iz dvije tablice, tzv Kartezijanski... Dekartov proizvod dvije tabele je druga tabela, koja se sastoji od svih mogućih parova redova koji čine obe tabele. Skup kolona u rezultirajućoj tablici su svi stupci u prvoj tablici nakon kojih slijede svi stupci u drugoj tablici. Ako unesete upit u dvije tablice bez specificiranja klauzule WHERE, rezultat izvršavanja upita u SQL okruženju bit će kartezijanski proizvod ovih tablica. Osim toga, ISO standard pruža poseban format za SELECT izraz koji vam omogućava da izračunate kartezijanski proizvod dvije tablice:

SELECT (* j columnList]

IZ tabeleNaziv CROSS JOINCaNeulte2

Razmotrimo ponovo primjer u kojem su klijent i pregledne tabele spojene pomoću zajedničke kolone clientNo. Kada radite sa tabelama, čiji je sadržaj dat u tabeli. 3.6 i 3.8, kartezijanski proizvod ovih tabela će biti 20 redova (4 reda u tabeli klijenata x 5 redova u tabeli za pregled = 20 redova). Ovo je ekvivalentno izdavanju upita korištenog u primjeru 5.24, ali bez primjene klauzule WHERE. Procedura za generiranje tablice koja sadrži rezultate spajanja dvije tablice pomoću SELECT izraza je sljedeća.

1. Formira se kartezijanski proizvod tablica navedenih u FROM klauzuli.

2. Ako upit sadrži klauzulu WHERE, primijenite uvjete pretraživanja na svaki red kartezijanske tablice proizvoda i pohranite samo one redove u tablici koji ispunjavaju navedene uvjete. U smislu relacijske algebre, ova operacija se zove ograničenje Kartezijanski proizvod.

3. Za svaki preostali red određuje se vrijednost svakog elementa navedenog u SELECT listi, kao rezultat čega se formira poseban red rezultirajuće tablice.

4. Ako je klauzula SELECT DISTINCT prisutna u originalnom upitu, svi dupli redovi se uklanjaju iz rezultirajuće tablice.

5. Ako upit koji se izvršava sadrži ORDER BY klauzulu,


© 2015-2019 stranica
Sva prava pripadaju njihovim autorima. Ova stranica ne tvrdi autorstvo, ali pruža besplatno korišćenje.
Datum kreiranja stranice: 2016-08-07

Top srodni članci