Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Greške
  • Primjeri SQL upita u MariaDB (MySQL). Dodatak D

Primjeri SQL upita u MariaDB (MySQL). Dodatak D

  • Prevod
  • Tutorial
Da li vam treba “IZABIR * GDJE a = b OD c” ili “IZABIR GDJE a = b OD c NA *”?

Ako ste poput mene, onda ćete se složiti: SQL je jedna od onih stvari koje na prvi pogled izgledaju lako (čita se kao na engleskom!), ali iz nekog razloga morate guglati svaki jednostavan upit da biste pronašli ispravnu sintaksu.


A onda počinju spajanja, agregacije, potupiti, i ispada potpuna glupost. izgleda ovako:


SELECT members.firstname || "" || members.lastname AS "Puno ime" FROM borrowings INNER JOIN members ON members.memberid = borrowings.memberid INNER JOIN knjige ON books.bookid = borrowings.bookid WHERE borrowings.bookid IN (ODABIR bookid IZ knjiga GDJE zaliha> (ODABIR prosj. ) IZ knjiga)) GROUP BY članovi.ime, članovi.prezime;

Bue! Ovo će uplašiti svakog početnika, ili čak srednjeg programera, ako prvi put vidi SQL. Ali nije sve tako loše.


Lako je zapamtiti ono što je intuitivno, a uz pomoć ovog tutorijala nadam se da ću sniziti prag za ulazak u SQL za početnike, a za one sa iskustvom ponuditi novi način gledanja na SQL.


Iako je SQL sintaksa gotovo ista u različitim bazama podataka, ovaj članak koristi PostgreSQL za upite. Neki primjeri će raditi u MySQL i drugim bazama podataka.

1. Tri magične riječi

U SQL-u postoji mnogo ključnih riječi, ali SELECT, FROM i WHERE se pojavljuju u gotovo svakom upitu. Malo kasnije, shvatit ćete da ove tri riječi predstavljaju najosnovnije aspekte izgradnje upita baze podataka, a drugi, složeniji upiti su samo dodaci na njih.

2. Naša baza

Pogledajmo bazu podataka koju ćemo koristiti kao primjer u ovom članku:







Imamo knjižnicu i ljude. Postoji i posebna tabela za obračun izdatih knjiga.

  • Tabela knjiga pohranjuje informacije o naslovu, autoru, datumu objavljivanja i dostupnosti knjige. To je jednostavno.
  • Tabela “članovi” sadrži imena i prezimena svih ljudi koji su se registrovali u biblioteci.
  • U tabeli "posuđenosti" se nalaze podaci o posuđenim knjigama iz biblioteke. Kolona bookid se odnosi na ID provjerene knjige u tabeli „knjige“, a kolona memberid se odnosi na odgovarajuću osobu iz tabele „članovi“. Također imamo datum izdavanja i datum kada knjiga mora biti vraćena.

3. Jednostavan zahtjev

Počnimo s jednostavnim upitom: trebamo imena i identifikatori(id) svih knjiga koje je napisao autor "Dan Brown"


Zahtjev će biti ovakav:


SELECT bookid AS "id", naslov IZ knjiga WHERE autor = "Dan Brown";

A rezultat je ovakav:


id naslov
2 Izgubljeni simbol
4 Inferno

Prilično jednostavno. Hajde da pogledamo zahtev da razumemo šta se dešava.

3.1 OD - odakle dobijamo podatke

Ovo sada može izgledati očigledno, ali FROM će biti veoma važno kasnije kada dođemo do spajanja i podupita.


FROM pokazuje na tablicu za upit. To može biti postojeća tabela (kao u gornjem primjeru) ili tablica kreirana u hodu putem spajanja ili podupita.

3.2 GDJE - koje podatke prikazati

WHERE se samo ponaša kao filter žice koje želimo da izbacimo. U našem slučaju želimo da vidimo samo one redove u kojima je vrednost u koloni autora „Dan Brown“.

3.3 SELECT - kako prikazati podatke

Sada kada imamo sve kolone koje su nam potrebne iz tabele koja nam je potrebna, moramo odlučiti kako prikazati ove podatke. U našem slučaju su potrebni samo naslovi i identifikatori knjiga, tako da smo upravo to i mi izabrati koristeći SELECT. Istovremeno, možete preimenovati kolonu koristeći AS.


Cijeli upit se može vizualizirati jednostavnim dijagramom:


4. Veze (spoji)

Sada želimo vidjeti naslove (ne nužno jedinstvene) svih knjiga Dana Browna koje su izvučene iz biblioteke i kada ove knjige treba vratiti:


SELECT books.title AS "Title", borrowings.returndate AS "Return Date" FROM borrowings PRIDRUŽITE knjige NA borrowings.bookid = books.bookid WHERE books.author = "Dan Brown";

rezultat:


Naslov Datum povratka
Izgubljeni simbol 2016-03-23 00:00:00
Inferno 2016-04-13 00:00:00
Izgubljeni simbol 2016-04-19 00:00:00

Zahtjev je uglavnom sličan prethodnom. sa izuzetkom IZ sekcija. To znači da tražimo podatke iz druge tabele... Ne pristupamo ni tabeli knjiga ni tabeli pozajmica. Umjesto toga, pozivamo se na novi sto koji je nastao spajanjem dvije tabele.


borrowings JOIN books ON borrowings.bookid = books.bookid je nova tabela koja je formirana kombinovanjem svih zapisa iz tablica "knjige" i "posudbe" u kojima su vrijednosti bookid-a iste. Rezultat takvog spajanja bit će:



Zatim postavljamo upit za ovu tabelu na isti način kao u gornjem primjeru. To znači da kada spajate tablice, trebate samo da brinete o tome kako to spojiti. I tada zahtjev postaje jasan kao u slučaju „jednostavnog zahtjeva“ iz tačke 3.


Pokušajmo sa malo složenijim spajanjem dvije tablice.


Sada želimo da dobijemo imena i prezimena ljudi koji su iz biblioteke preuzeli autorsku knjigu "Dan Brown".


Ovaj put, idemo odozdo prema gore:


Korak Korak 1- odakle dobijamo podatke? Da bismo dobili željeni rezultat, treba da spojimo tabele "član" i "knjige" sa tabelom "posuđenosti". Odjeljak JOIN će izgledati ovako:


posudbe PRIDRUŽITE se knjigama NA borrowings.bookid = books.bookid PRIDRUŽITE članovima ON members.memberid = borrowings.memberid

Rezultat povezivanja možete vidjeti na linku.


Korak 2- koje podatke prikazujemo? Nas zanimaju samo podaci gdje je autor knjige “Dan Brown”


WHERE books.author = "Dan Brown"

Korak 3- kako prikazujemo podatke? Sada kada su podaci primljeni, potrebno je samo prikazati ime i prezime onih koji su uzeli knjige:


SELECT members.firstname AS "Ime", members.prezime AS "Prezime"

Super! Ostaje samo spojiti tri komponente i napraviti zahtjev koji nam je potreban:


SELECT members.firstname AS "Ime", members.prezime AS "Prezime" FROM borrowings PRIDRUŽITE knjige ON borrowings.bookid = books.bookid PRIDRUŽITE članove ON members.memberid = borrowings.memberid WHERE books.author = "Dan Brown";

Što će nam dati:


Ime Prezime
Mike Willis
Ellen Horton
Ellen Horton

Fino! Ali imena se ponavljaju (nisu jedinstvena). Uskoro ćemo ovo popraviti.

5. Agregacija

grubo govoreći, agregacije su potrebne za pretvaranje više redova u jedan... U isto vrijeme, tokom agregacije, različita logika se koristi za različite stupce.


Nastavimo s našim primjerom gdje se pojavljuju dupli nazivi. Vidi se da je Ellen Horton pozajmila više od jedne knjige, ali ovo nije najbolji način da prikaže ovu informaciju. Drugi zahtjev se može uputiti:


SELECT members.firstname AS "Ime", members.prezime AS "Prezime", count (*) KAO "Broj posuđenih knjiga" IZ posudbi PRIDRUŽITE knjige NA borrowings.bookid = books.bookid JOIN members ON members.memberid = posudbe .memberid WHERE books.author = "Dan Brown" GRUPA PO members.firstname, members.prezime;

Što će nam dati željeni rezultat:


Ime Prezime Broj posuđenih knjiga
Mike Willis 1
Ellen Horton 2

Gotovo sve agregacije dolaze s klauzulom GROUP BY. Ova stvar pretvara tabelu koja se može dohvatiti upitom u grupe tabela. Svaka grupa odgovara jedinstvenoj vrijednosti (ili grupi vrijednosti) za stupac koji smo naveli u GROUP BY. U našem primjeru konvertujemo rezultat iz prethodne vježbe u grupu redova. Također radimo agregaciju sa count, koja pretvara više redova u cjelobrojnu vrijednost (u našem slučaju, ovo je broj redova). Zatim se ova vrijednost dodjeljuje svakoj grupi.


Svaki red u rezultatu rezultat je agregacije svake grupe.



Možete doći do logičnog zaključka da sva polja u rezultatu treba ili navesti u GROUP BY, ili na njima treba izvršiti agregaciju. Budući da se sva ostala polja mogu međusobno razlikovati u različitim redovima, a ako ih odaberete sa SELECT, nije jasno koje od mogućih vrijednosti treba uzeti.


U gornjem primjeru, funkcija brojanja je obrađivala sve redove (pošto smo brojali broj redova). Druge funkcije kao što su sum ili max obrađuju samo navedene nizove. Na primjer, ako želimo saznati broj knjiga koje je napisao svaki autor, onda nam je potreban upit poput ovog:


SELECT autora, zbroj (zaliha) IZ knjiga GROUP BY autora;

rezultat:


autor suma
Robin sharma 4
Dan Brown 6
John Green 3
Amish Tripathi 2

Ovdje funkcija zbroja obrađuje samo kolonu zaliha i izračunava zbir svih vrijednosti u svakoj grupi.

6. Potupiti


Potupiti su redovni SQL upiti ugrađeni u veće upite. Podijeljeni su u tri tipa prema vrsti vraćenog rezultata.

6.1 Dvodimenzionalna tabela

Postoje upiti koji vraćaju više kolona. Dobar primjer je upit iz posljednje vježbe agregacije. Kao potupit, jednostavno će vratiti drugu tabelu prema kojoj se mogu napraviti novi upiti. Nastavljajući s prethodne vježbe, ako želimo saznati broj knjiga koje je napisao autor “Robin Sharma”, onda je jedan od mogućih načina korištenje potupita:


SELECT * FROM (IZABIR autora, suma (zaliha) IZ knjiga GRUPA PO autora) AS rezultati WHERE autor = "Robin Sharma";

rezultat:



Može se napisati kao: ["Robin Sharma", "Dan Brown"]


2. Sada iskoristimo ovaj rezultat u novom upitu:


SELECT naslov, bookid FROM knjiga GDJE autora IN (ODABIR autora IZ (ODABIR autora, suma (zaliha) IZ knjiga GRUPA PO autoru) AS rezultati WHERE zbroj> 3);

rezultat:


naslov bookid
Izgubljeni simbol 2
Ko će plakati kad umreš? 3
Inferno 4

Ovo je isto kao:


SELECT naslov, bookid FROM knjiga WHERE autor IN ("Robin Sharma", "Dan Brown");

6.3 Individualne vrijednosti

Postoje upiti koji rezultiraju samo jednim redom i jednom kolonom. Mogu se tretirati kao konstantne vrijednosti i mogu se koristiti gdje god se koriste vrijednosti, kao što su operatori poređenja. Mogu se koristiti i kao dvodimenzionalne tabele ili nizovi sa jednim elementom.


Hajde, na primjer, da se informišemo o svim knjigama koje su trenutno iznad prosjeka u biblioteci.


Prosječan iznos se može dobiti na sljedeći način:


odaberite prosječno (zaliha) iz knjiga;

Što nam daje:


7. Operacije pisanja

Većina pisanja u bazu podataka je prilično jednostavna u poređenju sa složenijim čitanjem.

7.1 Ažuriranje

Sintaksa za upit UPDATE je semantički ista kao i za upit za čitanje. Jedina razlika je u tome što umjesto odabira stupaca SELECT postavljamo vrijednosti SET.


Ako su sve knjige Dana Browna izgubljene, tada morate resetirati vrijednost količine. Zahtjev za to će biti ovakav:


AŽURIRAJTE knjige SET zaliha = 0 WHERE autor = "Dan Brown";

WHERE radi isto kao i prije: bira redove. Umjesto SELECT koji smo koristili prilikom čitanja, sada koristimo SET. Međutim, sada morate navesti ne samo ime kolone, već i novu vrijednost za ovu kolonu u odabranim redovima.


7.2 Izbrisati

DELETE upit je samo SELECT ili UPDATE upit bez naziva stupaca. Ozbiljno. Kao i kod SELECT i UPDATE, klauzula WHERE ostaje ista: ona bira redove koje treba izbrisati. Operacija brisanja uništava cijeli red, tako da nema smisla specificirati zasebne stupce. Dakle, ako odlučimo da ne resetujemo broj knjiga Dana Browna, već da potpuno izbrišemo sve zapise, onda možemo uputiti sljedeći zahtjev:


IZBRIŠI IZ knjiga WHERE author = "Dan Brown";

7.3 Umetak

Možda jedina stvar koja se razlikuje od drugih tipova upita je INSERT. Format je:


INSERT INTO x (a, b, c) VRIJEDNOSTI (x, y, z);

Gdje su a, b, c nazivi kolona, ​​a x, y i z vrijednosti koje treba umetnuti u te kolone, istim redoslijedom. To je u osnovi to.


Pogledajmo konkretan primjer. Evo INSERT upita koji ispunjava cijelu tabelu "knjige":


UMETNI U knjige (knjižnik, naslov, autor, objavljeno, dionica) VRIJEDNOSTI (1, "Potomak Ikšvakua", "Amiš Tripati", "22.06.2015", 2), (2, "Izgubljeni simbol", " Dan Brown "," 22-07-2010 ", 3), (3, "Ko će plakati kad umreš?", "Robin Sharma", "06-15-2006", 4), (4," Inferno " , "Dan Brown", "05-05-2014", 3), (5, "Greška u našim zvijezdama", "John Green", "01-03-2015", 3);

8. Verifikacija

Došli smo do kraja, predlažem mali test. Taj zahtjev pogledajte na samom početku članka. Možete li to shvatiti? Pokušajte ga razbiti na klauzule SELECT, FROM, WHERE, GROUP BY i razmotriti pojedinačne komponente potupita.


Evo ga, u čitljivijem obliku:


SELECT members.firstname || "" || members.lastname AS "Puno ime" FROM borrowings INNER JOIN members ON members.memberid = borrowings.memberid INNER JOIN knjige ON books.bookid = borrowings.bookid WHERE borrowings.bookid IN (ODABIR bookid IZ knjiga GDJE zaliha> (ODABIR prosj. ) IZ knjiga)) GROUP BY članovi.ime, članovi.prezime;

Ovaj upit vraća listu ljudi koji su kupili knjigu iz biblioteke koja ima natprosječan ukupni iznos.


rezultat:


Puno ime
Lida Tyler

Nadam se da ste uspjeli to shvatiti bez problema. Ali ako ne, bio bih zahvalan na vašim komentarima i povratnim informacijama kako bih mogao poboljšati ovaj post.

Oznake: Dodaj oznake

Tipovi podatakaSQL(Kako ustrkao u standardu)

Vrste nizova

Numerički tipovi podataka

Monetarni, karakterni, binarni tipovi podataka

Boolean tip. Enumerations

Primjeri najjednostavnijih SQL upita

Osnovni SELECT upiti

SQL SELECT izraz je najvažniji i najčešće korišten izraz. Dizajniran je za dohvaćanje informacija iz tablica baze podataka. Pojednostavljena sintaksa za SELECT izraz je sljedeća.

SELECT [ALL | DISTINCT] select_item_commalist

FROM table_reference_commalist

[WHERE uslovni_izraz]

[GROUP BY column_name_commalist]

[IMATI uvjetni_izraz]

[ORDER BY order_item_commalist]

U zahtjevu mogu nedostajati stavke u uglastim zagradama.

Ključna riječ SELECT govori bazi podataka da je klauzula zahtjev za povlačenjem.

Nakon riječi SELECT navode se nazivi polja (lista atributa) čiji se sadržaj traži, odvojeni zarezima.

Potrebna ključna riječ u klauzuli SELECT je riječ FROM (od). Nakon ključne riječi FROM slijedi lista imena tablica odvojenih zarezima iz kojih se preuzimaju informacije.

Na primjer, odaberite naslov, opis iz filma

Svaki SQL upit mora završiti sa ";" (tačka-zarez). Rezultat ovog upita bit će tabela...

Redoslijed kolona u ovoj tabeli odgovara redoslijedu polja navedenih u upitu

Ako trebate prikazati vrijednosti svih stupaca tabele, možete koristiti simbol "*" (zvjezdica) umjesto da navodite njihova imena.

SELECT * FROM film;

U ovom slučaju, rezultat izvršavanja upita bit će cijela tabela filma.

Još jednom, obratimo pažnju na činjenicu da tablice dobivene kao rezultat SQL upita ne zadovoljavaju u potpunosti definiciju relacijskog odnosa. Konkretno, mogu sadržavati tuple (stringove) sa istim vrijednostima atributa.

Na primjer, upit "lista imena glumaca" može se napisati na sljedeći način.

odaberite ime od glumca;

Njegov rezultat će biti tabela, tabela sadrži iste redove. Da biste isključili duple zapise iz rezultata SELECT upita, koristite ključnu riječ DISTINCT (drugačije).

Ako upit SELECT dohvaća više polja, tada DISTINCT eliminira duple redove u kojima su vrijednosti svih odabranih polja identične.

Prethodni zahtjev se može napisati na sljedeći način.

odaberite različito ime od glumca;

Kao rezultat, dobijamo tabelu u kojoj su dupli redovi isključeni.

Ključna riječ ALL, za razliku od DISTINCT, ima suprotan učinak, to jest, kada se koristi, dupli redovi se uključuju u izlaz. Režim specificiran ključnom riječi ALL je po defaultu uključen, stoga se praktično ne koristi u tu svrhu u stvarnim upitima.

Korištenje klauzule definirane ključnom riječi WHERE (where) u SELECT izrazu omogućava vam da navedete izraz uvjeta (predikat) koji prihvaća istinitu ili lažnu vrijednost za vrijednosti polja reda tablice na koje se odnosi SELECT izraz. Klauzula WHERE određuje koji redovi navedenih tablica trebaju biti odabrani. Tabela, koja je rezultat upita, uključuje samo one redove za koje uslov (predikat) naveden u klauzuli WHERE daje vrijednost istinitom.

Primjer: Napišite upit koji bira prezimena svih aktera po imenu PENELOPE

odaberite prezime od glumca

gdje first_name = "PENELOPE";

U uslovima navedenim u klauzuli WHERE, operacije poređenja definisane operatorima = (jednako),> (veće od),< (меньше), >= (veće ili jednako),<- (меньше или равно), <>(nije jednako), kao i logičke operatore AND, OR i NOT.

Na primjer, zahtjev za dobijanje naziva i opisa filmova - kratkih filmova (kraćih od 60 minuta), čiji najam košta manje od 3 dolara, izgledat će ovako:

odaberite naslov, opis iz filma

gde dužina< 60 and rental_rate < 3

Rezultat ovog upita je:

iznajmljivanje - iznajmljivanje

inventar - inventar, zalihe

prodavnica- zaliha, prodavnica

SQL jezik se koristi za dohvaćanje podataka iz baze podataka. SQL je programski jezik koji je vrlo sličan engleskom, ali dizajniran za programe upravljanja bazama podataka. SQL se koristi u svakom upitu u Accessu.

Razumijevanje kako SQL funkcionira pomaže vam da kreirate preciznije upite i olakšava popravljanje upita koji vraćaju netačne rezultate.

Ovaj članak je dio serije o SQL-u za Access. On opisuje osnove korištenja SQL-a za dohvaćanje podataka i daje primjere SQL sintakse.

U ovom članku

Šta je SQL?

SQL je programski jezik za rad sa skupovima činjenica i odnosima između njih. Programi za upravljanje relacionim bazama podataka kao što je Microsoft Office Access koriste SQL za manipulaciju podacima. Za razliku od mnogih programskih jezika, SQL je čitljiv i razumljiv čak i za početnike. Kao i mnogi programski jezici, SQL je međunarodni standard koji priznaju tijela za standardizaciju kao što su ISO i ANSI.

Skupovi podataka su opisani u SQL-u kako bi se odgovorilo na pitanja. Mora se koristiti ispravna sintaksa kada se koristi SQL. Sintaksa je skup pravila koja vam omogućavaju da pravilno kombinujete elemente jezika. SQL sintaksa je bazirana na engleskoj sintaksi i dijeli mnoge elemente sa sintaksom Visual Basica za aplikacije (VBA).

Na primjer, jednostavan SQL izraz koji dohvaća listu prezimena kontakata po imenu Mary može izgledati ovako:

SELECT Prezime
IZ kontakata
WHERE First_Name = "Marija";

Bilješka: SQL jezik se koristi ne samo za izvođenje operacija nad podacima, već i za kreiranje i modificiranje strukture objekata baze podataka, kao što su tablice. Dio SQL-a koji se koristi za kreiranje i modificiranje objekata baze podataka naziva se jezik opisa podataka DDL. DDL nije pokriven u ovom članku. Za više informacija pogledajte članak Kreiranje i izmjena tabela ili indeksa pomoću upita za definiciju podataka.

SELECT izjave

SELECT izraz se koristi za opisivanje skupa podataka u SQL-u. Sadrži potpuni opis skupa podataka koji treba preuzeti iz baze podataka, uključujući sljedeće:

    tabele koje sadrže podatke;

    veze između podataka iz različitih izvora;

    polja ili proračuni na osnovu kojih se biraju podaci;

    uvjeti odabira koje moraju zadovoljiti podaci uključeni u rezultat upita;

    potreba i način sortiranja.

SQL rečenice

SQL izraz se sastoji od nekoliko dijelova koji se nazivaju klauzule. Svaka klauzula u SQL izrazu ima drugačiju svrhu. Potrebni su neki prijedlozi. Sljedeća tablica navodi SQL izraze koji se najčešće koriste.

SQL klauzula

Opis

Obavezno

Definira polja koja sadrže podatke koje želite.

Definira tablice koje sadrže polja navedena u klauzuli SELECT.

Određuje kriterije za odabir polja koje moraju zadovoljiti svi zapisi uključeni u rezultate.

Određuje redoslijed sortiranja rezultata.

U SQL izrazu koji sadrži agregatne funkcije, identificira polja za koja klauzula SELECT ne izračunava zbirnu vrijednost.

Samo ako postoje takva polja

U SQL izrazu koji sadrži agregatne funkcije, definira uvjete koji se primjenjuju na polja za koja klauzula SELECT izračunava zbirnu vrijednost.

SQL termini

Svaki SQL izraz se sastoji od pojmova koji se mogu uporediti s dijelovima govora. Sljedeća tabela navodi tipove SQL pojmova.

SQL termin

Uporedivi deo govora

Definicija

Primjer

identifikator

imenica

Ime koje se koristi za identifikaciju objekta baze podataka, kao što je ime polja.

Kupci. [Broj telefona]

operater

glagola ili priloga

Ključna riječ koja predstavlja ili modificira radnju.

konstantan

imenica

Vrijednost koja se ne mijenja, kao što je broj ili NULL.

izraz

pridjev

Kombinacija identifikatora, operatora, konstanti i funkcija dizajniranih za izračunavanje jedne vrijednosti.

> = Roba [Cijena]

Osnovne SQL klauzule: SELECT, FROM i WHERE

Opšti format SQL naredbi:

SELECT polje_1
IZ tabele_1
WHERE kriterij_1
;

napomene:

    Access ignorira prijelome reda u SQL izrazima. Bez obzira na to, preporučuje se da svaku rečenicu započnete u novom redu kako bi SQL izraz bio lak za čitanje, kako za osobu koja ju je napisala, tako i za sve ostale.

    Svaki SELECT izraz završava tačkom i zarezom (;). Tačka i zarez se može pojaviti na kraju posljednje rečenice ili u zasebnom redu na kraju SQL izraza.

Primjer u Accessu

Sljedeći primjer pokazuje kako bi SQL izraz mogao izgledati u Accessu za jednostavan upit odabira.

1. SELECT klauzula

2. klauzula FROM

3. WHERE klauzula

Prođimo kroz primjer rečenicu po rečenicu da bismo razumjeli kako funkcionira SQL sintaksa.

SELECT klauzula

SELECT, kompanija

Ovo je SELECT klauzula. Sadrži izjavu (SELECT) iza koje slijede dva identifikatora ("[E-mail adresa]" i "Kompanija").

Ako identifikator sadrži razmake ili posebne znakove (na primjer, "Adresa e-pošte"), mora se staviti u uglaste zagrade.

U SELECT klauzuli, ne morate specificirati tablice koje sadrže polja i ne možete specificirati kriterije odabira koje moraju zadovoljiti podaci uključeni u rezultate.

U SELECT izrazu, klauzula SELECT uvijek dolazi ispred klauzule FROM.

FROM klauzula

IZ kontakata

Ovo je klauzula FROM. Sadrži operator (FROM) iza kojeg slijedi identifikator (Kontakti).

Polja za odabir nisu navedena u klauzuli FROM.

WHERE klauzula

WHERE Grad = "Seattle"

Ovo je klauzula WHERE. Sadrži operator (WHERE) iza kojeg slijedi izraz (Grad = "Rostov").

Postoji mnogo stvari koje možete učiniti s SELECT, FROM i WHERE klauzulama. Za više informacija o korištenju ovih prijedloga pogledajte sljedeće članke:

Rezultati sortiranja: ORDER BY

Kao i kod Microsoft Excela, Access može sortirati rezultate upita u tabeli. Koristeći klauzulu ORDER BY, također možete odrediti kako se rezultati sortiraju kada se pokrene upit. Ako se koristi ORDER BY klauzula, ona se mora pojaviti na kraju SQL izraza.

Klauzula ORDER BY sadrži listu polja za sortiranje, istim redoslijedom kojim će se sortiranje primijeniti.

Na primjer, pretpostavimo da prvo želite sortirati rezultate prema polju Kompanija u opadajućem redoslijedu, a zatim, ako postoje zapisi s istom vrijednošću polja Company, sortirajte ih prema polju Adresa e-pošte u rastućem redoslijedu. Klauzula ORDER BY bi izgledala ovako:

ORDER BY DESC,

Bilješka: Prema zadanim postavkama, Access sortira vrijednosti u rastućem redoslijedu (od A do Z, od najmanjih do najvećih). Da biste umjesto toga sortirali vrijednosti u opadajućem redoslijedu, morate navesti ključnu riječ DESC.

Za više informacija o klauzuli ORDER BY pogledajte članak ORDER BY klauzula.

Rad sa pivot podacima: GROUP BY i HAVING klauzule

Ponekad morate raditi sa zbirnim podacima, kao što su ukupna mjesečna prodaja ili najskuplji artikli na zalihama. Da biste to učinili, agregatna funkcija se primjenjuje na polje u klauzuli SELECT. Na primjer, ako upit rezultira brojem adresa e-pošte za svaku kompaniju, klauzula SELECT može izgledati ovako:

Mogućnost korištenja određene agregatne funkcije ovisi o vrsti podataka u polju i željenom izrazu. Za više informacija o dostupnim agregatnim funkcijama pogledajte članak SQL agregatne funkcije.

Određivanje polja koja se ne koriste u agregatnoj funkciji: klauzula GROUP BY

Kada koristite agregatne funkcije, obično morate kreirati klauzulu GROUP BY. Klauzula GROUP BY specificira sva polja koja nemaju primijenjenu agregatnu funkciju. Ako se agregatne funkcije primjenjuju na sva polja u upitu, tada ne morate kreirati klauzulu GROUP BY.

Klauzula GROUP BY mora odmah slijediti klauzulu WHERE ili FROM ako ne postoji klauzula WHERE. U GROUP BY klauzuli, polja su navedena istim redoslijedom kao u SELECT klauzuli.

Nastavimo s prethodnim primjerom. Ako SELECT klauzula primjenjuje agregatnu funkciju samo na polje [Email Address], tada će klauzula GROUP BY izgledati ovako:

GROUP BY Company

Za više informacija o klauzuli GROUP BY pogledajte članak GROUP BY klauzula.

Ograničavanje agregiranih vrijednosti korištenjem uvjeta grupisanja: klauzula HAVING

Ako trebate navesti uvjete za ograničavanje rezultata, ali polje na koje želite primijeniti se koristi u agregiranoj funkciji, ne možete koristiti klauzulu WHERE. Umjesto toga koristite klauzulu HAVING. Klauzula HAVING radi isto kao i klauzula WHERE, ali se koristi za agregirane podatke.

Na primjer, pretpostavimo da primijenite AVG funkciju (koja izračunava prosjek) na prvo polje u klauzuli SELECT:

SELECT COUNT (), Kompanija

Ako želite da ograničite rezultate upita na osnovu vrednosti funkcije COUNT, ne možete primeniti uslov filtera na to polje u klauzuli WHERE. Umjesto toga, uvjet treba staviti u HAVING klauzulu. Na primjer, ako želite da upit vrati redove samo ako kompanija ima više adresa e-pošte, možete koristiti sljedeću klauzulu HAVING:

IMATI BROJ ()> 1

Bilješka: Upit može uključivati ​​i klauzulu WHERE i klauzulu HAVING, s kriterijima za polja koja se ne koriste u agregatnim funkcijama navedenim u klauzuli WHERE i uvjetima za polja koja se koriste u agregatnim funkcijama u klauzuli HAVING.

Za više informacija o klauzuli HAVING, pogledajte članak HAVING klauzula.

Kombiniranje rezultata upita: UNION operator

UNION operator se koristi za pregled svih podataka koje vraća više, sličnih upita za odabir u isto vrijeme kao spojeni skup.

UNION operator vam omogućava da kombinujete dva SELECT izraza u jedan. SELECT izrazi koji se spajaju moraju imati isti broj i redoslijed izlaznih polja s istim ili kompatibilnim tipovima podataka. Kada pokrenete upit, podaci iz svakog skupa odgovarajućih polja se kombinuju u jedno izlazno polje, tako da izlaz upita ima isti broj polja kao i svaki SELECT izraz pojedinačno.

Bilješka: U upitima unije, numerički i tekstualni tipovi podataka su kompatibilni.

Koristeći UNION operator, možete odrediti da li dupli redovi, ako ih ima, trebaju biti uključeni u rezultate upita. Da biste to učinili, koristite ključnu riječ ALL.

Upit za kombiniranje dva SELECT izraza ima sljedeću osnovnu sintaksu:

SELECT polje_1
IZ tabele_1
UNION
SELECT polje_a
FROM table_a
;

Na primjer, pretpostavimo da imate dvije tabele pod nazivom "Proizvodi" i "Usluge". Obje tabele sadrže polja s nazivom proizvoda ili usluge, informacijama o cijeni i garanciji, kao i polje koje označava ekskluzivnost proizvoda ili usluge koja se nudi. Iako postoje različite vrste garancija u tabelama Proizvodi i usluge, osnovne informacije su iste (da li postoji garancija kvaliteta za pojedine proizvode ili usluge). Možete koristiti sljedeći upit za spajanje da kombinujete četiri polja iz dvije tabele:

SELECT naziv, cijena, garancija_dostupna, ekskluzivna_ponuda
IZ proizvoda
UNION ALL
SELECT naziv, cijena, garancija_dostupna, ekskluzivna_ponuda
FROM Services
;

Za više informacija o kombiniranju SELECT izraza pomoću UNION operatora, pogledajte članak

Zahtjevi se pišu bez izbjegavanja citata, pošto MySQL, MS SQL i PostGree oni su različiti.

SQL upit: dobivanje specificiranih (obaveznih) polja iz tablice

SELECT id, country_title, count_people FROM table_name

Dobijamo listu zapisa: SVE zemlje i njihovo stanovništvo. Imena obaveznih polja su odvojena zarezima.

SELECT * FROM table_name

* označava sva polja. Odnosno, biće utisaka SVE polja podataka.

SQL upit: izlazni zapisi iz tablice isključujući duplikate

ODABIR DISTINCT country_title IZ table_name

Dobijamo listu zapisa: zemlje u kojima se nalaze naši korisnici. Može biti mnogo korisnika iz jedne zemlje. U ovom slučaju, ovo je vaš zahtjev.

SQL upit: prikaz zapisa iz tablice prema specificiranom uvjetu

SELECT id, country_title, city_title FROM table_name WHERE count_people> 100000000

Dobijamo listu zapisa: zemlje u kojima je broj ljudi veći od 100.000.000.

SQL upit: prikaz zapisa iz tablice s redoslijedom

SELECT id, city_title IZ table_name ORDER BY city_title

Dobijamo listu zapisa: gradovi po abecednom redu. Na početku A, na kraju I.

SELECT id, city_title IZ table_name ORDER BY city_title DESC

Dobijamo listu zapisa: gradovi u obrnutom smjeru ( DESC) uredu. Na početku I, na kraju A.

SQL upit: brojenje broja zapisa

SELECT COUNT (*) FROM table_name

Dobijamo broj (broj) zapisa u tabeli. U ovom slučaju NEMA liste zapisa.

SQL upit: izlaz potrebnog raspona zapisa

SELECT * FROM table_name LIMIT 2, 3

Dobijamo 2 (drugi) i 3 (treći) zapisa iz tabele. Zahtjev je koristan prilikom kreiranja navigacije na WEB stranicama.

SQL upiti s uvjetima

Izlaz zapisa iz tabele prema datom uslovu pomoću logičkih operatora.

SQL upit: I konstrukcija

SELECT id, city_title IZ table_name WHERE zemlja = "Rusija" I nafta = 1

Dobijamo listu zapisa: gradovi iz Rusije I imaju pristup ulju. Kada se koristi operater I, tada se oba uslova moraju podudarati.

SQL upit: OR konstrukcija

SELECT id, city_title FROM table_name WHERE zemlja = "Rusija" OR zemlja = "SAD"

Dobijamo listu zapisa: svi gradovi iz Rusije ILI SAD. Kada se koristi operater ILI, tada se barem jedan uvjet mora podudarati.

SQL upit: I NE konstrukcija

SELECT id, user_login FROM table_name WHERE country = "Rusija" I NE count_comments<7

Dobijamo listu zapisa: svi korisnici iz Rusije I ko je napravio NE MANJE 7 komentara.

SQL upit: IN (B) konstrukcija

SELECT id, user_login FROM table_name WHERE country IN ("Rusija", "Bugarska", "Kina")

Dobijamo listu zapisa: svi korisnici koji žive u ( IN) (Rusija, ili Bugarska, ili Kina)

SQL upit: NIJE U izgradnji

SELECT id, user_login FROM table_name GDJE zemlja NIJE U ("Rusija", "Kina")

Dobijamo listu zapisa: svi korisnici koji ne žive u ( NOT IN) (Rusija ili Kina).

SQL upit: IS NULL konstrukcija (prazne ili NE prazne vrijednosti)

SELECT id, user_login FROM table_name WHERE status JE NULL

Dobijamo listu unosa: svi korisnici kod kojih status nije definiran. NULL je posebna tema i stoga se provjerava zasebno.

SELECT id, user_login FROM table_name WHERE stanje NIJE NULL

Dobijamo listu zapisa: svi korisnici kod kojih je definiran status (NE NULA).

SQL upit: LIKE konstrukcija

SELECT id, user_login FROM table_name GDJE prezime LIKE "Ivan%"

Dobijamo listu zapisa: korisnika čije prezime počinje kombinacijom "Ivan". Znak % znači BILO KOJI broj BILO KOJI znakova. Da biste pronašli znak %, trebate koristiti izlazni "Ivan \%".

SQL upit: BETWEEN konstrukcija

SELECT id, user_login IZ table_name GDJE plata IZMEĐU 25000 I 50000

Dobijamo spisak evidencije: korisnici koji primaju plate od 25.000 do 50.000 uključujući.

Postoji PUNO logičkih operatora, pa detaljno proučite dokumentaciju SQL servera.

Složeni SQL upiti

SQL upit: kombiniranje više upita

(SELECT id, user_login IZ table_name1) UNION (SELECT id, user_login FROM table_name2)

Dobijamo listu zapisa: korisnika koji su registrovani u sistemu, kao i onih korisnika koji su posebno registrovani na forumu. Višestruki upiti se mogu kombinovati sa UNION operatorom. UNION se ponaša kao SELECT DISTINCT, to jest, odbacuje duple vrijednosti. Da biste dobili apsolutno sve zapise, morate koristiti operator UNION ALL.

SQL upit: brojanje vrijednosti polja MAX, MIN, SUM, AVG, COUNT

Izlaz jedan, maksimalna vrijednost brojača u tabeli:

SELECT MAX (brojac) FROM table_name

Izlaz jedan, minimalna vrijednost brojača u tabeli:

SELECT MIN (brojac) FROM table_name

Prikaz zbira svih vrijednosti brojača u tabeli:

SELECT SUM (brojac) FROM table_name

Prikaz prosječne vrijednosti brojača u tabeli:

SELECT AVG (brojač) IZ table_name

Prikaz broja brojača u tabeli:

SELECT COUNT (counter) FROM table_name

Prikaz broja brojača u radionici br. 1, u tabeli:

SELECT COUNT (counter) FROM table_name WHERE office = "Prodavnica #1"

Ovo su najpopularnije komande. Preporučljivo je, gdje je moguće, koristiti SQL upite ove vrste za izračunavanje, budući da se nijedno programsko okruženje ne može usporediti u brzini obrade podataka sa samim SQL serverom prilikom obrade vlastitih podataka.

SQL upit: grupiranje zapisa

SELECT kontinent, SUM (country_area) IZ zemlje GRUPA PO kontinentu

Dobijamo listu rekorda: sa imenom kontinenta i sa zbirom površina svih njihovih zemalja. Odnosno, ako postoji imenik zemalja u kojima svaka zemlja ima svoje područje, onda pomoću klauzule GROUP BY možete saznati veličinu svakog kontinenta (na osnovu grupiranja po kontinentima).

SQL upit: korištenje više tablica preko aliasa

ODABERITE o.order_no, o.amount_paid, c.company IZ narudžbi AS o, kupac AS sa GDJE o.custno = c.custno I c.city = "Tyumen"

Dobijamo listu zapisa: narudžbe od kupaca koji žive samo u Tjumenu.

Naime, sa pravilno dizajniranom bazom podataka ovog tipa, upit je najčešći, pa je u MySQL uveden poseban operator koji radi mnogo puta brže od prethodno napisanog koda.

ODABERITE o.order_no, o.amount_paid, z.company IZ narudžbi KAO o LIJEVI PRIDRUŽITE se kupcu KAO z ON (z.custno = o.custno)

Ugniježđeni podupiti

SELECT * FROM table_name GDJE plata = (IZABIR MAX (plata) OD zaposlenog)

Dobijamo jedan zapis: podatke o korisniku sa maksimalnom platom.

Pažnja! Ugniježđeni potupiti su jedno od uskih grla u SQL serverima. Zajedno sa svojom fleksibilnošću i snagom, oni također značajno povećavaju opterećenje servera. Što dovodi do katastrofalnog usporavanja rada ostalih korisnika. Slučajevi rekurzivnih poziva sa ugniježđenim upitima su vrlo česti. Stoga, toplo preporučujem da NE koristite ugniježđene upite, već da ih razbijete na manje. Ili koristite gornju kombinaciju LEFT JOIN. Pored ove vrste zahtjeva, zahtjevi su pojačano žarište narušavanja sigurnosti. Ako odlučite da koristite ugniježđene potupite, onda ih morate vrlo pažljivo dizajnirati i izvršiti početna pokretanja na kopijama baza podataka (testne baze podataka).

SQL upiti mijenjaju podatke

SQL upit: INSERT

Instrukcije INSERT omogućavaju umetanje zapisa u tabelu. Jednostavnim riječima, kreirajte liniju s podacima u tabeli.

Opcija broj 1. Često se koristi instrukcija:

INSERT INTO table_name (id, user_login) VRIJEDNOSTI (1, "ivanov"), (2, "petrov")

U tabeli" table_name"2 (dva) korisnika će biti ubačena odjednom.

Opcija broj 2. Pogodnije je koristiti stil:

INSERT table_name SET id = 1, user_login = "ivanov"; INSERT table_name SET id = 2, user_login = "petrov";

Ovo ima svoje prednosti i nedostatke.

Glavni nedostaci:

  • Mnogi mali SQL upiti rade nešto sporije od jednog velikog SQL upita, ali drugi upiti će biti stavljeni u red za uslugu. Odnosno, ako se veliki SQL upit izvršava 30 minuta, onda će za sve to vrijeme ostali upiti dimiti bambus i čekati svoj red.
  • Ispostavilo se da je zahtjev masovniji od prethodne verzije.

Glavne prednosti:

  • Tokom malih SQL upita, drugi SQL upiti nisu blokirani.
  • Lakoća čitanja.
  • Fleksibilnost. U ovoj opciji ne možete pratiti strukturu, već dodati samo potrebne podatke.
  • Prilikom formiranja arhiva na ovaj način, možete jednostavno kopirati jedan red i pokrenuti ga kroz komandnu liniju (konzolu), a da ne vraćate cijelu ARHIVU.
  • Stil pisanja je sličan naredbi UPDATE, što ga čini lakšim za pamćenje.

SQL upit: UPDATE

UPDATE table_name SET user_login = "ivanov", user_surname = "Ivanov" GDJE id = 1

U tabeli" table_name„U zapisu sa id = 1, vrijednosti polja user_login i user_surname će biti promijenjene na navedene vrijednosti.

SQL upit: DELETE

DELETE FROM table_name WHERE id = 3

Zapis sa ID brojem 3 će biti obrisan u tabeli table_name.

  1. Preporučuje se da sva imena polja napišete malim slovima i, ako je potrebno, odvojite ih prisilnim razmakom "_" radi kompatibilnosti sa različitim programskim jezicima kao što su Delphi, Perl, Python i Ruby.
  2. Napišite SQL naredbe VELIKIM slovima radi čitljivosti. Uvijek zapamtite da drugi ljudi mogu pročitati kod nakon vas, a najvjerovatnije i vi sami nakon N vremena.
  3. Imenujte polja s početka imenice, a zatim radnju. Na primjer: status_grad, korisnički_login, korisničko_ime.
  4. Pokušajte izbjeći zamjenske riječi na različitim jezicima koje mogu uzrokovati probleme u SQL-u, PHP-u ili Perlu, kao što su (ime, broj, veza). Na primjer: veza se može koristiti u MS SQL-u, ali je rezervirana u MySQL-u.

Ovaj materijal je kratka referenca za svakodnevni rad i ne tvrdi da je super mega autoritativni izvor, koji je primarni izvor SQL upita za određenu bazu podataka.

Tablični izrazi potupiti su imenovani i koriste se tamo gdje se očekuje da tabela postoji. Postoje dvije vrste tabličnih izraza:

    izvedene tablice;

    generalizovani tabelarni izrazi.

Ova dva oblika tabličnih izraza razmatraju se u sljedećim pododjeljcima.

Izvedene tabele

Izvedena tabela je tabelarni izraz uključen u klauzulu FROM upita. Izvedene tablice se mogu koristiti kada pseudonimi stupaca nisu izvodljivi jer SQL prevoditelj obrađuje drugi izraz prije nego što se pseudonim postane poznat. Primjer u nastavku pokušava koristiti pseudonim kolone u situaciji kada se druga klauzula obrađuje prije nego što je pseudonim poznat:

USE SampleDb; SELECT MJESEC (EnterDate) kao enter_month FROM Works_on GROUP BY enter_month;

Pokušaj izvršenja ovog upita rezultirat će sljedećom porukom o grešci:

Poruka 207, nivo 16, stanje 1, red 5 Nevažeći naziv kolone "enter_month". (Poruka 207: Nivo 16, stanje 1, red 5 Nevažeći naziv stupca enter_month)

Uzrok greške je taj što se klauzula GROUP BY obrađuje prije nego što se obradi pridružena SELECT lista, a pseudonim stupca enter_month nije poznat prilikom obrade ove grupe.

Ovaj problem se može riješiti korištenjem izvedene tablice koja sadrži prethodni upit (bez klauzule GROUP BY), budući da se klauzula FROM izvršava prije klauzule GROUP BY:

USE SampleDb; SELECT enter_month FROM (SELECT MONTH (EnterDate) kao enter_month FROM Works_on) AS m GROUP BY enter_month;

Rezultat izvršavanja ovog upita će biti ovakav:

Tipično, tabelarni izraz se može postaviti bilo gdje u SELECT izrazu gdje se može pojaviti ime tablice. (Rezultat tabelarnog izraza je uvijek tabela ili, u posebnim slučajevima, izraz.) Sljedeći primjer pokazuje upotrebu tabelarnog izraza na listi odabira SELECT izraza:

Rezultat ovog upita:

Generalizirani tabelarni izrazi

Zajednički tabelarni izraz (CTE) je izraz imenovane tablice koji podržava Transact-SQL jezik. Generički tabelarni izrazi se koriste u sljedeća dva tipa upita:

    nerekurzivno;

    rekurzivno.

Ove dvije vrste zahtjeva razmatraju se u sljedećim odjeljcima.

OTB i nerekurzivni upiti

Nerekurzivni OTB obrazac možete koristiti kao alternativu izvedenim tabelama i pogledima. Obično se OTB definiše pomoću WITH klauzule i opcijski upit koji upućuje na ime korišteno u klauzuli WITH. Ključna riječ WITH je dvosmislena u Transact-SQL-u. Da biste izbjegli dvosmislenost, završite izraz koji prethodi klauzuli WITH tačkom i zarezom.

USE AdventureWorks2012; ODABERITE SalesOrderID IZ Sales.SalesOrderHeader WHERE TotalDue> (ODABRAJTE AVG (TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR (OrderDate) = "2005") I Freight> (ODABRAJTE AVG (TotalDue) FROMOrOderHeaderSales /OderHeaderDa2. 2.5;

Upit u ovom primjeru odabire narudžbe čiji su ukupni porezi (TotalDue) veći od prosjeka za sve poreze i čiji su troškovi prevoza (Freight) veći od 40% prosjeka za poreze. Glavno svojstvo ovog upita je njegov volumen, pošto potupit treba napisati dvaput. Jedan od mogućih načina da se smanji veličina konstrukcije upita je kreiranje pogleda koji sadrži potupit. Ali ovo rješenje je donekle teško, jer zahtijeva kreiranje pogleda, a zatim njegovo brisanje nakon završetka izvršenja upita. Najbolji pristup bi bio stvaranje OTB-a. Primjer ispod pokazuje upotrebu nerekurzivnog OTB-a, koji skraćuje gornju definiciju upita:

USE AdventureWorks2012; WITH price_calc (year_2005) AS (SELECT AVG (TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR (OrderDate) = "2005") SELECT SalesOrderID FROM Sales.SalesOrderHeader WHERE TotalDue> (SELECT FROM year_20cal)

Sintaksa za klauzulu WITH u nerekurzivnim upitima je:

Parametar cte_name predstavlja OTB ime koje identificira rezultujuću tablicu, a parametar column_list predstavlja listu stupaca u izrazu tablice. (U gornjem primjeru, OTB je nazvan price_calc i ima jedan stupac, year_2005.) Parametar inner_query predstavlja SELECT izraz koji definira skup rezultata odgovarajućeg izraza tablice. Definirani izraz tablice se tada može koristiti u vanjskom upitu outer_query. (Vanjski upit u gornjem primjeru koristi OTB price_calc i njegov stupac year_2005 da pojednostavi dvostruko ugniježđeni upit.)

OTB i rekurzivni upiti

Ovaj odjeljak predstavlja materijal povećane složenosti. Stoga, kada ga čitate prvi put, preporučuje se da ga preskočite i vratite se kasnije. OTB-ovi mogu implementirati rekurzije jer OTB-ovi mogu sadržavati reference na sebe. Osnovna OTB sintaksa za rekurzivni upit izgleda ovako:

Parametri cte_name i column_list imaju isto značenje kao u OTB-u za nerekurzivne upite. Tijelo klauzule WITH sastoji se od dva upita koja kombinuje operator UNION ALL... Prvi upit se poziva samo jednom i počinje akumulirati rezultat rekurzije. Prvi operand UNION ALL operatora se ne odnosi na OTB. Ovaj upit se zove referentni upit ili izvor.

Drugi zahtjev sadrži vezu na OTB i predstavlja njegov rekurzivni dio. Zbog toga se naziva rekurzivnim članom. U prvom pozivu rekurzivnom dijelu, OTB referenca predstavlja rezultat referentnog upita. Rekurzivni član koristi rezultat prvog poziva na upit. Nakon toga, sistem ponovo poziva rekurzivni dio. Poziv rekurzivnom članu se prekida kada mu prethodni poziv vrati prazan skup rezultata.

Operator UNION ALL spaja trenutno akumulirane nizove, kao i dodatne nizove koje trenutni poziv dodaje rekurzivnom članu. (Prisustvo operatora UNION ALL znači da dupli redovi neće biti uklonjeni iz rezultata.)

Konačno, parametar outer_query definira vanjski upit koji koristi OTB da dobije sve pozive u uniju oba člana.

Da bismo demonstrirali rekurzivni OTB obrazac, koristimo tablicu Airplane koja je definirana i popunjena kodom prikazanim u primjeru ispod:

USE SampleDb; CREATE TABLE Avion (ContainingAssembly VARCHAR (10), ContainedAssembly VARCHAR (10), QuantityContained INT, UnitCost DECIMAL (6,2)); UMETNI U VRIJEDNOSTI aviona ("Avion", "Fuselage", 1, 10); INSERT INTO Airplane VALUES ("Airplane", "Wings", 1, 11); INSERT INTO Airplane VALUES ("Avion", "Rep", 1, 12); UMETNI U VRIJEDNOSTI aviona ("Fuselage", "Salon", 1, 13); UMETNI U VRIJEDNOSTI aviona ("Fuselaž", "Kabina", 1, 14); UMETNI U VRIJEDNOSTI aviona ("Fuselage", "Nose", 1, 15); UMETNI U VRIJEDNOSTI aviona ("Salon", NULL, 1.13); UMETNI U VRIJEDNOSTI aviona ("Kabina", NULL, 1, 14); INSERT INTO Airplane VALUES ("Nos", NULL, 1, 15); INSERT INTO Airplane VALUES ("Wings", NULL, 2, 11); INSERT INTO Airplane VALUES ("Rep", NULL, 1, 12);

Tabela aviona ima četiri kolone. Kolona ContainingAssembly identifikuje sklop, a kolona ContainedAssembly identifikuje delove (jedan za drugim) koji čine odgovarajući sklop. Slika ispod daje grafički prikaz mogućeg tipa aviona i njegovih sastavnih dijelova:

Tabela aviona se sastoji od sljedećih 11 redova:

Primjer ispod prikazuje klauzulu WITH koja se koristi za definiranje upita koji izračunava ukupnu cijenu svakog sklopa:

USE SampleDb; WITH list_of_parts (sklop1, količina, cijena) AS (ODABIR ContainingAssembly, QuantityContained, UnitCost FROM Airplane GDE ContainedAssembly JE NULL UNION SVE SELECT a.ContainingAssembly, a.QuantityContained, CAST (l.M.c.) Kvant. ) FROM list_of_parts l, Avion a WHERE l.assembly1 = a.ContainedAssembly) SELECT assembly1 "Part", quantity "Qty", cost "Cijena" FROM list_of_parts;

WITH klauzula definira OTB listu pod nazivom list_of_parts sa tri kolone: ​​sklop1, količina i cijena. Prvi SELECT izraz u primjeru poziva se samo jednom da bi se sačuvali rezultati prvog koraka procesa rekurzije. Naredba SELECT u posljednjem redu primjera prikazuje sljedeći rezultat.

Top srodni članci