2. Date functions
Podaci tipa DATE
Oraklove baze podataka čuvaju datume u numeričkom formatu
koji uključuje vek, godinu, mesec, dan, sate, minute i sekunde.
Difolt prikaz i izlazni format za bilo koji datum je DD-MON-YY
na primer: 22-MAY-08.
SYSDATE
SYSDATE je datumska funkcija koja vraća vreme i datum sa
tekućeg servera baze podataka, a prikazuje samo datum u
formatu DD-MON-YY.
4. Datumske funkcije
Date functions
Sve datumske funkcije vraćaju vrednost tipom DATE osim
funkcije MONTHS_BETWEEN , koja vraća numerički tip
vrednosti.
Pogledajmo datume zaposlenja u tabeli EMPLOYEES za
zaposlene u odeljenju 90 i primenimo na njih datumske
funkcije iz tabele sa pretodnog slajda.
SELECT employee_id, first_name, last_name, hire_date
FROM employees WHERE department_id = 90;
EMPLOYEE_ID FIRST_NAME LAST_NAME HIRE_DATE
100 Steven King 17-JUN-87
101 Neena Kochhar 21-SEP-89
102 Lex De Haan 13-JAN-93
5. MONTHS_BETWEEN(kasniji_datum, raniji_datum)
vraća broj meseci između datuma datih u zagradi
Date functions
SELECT employee_id, hire_date, SYSDATE,
MONTHS_BETWEEN(SYSDATE, hire_date) "Trajanje"
FROM employees WHERE department_id = 90;
EMPL
OYEE
_ID
HIRE_
DATE
SYSDA
TE
Trajanje
100
17-
JUN-87
15-
MAY-08
250.955526060334528076463560334528076464
101
21-
SEP-89
15-
MAY-08
223.826493802270011947431302270011947431
102
13-
JAN-93
15-
MAY-08
184.084558318399044205495818399044205496
6. MONTHS_BETWEEN(kasniji_datum, raniji_datum)
vraća broj meseci između datih datuma.
Rezultat je tipa NUMBER pa se mogu primeniti
numeričke funkcije ROUND i TRUNC da bismo
dobili ceo broj meseci.
Date functions
SELECT employee_id, hire_date, SYSDATE,
ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) "Round(Trajanje)",
TRUNC(MONTHS_BETWEEN(SYSDATE, hire_date)) "Trunc(Trajanje)"
FROM employees WHERE department_id = 90;
EMPLOYEE_ID HIRE_DATE SYSDATE Round(Trajanje) Trunc(Trajanje)
100 17-JUN-87 15-MAY-08 251 250
101 21-SEP-89 15-MAY-08 224 223
102 13-JAN-93 15-MAY-08 184 184
7. Računske operacije sa danima
Datumi se u Oraklovoj bazi podataka pamte kao brojevi čiji
ceo deo predstavlja datumsku komponentu (broj dana), a
razlomljeni (decimalni) deo predstavlja vremensku
komponentu (sati, minuti i sekunde datog dana).
Zato se za račun sa brojem dana koriste numeričke operacije
+ i – .
Koji je datum bio pre 100 dana? Koji datum će biti za 50 dana?
SELECT SYSDATE, SYSDATE-100, SYSDATE+50
FROM DUAL;
SYSDATE SYSDATE-100 SYSDATE+50
16-MAY-08 06-FEB-08 05-JUL-08
8. Funkcija NVL
Postupak sa Null-vrednostima
Upoznali smo se sa terminom “null”. Njime označavamo
nepostojeću, neutvrđenu, nedodeljenu, nepoznatu ili
neprimenjivu vrednost.
Funkcije i operacije po pravilu ignorišu null-polja, izostavljaju ih
jer se operacije ne mogu izvršiti nad “ničim”.
Međutim, polja sa null-vrednošću su važna jer mogu da nose
važnu informaciju i ponekad ih ne treba izostaviti iz obrade.
Recimo, ako je datum_smrti=NULL, to znači da je čovek još živ.
Postoji nekoliko funkcija koje, na određeni način, konvertuju
null-vrednost u nešto što se može obrađivati. Na ovom kursu
ćemo učiti o jednoj od njih, o funkciji NVL.
9. Funkcija NVL
Sintaksa NVL funkcije
NVL(a, b)
a – kolona ili izraz koji može imati null-vrednost
b – vrednost kojom se zamenjuje null-vrednost
1) a i b moraju biti istog tipa
2) b zamenjuje a samo ako je a=null,
inače a zadržava svoju ne-null-vrednost.
Funkcija NVL konvertuje null-vredost u novu vrednost, odnosno
u neki datum, niz karaktera ili broj.
Nova vrednost mora da pripada istom tipu podataka kao kolona
koja se konvertuje.
NVL ne dira vrednosti koje nisu null.
10. Funkcija NVL
Primer
Tabela D_PLAY_LIST_ITEMS sadrži izbor pesama za
planirane događaje. Na primer, na događaju čiji je id=100 će
se puštati peme br. 45, 46 i 47.
EVENT_ID SONG_ID COMMENTS
100 45 Play late
100 46 -
100 47 Play early
105 48 Play after cake cutting
105 49 Play first
105 47 Play for the father
Kolona COMMENTS daje DJ-u uputstva kako da postupa sa
kojom pesmom. Ništa posebno nije rečeno za pesmu 46. To
možemo konstatovati na sledeći način:
11. Funkcija NVL
Primer
SELECT event_id "Događaj", song_id "Pesma",
NVL(comments, 'Ništa posebno') "Pazi!"
FROM d_play_list_items;
Događaj Pesma Pazi!
100 45 Play late
100 46 Ništa posebno
100 47 Play early
105 48 Play after cake cutting
105 49 Play first
105 47 Play for the father
12. Inner versus Outer Joins
Spoljašnje spajanje
Unutrašnje spajanje (inner join) dve tabele, s kojim smo do
sada radili, vraća podatke koji zadovoljavaju uslov spajanja.
Ponekad nas, međutim, interesuju redovi jedne ili obe tabele
koji se, prema datom uslovu spajanja, ne mogu spojiti ni sa
jednim redom druge tabele.
Spoljašnje spajanje – outer join, po standardu ANSI-99 za
SQL, dozvoljava ovu funkcionalnost na sledeći način:
<leva_tabela> <SPOLJAŠNJE_SPAJANJE> <desna_tabela>
u tri moguća oblika:
13. Outer Joins
Spoljašnje spajanje
• LEFT OUTER JOIN (levo spoljašnje spajanje)
leva_tabela LEFT OUTER JOIN desna_tabela
vraća sve redove leve tabele spojene sa odgovarajućim
redovima desne tabele za koje je uslov spajanja zadovoljen,
ili sa null-vrednostima u kolonama iz desne tabele ukoliko
uslov spajanja nije ispunjen ni za jedan par redova.
• RIGHT OUTER JOIN (desno spoljašnje spajanje)
leva_tabela RIGHT OUTER JOIN desna_tabela
slično kao u prethodnom slučaju, samo za desnu tabelu
• FULL OUTER JOIN (potpuno spoljašnje spajanje)
leva_tabela FULL OUTER JOIN desna_tabela s
obuhvata oba prethodna slučaja
14. Outer Joins
Primer
SELECT last_name AS radnik, department_name AS odeljenje
FROM employees LEFT OUTER JOIN departments
ON employees.department_id=departments.department_id;
RADNIK ODELJENJE
Whalen Administration
Fay Marketing
Hartstein Marketing
Vargas Shipping
Matos Shipping
King Executive
... ...
Higgins Accounting
Grant -
Sada vidimo da Grant nije
raspoređen ni u jedno
odeljenje. To ne bi bilo tako
neposredno vidljivo da smo
koristili inner join.
15. Outer Joins
Primer sa funkcijom NVL
SELECT NVL(last_name, 'nema zaposlenih') AS radnik,
NVL(department_name, 'slobodan strelac') AS odeljenje
FROM employees FULL OUTER JOIN departments
ON employees.department_id=departments.department_id;
RADNIK ODELJENJE
Whalen Administration
… …
Higgins Accounting
Grant slobodan strelac
nema zaposlenih Contracting
18. Grupne funkcije
Group functions
Neke funkcije SQL-a se izvršavaju nad celom tabelom ili
nad specifičnim grupama redova. Pišu se u klauzuli
SELECT. Svaka funkcija vraća jedan rezultat. To su:
– AVG
– COUNT
– MIN
– MAX
– SUM
– VARIANCE
– STDDEV
SELECT column, group_function(column), …
FROM table
WHERE condition;
19. Grupne funkcije
Group functions
• MIN: Koristi se nad kolonama
sa podacima bilo kog tipa i
vraća najmanju vrednost.
• MAX: Koristi se nad kolonama
sa podacima bilo kog tipa i
vraća najveću vrednost.
• SUM: Koristi se nad
kolonama sa numeričkim
podacima i vraća total ili sumu
svih vrednosti.
• AVG: Koristi se nad kolonama
sa numeričkim podacima i
izračunava prosek.
• COUNT: Vraća broj redova
20. Grupne funkcije
Group functions
ID NAME ... ... COST ...
100 Peters Graduation 8000
105 Vigil wedding 10000
D_EVENTS
Kolika je prosečna cena događaja u bazi podataka DJs on
demand?
SELECT AVG(cost)
FROM d_events;
AVG(COST)
9000
21. Grupne funkcije
Group functions
Odredite broj zaposlenih, najmanju platu, datum najkasnijeg zaposlenja,
prezime lica koje je na vrhu abecednog spiska i prezime koje je na kraju
spiska zaposlenih iz tabele EMPLOYEES. Uzmite u obzir samo
zaposlene iz odeljenja 50 i 60.
SELECT COUNT(employee_id) "Broj zaposlenih",
MIN(salary) "Najmanja plata",
MAX(hire_date) "Poslednji prijem",
MIN(last_name) "Prvi na spisku",
MAX(last_name) "Poslednji na spisku"
FROM employees
WHERE department_id IN (50, 60);
Broj
zaposlenih
Najmanja
plata
Poslednji
prijem
Prvi na
spisku
Poslednji
na spisku
8 2500 16-NOV-99 Davies Vargas
22. Grupne funkcije
Pravila
• Grupne funkcije zanemaruju null-vrednosti.
• Grupne funkcije se ne mogu koristiti u klauzuli WHERE.
• MIN, MAX i COUNT se mogu koristiti sa bilo kojim tipom
podatka.
• SUM, AVG, STDDEV i VARIANCE se mogu koristiti
samo sa numeričkim tipom podataka.
23. Grupne funkcije
COUNT DISTINCT
COUNT(kolona_za_brojanje) broji redove u kojima
kolona _za_brojanje ima ne-null vrednost. Ako se ista
vrednost kolone kolona _za_brojanje javlja u više redova,
svaki red će biti uračunat.
Ako želimo da izbrojimo samo različite vrednosti kolone
kolona _za_brojanje, koristićemo
COUNT(DISTINCT kolona_za_brojanje)
kol_1 kol_2 kol_3 kol-4
3 - aba -
6 a - -
- a - -
3 a aca -
PRIMER
COUNT(kol_1) = 3
COUNT(DISTINCT kol_1) = 2
COUNT(kol_2) = 3
COUNT(DISTINCT kol_2) = 1
COUNT(kol_3) = 2
COUNT(DISTINCT kol_3) = 2
24. Grupne funkcije
COUNT DISTINCT
CD_NUM
BER
TITLE PRODUCER YEAR
90 The Celebrants Live in Concert Old Town Records 1997
91 Party Music for All Occasions The Music Man 2000
92 Back to the Shire Middle Earth Records 2002
93 Songs from My Childhood Old Town Records 1999
94 Carpe Diem R & B Inc. 2000
95 Here Comes the Bride The Music Man 2001
96 Graduation Songbook Tunes Are Us 1998
98 Whirled Peas Old Town Records 2004
D_CDS
SELECT COUNT(DISTINCT year) AS "Years"
FROM d_cds;
SELECT COUNT(year) AS "Years"
FROM d_cds;
Years
8
Years
7
25. Grupne funkcije
COUNT(*)
COUNT(kolona_za_brojanje) broji redove u kojima kolona _za_brojanje
ima ne-null vrednost i koji zadovoljavaju WHERE-uslov ako je dat.
COUNT(*) koristimo ako želimo da izbrojimo sve redove, ili sve redove koji
zadovoljavaju dati uslov ako je data klauzula WHERE.
kol_1 kol_2 kol_3 kol-4
3 - aba -
6 a - -
- a - -
3 a aca -
PRIMER
COUNT(kol_1) = 3
COUNT(kol_2) = 3
COUNT(kol_3) = 2
COUNT(kol_4) = null
COUNT(*) = 4
Koje vrednosti daju sledeći upiti?
SELECT COUNT(kol_2) FROM primer WHERE kol_1< 6;
SELECT COUNT(*) FROM primer WHERE kol_1< 6;
1
2
26. Grupne funkcije
kol_1 kol_2 kol_3 kol-4
3 - aba -
6 a - -
- a - -
3 a aca -
PRIMER
AVG, NVL
SELECT AVG(kolona)
FROM tabela;
Prosek će biti izračunat
samo za one redove u
kojima posmatrana
kolona nije null.
SELECT AVG(kol_1)
FROM primer;
Rezultat je
(3+6+3) / 3 = 4
Međutim, nekada je potrebno da pri izračunavanju proseka uzmemo u
obzir i redove u kojima je posmatrana kolona null. Recimo, ako imamo
četiri radnika u grupi, od kojih dvojica naprave po 3 proizvoda, jedan
napravi 6, a jedan ništa, po koliko proizvoda su oni napravili u proseku?
Pri izračunavanju proseka moramo uzeti u obzir svu četvoricu, a ne samo
onu trojicu koji su napravili nešto. U SQL-u za takve slučajeve koristimo
funkciju NVL pomoću koje zamenjujemo null-vrednost nulom.
SELECT AVG(NVL(kol_1, 0))
FROM primer;
Rezultat je
(3+6+0+3) / 4 = 3
27. ID FIRST_NAME LAST_NAME AUTH_EXPENSE_AMT
11 Jennifer cho -
22 Jason Tsang -
33 Allison Plumb 300000
12 Anna Smith 20
13 Jan Smith -
SELECT id, first_name, last_name, auth_expense_amt FROM d_partners
AVG, NVL
SELECT AVG(auth_expense_amt)
FROM d_partners;
AVG(AUTH_EXPENSE_AMT)
150010
SELECT
AVG(NVL(auth_expense_amt,0))
FROM d_partners;
AVG(AUTH_EXPENSE_AMT)
60004
(300000+20) / 2 = 150010
Zanemareni su redovi sa
null-vrednostima
(0+0+300000+20+0) / 5 = 60004
Sve null-vrednosti su zamenjene sa 0 pa
su uključeni svi redovi.
Grupne funkcije
28. Grupne funkcije
SELECT AVG(salary)
FROM employees;
Ovaj upit nam daje informaciju o prosečnoj plati na nivou cele
tabele EMPLOYEES. A ako nas interesuje prosek po
pojedinim odeljenjima (departments), mogli bismo to da
preciziramo klauzulom WHERE:
SELECT department_id, AVG(salary)
FROM employees WHERE department_id=10
AVG(SALARY)
8775
DEPARTMENT_ID AVG(SALARY)
20 9500
GROUP BY
DEPARTMENT_ID AVG(SALARY)
10 4400
SELECT department_id, AVG(salary)
FROM employees WHERE department_id=20
I tako dalje. Ali, ovo se efikasnije rešava klauzulom GROUP BY
29. Grupne funkcije
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
DEPARTMENT_ID AVG(SALARY)
10 4400
20 9500
50 3500
60 6400
80 10033.3333333333333333333333333333333333
90 19333.3333333333333333333333333333333333
110 10150
- 7000
GROUP BY
Da bismo izlaznoj informaciji dali željeni oblik, koristićemo
ROUND, NVL i druge funkcije i klauzule SQL-a.
30. Grupne funkcije
GROUP BY
SELECT NVL(department_name, 'nerasporedjeni') "Odeljenje",
ROUND(AVG(NVL(salary,0)), 2) "Prosečna plata"
FROM employees e FULL OUTER JOIN departments d
ON e.department_id=d.department_id
GROUP BY department_name
ORDER BY "Prosečna plata" DESC; Odeljenje Prosečna plata
Executive 19,333.33
Accounting 10,150.00
Sales 10,033.33
Marketing 9,500.00
nerasporedjeni 7,000.00
IT 6,400.00
Administration 4,400.00
Shipping 3,500.00
Contracting 0.00
31. Grupne funkcije
Pravila
• Ako u klauzulu SELECT uključite grupnu funkciju (AVG,
SUM, COUNT, MAX, MIN, STDDEV, VARIANCE) i još
neku pojedinačnu kolonu, svaka tako navedena
pojedinačna kolona mora biti navedena i u klauzuli
GROUP BY.
• Alijasi kolona se ne mogu koristiti u klauzuli GROUP BY.
• Klauzula WHERE isključuje vrste (redove) pre njihove
podele na grupe. Zato se grupne funkcije ne mogu koristiti
u klauzuli WHERE. Za definisanje uslova selekcije na
osnovu vrednosti grupnih funkcija koristi se klauzula
HAVING
32. Klauzula HAVING
HAVING
Kao što se klauzula WHERE koristi da se ograniči izbor redova,
tako se klauzula HAVING koristi za ograničen izbor grupa.
Ako upit koristi klauzule GROUP BY i HAVING, prvo se grupišu
redovi, zatim se izračunavaju grupne funkcije, a zatim se prikazuju
samo one grupe koje su saglasne sa klauzulom HAVING.
Klauzula WHERE se koristi da ograniči izbor redova koji se grupišu;
klauzula HAVING ograničava izbor grupa dobijenih klauzulom
GROUP BY.
SELECT department_id, MAX(salary)
FROM employees
WHERE department_id < 80
GROUP BY department_id
HAVING COUNT(*) > 1;
DEPARTMENT_ID MAX(SALARY)
20 13000
50 5800
60 9000
33. Klauzula HAVING
HAVING
SELECT department_id, MAX(salary), COUNT(*) "Broj zaposlenih"
FROM employees
GROUP BY department_id;
SELECT department_id, MAX(salary)
FROM employees
WHERE department_id
IN (10, 20, 80)
GROUP BY department_id
HAVING COUNT(*)
BETWEEN 2 AND 5
ORDER BY MAX(salary);
DEPARTMENT_ID MAX(SALARY)
80 11000
20 13000
DEPART
MENT_ID
MAX(SA
LARY)
Broj za
poslenih
- 7000 1
90 24000 3
20 13000 2
110 12000 2
80 11000 3
50 5800 5
10 4400 1
60 9000 3
34. Klauzula HAVING
HAVING
DEPARTMENT_ID AVG(SALARY)
10 4400
20 9500
50 3500
60 6400
- 7000
SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary)<7000
GROUP BY department_id;
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary)<10000;
ORA-00934:
group function is not allowed here
SELECT department_id, AVG(salary)
FROM employees
WHERE department_id>10
GROUP BY department_id
HAVING AVG(salary)<10000
ORDER BY AVG(salary) ;
DEPARTMENT_ID AVG(SALARY)
50 3500
60 6400
20 9500
Redosled klauzula
35. Comparison operators
Operatori poređenja
Već smo se sreli sa operatorima poređenja (=, >, <=,
BETWEEN, …), koje smo koristili za definisanje uslova u
klauzulama WHERE i HAVING. Neki porede datu kolonu ili
izraz sa jednom vrednošću (jednoredni operatori),
a drugi (višeredni) sa skupom ili intervalom vrednosti.
Jednoredni operatori
=
<=
>=
!= , <>
IS
NOT
LIKE
Višeredni operatori
IN
BETWEEN ... AND
ALL
ANY
36. Comparison operators
Operatori poređenja
SELECT department_id, MAX(salary), COUNT(*)
FROM employees
WHERE department_id IS NOT NULL AND
salary BETWEEN 6000 AND 20000
GROUP BY department_id
HAVING MAX(salary) <= 9000 OR NOT(MAX(salary) < 13000);
DEPARTMENT_ID MAX(SALARY) COUNT(*)
20 13000 2
60 9000 2
90 17000 2
37. Comparison operators
LIKE
Da li ste ikada išli u kupovinu da tražite nešto što ste nekada videli u nekom
izlogu ili u TV-reklami, ali se niste sećali svih detalja o tome što tražite?
Često ćete biti u sličnoj situaciji kada nešto tražite u bazi podataka.
Recimo, znate da u kompaniji imate nekoga čije ime počinje sa El, ali ne
znate puno ime, a treba da nađete gde radi ta osoba.
U takvim situacijama pomaže operator LIKE sa džoker-znacima:
% – zamenjuje 0, 1 ili više slova u nizu, uključujući i razmak (blanko)
_ (donja crta) – zamenjuje jedno slovo ili razmak
– poništava značenje džoker-znaka, tako da se tretira kao obično slovo
SELECT first_name, last_name, department_id
FROM employees
WHERE first_name LIKE 'El%';
FIRST_NAME LAST_NAME DEPARTMENT_ID
Eleni Zlotkey 80
Ellen Abel 80
38. Comparison operators
LIKE
Gde radi osoba koja u prezimenu ima slovo e na drugom
mestu, i još negde iza njega ima slovo h?
Ne znamo da li je reč o velikim ili malim slovima.
SELECT first_name, last_name, department_id
FROM employees
WHERE LOWER(last_name) LIKE '_e%h%';
FIRST_NAME LAST_NAME DEPARTMENT_ID
Lex De Haan 90
39. Comparison operators
ALL, ANY
Operatori ALL i ANY se koriste u uslovima oblika
<kolona ili izraz> <jednoredni operator> ALL (<niz vrednosti>)
<kolona ili izraz> <jednoredni operator> ANY (<niz vrednosti>)
Uslov sa ALL je ispunjen ako jednoredni operator vraća
True za sve vrednosti iz datog niza vrednosti.
Uslov sa ANY je ispunjen ako jednoredni operator vraća
True za bar jednu vrednosti iz datog niza vrednosti.
40. Comparison operators
ALL, ANY
SELECT department_id, last_name, salary
FROM employees
WHERE salary > ALL (16000, 18000, 20000)
ORDER BY department_id;
SELECT department_id, last_name, salary
FROM employees
WHERE salary > ANY (16000, 18000, 20000)
ORDER BY department_id;
DEPARTMENT_ID LAST_NAME SALARY
90 King 24000
DEPARTMENT_ID LAST_NAME SALARY
90 King 24000
90 De Haan 17000
90 Kochhar 17000
41. Subqueries
Podupiti
Podupit je SELECT-rečenica ugneždena u neku klauzulu ili
drugu SELECT-rečenicu. Podupit se izvršava jednom
pre glavnog upita. Glavni ili spoljašnji upit koristi rezultat
podupita.
Podupiti se mogu smestiti u nekoliko SQL-klauzula, kao:
SELECT, WHERE, HAVING, FROM.
SELECT select_list
FROM table
WHERE expression operator
(SELECT select_list
FROM table);
Glavni ili
spoljašnji upit
SELECT-rečenica u
zagradi je unutrašnji
upit ili ‘podupit’
42. Subqueries
Jednoredni podupiti
ID FIRST_NAME LAST_NAME BIRTHDATE
12 Sue Doe 01-JUL-80
9 Bob Miller 19-MAR-79
SELECT id, first_name, last_name, birthdate
FROM f_staffs
WHERE birthdate >
(SELECT birthdate FROM f_staffs
WHERE last_name = ‘Tuttle’);
BIRTHDATE
30-MAR-69
Jednoredni upiti se koriste sa jednorednim operatorima
(>, =, >=, <, !=, <>, <=).
Jednoredni unutrašnji upit vraća samo jedan red..
43. Subqueries
Višeredni podupiti
Izlistaj naslove, izvođače i trajanje pesama na CD 91.
Za ovo su nam potrebne tabele D_SONGS, D_CDS i
vezna zabela D_TRACK_LISTINGS
ID TITLE DURATION ARTIST TYPE_CODE
45 Its Finally Over 5 min The Hobbits 12
46 Im Going to Miss My Teacher 2 min Jane Pop 12
47 Hurrah for Today 3 min The Jubilant Trio 77
48 Meet Me At the Altar 6 min Bobby West 1
49 Lets Celebrate 8 min The Celebrants 77
50 All These Years 10 min Diana Crooner 88
D_SONGS
Višeredni upiti se koriste sa višerednim operatorima
(BETWEEN ... OR, IN, ALL, ANY).
Višeredni unutrašnji upit vraća više redova i ne može se
koristiti sa jednorednim operatorima u glavnom upitu.
44. Subqueries
Višeredni podupiti
CD_NUMBER TITLE PRODUCER YEAR
90 The Celebrants Live in Concert Old Town Records 1997
91 Party Music for All Occasions The Music Man 2000
92 Back to the Shire Middle Earth Records 2002
93 Songs from My Childhood Old Town Records 1999
94 Carpe Diem R & B Inc. 2000
95 Here Comes the Bride The Music Man 2001
96 Graduation Songbook Tunes Are Us 1998
98 Whirled Peas Old Town Records 2004
D_CDS
SONG_ID CD_NUMBER TRACK
45 92 1
46 93 1
47 91 2
48 95 5
49 91 3
D_TRACK_LISTINGS
45. Subqueries
Višeredni podupiti
SONG_ID
47
49
SELECT title, artist, duration
FROM d_songs
WHERE id IN
(SELECT song_id
FROM d_track_listings
WHERE d_track_listings.cd_number = 91);
TITLE ARTIST DURATION
Hurrah for Today The Jubilant Trio 3 min
Lets Celebrate The Celebrants 8 min
46. Subqueries
Isti rezultat se može dobiti i
spajanjem tabela
SELECT title, artist, duration
FROM d_songs,d_track_listings
WHERE d_track_listings.song_id = d_songs.id and
d_track_listings.cd_number = 91;
47. Subqueries
Pravila o podupitima
• Podupiti se daju u zagradi.
• Podupit je uvek na desnoj strani uslova poređenja.
• Spoljašnji i unutrašnji upit mogu uzeti podatke iz različitih
tabela (jedan iz jedne, drugi iz druge).
• Samo jedna klauzula ORDER BY može biti uključena u
jednu SELECT-rečenicu i ona mora biti poslednja
klauzula spoljašnjeg upita. Podupit ne može imati
sopstvene klauzule ORDER BY.
• Jedino ograničenje broja podupita je veličina bafera koji
se koristi za upit.
48. Sekcija 17 L 3
Uradite:
Kviz2 za ovu nedelju
Grupne funkcije