sql: lezione 6 nataliya rassadko [email protected]

43
SQL: Lezione 6 Nataliya Rassadko [email protected]

Upload: leonardo-zamboni

Post on 01-May-2015

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

SQL: Lezione 6

Nataliya [email protected]

Page 2: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Agenda

Risposte alla provettaModifiche di DB

INSERT UPDATE DELETE

Creazione di DB

Page 3: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Risposte alla Provetta: 1.a – 4 punti

Visualizzarre gli studenti che sono nati prima di 1986 e frequentano il corso “Databases” iniziate nell’anno 2008. Anche in algebra

SELECT Students.Name FROM Students NATURAL JOIN Enrollment NATURAL JOIN Courses WHERE Title=‘Databases’ AND Year=‘2008’ and Birthday<’01-01-1986’

πStudents.Name(σTitle=‘Databases’ AND Year=‘2008’ and Birthday<’01-01-1986’(Students ⋈ Enrollment ⋈ Courses))

Se in SQL si usava prodotto cartesiano e nell’algebra si usava join, -1

Students (Sid, Name, Birthday)Courses (Cid, Title, Year)Enrollment (Sid, Cid, Enrollment, Grade)CoursePrerequisites(Cid, PCId, Credits)

Page 4: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Risposte alla Provetta: 1.b – 4 punti

Visualizzarre gli studenti che sono iscritti a Settembre 2008 ai corsi con valore di 3 crediti. Anche in algebra

SELECT Students.Name FROM Students NATURAL JOIN Enrollment NATURAL JOIN CoursePrerequisites WHERE Credits=3 AND EnrollmentDate>=’01-09-2008’ and EnrollmentDate<=’31-09-2008’

πStudents.Name(σ Credits=3 AND EnrollmentDate>=’01-09-2008’ and EnrollmentDate<=’31-09-

2008’(Students ⋈ Enrollment ⋈ CoursePrerequisites))

Se in SQL si usava prodotto cartesiano e nell’algebra si usava join, -1

Students (Sid, Name, Birthday)Courses (Cid, Title, Year)Enrollment (Sid, Cid, Enrollment, Grade)CoursePrerequisites(Cid, PCId, Credits)

Page 5: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Risposte alla Provetta: 1.c – 2 punti

Visualizzarre la media di voti per ciascuno corso iniziato nell’anno 2008.

SELECT Title, AVG(Grade) FROM Courses NATURAL JOIN Enrollment WHERE CId IN (SELECT Cid FROM Courses WHERE Year=‘2008’) GROUP BY Cid

SELECT Title, AVG(Grade) FROM (SELECT Title FROM Courses WHERE Year=‘2008’) NATURAL JOIN Enrollment GROUP BY Cid

Rappresentazione in algebra non esiste

Niente HAVING!

Students (Sid, Name, Birthday)Courses (Cid, Title, Year)Enrollment (Sid, Cid, Enrollment, Grade)CoursePrerequisites(Cid, PCId, Credits)

Page 6: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Risposte alla provetta 1.d – 2 punti

WITH RECURSIVE IReq(ICId, IPCId) AS (SELECT CId, PId FROM CoursePrerequisites) UNION (SELECT IReq.ICId, CourcePrerequites.PId FROM

IReq, CoursePrerequisites WHERE IReq.IPCId=CoursePrerequisites.CId)

SELECT Title FROM IReq JOIN Courses ON IPCid=Cid WHERE Title=‘Databases’ AND Year=‘2008’

Students (Sid, Name, Birthday)Courses (Cid, Title, Year)Enrollment (Sid, Cid, Enrollment, Grade)CoursePrerequisites(Cid, PCId, Credits)

Relazione finale con attributi (Dependee, Dependant)

Base ri recorsiaNon *! Ci sono Credits!

Step ri recorsia

Page 7: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Risposte alla Provetta: 2.a – 2 punti

A B C

NULL 2 4

2 2 6

NULL 2 NULL

5 NULL NULL

•SELECT A FROM R WHERE B=C

•Risposta: Relazione vuota

•Condizione in clausola WHERE deve essere TRUE

•Quando NULL e’ parte di un espressione di comparazione, il risultato e’ UNKNOWN, e.g., 5 > x = UNKNOWN, se x = NULL

Page 8: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Risposte alla Provetta: 2.b – 6 punti

AVG(A)=(2+5)/2SUM(B)=6COUNT(C)=2

Gli operatori ignorano i campi con valore NULL

Anche COUNT(C)

COUNT(*) avrebbe calcolato tutti i campi, anche con NULL

A B C

NULL 2 4

2 2 6

NULL 2 NULL

5 NULL NULL

Page 9: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

ER

Student

name matricola

University

name address

StudiesAt

Faculty name

ofProfessor

name id

BelongsTo

Rector

Page 10: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Weak Entity

Relazione è del tipo “parte di” Unit-of, Belongs-to, is-a

Questo significa che entità non è unica Es: professore di università Chiave: profId, facoltàId

universitàIdLe chiave di queste entità si formano dalle chiave delle

altre entità, con quali sono in relazione del tipo “parte di”

Se le entità referenti sono anche deboli, le chiavi si formano dalle chiavi di entità referenti di entità referenti ecc.

Page 11: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Risposte alla Provetta: 3 – 5 punti

Student(matricola, name, Uname) FK Uname to University.name

University(name, address, rector) FK rector to Professor.id

Professor(id, name, Fname, Uname) FK Fname to Faculty.Fname FK Uname to University.Uname

Faculty(Fname, Uname) FK Uname to University.name

Page 12: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Risposte alla Provetta: 4 – 5 punti

R(A, B, C, D, E)FD: AB->C, BC->D, E->DBCNF: per ogni FD X->Y

Y X (non-trivial FD) X è superkey (determina tutta R)

Nel nostro caso Tutti FD sono non-trivial - OK Che ne dite di superkey?

Page 13: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Test di chiusura

AB+=ABCDBC+=BCDE+=ED

Nessuna FD è superkey (devono essere tutti)ABE – candidato alla chiaveQuindi, R(ABCDE) non è in BCNFDobbiamo normalizzarla

BCD, ABC, ABEED, ABC, ABE

Page 14: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Normalizzazione 1

ABCDE

ABCD ABE

AB->C

•R si decompone in R1 e R2

•R1=X+

•R2=R-(X+-X)

BCD ABC

Chiave, quindi normalizzata

BC->DE->D

Non sono superchiavi

BC->D

Mai ABC a questo punto!

R-X + X X +-X

R2

R1

R

Page 15: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Normalizzazione 2

ABCDE

BCD ABCE

BC->D

ABC ABE

AB->CE->D

Non sono superchiavi

AB->C

Page 16: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Normalizzazione 3

ABCDE

ED ABCE

E->D

ABE ABC

AB->CBC->D

Non sono superchiavi

AB->C

Page 17: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Statistics

15,5% hanno ricevuto piu di 2562,1% hanno ricevuti tra 18 e 2522,4% hanno ricevuti meno di 18

0

1

2

3

4

5

6

7

8

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Page 18: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Collegamento a PostgreSQL

Command line psql -U user01 -d db01 -h ares.science.unitn.it

user01 puo’ essere sostituito da user02, user03, …, user99, user100

Stessa cosa per db01 Ci bisognerà di inserire password – stessa cosa

Visualizzare tutte le tabelle SET search_path TO imdb,public

Query Nomi di tabelle e attributi vanno “”, e.g., “Movie” Prima di nomi di tabelle va imdb., e.g., imdb.“Movie” Tutti nomi sono case sensitive, e.g., tabella “movie” non esiste Query finiscono con simbolo “;”

Page 19: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

TORNIAMO ALLA LEZIONE

INSERTUPDATEDELETE

Page 20: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

INSERT

Il comando di inserimento di righe nella base di dati presenta due sintassi alternative:

INSERT INTONome Tabella [lista attributi]VALUES(valore1, valore2, ...)

INSERT INTONome Tabella [lista attributi]VALUES(select SQL)

Page 21: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

INSERT

• Le colonne (o campi) di destinazione dei valori possono essere o meno dichiarate nel comando.

• Se non vengono dichiarate, è necessario passare al comando un valore per ogni colonna della tabella, rispettando rigorosamente l'ordine delle colonne stesse.

Page 22: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

INSERT

E’ possibile indicare le sole colonne per le quali vengono passati dei valori, purché vengano inseriti comunque i valori per tutte le colonne not null (che non possono essere nulle) della tabella. INSERT INTO

Nome Tabella (col1, col2,..)VALUES(valore1, valore2, ...)

Page 23: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

INSERT

Il comando INSERT opera inserendo in tabella una sola riga per volta.

È possibile inserire più di una riga "in modo automatico" passando al comando INSERT una serie di righe (o tuple) risultanti da un comando di SELECT, purché tali righe siano compatibili con le colonne della tabella su cui si inseriscono i dati.

Page 24: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

ESERCIZIO

Aggiungere, alla tabella Movie, il film “La ricerca della felicità” del regista Gabriele Muccino (Medusa Films, 117 minuti)

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#)

INSERT INTO "Movie“ ("title","year","length","inColor","studioName","producerC#) VALUES (‘La ricerca della felicità’,‘2006’,‘117’, ‘true’,‘Medusa’,x);<- dato dall’inserimento di GM in MovieExec

Page 25: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

ESERCIZIO

Aggiungere, alla tabella Studio, i nomi degli studi cinematografici presenti nella tabella Movie (StudioName) ma non nella tabella Studio

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#)

INSERT INTO “Studio" (“Name”) SELECT DISTINCT “studioName” FROM “Movie” WHERE “studioName” NOT IN (SELECT “name” FROM imdb.”Studio”);

Page 26: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

INSERT

Ciascuna forma del comando possiede uno specifico campo di applicazione

La prima è quella tipicamente usata all’interno di programmi per riempire una tabella con i dati forniti direttamente dagli utenti

La seconda forma permette invece di inserire dati di una tabella a partire da altre informazioni presenti nella base di dati

Page 27: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

UPDATE

Il comando UPDATE permette di aggiornare uno o più attributi delle righe di una specifica tabella che soddisfano un’evantuale condizione.

UPDATENomeTabellaSET(valore1, valore2, ...)WHERE(condizione)

Page 28: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

UPDATE

Se la condizione non compare, come al solito si suppone di default un valore vero e si esegue la modifica su tutte le righe.

Il nuovo valore cui viene posto l’attributo può essere: Il risultato della valutazione di un’espressione

sugli attributi della tabella il risultato di una generica interrogazione SQL il valore nullo il valore di default per il dominio

Page 29: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

ESERCIZIO

• Aumentare del 10% il networth dei produttori che hanno prodotto almeno 10 film in bianco e nero

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#)

UPDATE “MovieExec” set “netWorth”=“netWorth”*1.1 WHERE “cert#” in (select “producerC#” from “Movie” where “inColor”=‘false’ Group by “producerC#” Having count(*)>=‘10’)

Page 30: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

UPDATE

E’ possibile modificare più colonne contermporaneamente in una riga mediante l'uso della virgola per separare i campi

UPDATE NomeTabella SET Nome_Colonna1 = Nuovo_Valore1,Nome_Colonna2 = Nuovo_Valore2,Nome_Colonna3 = Nuovo_Valore3WHERE (condizione)

Page 31: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

ESERCIZIO

Aggiunger il prefisso “Pres. ” ai nomi di produttori che sono presidenti di uno Studio:

UPDATE “MovieExec” SET “name”='Pres. '|| “name” WHERE “cert#” IN (SELECT “presC#” FROM “Studio”);

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#)

Page 32: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

DELETE

Il comando DELETE elimina righe dalle tabelle della base di dati seguendo la semplice sintassi:

DELETE FROMNomeTabellaWHERE(condizione)

Page 33: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

DELETE

Quando la condizione argomento della clausola where non viene specificata, il comando cancella tutte le righe della tabella.

DELETE FROM Nome_Tabella

DELETE * FROM Nome_Tabella

Page 34: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

ESERCIZIO

Eliminare i riferimenti al film 'City by the Sea’ prodotto nell’anno 2002 a cui ha partecipato l’attore Rober De Niro (De Niro, Robert).

DELETE FROM “StarsIn” WHERE “movieTitle”='City by the Sea' AND “movieYear”=‘2002’ AND “starName” =‘De Niro, Robert’;

DELETE FROM “Movie” WHERE “title”='City by the Sea' AND “year”=‘2002’

Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#)

Page 35: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

DDL (Data Definion Language)

DML è finito SELECT, INSERT, UPDATE, DELETE

DDL Domini elementari Definizione di domini Valori predefiniti di domini Definizione di schema Definizione di tabella Intra-relational constraints Inter-relational constraints Modificazioni delle tabelle esistenti

Page 36: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Domini elementari 1/2

Character [varying][(Length)][character set CharsetName] Character(20) character set Greek Character varying, varchar

Bit [varying][(length)] bit(5) – stringa di 5 bit varbit(100) – stringa di massimo 100 bit

Numeric[(precision[, scale])] numeric(5,2): [-999.99,999.99] Default scale = 0, default precision dipende dalla

implementazione (e.g., 10 in mySQL, 18 in MSQ SQL) Decimal[(precision[, scale])]

Diverso da numeric: precision di decimal è minimo richiesto integer smallint

Page 37: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Domini elementari 2/2

Float[(Precision)] Double precision Real

Date Data, mese, anno

Time[(Precision)][with time zone] Ore, minute, seconde Precision=6 microsecondi With time zone: timezone_hour, timezone_minute

21:03:04+1:00 = 20:03:04+0:00 Timestamp [(Precision)][with time zone]

Dall’anno ai secondi

Interval FirstUnitOfTime [LastUnitOfTime]

Floating point rappresentazione:

mantissa+esponenta, e.g., 0.17E16 = 1.7X1015

Page 38: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Lavoriamo con Tempo

SELECT CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP;

SELECT now();SELECT EXTRACT(YEAR FROM CURRENT_DATE);

Lo stesso con MONTH, DAY Lo stesso con FROM CURRENT_TIME (con HOUR,

MINUTE, SECOND) Lo stesso con FROM CURRENT_TIMESTAMP (con tutto)

SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40'); Risultato = 16

Page 39: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Altri domini

BooleanBLOBOLETextMemoLongSmalldatetimeBigintTinyint

Page 40: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

Definione di Schema

CREATE SCHEMA [SchemaName][[authorization]Authorization]{SchemaElementDefinions} Tabelle View Assertions ecc

Page 41: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

DEFINIZIONE TABELLE

Una tabella SQL è costituita da una collezione ordinata di attributi e da un insieme di vincoli (eventualmente vuoto).

CREATE TABLE NomeTable

{ NomeAttributo Dominio [ValoreDiDefault][Vincoli] NomeAttributo Dominio [ValoreDiDefault][Vincoli] NomeAttributo Dominio [ValoreDiDefault][Vincoli] … AltriVincoli }

Page 42: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

DEFINIZIONE TABELLE

Ogni tabella, viene definita associandole un nome ed elencando gli attributi che ne compongono lo schema.

Per ogni attributo si definisce un nome, un dominio ed eventualmente un insieme di vincoli che devono essere rispettati dai valori dell’attributo.

Dopo aver definito gli attributi, si possono definire i vincoli che coinvolgono più attributi della tabella.

Una tabella è inizialmente vuota e il creatore possiede tutti i privilegi sulla tabella.

Page 43: SQL: Lezione 6 Nataliya Rassadko rassadko@gmail.com

ESERCIZIO

Ricreare la tabella Movie nel db di lavoro work.

CREATE TABLE “Movie” (“title” VARCHAR(255), “year” INT2, “length” INT2, “inColor” BOOL, “studioName” VARCHAR(255), “producerC#” VARCHAR(255));