Corso di Basi di Dati

Documenti analoghi
SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative

Il linguaggio SQL: query innestate

BASI DATI: algebra relazionale

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

V. Moriggia Modelli di Base Dati. Modelli di Base Dati. a.a. 2001/

Il linguaggio SQL: viste e tabelle derivate. Versione elettronica: SQLd-viste.pdf

Il linguaggio SQL: viste e tabelle derivate

Dichiarazione degli schemi in SQL DDL 1

Linguaggio SQL. studenti matricola nome cognome citta anno 11 marco bini bologna laura sicuro rimini 1984 esami codice

Esempio di database relazionale con l utilizzo del prodotto MySQL

DATABASE PER IL WEB. Programmazione Web 1

Storia. Corso di Basi di Dati Spaziali. Componente DDL. Funzionalità. Esempio. Creazione di schema. Linguaggi: SQL. Storia:

Corso di Laurea in Ingegneria Informatica Algoritmi e basi di dati Modulo Basi di dati a.a

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Basi di Dati. Esercitazione 3: Interrogazioni in SQL. K. Donno - Interrogazioni in SQL

I database. Introduzione alla teoria delle basi di dati

SQL. Structured Query Language 1974: SEQUEL by IBM 1981: SQL by IBM : SQL ISO 9075:1992 SQL:1999 SQL:2003

INTRODUZIONE ALLE BASI DATI RELAZIONALI

SQL - Funzioni di gruppo

2011 Politecnico di Torino 1

Progettazione logica

LABORATORIO di INFORMATICA

Basi di dati: appello 08/03/06

Basi di Dati. S Q L Lezione 2


STUDIO. Esercizi proposti a lezione cap. 3 rev. dic da Ulmann, Widom Introduzione ai database. indirizzo. titolo. nome. recitain. attori.

SQL Sintassi Dei Comandi

Basi di Dati prof. Letizia Tanca lucidi ispirati al libro Atzeni-Ceri-Paraboschi-Torlone. SQL: il DDL

SQL (STRUCTURED QUERY LANGUAGE)

SISTEMI OPERATIVI, RETI, INTERNET

Esame Informatica Generale 13/04/2016 Tema A

Il linguaggio SQL. ing. Alfredo Cozzi 1

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

SQL: Concetti Base -Prima Parte-

Documentazione SQL. Argomento Sintassi Note Definizione schema create schema [NomeSchema] [[authorization] Autorizzazione] {DefElementoSchema}

Alessandra Raffaetà. Esempio: Compagnia di trasporti

Vincoli e Triggers. Vincoli. Tipo di vincoli. Chiavi esterne

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

Esprimere in algebra (ottimizzata), calcolo relazionale la seguente query:

Modulo 2 Data Base - Modello Relazionale

Vincoli di Integrità Approccio dichiarativo alla loro implementazione

CONCETTI E ARCHITETTURA DI UN SISTEMA DI BASI DI DATI

XML e Windows Phone. Semplice tutorial per l'utilizzo di documenti e dati XML in un'app per Windows Phone.

SQL: concetti base SQL. Definizione dei dati in SQL. SQL: "storia"

SQL non è solo un linguaggio di interrogazione (Query Language), ma. Un linguaggio per la definizione di basi di dati (Data-definition language (DDL))

SQL PER LA DEFINIZIONE DI BASI DI DATI

INFORMATICA PER L IMPRESA (Docente Prof. Alfredo Garro) ESERCIZIO 3

Per poter interagire con un database in rete mediante uno script php bisogna. innanzitutto cerare una connessione. Ciò si ottiene mediante la funzione

Il linguaggio SQL: le basi

Si considerino le seguenti specifiche relative alla realizzazione di un sistema informativo per la gestione di un sito di blog.

DBMS (Data Base Management System)

Compito Sistemi Informativi LA. Tempo concesso : 90 minuti 28 Giugno 05 Nome: Cognome: Matricola: Esercizio 1

DUE GRUPPI DI COMANDI

SELECT FROM ORDER BY SELECT FROM ORDER BY DESC DESC SELECT FROM ORDER BY DESC DESC SELECT FROM WHERE SELECT FROM WHERE AND SELECT FROM WHERE AND

Indicare quale o quali delle seguenti affermazioni sono vere?

Esame di Informatica Generale 25 giugno 2010 Professori: Carulli, Fiorino, Mazzei

Parte 6 Esercitazione sull accesso ai file

Università degli Studi di Milano. Esercizi Corso SIT. Basi di dati

CAPITOLO V. DATABASE: Il modello relazionale

Definizione di domini

SISTEMI INFORMATIVI AZIENDALI. introduzione ai sistemi informativi 1

Data management a.a Il linguaggio SQL

Il linguaggio SQL: le basi. Versione elettronica: SQLa-basi.pdf

Si considerino le seguenti specifiche per la realizzazione di un sito web per la gestione di abbonamenti a riviste di vario genere..

Corso di Informatica. Software di produttività personale e database. Ing Pasquale Rota

Traduzione dello schema E-R in modello logico relazionale

Capitolo 4. Soluzione: Soluzione: Create domain STRING as character varying (256) default sconosciuto not null

Capitolo 9. Esercizio 9.1. Esercizio 9.2

SQL (STRUCTURED QUERY LANGUAGE)

MAX, SUM, AVG, COUNT)

Introduzione. Structured Query Language (SQL) Inquadramento. Evoluzione dello standard SQL - 1. La situazione attuale

Corso di Laboratorio di Basi di Dati

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

ACCESS. Database: archivio elettronico, dotato di un programma di interfaccia che facilita la registrazione e la ricerca dei dati.

ESERCIZI DI MODELLAZIONE E-R

Database. Cos è un database? Intro Tipi di entità Mapping ER/EER à Relazionale

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

ESERCIZIO 1 (12 punti) Dato il seguente schema relazionale, che modella le informazioni relative ad una Software (SW) House:

PROGRAMMA DI CLASSE 5AI

INFORMATICA. Applicazioni WEB a tre livelli con approfondimento della loro manutenzione e memorizzazione dati e del DATABASE.

Progetto B. Utenti. Di conseguenza si potranno avere solo utenti di questi tipi

Laboratorio di Basi di Dati

Mini-Corso di Informatica

BASI DI DATI. basi di dati - introduzione ai sistemi informativi 1

Basi di dati e Sistemi informativi aziendali

SQL IL LINGUAGGIO DI INTERROGAZIONE

Normalizzazione. Definizione

Prova Scritta di Basi di Dati

Structured Query Language. Informatica Generale - SQL Versione 1.0, aa p.1/172

Data Management Software. Il linguaggio SQL. Raggruppamenti. Paolo Avallone Sr Consulting IT Specialist DB2, Data Management Marzo 2004

Domini elementari in SQL

Basi di Dati 1 Prof. L. Tanca e F. A. Schreiber APPELLO DEL 21 LUGLIO 2015 Tempo: 2h30m

Il linguaggio SQL Basi di dati 1. Il linguaggio SQL. Angelo Montanari. Dipartimento di Matematica e Informatica Università di Udine

Uso delle variabili di alias. SQL slide aggiuntive. Interrogazione 25. Interrogazione 26

Domini Numerici Esatti (1) I domini numerici esatti permettono di definire attributi che contenegono valori esatti interi o con parte frazionaria.

Vincoli di Integrità

Basi di Dati Prof. L. Tanca e F. A. Schreiber APPELLO DEL 12 FEBBRAIO 2015 PARTE 1

Fondamenti di Informatica T1 Mappe

CAPITOLO 4 ESERCIZI SU SQL

Transcript:

Corso di Basi di Dati Il Linguaggio SQL Home page del corso: http://www.cs.unibo.it/~difelice/dbsi/

Il Linguaggio SQL SQL (Structured Query Language) è il linguaggio di riferimento per le basi di dati relazionali. Diverse versioni del linguaggio: SQL-86 à Costrutti base SQL-89 à Integrita referenziale SQL-92 (SQL2) à Modello relazionale, struttura a livelli SQL:1999 (SQL3) à Modello ad oggetti SQL:2003 (SQL3) à Nuove parti: SQL/JRT, SQL/XML SQL:2006 (SQL3) à Estensione di SQL/XML SQL:2008 (SQL3) à Lievi aggiunte

Es. Estrarre il codice dello strutturato che riceve lo stipendio più alto. STRUTTURATI Codice Nome Cognome Tipo Dipartimento Stipendio 123 Marco Marchi Associato Chimica 20000 124 Michele Micheli Associato Fisica 20000 125 Lucia Di Lucia Ordinario Fisica 30000 126 Dario Rossi Ordinario Informatica 35000 127 Mario Rossi Ricercatore Informatica 15000 129 Michele Bianchi Associato Fisica 20000

Es. Estrarre il codice dello strutturato che riceve lo stipendio più alto. SELECT CODICE, MAX(STIPENDIO) FROM STRUTTURATI ERRORE SELECT MAX(STIPENDIO) restituisce solo un valore SELECT CODICE restituisce più di un valore

Es. Estrarre il codice dello strutturato che riceve lo stipendio piu alto. SELECT CODICE FROM STRUTTURATI WHERE STIPENDIO= MAX(STIPENDIO) ERRORE L operatore aggregato MAX si applica sulla SELECT e viene valutato dopo la WHERE

Nella clausola where, oltre ad espressioni semplici, possono comparire espressioni complesse in cui il valore di un attributo viene confrontato con il risultato di un altra query (query annidate). SELECT FROM NOTA: Si sta confrontando un singolo valore con il risultato di una query (quindi potenzialmente una tabella). WHERE (Attributo expr SELECT FROM WHERE)

Es. Estrarre il codice dello strutturato che riceve lo stipendio più alto. STRUTTURATI Codice Nome Cognome Tipo Dipartimento Stipendio 123 Marco Marchi Associato Chimica 20000 124 Michele Micheli Associato Fisica 20000 125 Lucia Di Lucia Ordinario Fisica 30000 126 Dario Rossi Ordinario Informatica 35000 127 Mario Rossi Ricercatore Informatica 15000 129 Michele Bianchi Associato Fisica 20000

Es. Estrarre il codice dello strutturato che riceve lo stipendio piu alto. QUERY ESTERNA SELECT CODICE FROM STRUTTURATI WHERE (STIPENDIO = SELECT MAX(STIPENDIO) FROM STRUTTURATI) CODICE 126 QUERY INTERNA

Nel caso precedente, la query interna restituisce solo un valore Cosa accade se la query interna restuisce più di un valore? Gli operatori di confronto <,=,> non si possono utilizzare in questo caso Es. Estrarre nome e cognome degli strutturati del dipartimento di Informatica che guadagnano quanto un loro collega di Fisica.

Nel caso precedente, la query interna restituisce solo un valore Cosa accade se la query interna restuisce piu di un valore? SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO= INFORMATICA ) AND (STIPENDIO = (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO= FISICA ))) NON FUNZIONA

Esistono operatori speciali di confronto nel caso di interrogazioni annidate: any à la riga soddisfa la condizione se e vero il confronto tra il valore dell attributo ed ALMENO UNO dei valori ritornati dalla query annidata. all à a riga soddisfa la condizione se e vero il confronto tra il valore dell attributo e TUTTI i valori ritornati dalla query annidata.

Il costrutto in restituisce true se un certo valore e contenuto nel risultato di una interrogazione nidificata, false altrimenti. SELECT ListaAttributi FROM TabellaEsterna Nel caso di più di 1 valore si utilizza il costrutture di tuple. WHERE Valore/i IN SELECT ListaAttributi2 FROM TabellaInterna WHERE Condizione

Il costr utto exist restituisce true se l interrogazione nidificata restituisce un risultato non vuoto (>=1 elemento trovato). SELECT ListaAttributi FROM TabellaEsterna WHERE EXIST SELECT ListaAttributi2 FROM TabellaInterna WHERE Condizione Controlla se il numero di righe della query interna>0

Es. Estrarre nome e cognome degli strutturati del dipartimento di Informatica che guadagnano quanto un loro collega di Fisica. SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO= INFORMATICA ) AND (STIPENDIO = ANY (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO= FISICA )))

Es. Estrarre nome e cognome degli strutturati del dipartimento di Informatica che guadagnano più di tutti i loro colleghi di Fisica. SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO= INFORMATICA ) AND (STIPENDIO > ALL (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO= FISICA )))

Le interrogazioni nidificate possono essere: Semplici à non c e passaggio di binding tra un contesto all altro. Le interrogazioni vengono valutate dalla più interna alla più esterna. Complesse à c e passaggio di binding attraverso variabili condivise tra le varie interrogazioni. In questo caso, le interrogazioni più interne vengono valutate su ogni tupla.

STEP1: Viene valutata la query più interna SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO= INFORMATICA ) AND (STIPENDIO > ALL (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO= FISICA ))) Stipendio 20000 30000 20000

STEP2: Viene confrontata ciascuna riga della tabella più esterna con il risultato della query interna SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO= INFORMATICA ) AND (STIPENDIO > ALL (SELECT STIPENDIO Codice Nome Cognome Tipo Dipartimento Stipendio 123 Marco Marchi Associato Chimica 20000 124 Michele Micheli Associato Fisica 20000 125 Lucia Di Lucia Ordinario Fisica 30000 126 Dario Rossi Ordinario Informatica 35000 127 Mario Rossi Ricercatore Informatica 15000 129 Michele Bianchi Associato Fisica 20000 Stipendio 20000 30000 20000

STEP2: Viene confrontata ciascuna riga della tabella più esterna con il risultato della query interna SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO= INFORMATICA ) AND (STIPENDIO > ALL (SELECT STIPENDIO Codice Nome Cognome Tipo Dipartimento Stipendio 123 Marco Marchi Associato Chimica 20000 124 Michele Micheli Associato Fisica 20000 125 Lucia Di Lucia Ordinario Fisica 30000 126 Dario Rossi Ordinario Informatica 35000 127 Mario Rossi Ricercatore Informatica 15000 129 Michele Bianchi Associato Fisica 20000 Stipendio 20000 30000 20000

STEP2: Viene confrontata ciascuna riga della tabella più esterna con il risultato della query interna SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO= INFORMATICA ) AND (STIPENDIO > ALL (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO= FISICA ))) Nome Dario Cognome Rossi

Le interrogazioni nidificate possono essere: Semplici à non c e passaggio di binding tra un contesto all altro. Le interrogazioni vengono valutate dalla piu interna alla piu esterna. Complesse à c e passaggio di binding attraverso variabili condivise tra le varie interrogazioni. In questo caso, le interrogazioni piu interne vengono valutate su ogni tupla.

Es. Estrarre nome/cognome degli impiegati che hanno omonimi (stesso nome/cognome di altri impiegati). IMPIEGATI Codice Nome Cognome Ufficio 1 Marco Marchi A 2 Dario Rossi B 3 Lucia Di Lucia C 4 Dario Rossi C 5 Mario Rossi A 6 Marco Marchi B

Es. Estrarre nome/cognome degli impiegati che hanno omonimi (stesso nome/cognome di altri impiegati). A=IMPIEGATI B=IMPIEGATI for i=0 A for j=0 B if ((A[i].Nome==B[j].Nome) AND (A[i].Cognome== B[j].Cognome)) Include IMPIEGATI[i] into the result E necessario valutare due volte la tabella IMPIEGATI

Es. Estrarre nome/cognome degli impiegati che hanno omonimi (stesso nome/cognome di altri impiegati). SELECT NOME, COGNOME FROM IMPIEGATI AS I WHERE (I.NOME,I.COGNOME) = (SELECT NOME, COGNOME FROM IMPIEGATI AS I2 W H E R E ( I.NOME=I2.NOME) AND (I.COGNOME=I2.COGNOME) AND (I.CODICE <> I2.CODICE))

Funzionamento: La query più interna viene valutata su ciascuna tupla della query più esterna... I Codice Nome Cognome Ufficio 1 Marco Marchi A 2 Dario Rossi B 3 Lucia Di Lucia C 4 Dario Rossi C 5 Mario Rossi A 6 Marco Marchi B I2 Codice Nome Cognome Ufficio 1 Marco Marchi A 2 Dario Rossi B 3 Lucia Di Lucia C 4 Dario Rossi C 5 Mario Rossi A 6 Marco Marchi B

Funzionamento: La query più interna viene valutata su ciascuna tupla della query più esterna... I Codice Nome Cognome Ufficio 1 Marco Marchi A 2 Dario Rossi B 3 Lucia Di Lucia C 4 Dario Rossi C 5 Mario Rossi A 6 Marco Marchi B I2 Codice Nome Cognome Ufficio 1 Marco Marchi A 2 Dario Rossi B 3 Lucia Di Lucia C 4 Dario Rossi C 5 Mario Rossi A 6 Marco Marchi B

In alcuni casi, le query annidate possono essere riscritte usando costrutti di join tra tabelle o selfjoin (prodotto cartesiano + selezione). SELECT NOME, COGNOME FROM IMPIEGATI AS I,IMPIEGATI AS I2 WHERE (I.NOME=I2.NOME) AND (I.COGNOME=I2.COGNOME) AND (I.CODICE <> I2.CODICE))

In maniera equivalente, usando l operatore in ed i costruttori di tupla: SELECT CODICE FROM IMPIEGATI AS I WHERE (I.NOME,I.COGNOME) NOT IN (SELECT NOME, COGNOME FROM IMPIEGATI AS I2 WHERE (I.NOME=I2.NOME) AND (I.COGNOME=I2.COGNOME) AND (I.CODICE <> I2.CODICE))

Es. Estrarre nome/cognome degli impiegati che NON hanno omonimi (stesso nome/cognome di altri impiegati). IMPIEGATI Codice Nome Cognome Ufficio 1 Marco Marchi A 2 Dario Rossi B 3 Lucia Di Lucia C 4 Dario Rossi C 5 Mario Rossi A 6 Marco Marchi B

SELECT NOME, COGNOME FROM IMPIEGATI AS I WHERE NOT EXISTS (SELECT * FROM IMPIEGATI AS I2 W H E R E (I.NOME=I2.NOME) AND (I.COGNOME=I2.COGNOME) AND (I.CODICE <> I2.CODICE)) Q. E possibile scrivere la stessa query senza usare interrogazioni annidate?

Esempio (interrogazioni nidificate). Dato il seguente schema: FILM(Titolo, Anno, Regista) REGISTA(Nome, AnnoNascita) ATTORE(Nome, AnnoNascita) RECITAZIONE(TitoloFilm, NomeAttore) Selezionare i nomi dei registi che hanno recitato solo in film diretti da loro stessi.

Una possibile soluzione con 3 query annidate SELECT NOME FROM REGISTA R1 WHERE (NOT EXIST (SELECT * FROM FILM F WHERE ((F.TITOLO=ANY SELECT R.TITOLOFILM FROM RECITAZIONE R WHERE (R.NOMEATTORE=R1.NOME) ) AND (R1.NAME<>F.REGISTA)) ) )

SQL: Viste Le viste rappresentano tabelle virtuali ottenute da dati contenute in altre tabelle del database. Ogni vista ha associato un nome ed una lista di attributi, e si ottiene dal risultato di una select. create view NomeView [ListaAttributi] as SELECTSQL [with [local cascade] check option]

SQL: Viste PROPRIETA delle VISTE I dati delle viste NON sono fisicamente memorizzati a parte, in quanto dipendono da altre tabelle (ad eccezione delle viste materializzate). Le viste esistono a livello di schema ma non hanno istanze proprie. Le operazioni di aggiornamento di viste potrebbero non essere consentite in alcuni DBMS.

SQL: Viste Q. A che serve definire una vista? Implementare meccanismi di indipendenza tra il livello logico ed il livello esterno. S c r i ve r e i n t e r r o g a z i o n i c o m p l e s s e, semplificandone la sintassi. Garantire la retro-compatibilità con precedenti versioni dello schema del DB, in caso di ristrutturazione dello stesso.

SQL: Viste Data la tabella PROFESSORI, definire una vista STUDENTI in cui si mostrano solo le informazioni anagrafiche (nome, cognome, codice, data nascita) dei docenti. PROFESSORI Codice Nome Cognome Nascita Livello Stipendio 1 Marco Marchi 10/04/1980 A1 20000 3 Michele Micheli 12/05/1967 R 20000 5 Lucia Di Lucia 12/05/1978 R2 30000 7 Dario Rossi 24/01/1965 O2 32000

SQL: Viste Data la tabella PROFESSORI, definire una vista STUDENTI in cui si mostrano solo le informazioni anagrafiche (nome, cognome, codice, data nascita) dei docenti. CREATE VIEW STUDENTI(CODICE,NOME,COGNOME, DATANASCITA) AS SELECT CODICE,NOME,COGNOME,NASCITA FROM PROFESSORI

SQL: Viste Q. A che serve definire una vista? Implementare meccanismi di indipendenza tra il livello logico ed il livello esterno. S c r i ve r e i n t e r r o g a z i o n i c o m p l e s s e, semplificandone la sintassi. Garantire la retro-compatibilita con precedenti versioni dello schema del DB, in caso di ristrutturazione dello stesso.

SQL: Viste Es. Estrarre il nome del dipartimento che ha la spesa più alta in stipendi. STRUTTURATI Codice Nome Cognome Tipo Dipartimento Stipendio 123 Marco Marchi Associato Chimica 20000 124 Michele Micheli Associato Fisica 20000 125 Lucia Di Lucia Ordinario Fisica 30000 126 Dario Rossi Ordinario Informatica 32000 127 Mario Rossi Ricercatore Informatica 15000 129 Michele Bianchi Associato Fisica 20000

SQL: Viste L interrogazione seguente potrebbe non essere consentita su alcuni DBMS SELECT DIPARTIMENTO FROM STRUTTURATI GROUP BY DIPARTIMENTO HAVING SUM(STIPENDIO)>= ALL SELECT SUM(STIPENDIO) FROM STRUTTURATI GROUP BY DIPARTIMENTO

SQL: Viste Soluzione. Creare una vista che visualizzi la somma totale degli stipendi di ciascun dipartimento. CREATE VIEW SPESEDIPARTIMENTI (NOMEDIP, SPESA) AS SELECT DIPARTIMENTO, SUM(STIPENDI) FROM STRUTTURATI GROUPBY DIPARTIMENTO

SQL: Viste STEP2. Estrarre il nome del dipartimento che ha la spesa piu alta in stipendi usando la vista SPESEDIPARTIMENTI. SELECT NOMEDIP FROM SPESEDIPARTIMENTI WHERE SPESA=(SELECT MAX(STIPENDI) FROM SPESEDIPARTIMENTI) Q: E possibile scrivere la stessa interrogazione senza usare una vista?

SQL: Viste Q. A che serve definire una vista? Implementare meccanismi di indipendenza tra il livello logico ed il livello esterno. S c r i ve r e i n t e r r o g a z i o n i c o m p l e s s e, semplificandone la sintassi. Garantire la retro-compatibilita con precedenti versioni dello schema del DB, in caso di ristrutturazione dello stesso.

SQL: Viste Si supponga di avere un DB, in cui la tabella: ESAMI(Matricola,Nome,Cognome,Data,Voto) Viene sostituita con le tabelle: STUDENTI(Matricola,Nome,Cognome) PROVE(Matricola,Data,Voto) Con le viste, è possibile mantenere anche la visione originaria del DB

SQL: Viste Con le viste, è possibile mantenere anche la visione originaria del DB CREATE VIEW ESAMI(MATRICOLA, NOME, COGNOME, DATA, VOTO) AS SELECT S.*, P.DATA, P.VOTO FROM STUDENTI AS S, PROVE AS P WHERE S.MATRICOLA=P.MATRICOLA

SQL: Viste In generale, l aggiornamento di una vista è un operazione molto delicata, ed è consentita solo in un sottoinsieme (limitato) di casi In molti DBMS commerciali, non e consentito l aggiornamento di viste che sono ottenute da piu di una tabella. CREATE VIEW CAPI(NOME, TELEFONO) AS SELECT I.NOME,U.TEL FROM IMPIEGATI AS I,UFFICI AS U WHERE (I.NOME=U.NOME) AND (I.RUOLO= C ) Piu di una tabella, vista non aggiornabile

SQL: Viste L opzione WITH CHECK OPTION consente di definire viste aggiornabili, a condizione che le tuple aggiornate continuino ad appartenere alla vista (in pratica, la tupla aggiornata non deve violare la clausola WHERE). CREATE VIEW PROFESSORIRICCHI(CODICE,NOME,COGNOME,STIPENDIO) AS SELECT CODICE,NOME,COGNOME,STIPENDIO FROM PROFESSORI WHERE (STIPENDIO>=30000)

SQL: Viste PROFESSORI Codice Nome Cognome Nascita Livello Stipendio 1 Marco Marchi 10/04/1980 A1 20000 3 Michele Micheli 12/05/1967 R 20000 5 Lucia Di Lucia 12/05/1978 R2 30000 7 Dario Rossi 24/01/1965 O2 32000 PROFESSORIRICCHI Codice Nome Cognome Stipendio 5 Lucia Di Lucia 30000 7 Dario Rossi 32000 UPDATE PROFESSORIRICCHI SET STIPENDIO=20000 WHERE (CODICE=5) Operazione NON consentita

SQL: Viste Una vista può essere costruita a partire da altre viste dello schema (viste derivate) E possibile l aggiornamento di viste derivate? WITH LOCAL CHECK OPTION à Il controllo di validità si limita alla vista corrente. WITH CASCADE CHECK OPTION à Il controllo di validità si estende ricorsivamente a tutte le viste da cui la corrente e derivata.

SQL: Viste L e C o m m o n Ta b l e E x p r e s s i o n (CTE) rappresentano viste temporanee che possono essere usate in una query come se fossero una vista a tutti gli effetti. Differenza con la vista à una CTE non esiste a livello di schema del DB WITH NAME(Attributi) AS SQLCommand SQL Query (including VIEW in its definition)

SQL: Viste Es. Estrarre il nome del dipartimento che ha la spesa più alta in stipendi. WITH SPESEDIPARTIMENTI (NOMEDIP, SPESA) AS SELECT DIPARTIMENTO, SUM(STIPENDI) FROM STRUTTURATI GROUPBY DIPARTIMENTO La vista temporanea SPESEDIPARTIMENTI SELECT NOMEDIP e valida solo nella query sottostante FROM SPESEDIPARTIMENTI WHERE SPESA=(SELECT MAX(STIPENDI) FROM SPESEDIPARTIMENTI)

SQL: Viste SQL2 non consente di definire viste ricorsive. Es. Trova tutti gli antenati di Paolo. GENITORI ANTENATI Figlio Genitore Persona Avo Paolo Marco Paolo Marco Marco Michele Paolo Michele Marco Lucia Paolo Lucia Simone Dario Paolo Dario In SQL3, è possibile definire CTE ricorsive semplici.

SQL: Viste WITH RECURSIVE ANTENATI(Persona, Avo) AS ((SELECT Figlio, Genitore FROM Genitori) UNION (SELECT G.Figlio, A.Avo FROM Genitori G, Antenati A WHERE G.Genitore=A.Persona)) SELECT Avo FROM Antenati WHERE (Persona= Anna )

SQL: Viste COME FUNZIONA? Ad ogni iterazione, si aggiungono alla tabella ANTENATI le tuple che risultano dal join tra GENITORI e le tuple aggiunte ad ANTENATI al passo precedente ANTENATI GENITORI Figlio Paolo Marco Marco Lucia Genitore Marco Michele Lucia Dario Figlio Paolo Marco Marco Lucia Paolo Paolo Marco Paolo Genitore Marco Michele Lucia Dario Michele Lucia Dario Dario I ITER. II ITER. III ITER.

SQL: Assertion Le asserzioni (SQL2) sono un costrutto per definire vincoli generici a livello di schema. create assertion NomeAsserzione check Condizione Consentono di definire vincoli non altrimenti definibili con i costrutti visti fin qui. Il vincolo può essere immediato o differito (ossia verificato al termine di una transazione).

SQL: Assertion Il voto deve essere compreso tra 18 e 30. CREATE ASSERTION VotoValido CHECK (Voto IS NOT NULL AND (VOTO>=18) AND (Voto<=30)) La tabella STUDENTI non può essere vuota CREATE ASSERTION TabellaValida CHECK (1>=SELECT COUNT(*) FROM STUDENTI)

SQL: Assertion CREATE SCHEMA IMP_SCHEMA; CREATE TABLE IMPIEGATI ( NOME VARCHAR(20); COGNOME VARCHAR(20); SALARIO NUMERIC; CODICE SMALLINT PRIMARY KEY; ); CREATE ASSERTION SALARIO_CONTROLLO CHECK (NOT EXISTS (SELECT * FROM IMPIEGATI WHERE (SALARIO > 35000));

SQL: Assertion Elementi di uno schema SQL visti fin qui: Tabelle Domini Viste Asserzioni ALTRO? Stored Procedures Trigger Regole d accesso