Structured Query Language

Preview:

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

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]

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.

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.

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

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 5 -

Standardizacija SQL

Vir: Wikipedia EN

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

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.

– …

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

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 -

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

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]

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

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

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

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

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

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

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

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

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

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.

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.

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

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

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’

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

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

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.

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

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.

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

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.

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

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

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.

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.

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

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

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.

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.

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’

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’

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

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?

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.

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.

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 * ...)

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

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’)

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).

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.

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

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)

!

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.

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

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

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 ...

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.

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

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.

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’)

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

PODATKOVNE BAZEModul: SQL@Laboratorij za podatkovne tehnologije

- 64 -

Podatkovni tipi v SQL standardu

Vir: [2,159]

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.

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.

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

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.

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.

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

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.

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

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.

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))

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

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.

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.

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)] [,…] })

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

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

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

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;

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’;

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;

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.

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).

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 ]

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)

PODATKOVNE BAZEModul: SQL©Laboratorij za podatkovne tehnologije

- 89 -

Izolacijske ravni transakcijDirty Read

Read Uncommited (results out of order)

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)

PODATKOVNE BAZEModul: SQL©Laboratorij za podatkovne tehnologije

- 91 -

Izolacijske ravni transakcijPhantom read

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

PODATKOVNE BAZEModul: SQL©Laboratorij za podatkovne tehnologije

- 92 -

Izolacijske ravni transakcij

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

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.

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}

Recommended