La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

SQL: Lezione 6 Nataliya Rassadko

Presentazioni simili


Presentazione sul tema: "SQL: Lezione 6 Nataliya Rassadko"— Transcript della presentazione:

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

2 Agenda Risposte alla provetta Modifiche di DB INSERT UPDATE DELETE Creazione di DB

3 Risposte alla Provetta: 1.a – 4 punti Visualizzarre gli studenti che sono nati prima di 1986 e frequentano il corso Databases iniziate nellanno 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 nellalgebra si usava join, -1 Students (Sid, Name, Birthday) Courses (Cid, Title, Year) Enrollment (Sid, Cid, Enrollment, Grade) CoursePrerequisites(Cid, PCId, Credits)

4 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 nellalgebra si usava join, -1 Students (Sid, Name, Birthday) Courses (Cid, Title, Year) Enrollment (Sid, Cid, Enrollment, Grade) CoursePrerequisites(Cid, PCId, Credits)

5 Risposte alla Provetta: 1.c – 2 punti Visualizzarre la media di voti per ciascuno corso iniziato nellanno 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)

6 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 recorsia Non *! Ci sono Credits! Step ri recorsia

7 Risposte alla Provetta: 2.a – 2 punti ABC NULL24 226 2 5 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

8 Risposte alla Provetta: 2.b – 6 punti AVG(A)=(2+5)/2 SUM(B)=6 COUNT(C)=2 Gli operatori ignorano i campi con valore NULL Anche COUNT(C) COUNT(*) avrebbe calcolato tutti i campi, anche con NULL ABC NULL24 226 2 5

9 ER

10 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àId Le 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.

11 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

12 Risposte alla Provetta: 4 – 5 punti R(A, B, C, D, E) FD: AB->C, BC->D, E->D BCNF: 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?

13 Test di chiusura AB + =ABCD BC + =BCD E + =ED Nessuna FD è superkey (devono essere tutti) ABE – candidato alla chiave Quindi, R(ABCDE) non è in BCNF Dobbiamo normalizzarla BCD, ABC, ABE ED, ABC, ABE

14 Normalizzazione 1 ABCDE ABCD ABE AB->C R si decompone in R 1 e R 2 R 1 =X + R 2 =R-(X + -X) BCDABC Chiave, quindi normalizzata BC->D E->D Non sono superchiavi BC->D Mai ABC a questo punto! R-X +R-X + XX +-XX +-X R2R2 R1R1 R

15 Normalizzazione 2 ABCDE BCD ABCE BC->D ABCABE AB->C E->D Non sono superchiavi AB->C

16 Normalizzazione 3 ABCDE ED ABCE E->D ABEABC AB->C BC->D Non sono superchiavi AB->C

17 Statistics 15,5% hanno ricevuto piu di 25 62,1% hanno ricevuti tra 18 e 25 22,4% hanno ricevuti meno di 18

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

19 TORNIAMO ALLA LEZIONE INSERT UPDATE DELETE

20 INSERT Il comando di inserimento di righe nella base di dati presenta due sintassi alternative: INSERT INTO Nome Tabella [lista attributi] VALUES(valore1, valore2,...) INSERT INTO Nome Tabella [lista attributi] VALUES(select SQL)

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

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

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

24 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 dallinserimento di GM in MovieExec

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

26 INSERT Ciascuna forma del comando possiede uno specifico campo di applicazione La prima è quella tipicamente usata allinterno 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

27 UPDATE Il comando UPDATE permette di aggiornare uno o più attributi delle righe di una specifica tabella che soddisfano unevantuale condizione. UPDATE NomeTabella SET(valore1, valore2,...) WHERE(condizione)

28 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 lattributo può essere: Il risultato della valutazione di unespressione sugli attributi della tabella il risultato di una generica interrogazione SQL il valore nullo il valore di default per il dominio

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

30 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_Valore3 WHERE (condizione)

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

32 DELETE Il comando DELETE elimina righe dalle tabelle della base di dati seguendo la semplice sintassi: DELETE FROM NomeTabella WHERE (condizione)

33 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

34 ESERCIZIO Eliminare i riferimenti al film 'City by the Sea prodotto nellanno 2002 a cui ha partecipato lattore 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#)

35 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

36 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

37 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] Dallanno ai secondi Interval FirstUnitOfTime [LastUnitOfTime] Floating point rappresentazione: mantissa+esponenta, e.g., 0.17E16 = 1.7X10 15

38 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

39 Altri domini Boolean BLOB OLE Text Memo Long Smalldatetime Bigint Tinyint

40 Definione di Schema CREATE SCHEMA [SchemaName][[authorization]Authorization]{Sche maElementDefinions} Tabelle View Assertions ecc

41 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 }

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

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


Scaricare ppt "SQL: Lezione 6 Nataliya Rassadko"

Presentazioni simili


Annunci Google