94
PODATKOVNE BAZE Modul: SQL @Laboratorij za podatkovne tehnologije - 1 - Structured Query Language Uvod v SQL Stavki skupine SQL DML Stavki skupine SQL DDL Povzeto po [2, 112-195]

Structured Query Language

  • Upload
    susan

  • View
    37

  • Download
    1

Embed Size (px)

DESCRIPTION

Povzeto po [2, 112-195 ]. Structured Query Language. Uvod v SQL Stavki skupine SQL DML Stavki skupine SQL DDL. Uvod v SQL…. SQL sestavljata dve skupini ukazov: Skupina ukazov DDL ( Data Definition Language ) za opredelitev strukture podatkovne baze in - PowerPoint PPT Presentation

Citation preview

Page 1: Structured Query Language

PODATKOVNE BAZE Modul: SQL@Laboratorij za podatkovne tehnologije

- 1 -

Structured Query Language

Uvod v SQL Stavki skupine SQL DML Stavki skupine SQL DDL

Povzeto po [2, 112-195]

Page 2: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 2 -

Uvod v SQL… SQL sestavljata dve skupini ukazov:

– Skupina ukazov DDL (Data Definition Language) za opredelitev strukture podatkovne baze in

– Skupina ukazov DML (Data Manipulation Language) za poizvedovanje in ažuriranje podatkov.

SQL do izdaje SQL:1999 ne vključuje ukazov kontrolnega toka. Kontrolni tok je bil potrebno obvladati s programskim jezikom ali interaktivno z odločitvami uporabnikov.

Page 3: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 3 -

Uvod v SQL… Lastnosti SQL:

– Enostaven;– Nepostopkoven (kaj in ne kako);– Uporaben v okviru številnih vlog: skrbniki PB,

vodstvo, razvijalci informacijskih rešitev, končni uporabniki;

– Obstaja ISO standard za SQL; – SQL de-facto in tudi uradno standardni jezik za delo z

relacijskimi podatkovnimi bazami.

Page 4: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 4 -

Zgodovina SQL V 1970h IBM razvija sistem System R, ki bo

temeljil na relacijskem modelu. 1974 – D. Chamberlin in F. Boyce (IBM San

Jose Laboratory) definirata jezik ‘Structured English Query Language’ (SEQUEL).– SEQUEL se kasneje preimenuje v SQL

Pozno v 1970h – Relational Software (danes Oracle) razvije svoj SUPB, ki temelji na relacijskem modelu in implementira SQL.

Poleti 1979 – Oracle izda prvo komercialno različico SQL; nekaj tednov pred IBM-ovo implementacijo System/38

Page 5: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 5 -

Standardizacija SQL

Vir: Wikipedia EN

Page 6: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 6 -

SQL:2008

SQL:2008

Framework

Foundation

Call-Level Interface

Persistent Stored

Modules

Management of External

Data

Object Language Bindings

Information and Definition

Schemas

SQL Routines and Types

Using the Java TM

Programming Language

XML-Related Specifications

ISO/ANSI SQL:2008 standardAvailable on-line for cca $450

Page 7: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 7 -

Pomembnost jezika SQL… SQL do sedaj edini široko sprejet

standardni podatkovni poizvedovalni jezik. SQL del aplikacijskih arhitektur (npr. v

okviru IBM-ove arhitekture - Systems Application Architecture (SAA).

Strateška odločitev več pomembnih združb – Konzorcij X/OPEN za UNIX– Federal Information Processing Standard (FIPS) –

standard, kateremu morajo ustrezati vsi SUPB-ji prodani državnim organom v ZDA.

– …

Page 8: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 8 -

Pomembnost jezika SQL SQL uporabljen tudi v drugih standardih

– ISO Information Resource Dictionary System (IRDS)– Remote Data Access (RDA),...

Interes v akademskih krogih daje jeziku teoretično osnovo in tehnike za implementacijo– Optimizacija poizvedb– Distribucija podatkov– Varnost podatkov

Pojavljajo se specializirane implementacije SQL, npr. za OLAP

Page 9: Structured Query Language

Implementacije SQL Med standardi SQL-92, SQL:1999;

SQL:2008,… razlike Implementacije ponudnikov SUPB različne

(dialekti)

Primerjava implementacij SQL– http://troels.arvin.dk/db/rdbms/

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 9 -

Page 10: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 10 -

Stavki skupine SQL DML DML skupina zajema SQL stavke za

manipulacijo s podatki– SELECT Izbira– INSERT Dodajanje– DELETE Brisanje– UPDATE Spreminjanje

Sintaksa SELECT stavka najbolj kompleksna

Page 11: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 11 -

SELECT stavek…

SELECT [DISTINCT | ALL] {* | [columnExpression [AS newName]] [,...] }

FROM TableName [alias] [, ...][WHERE condition][GROUP BY columnList] [HAVING condition][ORDER BY columnList]

Page 12: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 13 -

Primeri Za primere bomo uporabljali shemo PB o hotelih

Hotel (hotelNo, hotelName, address)Room (roomNo, hotelNo, type, price)Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo,

comments)Guest (guestNo, guestName, guestAddress)

Izpiši vse podatke hotelihSELECT hotelNo, hotelName, addressFROM Hotel

ali krajšeSELECT * FROM Hotel

Page 13: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 14 -

Uporaba DISTINCT Izpiši oznake hotelov in sob, ki so bile kdaj

koli rezervirane

SELECT DISTINCT hotelNo, roomNoFROM Booking

Ukaz DISTINCT eliminira dvojnike

Glej primer 1 Q_Distinct

V Accessu so na voljo še DISTINCTROW in TOP n

Page 14: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 15 -

Izračunana polja Izpiši ceno sob za deset dnevni najem

SELECT RoomNo, type, price*10 AS CenaNajemaFROM Room Uporabljamo formule

Izračunanemu stolpcu dodelimo naziv

Glej primer 2 Q_CalcFields

Page 15: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 16 -

Iskalni kriteriji Izpiši oznake hotelov, ki imajo tri-posteljne

sobe (type = 3) in ceno manjšo kot 100 EUR

SELECT hotelNo FROM RoomWHERE type = 3 AND price < 100

Pogoj 1 Pogoj 2

Pogoje združujemo z logičnimi operatorji

Page 16: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 17 -

Iskanje z uporabo BETWEEN Izpiši vse sobe s ceno med 50 in 70 EUR

SELECT roomNoFROM RoomWHERE price BETWEEN 50 AND 70

BETWEEN vključuje spodnjo in zgornjo mejo!Uporabimo lahko tudi negacijo NOT BETWEENBETWEEN ne doda veliko SQL moči, možno izraziti posredno

Glej primer 3 Q_Between

Page 17: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 18 -

Iskanje po članstvu množice Izpiši oznake hotelov in številke dve ali tri-

posteljnih sob

SELECT hotelNo, roomNoFROM RoomWHERE type IN (2,3)

Članstvo množice

Uporabimo lahko tudi negacijo NOT ININ ne doda veliko SQL moči; koristno pri večjih množicah

Page 18: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 19 -

Iskanje z vzorcem Izpiši vse goste, ki živijo kjerkoli v Ljubljani

(v polju guestAddress je tudi string ‘Ljubljana’)

SELECT guestNo, guestName, guestAddress

FROM GuestWHERE guestAddress LIKE

‘%Ljubljana%’SQL ima dva posebna znaka za iskanje z vzorcem:Znak % nadomešča katerikoli niz znakovZnak _ nadomešča katerikoli znak

Iskanje z vzorcem

Glej primer 4 Q_Like

Page 19: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 20 -

Iskanje z NULL vrednostjo v pogoju Izpiši vse rezervacije brez podanih

komentarjev

SELECT * FROM BookingWHERE comments IS NULL

Iskanje z NULL vrednostjo

Uporabljamo lahko tudi negacijo IS NOT NULL

Page 20: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 21 -

Sortiranje vrstic v izhodni relaciji Izpiši vse podatke o sobah, urejene po tipu

sobe od največje do najmanjše in znotraj tipa po cenah od najmanjše do največje

SELECT *FROM RoomORDER BY type DESC, price ASC

ASC – ascending naraščujočeDESC – descending padajoče

Page 21: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 22 -

Agregiranje podatkov… ISO standard definira pet agregarnih

operacij– COUNT vrne število vrednosti v določenem

stolpcu– SUM vrne seštevek vrednosti v določenem stolpcu– AVG vrne povprečje vrednosti v določenem stolpcu– MIN vrne najmanjšo vrednost v določenem stolpcu– MAX vrne največjo vrednost v določenem stolpcu

Vse operacije delujejo na enem stolpcu in vračajo eno samo vrednost.

Page 22: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 23 -

Agregiranje podatkov… COUNT, MIN in MAX se uporabljajo za

numerične in ne-numerične vrednosti, SUM in AVG zahtevata numerične vrednosti.

Vse operacije razen COUNT(*) najprej odstranijo vrstice z NULL vrednostjo v stolpcu, po katerem agregiramo.

COUNT(*) prešteje vse vrstice, ne glede na NULL vrednosti ali duplikate.

Page 23: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 24 -

Agregiranje podatkov… Če se želimo znebiti duplikatov, uporabimo

DISTINCT pred imenom stolpca.

DISTINCT nima učinka na MIN/MAX, lahko pa vpliva na SUM/AVG.

Agregarne operacije lahko uporabimo le v SELECT ali HAVING sklopu

Page 24: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 25 -

Agregiranje podatkov Če SELECT sklop vsebuje agregarno

operacijo, mora obstajati tudi GROUP BY sklop, sicer ni moč dodeliti agregirane vrednosti.

SELECT roomNo, AVG(price)FROM Room

Napačna raba agregacije

Glej primer 5 Q_Group By problem

Page 25: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 26 -

Uporaba COUNT in DISTINCT V koliko različnih hotelih obstajajo

rezervacije za prvi teden v mesecu januarju 2005

SELECT COUNT (DISTINCT hotelNo) AS numHFROM BookingWHERE dateFrom = ‘1.1.2005’ AND

dateTo = ‘7.1.2005’

Page 26: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 27 -

Uporaba več agregatov istočasno

Izpiši povprečno, minimalno in maksimalno ceno dvoposteljne sobe

SELECT AVG(price), MIN(price), MAX(price)FROM RoomWHERE type = 2

Page 27: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 28 -

Združevanje podatkov… Sklop GROUP BY uporabimo za združevanje

podatkov v skupine.

SELECT in GROUP BY sta tesno povezana

Tip sobe Avg(Cena)1 $501 $451 $552 $702 $80

Tip sobe Avg(Cena)1 $502 $75

Page 28: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 29 -

Združevanje podatkov… Vsi stolpci, ki so navedeni v SELECT sklopu,

se morajo nahajati tudi v GROUP BY sklopu, razen tistih, ki nastopajo samo v agregarnih operacijah.

Če uporabljamo WHERE sklop v kombinaciji z GROUP BY, se WHERE upošteva najprej, združevanje pa se izvede na preostalih vrsticah.

ISO standard jemlje NULL vrednosti kot enake, ko gre za združevanje.

Page 29: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 30 -

Primer združevanja Izpiši število enoposteljnih, dvoposteljnih in

troposteljnih sob v vsakem hotelu

SELECT hotelNo, type, COUNT(roomNo)FROM RoomGROUP BY hotelNo, type

Za vsako skupino hotel, tip sobe vrne število sob

Page 30: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 31 -

Omejitev skupin HAVING sklop je namenjen uporabi v

kombinaciji z GROUP BY kot omejitev skupin, ki se lahko pojavijo v rezultatu.

Deluje podobno kot WHERE– WHERE filtrira posamezne vrstice– HAVING filtrira skupine.

Stolpci, ki so navedeni v HAVING sklopu, morajo biti tudi v SELECT sklopu ali v agregatih.

Page 31: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 32 -

Uporaba sklopa HAVING Izpiši število enoposteljnih, dvoposteljnih in

troposteljnih sob v vsakem hotelu ter njihovo povprečno ceno. Upoštevaj samo tiste primere, ko je število sob večje od 1.

SELECT hotelNo, type, COUNT(roomNo), AVG(price)FROM RoomGROUP BY hotelNo, typeHAVING COUNT(roomNo) > 1

Glej primer 6 Q_Having

Page 32: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 33 -

Gnezdenje poizvedb… Nekateri SQL stavki imajo lahko vgnezdene

SELECT stavke.

Vgnezdeni SELECT stavki se lahko uporabijo v WHERE ali HAVING sklopih drugega SELECT stavka (subselect).

Vgnezdeni SELECT stavki se lahko pojavijo tudi v INSERT, UPDATE in DELETE stavkih.

Page 33: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 34 -

Primer vgnezdenega SELECT stavka Izpiši nazive hotelov, ki imajo vsaj 10

troposteljnih sob

SELECT hotelName FROM HotelWHERE hotelNo IN ( SELECT hotelNo

FROM RoomGROUP BY hotelNoHAVING COUNT(hotelNo) > 9)

Ali je stavek pravilen?

Manjka WHERE pogoj vvgnezdenem SELECT stavku:

WHERE type = 3

Page 34: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 35 -

Pravila gnezdenja SELECT stavkov… Vgnezdeni SELECT stavki ne smejo

uporabljati ORDER BY sklopa.

SELECT sklop vgnezdenega SELECT stavka lahko zajema samo en stolpec, razen v primeru uporabe ukaza EXISTS.

Imena stolpcev v vgnezdenem SELECT stavku se privzeto nanašajo na tabele iz vgnezdenega ali zunanjega SELECT stavka (uporaba alias-ov)

Glej primer 7 Q_Exists

Page 35: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 36 -

Pravila gnezdenja SELECT stavkov Ko je vgnezden SELECT stavek operand v

primerjavi, se mora nahajati na desni strani enačbe.

Vgnezdeni SELECT stavek ne more biti operand v izrazu.

Page 36: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 37 -

Uporaba ANY in ALL V vgnezedenih SELECT stavkih, ki vračajo

en sam stolpec, lahko uporabljamo operatorja ANY in ALL.

Z uporabo ALL bo pogoj izpolnjen samo, če bo veljal za vse vrednosti, ki ji vrača poizvedba.

Z uporabo ANY, bo pogoj izpolnjen, če bo veljal za vsaj eno od vrednosti, ki ji poizvedba vrača.

Če je rezultat poizvedbe prazen, bo ALL vrnil true, ANY pa false.

Namesto ANY lahko uporabljamo tudi SOME.

Page 37: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 38 -

Primer uporabe ANY Izpiši številke sob ter pripadajočih hotelov,

katerih cena je večja kot cena vsaj ene sobe v hotelu ‘Hilton New York’ (hotelNo = 5).

SELECT R.hotelNo, R.roomNoFROM room AS RWHERE R.hotelNo <>5 AND

R.price > ANY ( SELECT price FROM Room WHERE hotelNo =

5 );Glej primer 9 Q_Any

Page 38: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 39 -

Primer uporaba ALL Izpiši številke sob ter pripadajočih hotelov,

katerih cena je večja kot cena vseh sob v hotelu ‘Hilton New York’ (hotelNo = ‘HIL’).

SELECT R.hotelNo, R.roomNoFROM Room AS RWHERE R.hotelNo <>5 AND

R.price > ALL ( SELECT Price FROM Room WHERE hotelNo =

5 );Glej primer 10 Q_All

Page 39: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 40 -

Poizvedbe po več tabelah... Poizvedbe po več tabelah lahko izvajamo z

uporabo vgnezdenih SELECT stavkov Omejitev: stolpci v rezultatu so lahko le iz

ene tabele

V poizvedbah, ki vračajo stolpce različnih tabel, moramo uporabljati stik.

Stik izvedemo tako, da v sklopu FROM navedemo tabele, v sklopu WHERE pa določimo stolpce za stik.

Page 40: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 41 -

Poizvedbe po več tabelah... Za tabele v razdelku FROM lahko uvedemo

sinonime (alias). Sintaksa:

SELECT H.hotelNo, R.roomNoFROM Hotel H, Room R...

Sinonimi so potrebni za ločevanje med istoimenskimi stolpci različnih tabel.

Page 41: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 42 -

Primer poizvedbe po dveh tabelah Izpiši številke, tip in cene sob v hotelu z

nazivom ‘Hilton New York’

SELECT R.roomNo, R.type, R.priceFROM Room R, Hotel HWHERE R.hotelNo = H.hotelNo AND

H.hotelName = ‘Hilton New York’

Page 42: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 43 -

Primer poizvedbe po več tabelah Izpiši imena in naslove gostov, ki imajo za

termin od 1.1.2005 do 6.1.2005 rezervacije v hotelu ‘Hilton New York’

SELECT G.guestName, G.guestAddressFROM Guest G, Booking B, Hotel H WHERE B.guestNo = G.guestNo AND

B.hotelNo = H.hotelNo AND

B.fromDate = ‘1.1.2005’ ANDB.toDate = ‘6.1.2005’ ANDH.hotelName = ‘Hilton New

York’

Page 43: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 44 -

Alternativni načini stika več tabel SQL omogoča alternativne načine stika

med več tabelami:– FROM Room R JOIN Hotel H ON R.hotelNo =

H.hotelNo– FROM Room JOIN Hotel USING hotelNo– FROM Room NATURAL JOIN Hotel

Zgornji zapisi nadomestijo sklopa FROM in WHERE

V prvem primeru rezultat vsebuje dva identična stolpca hotelNo.

V Accessu so na voljo ukazi INNER JOIN, LEFT JOIN, RIGHT JOIN

Page 44: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 45 -

Zunanji stik Za zapis SELECT stavka, ki vsebuje zunanji

stik med dvema tabelama, uporabimo naslednjo sintakso:

SELECT DISTINCT H.hotelName, B.roomNoFROM Hotel H LEFT JOIN

Booking B ON H.hotelNo = B. hotelNo

Kaj izpiše zgornja poizvedba?

Page 45: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 46 -

Polni zunanji stik SQL omogoča tudi izvedbo polnega

zunanjega stika (Full Outer Join) Polni zunanji stik med tabelama A in B kot

rezultat vrne tudi tiste vrstice, ki v tabeli A ali B nimajo stičnega para.

Sintaksa:SELECT DISTINCT G.guestName, H.hotelNameFROM Hotel H FULL OUTER JOIN Guest G

ON H.address = G.guestAddressV Accessu ukaz FULL OUTER JOIN ni na voljo.

Page 46: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 47 -

Uporaba EXISTS in NOT EXISTS EXISTS in NOT EXISTS lahko uporabljamo le

v vgnezdenih poizvedbah. Vračajo logičen rezultat true/false.

– True dobimo, če obstaja vsaj ena vrstica v tabeli, ki je rezultat vgnezdene poizvedbe.

– False dobimo, če vgnezdena poizvedba vrača prazno množico.

NOT EXISTS je negacija EXISTS.

Page 47: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 48 -

Uporaba EXISTS in NOT EXISTS (NOT) EXISTS preveri samo, če v rezultatu

vgnezdene poizvedbe (ne) obstajajo vrstice

Število stolpcev v SELECT sklopu vgnezdene poizvedbe je zato irelevantno

Navadno uporabimo sintakso:(SELECT * ...)

Page 48: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 49 -

Primer uporabe EXISTS Izpiši vse goste, ki so kdaj koli imeli

rezervacije v hotelu Hilton New York.

SELECT guestName, guestAddressFROM Guest GWHERE EXISTS

(SELECT * FROM Booking B, Hotel H WHERE B.guestNo = G.guestNo AND B.hotelNo = H.hotelNo AND

H.hotelName = ‘Hilton New York’)

Kaj dobimo, če ta pogoj izpustimo?

Glej primer 11 Q_Exists

Page 49: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 50 -

Namesto EXISTS lahko uporabimo stikSELECT DISTINCT G.guestName,

G.guestAddressFROM Guest G, Booking B, Hotel HWHERE B.guestNo = G.guestNo AND

B.hotelNo = H.hotelNo ANDH.hotelName = ‘Hilton New York’)

Page 50: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 51 -

Uporaba operacij nad množicami... Rezultate dveh ali več poizvedb lahko

združujemo z ukazi:– Union (unija), – Intersection (Presek) – Difference (EXCEPT) (Razlika)

Da lahko izvajamo naštete operacije, morata tabeli A in B biti skladni (domene atributov morajo biti enake).

Page 51: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 52 -

Uporaba operacij nad množicami Sintaksa:op [ALL] [CORRESPONDING [BY {column1

[, ...]}]]

Če uporabimo CORRESPONDING BY, se operacija izvede samo nad poimenovanimi stolpci

Če uporabimo samo CORRESPONDING brez BY člena, se operacija izvede nad skupnimi stolpci.

Če uporabimo ALL, lahko rezultat vključuje tudi dvojnikeV Accessu opcija CORRESPONDING BY ni na voljo.

Page 52: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 53 -

Primer unije Izpiši vse mesta, kjer je bodisi lociran

kakšen gost hotelske verige ali kakšen hotel.

(SELECT addressFROM Hotel)UNION(SELECT guestAddressFROM Guest)

Kako bo naziv stolpca, ki ga poizvedba vrne?

V Accessu se polja imenujejo tako kot v levi tabeli pri ukazu UNION. Glej primer 12 Q_Union

Page 53: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 54 -

Unija z uporabo CORRESPONDING BY(SELECT *FROM Hotel)UNION CORRESPONDING BY address(SELECT *FROM Guest)

Hotel(hotelNo, hotelName, address)Guest(guestNo, guestName, address)

!

Page 54: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 55 -

INSERT stavek...INSERT INTO TableName [ (columnList) ]VALUES (dataValueList)

Seznam columnList ni obvezen; Pri vnosu moramo vpisati najmanj vse

obvezne vrednosti (not null), razen za stolpce s privzeto vrednostjo (DEFAULT).

Seznam dataValueList mora ustrezati seznamu columnList.

Page 55: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 56 -

Primeri INSERT stavkov... Vnos nove vrstice v tabelo Booking

INSERT INTO BookingVALUES (21, 109, ’12.12.2005’, ’17.12.2005’, 109, ‘soba za nekadilce’);

Shema relacije Booking:Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo,

comments)

Glej primer 13 Q_Insert Simple

Page 56: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 57 -

Primeri INSERT stavkov... Vnos nove vrstice v tabelo Booking – vnos

samo obveznih vrednostiINSERT INTO BookingVALUES (21, 109, ’12.12.2005’, ’17.12.2005’, 109, null);

aliINSERT INTO Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo)VALUES (21, 109, ’12.12.2005’, ’17.12.2005’, 109);

stolpec comments je neobvezen

Page 57: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 58 -

Primeri INSERT stavkov... Vnos več vrstic iz ene ali več drugih tabel...

INSERT INTO TableName [ (columnList) ]SELECT ...

Page 58: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 59 -

UPDATE stavek...UPDATE TableName SET columnName1 = dataValue1

[, columnName2 = dataValue2...][WHERE searchCondition]

TableName se lahko nanaša na ime osnovne tabele ali ime pogleda.

Sklop SET določa nazive enega ali več stolpcev ter nove vrednosti teh stolpcev (morajo ustrezati po podatkovnem tipu).

WHERE sklop neobvezen.

Page 59: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 60 -

Primeri UPDATE stavkov Vse dvoposteljne sobe v hotelu Hilton

(HotelNo = 5) povišaj za 5%

UPDATE RoomSET price = price * 1,05WHERE type = 2 AND hotelNo = 5

Glej primer 14 Q_Update Simple, 15 Q_Update Complex

Page 60: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 61 -

DELETE stavekDELETE FROM TableName [WHERE searchCondition]

TableName se lahko nanaša na ime osnovne tabele ali ime pogleda.

WHERE sklop ni obvezen. Če ga spustimo, zbrišemo vse vrstice v tabeli. Tabela ostane.

Page 61: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 62 -

Primeri DELETE stavkov Izbriši vse potekle rezervacije, ki se

nanašajo na hotel Slon.

DELETE FROM BookingWHERE FromDate < ‘25.11.2005’ AND

hotelNo IN (SELECT hotelNo FROM HotelWHERE hotelName =

‘Hotel Slon’)

Page 62: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 63 -

Stavki skupine SQL DDL... DDL skupina zajema SQL stavke za

manipulacijo s strukturo podatkovne baze. Kaj si bomo pogledali:

– Podatkovni tipi, ki jih podpira SQL standard.– Namen sklopa “integrity enhancement feature”.– Kako definirati omejitve z SQL-om?– Kako uporabiti “integrity enhancement feature” v

CREATE in ALTER TABLE stavkih?– Način delovanja ISO transakcijskega modela

Page 63: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 64 -

Podatkovni tipi v SQL standardu

Vir: [2,159]

Page 64: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 65 -

Integrity Enhancement Feature... Za zagotavljanje skladnosti podatkov SQL

standard ponuja več vrst omejitev:– Obveznost podatkov– Omejitve domene (Domain constraints)– Pravila za celovitost podatkov (Integrity constraints)

Celovitost entitet (Entity Integrity) Celovitost povezav (Referential Integrity)

– Števnost (Multyplicity)– Splošne omejitve (General constraints)

Omejitve so lahko definirane v CREATE in ALTER TABLE stavkih.

Page 65: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 66 -

Integrity Enhancement Feature... Obveznost podatkov

hotelNo Numeric(3) NOT NULL

Omejitve domeneCHECKspol CHAR NOT NULL

CHECK (spol IN (‘M’, ‘Ž’))

V Accessu DOMENE niso na voljo.

Page 66: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 67 -

Integrity Enhancement Feature... CREATE DOMAIN

CREATE DOMAIN DomainName [AS] dataType[DEFAULT defaultOption][CHECK (searchCondition)]Primer:CREATE DOMAIN Tspol AS CHAR

CHECK (VALUE IN (‘M’, ‘Ž’));

Spol Tspol NOT NULL

Page 67: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 68 -

Integrity Enhancement Feature... searchCondition lahko vsebuje iskalno

tabelo (lookup table):CREATE DOMAIN guestNo AS CHAR(4)CHECK (VALUE IN (SELECT guestNo FROM Guest));

Domeno lahko ukinemo z uporabo stavka DROP DOMAIN:DROP DOMAIN DomainName [RESTRICT | CASCADE] Kaj naj se zgodi, če je

domena trenutno v uporabi

Access omogoča definicijo LOOKUP tabel.

Page 68: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 69 -

IEF – Celovitost entitet Primarni ključ tabele mora vsebovati

enolično neprazno vrednost v vsaki vrstici tabele.

ISO standard podpira tuje ključe s sklopom FOREIGN KEY v okviru CREATE in ALTER TABLE stavkov.PRIMARY KEY(hotelNo, roomNo)

Vsaka tabela ima lahko največ en primarni ključ. Enoličnost neosnovnih stolpcev lahko zagotavljamo z uporabo UNIQUEUNIQUE(priimek)V Accessu je mogoče definirati validacijska pravila.

Page 69: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 70 -

IEF – Celovitost povezav... FK (tuji ključ) je stolpec ali množica

stolpcev, ki povezujejo vsako vrstico tabele A z vrstico referenčne tabele B, kjer se ujemajo vrednosti A.FK = B.PK.

Celovitost povezav zagotavlja, da če ima FK neko vrednost, potem se ta vrednost nahaja v primarnem ključu povezane tabele.

ISO standard omogoča definicijo tujih ključev s sklopom FOREIGN KEY v CREATE in ALTER TABLEFOREIGN KEY(hotelNo) REFERENCES Hotel

Page 70: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 71 -

IEF – Celovitost povezav... Vsak INSERT/UPDATE stavek, ki skuša

kreirati FK vrednost v tabeli, brez da bi ta vrednost obstajala kot PK v povezani tabeli, je zavrnjen.

Ob zavrnitvi so možne naslednje akcije– CASCADE– SET NULL– SET DEFAULT– NO ACTION

Access omogoča zagotavljanje celovitosti povezav, vendar ne omogoča vseh od zgoraj naštetih možnosti.

Page 71: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 72 -

IEF – Celovitost povezav... Določimo z uporabo ON UPDATE, ON

DELETEON UPDATE SET NULL

Primeri:

FOREIGN KEY (hotelNo) REFERENCES HotelON DELETE SET NULL

FOREIGN KEY (guestNo) REFERENCES GuestON UPDATE CASCADE

Page 72: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 73 -

IEF – Splošne omejitve Splošne omejitve določimo z

CHECK/UNIQUE opcijami v CREATE in ALTER TABLE stavkih.

CREATE ASSERTION AssertionNameCHECK (searchCondition)

Access ne omogoča kreiranja objektov z ukazom CREATE, saj ne implementira DDL ukazov . Izjema so ukazi v zvezi s kreiranjem, spreminjanjem in brisanjem tabel CREATE/DROP/ALTER TABLE.

Page 73: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 74 -

IEF – Splošne omejitve – primer CREATE ASSERTION PrevecRezervacijCHECK (NOT EXISTS (SELECT hotelNo,

dateFrom, roomNo

FROM Booking GROUP BY hotelNo

dateFrom, roomNo HAVING COUNT(*) > 1))

Page 74: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 75 -

Kreiranje podatkovnih objektov... SQL DDL omogoča kreiranje in brisanje

podatkovnih objektov, kot so: shema, domena, tabela, pogled in indeks.

Glavni SQL DDL stavki so:CREATE SCHEMA DROP SCHEMACREATE/ALTER DOMAIN DROP DOMAINCREATE/ALTER TABLE DROP TABLECREATE VIEW DROP VIEW

Mnogi SUPB-ji omogočajo tudi CREATE INDEX DROP INDEX

Page 75: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 76 -

Kreiranje podatkovnih objektov... Relacije in drugi podatkovni objekti

obstajajo v nekem okolju. Vsako okolje vsebuje enega ali več

katalogov, vsak katalog pa množico shem. Shema je poimenovana kolekcija

povezanih podatkovnih objektov. Objekti v shemi so lahko tabele, pogledi,

domene, trditve, dodelitve, pretvorbe in znakovni nizi. Vsi objekti imajo istega lastnika.

Page 76: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 77 -

Kreiranje shemeCREATE SCHEMA [Name |

AUTHORIZATION CreatorId ]

DROP SCHEMA Name [RESTRICT | CASCADE ]

RESTRICT (privzeto): shema mora biti prazna, sicer brisanje ni možno.

CASCADE: kaskadno se brišejo vsi objekti, povezani s shemo. Če katerokoli brisanje ne uspe, se zavrne celotna operacija.

Page 77: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 78 -

Kreiranje tabele...CREATE TABLE TableName ({colName dataType [NOT NULL] [UNIQUE][DEFAULT defaultOption][CHECK searchCondition] [,...]}[PRIMARY KEY (listOfColumns),]{[UNIQUE (listOfColumns),] […,]}{[FOREIGN KEY (listOfFKColumns)

REFERENCES ParentTableName [(listOfCKColumns)],[ON UPDATE referentialAction][ON DELETE referentialAction ]] [,…]}

{[CHECK (searchCondition)] [,…] })

Page 78: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 79 -

Primer kreiranja tabele...CREATE DOMAIN hotelNumber AS NUMERIC(3)CHECK (VALUE IN (SELECT hotelNo FROM Hotel));

CREATE DOMAIN guestNumber AS NUMERIC(3)CHECK (VALUE IN (SELECT guestNo FROM Guest));

CREATE DOMAIN rezervDate AS DATE;CHECK(VALUE BETWEEN ‘1.1.1995’ AND ‘1.1.2200’);

CREATE DOMAIN roomNumber AS INTEGER;CHECK(VALUE BETWEEN 100 AND 545);

CREATE DOMAIN comments AS VARCHAR(100);

Najprej kreiramo domene

Page 79: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 80 -

Primer kreiranja tabele...CREATE TABLE Booking (

hotelNo hotelNumber NOT NULL, CONSTRAINT PrevecRezervacij…

guestNo guestNumber NOT NULL, dateFrom rezervDate NOT NULL DEFAULT date(), dateTo rezervDate NOT NULL, roomNo roomNumber NOT NULL, comments comments,PRIMARY KEY (hotelNo),FOREIGN KEY (guestNo) REFERENCES GuestON DELETE SET NULL ON UPDATE CASCADE …);

potem kreiramo tabelo

Glej primer 17 Q_CreateTable

Page 80: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 81 -

ALTER TABLE stavek... S stavkom ALTER TABLE lahko:

– Dodajamo ali ukinjamo stolpce v tabeli;– Dodajamo ali ukinemo omejitve tabele;– Za stolpce v tabeli določamo ali ukinjamo privzete

vrednosti;– Spreminjamo podatkovne tipe stolpcev v tabeli;

Glej primer 18 Q_AlterTable

Page 81: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 82 -

Primeri ALTER TABLE stavkov... Spremeni tabelo Booking tako, da ukineš

privzeto vrednost stolpca fromDate.

ALTER TABLE BookingALTER fromDate DROP DEFAULT;

Page 82: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 83 -

Primeri ALTER TABLE stavkov... Spremeni tabelo Booking tako, da ukineš

omejitev, da nobena soba nobenega hotela ne sme imeti več kot eno rezervacijo na isti dan. V tabelo Gost dodaj stolpec Spol.

ALTER TABLE BookingDROP CONSTRAINT

prevecRezervacij;

ALTER TABLE GostADD Spol NOT NULL DEFAULT =

‘M’;

Page 83: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 84 -

Stavek DROP TABLE S pomočjo stavka DROP TABLE ukinemo

tabelo. Obenem se zbrišejo vsi zapisi tabele.

DROP TABLE TableName [RESTRICT | CASCADE]

Restrict: Ukaz se ne izvede, če obstajajo objekti, ki so vezani na tabelo, ki jo brišemo.

Cascade: kaskadno se brišejo vsi vezani objekti.

Primer:DROP TABLE Gost RESTRICT;

Page 84: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 85 -

Transakcije… SQL definira transakcijski model z ukazoma

COMMIT in ROLLBACK. Transakcija je logična enota dela z enim ali

več SQL ukazi. S stališča zagotavljanja skladnega stanja je atomarna.

Spremembe, ki so narejene znotraj poteka transakcije, praviloma niso vidne navzven drugim transakcijam, dokler transakcija ni končana.

Page 85: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 86 -

Transakcije... Transakcija se lahko zaključi na enega od

štirih načinov:– Transakcija se uspešno zaključi s COMMIT;

spremembe so permanentne. – Transakcija se prekine z ROLLBACK; spremembe,

narejene s transakcijo, se razveljavijo. – Program, znotraj katerega se izvaja transakcija, se

uspešno konča. Transakcija je potrjena implicitno (brez COMMITa).

– Program, znotraj katerega se izvaja transakcija, se ne konča uspešno. Transakcija se implicitno razveljavi (brez ROLLBACKa).

Page 86: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 87 -

Transakcije Nova transakcija se začne z novim SQL

stavkom, ki transakcijo inicira. SQL transakcij ne moremo gnezditi. Transakcijo nastavimo s pomočjo ukaza

SET TRANSACTIONSET TRANSACTION [READ ONLY | READ WRITE] |[ISOLATION LEVEL READ UNCOMMITTED | READ COMMITTED|REPEATABLE READ |SERIALIZABLE ]

Page 87: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 88 -

Transakcije… READ ONLY – pove, da transakcija vključuje

samo operacije, ki iz baze berejo. – SUPB bo dovolil INSERT, UPDATE in DELETE samo nad

začasnimi tabelami. ISOLATION LEVEL – pove stopnjo

interakcije, ki jo SUPB dovoli med to in drugimi transakcijami.– READ UNCOMMITTED– READ COMMITTED– REPEATABLE READ– SERIALIZABLE

Varen je samo način SERIALIZABLE (vrača serializabilne urnike)

Page 88: Structured Query Language

PODATKOVNE BAZEModul: SQL©Laboratorij za podatkovne tehnologije

- 89 -

Izolacijske ravni transakcijDirty Read

Read Uncommited (results out of order)

Page 89: Structured Query Language

PODATKOVNE BAZEModul: SQL©Laboratorij za podatkovne tehnologije

- 90 -

Izolacijske ravni transakcijNon-repeatable read

Read Committed, Read UncommittedLock based CC (if lock released immediately after SELECT…)Multiver.TS (works on previous version, checks at the end)

Page 90: Structured Query Language

PODATKOVNE BAZEModul: SQL©Laboratorij za podatkovne tehnologije

- 91 -

Izolacijske ravni transakcijPhantom read

Read Committed, Read Uncommitted, Repeatable readRange select/lock problem

Page 91: Structured Query Language

PODATKOVNE BAZEModul: SQL©Laboratorij za podatkovne tehnologije

- 92 -

Izolacijske ravni transakcij

Page 92: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 93 -

Transakcije…Isolation level Dirty Read

Non-repeatable read

Phantom read

READ UNCOMMITTED Y Y Y

READ COMMITTED N Y Y

REPEATABLE READ N N Y

SERIALIZABLE N N N

Page 93: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 94 -

Takojšnje in zapoznele omejitve... Včasih želimo, da se omejitve ne bi

upoštevale takoj, po vsakem SQL stavku, temveč ob zaključku transakcije.

Omejitve lahko definiramo kot – INITIALLY IMMEDIATE – ob začetku transakcije;– INITIALLY DEFERRED – ob zaključku transakcije.

Če izberemo INITIALLY IMMEDIATE (privzeta možnost), lahko določimo tudi, ali je zakasnitev moč določiti kasneje. Uporabimo [NOT] DEFERRABLE.

Page 94: Structured Query Language

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 95 -

Takojšnje in zapoznele omejitve Način upoštevanja omejitev za trenutno

transakcijo nastavimo z ukazom SET CONSTRAINTS.

SET CONSTRAINTS{ALL | constraintName [, . . . ]} {DEFERRED | IMMEDIATE}