580 likes | 813 Views
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 :
E N D
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’ illinguaggio di riferimento per le basi di datirelazionali. • Diverse versioni del linguaggio: • SQL-86 Costrutti base • SQL-89 Integrita’ referenziale • SQL-92 (SQL2) Modellorelazionale, struttura a livelli • SQL:1999 (SQL3) Modello ad oggetti • SQL:2003 (SQL3) Nuoveparti: SQL/JRT, SQL/XML • SQL:2006 (SQL3) Estensione di SQL/XML • SQL:2008 (SQL3) Lieviaggiunte
SQL: DML Es. Estrarreilcodicedellostrutturatochericeve lo stipendiopiu’ alto. STRUTTURATI
SQL: DML Es. Estrarreilcodicedellostrutturatochericeve lo stipendiopiu’ alto. SELECT CODICE, MAX(STIPENDIO) FROM STRUTTURATI ERRORE! • SELECT MAX(STIPENDIO) restituisce solo un valore!! • SELECT CODICE restituiscepiu’ di un valore!!
SQL: DML Es. Estrarreilcodicedellostrutturatochericeve lo stipendiopiu’ alto. SELECT CODICE FROM STRUTTURATI WHERE STIPENDIO= MAX(STIPENDIO) ERRORE! • L’operatoreaggregatoMAXsiapplicasullaSELECT e vienevalutatodopo la WHERE …
SQL: DML Nellaclausolawhere, oltre ad espressionisemplici, possonocomparireespressionicomplesse in cui ilvalore di un attributovieneconfrontato con ilrisultato di un’altra query (query annidate). NOTA: Si staconfrontandoun singolo valore con ilrisultato di una query (quindi potenzialmenteunatabella). SELECT FROM WHERE (Attributoexpr SELECT FROM WHERE)
SQL: DML Es. Estrarreilcodicedellostrutturatochericeve lo stipendiopiu’ alto. STRUTTURATI
SQL: DML Es. Estrarreilcodicedellostrutturatochericeve lo stipendiopiu’ alto. QUERY ESTERNA SELECT CODICE FROM STRUTTURATI WHERE (STIPENDIO = SELECT MAX(STIPENDIO) FROM STRUTTURATI) QUERY INTERNA
SQL: DML Nelcasoprecedente, la query internarestituisce solo un valore … Cosaaccade se la query internarestuiscepiu’ di un valore? Glioperatori di confronto <,=,> non sipossonoutilizzare in questocaso! Es. Estrarrenome e cognomedeglistrutturati del dipartimento di Informaticacheguadagnanoquanto un lorocollega di Fisica.
SQL: DML Nelcasoprecedente, la query internarestituisce solo un valore … Cosaaccade se la query internarestuiscepiu’ di un valore? SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO = (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO=“FISICA”))) NON FUNZIONA!
SQL: DML • Esistonooperatorispeciali di confrontonelcaso di interrogazioniannidate: • any la rigasoddisfa la condizione se e’ veroilconfrontotrailvalore dell’ attributoedALMENO UNOdeivaloriritornatidalla query annidata. • all a rigasoddisfa la condizione se e’ veroilconfrontotrailvalore dell’ attributo e TUTTIivaloriritornatidalla query annidata.
SQL: DML Es. Estrarrenome e cognomedeglistrutturati del dipartimento di Informaticacheguadagnanoquanto un lorocollega di Fisica. SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO = ANY (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO=“FISICA”)))
SQL: DML Es. Estrarrenome e cognomedeglistrutturati del dipartimento di Informaticacheguadagnanopiu’ di tuttiilorocolleghidi Fisica. SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO > ALL (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO=“FISICA”)))
SQL: DML • Le interrogazioninidificatepossonoessere: • Semplici non c’e’ passaggio di bindingtra un contestoall’altro. Le interrogazionivengonovalutatedallapiu’ internaallapiu’ esterna. • Complesse c’e’ passaggio di binding attraversovariabilicondivisetra le varieinterrogazioni. In questocaso, le interrogazionipiu’ interne vengonovalutatesuognitupla.
SQL: DML STEP1: Vienevalutata la query piu’ interna… SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO > ALL (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO=“FISICA”)))
SQL: DML STEP2: Vieneconfrontataciascunarigadellatabella piu’ esterna con ilrisultatodella query interna … SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO > ALL (SELECT STIPENDIO …
SQL: DML STEP2: Vieneconfrontataciascunarigadellatabella piu’ esterna con ilrisultatodella query interna … SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO > ALL (SELECT STIPENDIO …
SQL: DML STEP2: Vieneconfrontataciascunarigadellatabella piu’ esterna con ilrisultatodella query interna … SELECT NOME, COGNOME FROM STRUTTURATI WHERE (DIPARTIMENTO=“INFORMATICA”) AND (STIPENDIO > ALL (SELECT STIPENDIO FROM STRUTTURATI WHERE (DIPARTIMENTO=“FISICA”)))
SQL: DML • Le interrogazioninidificatepossonoessere: • Semplici non c’e’ passaggio di bindingtra un contestoall’altro. Le interrogazionivengonovalutatedallapiu’ internaallapiu’ esterna. • Complesse c’e’ passaggio di binding attraversovariabilicondivisetra le varieinterrogazioni. In questocaso, le interrogazionipiu’ interne vengonovalutatesuognitupla.
SQL: DML Es. Estrarrenome/cognomedegliimpiegatichehannoomonimi (stessonome/cognome di altriimpiegati). IMPIEGATI
SQL: DML Es. Estrarrenome/cognomedegliimpiegatichehannoomonimi (stessonome/cognome di altriimpiegati). 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’ necessariovalutare due volte la tabella IMPIEGATI!!
SQL: DML Es. Estrarrenome/cognomedegliimpiegatichehannoomonimi (stessonome/cognome di altriimpiegati). 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’ internavienevalutatasuciascunatupladella query piu’ esterna... I I2
SQL: DML Funzionamento: La query piu’ internavienevalutatasuciascunatupladella query piu’ esterna... I I2
SQL: DML In alcunicasi, le query annidatepossonoessereriscritteusandocostrutti di join tratabelle o self-join (prodottocartesiano + 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))
SQL: DML Il costruttoin restituiscetruese un certovalore e’ contenutonelrisultato di unainterrogazionenidificata, falsealtrimenti. SELECT ListaAttributi FROM TabellaEsterna WHERE Valore/iINSELECT ListaAttributi2 FROM TabellaInterna WHERE Condizione Nelcaso di piu’ di 1 valoresiutilizzailcostrutture di tuple.
SQL: DML In manieraequivalente, usandol’operatoreinedicostruttori 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))
SQL: DML Il costruttoexistrestituiscetrue se l’interrogazionenidificatarestituisce un risultato non vuoto(>=1 elementotrovato). SELECT ListaAttributi FROM TabellaEsterna WHERE EXIST SELECT ListaAttributi2 FROM TabellaInterna WHERE Condizione Controlla se ilnumero di righedella query interna>0
SQL: DML Es. Estrarrenome/cognomedegliimpiegaticheNONhannoomonimi (stessonome/cognome di altriimpiegati). IMPIEGATI
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’ possibilescrivere la stessa query senzausareinterrogazioniannidate?
SQL: DML Esempio (interrogazioninidificate).Datoilseguente schema: FILM(Titolo, Anno, Regista) REGISTA(Nome, AnnoNascita) ATTORE(Nome, AnnoNascita) RECITAZIONE(TitoloFilm, NomeAttore) Selezionareinomideiregistichehannorecitato solo in film diretti da lorostessi.
SQL: DML Unapossibilesoluzione 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 visterappresentano “tabellevirtuali” ottenute da daticontenute in altretabelle del database. Ogni vista ha associato un nomeedunalista di attributi, e siottiene dal risultato di unaselect. create view NomeView [ListaAttributi] as SELECTSQL [with [local | cascade] check option]
SQL: Viste PROPRIETA’ delle VISTE • I datidelleviste NON sonofisicamentememorizzati a parte, in quantodipendono da altretabelle(ad eccezionedellevistematerializzate). • Le visteesistonoa livello di schema ma non hannoistanzeproprie. • Le operazioni di aggiornamento di vistepotrebbero non essereconsentite in alcuni DBMS.
SQL: Viste • Q. A che serve definireuna vista? • Implementaremeccanismi di indipendenzatraillivellologicoedillivelloesterno. • Scrivereinterrogazionicomplesse, semplificandone la sintassi. • Garantire la retro-compatibilita’ con precedentiversionidello schema del DB, in caso di ristrutturazionedellostesso.
SQL: Viste Data la tabella PROFESSORI, definireunavista “STUDENTI” in cui simostrano solo le informazionianagrafiche (nome, cognome, codice, data nascita) deidocenti. PROFESSORI
SQL: Viste Data la tabella PROFESSORI, definireuna vista “STUDENTI” in cui simostrano solo le informazionianagrafiche (nome, cognome, codice, data nascita) deidocenti. CREATE VIEW STUDENTI(CODICE,NOME,COGNOME, DATANASCITA) AS SELECT CODICE,NOME,COGNOME,NASCITA FROM PROFESSORI
SQL: Viste • Q. A che serve definireuna vista? • Implementaremeccanismi di indipendenzatraillivellologicoedillivelloesterno. • Scrivereinterrogazionicomplesse, semplificandone la sintassi. • Garantire la retro-compatibilita’ con precedentiversionidello schema del DB, in caso di ristrutturazionedellostesso.
SQL: Viste Es. Estrarreilnome del dipartimentoche ha la spesapiu’ alta in stipendi. STRUTTURATI
SQL: Viste L’interrogazioneseguentepotrebbenon essereconsentitasualcuni DBMS … SELECT DIPARTIMENTO FROM STRUTTURATI GROUP BY DIPARTIMENTO HAVING SUM(STIPENDIO)>= ALL SELECT SUM(STIPENDIO) FROM STRUTTURATI GROUP BY DIPARTIMENTO
SQL: Viste Soluzione. Creareuna vista chevisualizzi la sommatotaledeglistipendi di ciascundipartimento. CREATE VIEW SPESEDIPARTIMENTI (NOMEDIP, SPESA) AS SELECT DIPARTIMENTO, SUM(STIPENDI) FROM STRUTTURATI GROUPBY DIPARTIMENTO
SQL: Viste STEP2. Estrarreilnome del dipartimentoche ha la spesapiu’ alta in stipendiusando la vista SPESEDIPARTIMENTI. SELECT NOMEDIP FROM SPESEDIPARTIMENTI WHERE SPESA=(SELECT MAX(STIPENDI) FROM SPESEDIPARTIMENTI) Q: E’ possibilescrivere la stessainterrogazionesenzausareuna vista?
SQL: Viste • Q. A che serve definireuna vista? • Implementaremeccanismi di indipendenzatraillivellologicoedillivelloesterno. • Scrivereinterrogazionicomplesse, semplificandone la sintassi. • Garantire la retro-compatibilita’ con precedentiversionidello schema del DB, in caso di ristrutturazionedellostesso.
SQL: Viste Si supponga di avere un DB, in cui la tabella: ESAMI(Matricola,Nome,Cognome,Data,Voto) Vienesostituita con le tabelle: STUDENTI(Matricola,Nome,Cognome) PROVE(Matricola,Data,Voto) Con le viste, e’ possibilemantenereanche la visioneoriginariadel DB …
SQL: Viste Con le viste, e’ possibilemantenereanche la visioneoriginariadel DB … CREATE VIEW ESAMI(MATRICOLA, NOME, COGNOME, DATA, VOTO) ASSELECT 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’ consentitol’aggiornamento di vistechesonoottenute da piu’ di unatabella. 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 unatabella, vista non aggiornabile!!
SQL: Viste L’opzioneWITH CHECK OPTIONconsente di definirevisteaggiornabili, a condizioneche le tuple aggiornatecontinuino ad appartenerealla vista (in pratica, la tuplaaggiornata non deveviolare la clausolaWHERE). CREATE VIEW PROFESSORIRICCHI(CODICE,NOME,COGNOME,STIPENDIO) AS SELECT CODICE,NOME,COGNOME,STIPENDIO FROM PROFESSORI WHERE (STIPENDIO>=30000)
SQL: Viste PROFESSORI UPDATE PROFESSORIRICCHI SET STIPENDIO=20000 WHERE (CODICE=5) PROFESSORIRICCHI Operazione NON consentita!!
SQL: Viste • Una vista puo’ esserecostruita a partire da altrevistedello schema (viste derivate) … • E’ possibilel’aggiornamento di viste derivate? • WITH LOCAL CHECK OPTION Il controllo di validita’ silimitaalla vista corrente. • WITH CASCADECHECK OPTION Il controllo di validita’ siestendericorsivamente a tutte le viste da cui la corrente e’ derivata.
SQL: Viste Le Common Table Expression (CTE) rappresentanovistetemporaneechepossonoessereusate in una query come se fosserouna view a tuttiglieffetti. 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) …