Corso di Basi di Dati Il Linguaggio SQL

Slides:



Advertisements
Presentazioni simili
Interrogazioni Semplici Le operazioni di interrogazione vengono specificate per mezzo dellistruzione select select ListaAttributi from ListaTabelle [where.
Advertisements

Principale limitazione di AR e SQL-92: interrogazioni ricorsive
Structured Query Language
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità C1 Il linguaggio SQL.
Structured Query Language (SQL) Presentazione 13.1 Informatica Generale (Prof. Luca A. Ludovico)
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
Principale limitazione di AR e SQL-92: interrogazioni ricorsive IMPIEGATO NOMENOMECAPO RossiVerdi NeriVerdi DeSio TucciDeSio DeLucaDeSio Lazio selezionare.
Asserzioni, Viste & Triggers
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
Basi di Dati prof. A. Longheu
SQL.
SQL Dati i seguenti schemi relazionali:
19/01/2014 Viste. 19/01/2014 Viste Le Viste Logiche o Viste o View possono essere definite come delle tabelle virtuali, i cui dati sono riaggregazioni.
1 Corso di Laurea in Biotecnologie Informatica (Basi di Dati) SQL: Data Manipulation Language (DML) Anno Accademico 2009/2010 Da: Atzeni, Ceri, Paraboschi,
Laboratorio di Basi di Dati Introduzione ad Access 2ª Parte.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999
Basi di dati Università Degli Studi Parthenope di Napoli
SQL: Lezione 7 Nataliya Rassadko
SQL Per la definizione di basi di dati SQL per definire ed amministrare Ogni utente puo definire una base di dati di cui diventa lamministratore potendo.
Esercitazione.
Trovare le matricole dei capi degli impiegati che guadagnano più di 40 milioni PROJCapo (SELStipendio>40 (Supervisione JOIN Impiegato=Matricola Impiegati))
Equivalenza di espressioni
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.
Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste listruzione.
Relazioni Relazione : concetto mutuato dalla definizione di relazione matematica della teoria degli insiemi, come sottoinsieme del prodotto cartesiano.
Manipolazione dei dati I comandi SQL che permettono di modificare il contenuto di una base di dati sono insertdeleteupdate insert ha la seguente sintassi:
SELECT STATEMENT Clausola WHERE permette di limitare il numero di record da estrarre SELECT */ [DISTINCT] colonna/ espressione [alias],… FROM table [WHERE.
Viste. Cosè una vista? è possibile creare un subset logico di dati o una combinazione di dati una vista è una tabella logica basata su una tabella o su.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, Capitolo 4:SQL 16/10/2002.
Basi di dati Claudia Raibulet
SQL: Structured Query Language
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
L’algebra relazionale
Gerarchie Ricorsive Una gerarchia ricorsiva deriva dalla presenza di una ricorsione o ciclo (un anello nel caso più semplice) nello schema operazionale.
Corso di Basi di Dati Il Linguaggio SQL Home page del corso:
Basi di Dati e Sistemi Informativi
Corso di Basi di Dati Il Linguaggio SQL
1 Il Linguaggio SQL Il Linguaggio SQL Prof. Lorenzo Vita, Ing. Luigi Testa.
Basi di Dati e Sistemi Informativi
Basi di Dati e Sistemi Informativi Il Linguaggio SQL Home page del corso:
Basi di Dati e Sistemi Informativi Il Linguaggio SQL Home page del corso:
SQL.
Sistemi Informativi Insieme di “strutture” in grado di acquisire, elaborare, trasmettere ed archiviare informazioni in genere ad uso di un’organizzazione.
DB- Sistemi Informativi
SQL Interrogazioni. 2 Interrogazioni in SQL Non esiste un SQL standard (vari dialetti) Formulazione di interrogazioni (query) è parte del Data Manipulation.
Microsoft Access (parte 5) Introduzione alle basi di dati Scienze e tecniche psicologiche dello sviluppo e dell'educazione, laurea magistrale Anno accademico:
Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (IV) SQL (Slide tratte in parte da da Atzeni, Ceri,
SQL (IV) Data Definition Language/ Data Manipulation Language.
Il Linguaggio SQL. Le interrogazioni in SQL (continua…) La parte di SQL dedicata alla formulazione di interrogazioni fa parte del DML. SQL esprime le.
SQL, esempi 30/10/2014Basi di dati SQL1. 30/10/2014Basi di dati SQL2 CREATE TABLE, esempi CREATE TABLE corsi( codice numeric NOT NULL PRIMARY KEY, titolo.
Algebra relazionale (III). Esempi di Interrogazioni: 3 Trovare matricola e nome dei capi i cui impiegati guadagnano tutti più di Tutti gli impiegati?
Microsoft Access Query (III).
1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.
Interrogazioni (parte 2)
SQL (III) Data Definition Language/ Data Manipulation Language.
Interrogazioni Le interrogazioni in SQL sono formulate in modo dichiarativo specificando cioè cosa si vuole ottenere e non come lo si vuole ottenere. L’interrogazione.
Vincoli Interrelazionali Per i vincoli visti l’inserimento di un valore che li viola viene semplicemente impedito. In caso di vincoli di integrità referenziale,
Vincoli interrelazionali
Raggruppamenti e target list scorretta select padre, avg(f.reddito), p.reddito from persone f join paternita on figlio = nome join persone p on padre =
Funzionalità del DBMS relazionale l Funzioni per –definizione della base di dati –inserimento / rimozione /aggiornamento di informazioni deve soddisfare.
Approfondimenti SQL.
Basi di Dati e Sistemi Informativi Esercitazione: Il Linguaggio SQL (DDL+DML) Home page del corso:
Linguaggio SQL prima parte Linguaggio SQL prima parte A. Lorenzi, E. Cavalli INFORMATICA PER SISTEMI INFORMATIVI AZIENDALI Copyright © Istituto Italiano.
SQL Linguaggio per l’interrogazione di una base dati.
Basi di Dati attive. Sistemi Informativi DEE - Politecnico di Bari E. TinelliBasi di dati attive2 Definizione Una base di dati si dice attiva quando dispone.
Linguaggio SQL. Linguaggi per database La diffusione del modello relazionale ha favorito l’uso prevalente di linguaggi non procedurali: in questo modo.
Esercizi SQL Group by. CREATE TABLE dipendente (codDip CHAR(8) NOT NULL UNIQUE PRIMARY KEY, cognome CHAR(60) NOT NULL, nome CHAR(60) NOT NULL, stipendio.
Corso di Basi di Dati Il Linguaggio SQL
Corso di Basi di Dati Il Linguaggio SQL
Transcript della presentazione:

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

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

SQL: DML Es. Estrarre il codice dello strutturato che riceve lo stipendio piu’ alto. SELECT CODICE, MAX(STIPENDIO) FROM STRUTTURATI ERRORE! SELECT MAX(STIPENDIO) restituisce solo un valore!! SELECT CODICE restituisce piu’ di un valore!!

SQL: DML 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 …

SQL: DML 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). NOTA: Si sta confrontando un singolo valore con il risultato di una query (quindi potenzialmente una tabella). SELECT FROM WHERE (Attributo expr SELECT WHERE)

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

SQL: DML 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) QUERY INTERNA CODICE 126

SQL: DML Nel caso precedente, la query interna restituisce solo un valore … Cosa accade se la query interna restuisce piu’ 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.

SQL: DML 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 WHERE (DIPARTIMENTO=“FISICA”))) NON FUNZIONA!

SQL: DML 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.

SQL: DML 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 WHERE (DIPARTIMENTO=“FISICA”)))

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

SQL: DML 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.

SQL: DML STEP1: Viene valutata la query piu’ interna… SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO > ALL (SELECT STIPENDIO WHERE (DIPARTIMENTO=“FISICA”))) Stipendio 20000 30000

SQL: DML STEP2: Viene confrontata ciascuna riga della tabella piu’ 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 Fisica 125 Lucia Di Lucia Ordinario 30000 126 Dario Rossi Informatica 35000 127 Mario Ricercatore 15000 129 Bianchi Stipendio 20000 30000

SQL: DML STEP2: Viene confrontata ciascuna riga della tabella piu’ 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 Fisica 125 Lucia Di Lucia Ordinario 30000 126 Dario Rossi Informatica 35000 127 Mario Ricercatore 15000 129 Bianchi Stipendio 20000 30000

SQL: DML STEP2: Viene confrontata ciascuna riga della tabella piu’ esterna con il risultato della query interna … SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO > ALL (SELECT STIPENDIO WHERE (DIPARTIMENTO=“FISICA”))) Nome Cognome Dario Rossi

SQL: DML 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.

SQL: DML 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 5 Mario 6

SQL: DML 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!!

SQL: DML 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 WHERE (I.NOME=I2.NOME) AND (I.COGNOME=I2.COGNOME) AND (I.CODICE <> I2.CODICE))

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

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

SQL: DML In alcuni casi, le query annidate possono essere riscritte usando costrutti di join tra tabelle o self-join (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))

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

SQL: DML 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))

Controlla se il numero di righe della query interna>0 SQL: DML Il costrutto 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

SQL: DML 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 5 Mario 6

SQL: DML SELECT NOME, COGNOME FROM IMPIEGATI AS I WHERE NOT EXISTS (SELECT * FROM IMPIEGATI AS I2 WHERE (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?

SQL: DML 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.

SQL: DML 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. Scrivere interrogazioni complesse, semplificandone la sintassi. Garantire la retro-compatibilita’ 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 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. Scrivere interrogazioni complesse, 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 piu’ alta in stipendi. STRUTTURATI Codice Nome Cognome Tipo Dipartimento Stipendio 123 Marco Marchi Associato Chimica 20000 124 Michele Micheli Fisica 125 Lucia Di Lucia Ordinario 30000 126 Dario Rossi Informatica 32000 127 Mario Ricercatore 15000 129 Bianchi

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)

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. Scrivere interrogazioni complesse, 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, e’ possibile mantenere anche la visione originaria del DB …

SQL: Viste Con le viste, e’ 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 e’ un’ operazione molto delicata, ed e’ 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 UPDATE PROFESSORIRICCHI SET STIPENDIO=20000 Codice Nome Cognome Nascita Livello Stipendio 1 Marco Marchi 10/04/1980 A1 20000 3 Michele Micheli 12/05/1967 R 5 Lucia Di Lucia 12/05/1978 R2 30000 7 Dario Rossi 24/01/1965 O2 32000 UPDATE PROFESSORIRICCHI SET STIPENDIO=20000 WHERE (CODICE=5) PROFESSORIRICCHI Codice Nome Cognome Stipendio 5 Lucia Di Lucia 30000 7 Dario Rossi 32000 Operazione NON consentita!!

SQL: Viste Una vista puo’ 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 validita’ si limita alla vista corrente. WITH CASCADE CHECK OPTION  Il controllo di validita’ si estende ricorsivamente a tutte le viste da cui la corrente e’ derivata.

SQL: Viste Le Common Table Expression (CTE) rappresentano viste temporanee che possono essere usate in una query come se fossero una view a tutti gli effetti. Differenza con la view  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 piu’ alta in stipendi. WITH SPESEDIPARTIMENTI (NOMEDIP, SPESA) AS SELECT DIPARTIMENTO, SUM(STIPENDI) FROM STRUTTURATI GROUPBY DIPARTIMENTO SELECT NOMEDIP FROM SPESEDIPARTIMENTI WHERE SPESA=(SELECT MAX(STIPENDI) FROM SPESEDIPARTIMENTI) La vista temporanea SPESEDIPARTIMENTI e’ valida solo nella query sottostante!

SQL: Viste SQL2 non consente di definire viste ricorsive. Es. Trova tutti gli antenati di “Paolo”. GENITORI ANTENATI Figlio Genitore Paolo Marco Michele Lucia Simone Dario Persona Avo Paolo Marco Michele Lucia Dario In SQL3, e’ 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 Figlio Genitore Paolo Marco Michele Lucia Dario GENITORI Figlio Genitore Paolo Marco Michele Lucia 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 puo’ 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 puo’ essere vuota … CREATE ASSERTION TabellaValida CHECK (1>=SELECT COUNT(*) FROM STUDENTI)

SQL: Assertion CREATE SCHEMA IMP_SCHEMA; NOME VARCHAR(20); 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 Domini Viste Asserzioni Elementi di uno schema SQL visti fin qui: Tabelle Domini Viste Asserzioni Stored Procedures Trigger Regole d’accesso ALTRO?