SlideShare uma empresa Scribd logo
1 de 48
Datumske funkcije
Outer Joins
Funkcija NVL
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.
Datumske funkcije
Date functions
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
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
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
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
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.
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.
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:
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
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:
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
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.
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
Uradite Kviz1 za ovu nedelju
Conversion functions & Outer Joins
Operatori poređenja
Grupne funkcije
Podupiti
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;
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
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
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
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.
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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’
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..
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.
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
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
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;
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.
Sekcija 17 L 3
Uradite:
Kviz2 za ovu nedelju
Grupne funkcije

Mais conteúdo relacionado

Destaque

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Destaque (20)

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 

DATUMSKE FUNKCIJE_FUNKCIJA NVL_OUTER JOINS .PPTX

  • 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
  • 16. Uradite Kviz1 za ovu nedelju Conversion functions & Outer Joins
  • 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