SQL - Elementi più avanzati

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

Manuale SQL. Manuale SQL - 1 -

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

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

Esercitazione 3 SQL.

SQL - Structured Query Language

Caratteristiche dei linguaggi per Database

Interrogazioni semplici

Linguaggio SQL seconda parte

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

Trigger. Basi di dati attive. Trigger: regole che specificano azioni attivate automaticamente dal DBMS al verificarsi di determinati eventi

Interrogazioni nidificate

Interrogazioni nidificate

Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor

Basi di Dati: Corso di laboratorio

Basi di Dati: Corso di laboratorio

Alessandra Raffaetà. Esercizio: Cinema

Tabelle esempio: Impiegato/Dipartimento

Laboratorio di Basi di Dati

Database Lezione 2. Sommario. - Progettazione di un database - Join - Valore NULL - Operatori aggregati

Elena Baralis 2007 Politecnico di Torino 1

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, SQL

Basi di dati (4) Docente: Andrea Bulgarelli. Università di Modena e Reggio Emilia. Argomento: select (1.

Esempi SQL con Access. Orazio Battaglia

Il linguaggio SQL: raggruppamenti. Versione elettronica: SQLb-gruppi.pdf

SQL - Sottointerrogazioni

SQL terza parte D O C E N T E P R O F. A L B E R T O B E L U S S I. Anno accademico 2010/11

Corso di Basi di Dati

Estensioni del linguaggio SQL per interrogazioni OLAP

Lezione 7 SQL (II) Basi di dati bis Docente Mauro Minenna Pag.1

Basi di dati 8 settembre 2015 Esame Compito A Tempo a disposizione: due ore. Libri chiusi.

<Nome Tabella>.<attributo>

SQL: Structured Query Language. T. Catarci, M. Scannapieco, Corso di Basi di Dati, A.A. 2008/2009, Sapienza Università di Roma

Viene richiesto di MIN CARD(S,E) = 1 UPDATE DELETE MAX CARD(S,E) = 3 INSERT UPDATE

SELECT s.nome, e.data Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

SQL: DDL, VI, Aggiornamenti e Viste

SELECT s.nome, e.data FROM Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

Esempio di database relazionale con l utilizzo del prodotto MySQL

Basi di Dati: Corso di laboratorio

Elena Baralis 2007 Politecnico di Torino 1

ESEMPIO DI TRIGGER PER IL CONTROLLO DELLE PROPRIETÀ COPERTURA DI UNA GERARCHIA (ARGOMENTO SVOLTO IN CLASSE IL 25 MAGGIO 2011)

SQL [2] Concetti avanzati di SQL. Esempi di interrogazioni

MODULO 2. Query normali e parametriche Query di:

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

SQL - Funzioni di gruppo

SQL. SQL: una visione panoramica. SQL: "storia" Definizione dei dati

APPUNTI DELLA LEZIONE DI DATABASE DEL 26/10/2016 Studenti: Marco D'Amato, Adriano Luigi Piscopello Professore: Mario Bochicchio

Idoneita Informatica. Sistemi per la gestione di basi di Dati

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

D B M G. Linguaggio SQL: fondamenti. Istruzione SELECT: fondamenti. Elena Baralis 2007 Politecnico di Torino 1. Struttura di base

SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

Basi di Dati: Corso di laboratorio

SQL e algebra relazionale

SQL. SQL: "storia. Sviluppato nella metà degli anni settanta (1974) presso il laboratorio di ricerca IBM di S.Josè. Dal 1983 ca. "standard di fatto"

INFORMATICA GENERALE Prof. Alberto Postiglione. Scienze della Comunicazione Università di Salerno. INFORMATICA GENERALE Prof. Alberto Postiglione

Gestione e Analisi dei Dati. Lezione 2 Vincoli su attributo Selezioni semplici su una tabella

Basi di dati attive. Una base di dati è ATTIVA quando consente la definizione e la gestione di regole di produzione (regole attive o trigger).

Tali regole vengono attivate in modo automatico al verificarsi di specifici eventi sulla. eseguono azioni sulla base di dati stessa.

Elena Baralis 2007 Politecnico di Torino 1

Introduzione alle basi di dati

SQL Avanzato. Interrogazioni e il valore NULL. Interrogazioni complesse, trigger, viste e modifiche dello schema. Giorgio Giacinto 2015

Eprogram ITIS V anno Unità 4 - Il linguaggio SQL

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

BASE DI DATI. Esercitazione: Campionato italiano 2015/2016 Raggruppamenti Nidificazione. Informatica Umanistica Università di Pisa

Interrogazioni$e$il$valore$NULL$

PROGETTAZIONE DI DATABASE Linguaggio SQL

Domande utili alla preparazione dell orale di Informatica all Esame di Stato

SQL (STRUCTURED QUERY LANGUAGE)

Basi di dati I 19 settembre 2016 Tempo a disposizione: un ora e 45 minuti.

Basi di dati attive. Paolo Atzeni Stefano Ceri. Basi di dati attive

SQL QUERY: Le interrogazioni del database

Le Basi di Dati Attive

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

I.I.S. G. COSSALI - ORZINUOVI DATABASE. Marzo 2017 Prof. Dario Tomasoni 1

Microsoft Access (parte 5) Query. Query. Query. Query. Creare una query

Basi di dati I 8 luglio 2016 Esame Compito A Tempo a disposizione: un ora e trenta minuti.

Istruzioni DML di SQL

SQL Laboratorio di Basi di Dati a.a. 2002/2003

Data warehouse in Oracle

ESERCIZI SQL. Esercizio 1

Le query di comando e di servizio in Access

ESERCITAZIONI ACCESS

Interrogazioni in SQL

σ data 15/12/2013 data 20/12/2014

Interrogazioni con ANY e ALL. Operatori ANY e ALL. Interrogazioni con ANY e ALL. Interrogazioni con ANY e ALL. Interrogazioni con ANY e ALL

DATABASE PER IL WEB. Programmazione Web 1

Il linguaggio SQL: query innestate

Interrogazioni complesse. SQL avanzato 1

LO SVOLGIMENTO DEL TEMA DI INFORMATICA

Join in SQL (primo modo) Informatica. Tabella Dipartimento. Interrogazione 4a. Interrogazione 4b. Interrogazione 4a

BASI DATI: algebra relazionale

Basi di Dati. S Q L Lezione 4

Sommario. Introduzione... 13

Basi di dati Appello del Soluzione del compito B

Esercitazione 3 SQL 2

Universita di Milano Bicocca Corso di Basi di dati 1 in elearning C. Batini 6. SQL DDL 6.2 Data Description Language - 2

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

Laboratorio di Basi di Dati

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

Transcript:

SQL - Elementi più avanzati Informatica@SEFA 07/08 - Lezione Massimo Lauria <massimo.lauria@uniroma.it> http://massimolauria.net/courses/infosefa07/ Venerdì, 5 Dicembre 07

Funzioni di gruppo

Oltre le query classiche Consideriamo il nostro DB del registro automobilistico e supponiamo di volere rispondere a domande come quanti veicoli sono registrati? quanti veicoli sono stati acquistati in media da ogni proprietario? qual è la massima velocità tra quella dei veicoli con cilindrata maggiore di 800?

Nell algebra relazionale il calcolo delle tabelle e la valutazione delle condizioni della query sono eseguite tupla per tupla. Ora stiamo chiedendo di effettuarecalcoli sul risultato di una query, calcoli che aggregano i dati di più righe. 4

Opzione Usare un linguaggiodiprogrammazione generico. È possibile connettersi DB con un linguaggio di programmazione (e.g. Python) Eseguire query SQL Analizzare il risultato L approccio più flessibile ma complesso. 5

Opzione Usare le funzioni di gruppo (o operatori aggregati) per calcolare funzioni specifiche sui dati della tabella. MAX calcola il valore massimo MIN calcola il valore minimo SUM somma dei valori AVG calcolo della media count conteggio dei valori Altre funzioni sono aggiunte dall implementazione. 6

Un semplice esempio Contiamo il numero di veicoli select count(*) from Veicoli; count(*) 5 Calcoliamo la massima cilindrata select max(cilindrata) from Veicoli; max(cilindrata) 998 7

All interno di query più sofisticate Vogliamo calcolare la velocità media dei veicoli Fiat, e averne il numero. select avg(velocità) as 'Velocità media',count(*) as 'N. Macchine', Nome_Fabbrica from Veicoli join Modelli join Fabbriche where Veicoli.Cod_Modello=Modelli.Cod_Modello and Fabbriche.Cod_Fabbrica=Modelli.Cod_Fabbrica and Fabbriche.Nome_Fabbrica='Fiat'; 4 5 Velocità media N. Macchine Nome_Fabbrica 50.5 6 Fiat 8

Il meccanismo degli operatori aggregati Come funzionano questi operatori? Consideriamo la query select Exp,Exp,... from <Tabelle > where <Condizione > dove alcune delle espressioni colonne usano degli operatori. Prima viene effettuata la query select * from <Tabelle > where <Condizione >. il valore di Exp, Exp, viene calcolato dalle colonne della query. E.g. sum(velocità) è la somma dei valori nella colonna Velocità 9

Esempio select * from Veicoli where Posti=5; Targa Cilindrata Cavalli_Fiscali Velocità Posti Immatricolazione Cod_C A456X 796 85 95 5 998--0 B56787Y 708 0 0 5 989-09- C76589AG 06 54 0 5 998-08- CFT40VB 90 75 70 5 995-0- DD4567XX 58 7 NULL 5 997-06-05 DGH789JC 590 4 70 5 995-0-05 DH79567H 589 07 70 5 NULL ERG567NM 598 07 75 5 997--8 F9654NH 78 5 85 5 99-0-08 FGH67FV 899 9 40 5 998-08-09 XCH56GJK 98 0 0 5 998-09-04 XF5789CY 587 07 75 5 996-05-05 select max(velocità)-min(velocità),count(velocità), sum(velocità),count(*) from Veicoli where Posti=5; max(velocità)-min(velocità) count(velocità) sum(velocità) count(*) 90 840 0

Esempio (II) La query select * from Veicoli where Posti=5; restituisce righe di veicoli. Sui quali abbiamo calcolato quattro espressioni contenenti funzioni di gruppo. count(*) conta il numero di righe della query count(velocità) conta i valori non nulli in Velocità sum(velocità) somma i valori in Velocità avg(velocità) media dei valori in Velocità

Espressioni colonna Le espressioni nella lista colonne possono avere anche diversi funzioni di gruppo, che possono essere composte in espressioni algebriche, come abbiamo già visto per le espressioni colonna. Esempio select avg(cilindrata)*count(cilindrata), sum(cilindrata) from Veicoli; avg(cilindrata)*count(cilindrata) sum(cilindrata) 954.0 954

Sintassi Con l eccezione di count(*) la sintassi delle funzioni di gruppo è una delle seguenti func(nomecolonna) func(all NomeColonna) func(distinct NomeColonna) dove NomeColonna è una colonna del risultato della query, e func è una tra avg, sum, max, min, count.

I valori passati alla funzione di gruppo Targa Velocità A456X 95 B56787Y 0 C76589AG 0 C78905GT C845905Z NULL CFT40VB 70 D9765W NULL DD4567XX NULL DGH789JC 70 DH79567H 70 ERG567NM 75 F9654NH 85 FGH67FV 40 XCH56GJK 0 XF5789CY 75 non nulli, con ripetizioni count(velocità) non nulli, con ripetizioni count(all Velocità) non nulli, senza ripetizioni count(distinct Velocità) 9 4

Colonne a valori tutti nulli Table: Test Valore NULL NULL NULL select count(*),count(valore),max(valore), min(valore),avg(valore) from Test; count(*) count(valore) max(valore) min(valore) avg(valore) 0 NULL NULL NULL 5

Un altro esempio E.g. Vediamo quante versioni di modelli sono stati prodotti da ogni fabbrica. Prima elenchiamo le fabbriche per avere un riferimento. select * from Fabbriche; Cod_Fabbrica Nome_Fabbrica ------------ ------------- 00 Fiat 00 Ford 004 Piaggio 005 Volvo 006 Renault 007 Toyota 008 Volkswagen 009 Honda 6

Numero di versioni nella fabbrica 00 ogni modello esiste in diverse versioni ogni modello ha uno specifico Cod_Fabbrica select sum(numero_versioni) as '# Vers. Fabbrica 00' from Modelli where Cod_Fabbrica = '00'; # Vers. Fabbrica 00 7

Vediamo le fabbriche 00 e 00 select sum(numero_versioni) as '# Vers. Fabbrica 00' from Modelli where Cod_Fabbrica = '00'; # Vers. Fabbrica 00 NULL select sum(numero_versioni) as '# Vers. Fabbrica 00' from Modelli where Cod_Fabbrica = '00'; # Vers. Fabbrica 00 8

Aggregare i dati per gruppi Naturalmente non vogliamo fare queste query una alla volta per ogni fabbrica. In SQL è possibile segmentare la tabella in gruppi così gli operatori aggregati vengono applicati ai singoli gruppi. 9

Uso della clausola GROUP BY select Cod_Fabbrica, Numero_Versioni from Modelli order by Cod_Fabbrica; Cod_Fabbrica Numero_Versioni 5 4 4 5 6 5 6 6 7 4 8 4 9 select Cod_Fabbrica, sum(numero_versioni) as 'Numero versioni' from Modelli group by Cod_Fabbrica; Cod_Fabbrica Numero versioni 4 4 5 6 9 7 4 8 4 9 4 5 0

Un esempio più articolato Miglioriamo la query e contiamo le righe di ogni gruppo select Nome_Fabbrica as Fabbrica, sum(numero_versioni) as Versioni, count(*) as 'Numero modelli' from Modelli join Fabbriche on Modelli.Cod_Fabbrica = Fabbriche.Cod_Fabbrica group by Nome_Fabbrica order by Versioni desc; 4 5 6 7 Fabbrica Versioni Numero modelli Fiat 5 Renault 9 Piaggio 4 Toyota 4 Volkswagen 4 Ford Honda Volvo

Filtrare le righe con gli operatori aggregati Fabbrica Versioni Numero modelli Fiat 5 Renault 9 Piaggio 4 Toyota 4 Volkswagen 4 Ford Honda Volvo E.g. Da questa query vogliamo solo le righe con Versioni dispari. Non possiamo usare la clausola WHERE perché questa si applica prima degli operatori aggregati.

Clausola HAVING La clausola WHERE filtrare le righe di una query viene applicata PRIMA degli operatori aggregati non li può usare nelle espressioni Per filtrare i gruppi si usa la clausola HAVING viene applicata DOPO gli operatori aggregati che possono essere usati nelle espressioni.

Clausola HAVING su un esempio semplice (I) Semplifichiamo l esempio di prima, usando il codice di fabbrica invece del nome, così evitiamo il JOIN select Cod_Fabbrica, sum(numero_versioni) as Versioni, count(*) as 'Numero Modelli' from Modelli group by Cod_Fabbrica; 4 5 Cod_Fabbrica Versioni Numero Modelli 5 4 4 5 6 9 7 4 8 4 9 4

Clausola HAVING su un esempio semplice (II) Ora solo le fabbriche con numero di versioni dispari. select Cod_Fabbrica, sum(numero_versioni) as Versioni, count(*) as 'Numero Modelli' from Modelli group by Cod_Fabbrica having Versioni % = ; 4 5 6 Cod_Fabbrica Versioni Numero Modelli 5 6 9 9 5

La clausola HAVING sull esempio di prima select Nome_Fabbrica as Fabbrica, sum(numero_versioni) as Versioni, count(*) as 'Numero modelli' from Modelli join Fabbriche on Modelli.Cod_Fabbrica = Fabbriche.Cod_Fabbrica group by Nome_Fabbrica having (Versioni % ) = order by Versioni desc; 4 5 6 7 8 Fabbrica Versioni Numero modelli Fiat 5 Renault 9 Ford Honda Abbiamo re-inserito anche ordinamento e JOIN. 6

Fine della panoramica su SQL di base Tutto quello che è stato visto finora è sul manuale SQL del corso. http://massimolauria.net/courses/infosefa07/docs/manuale_sql.pdf 7

Altri elementi SQL che non fanno parte del programma di esame 8

Inserimento dati Inserimenti espliciti insert into Veicoli values ('C845905Z',NULL,NULL,NULL,,'995-04-','04','0','006'), ('D9765W',NULL,NULL,NULL,,'997-08-','0','0','00'); anche omettendo colonne insert into Veicoli( Targa,Posti,Immatricolazione Cod_Categoria, Cod_Combustibile, Cod_Modello) values ('C845905Z',,'995-04-','04','0','006'), ('D9765W',,'997-08-','0','0','00'); 4 5 9

Inserimento dati (II) Inserimenti attraverso una query create table VeicoliLenti ( [...omissis...]); insert into VeicoliLenti select * from Veicoli where Velocità < 0; 0

Eliminazione dati Si possono eliminare tutti i dati di una tabella che verificano la condizione di una clausola WHERE. delete from Veicoli where Cod_Modello in ('00','00');

Aggiornamento dati Si possono aggiornare le righe di una tabella, se soddisfano la condizione di una clausola where update Fabbriche set Nome_Fabbrica = 'FCA' where Nome_Fabbrica = 'Fiat' Notate che la condizione viene controllata prima dell aggiornamento dati.

Query annidate (I) Le espressioni SQL usate nelle clausole WHERE, HAVING, possono contenere sotto-espressioni della forma <Expr> in ('V','V','V',...) select Nome_Modello from Modelli join Fabbriche on Modelli.Cod_Fabbrica = Fabbriche.Cod_Fabbrica where Nome_Fabbrica in ('Fiat','Renault'); Nome_Modello Panda Brava Ducato Clio Coupè Megane Seicento Laguna

Query annidate (II) É possibile calcolare le sequenze su cui usare IN attraverso una sotto-query, invece di scriverle esplicitamente. E.g. Le fabbriche che producono veicoli con velocità almeno 80 km/h. select distinct Nome_Fabbrica from Fabbriche join Modelli on Modelli.Cod_Fabbrica = Fabbriche.Cod_Fabbrica where Cod_Modello in (select Cod_Modello from Veicoli where Velocità >= 80); 4 5 Nome_Fabbrica Ford Volvo Fiat Volkswagen 4

Sotto-query correlate (I) Se la sotto-query dipende da attributi della query esterna, deve essere rieseguita per ogni riga. select Targa,Nome_Modello from Veicoli as V join Modelli as M on V.Cod_Modello = M.Cod_Modello where Velocità = (select max(velocità) from Veicoli where Cod_Modello=V.Cod_Modello); Targa Nome_Modello A456X Mondeo C76589AG Panda C78905GT Coupè CFT40VB Clio DGH789JC Civic DH79567H Megane ERG567NM Laguna F9654NH Golf FGH67FV Seicento XCH56GJK V-0 XF5789CY Corolla 5

Sotto-query correlate (II) E.g. Tutti i dischi le cui tracce occupano meno di MB select AlbumId, Title from Albums where 000000 > (select sum(bytes) from Tracks where Tracks.AlbumId = Albums.AlbumId) order by title; 4 5 AlbumId Title 8 Charpentier: Divertissements, Airs & Concerts 45 Monteverdi: L Orfeo 6

Altri usi delle query annidate Le sotto-query possono apparire: dentro altre sotto-query nella clausola from nella clausola select 7

Check É possibile inserire dei vincoli di integrità della base di dati, che vengono verificati ad ogni cambiamento dei dati. create table Esame( Matricola nchar(0), Cod_Insegnamento nchar(0), Voto integer check (Voto >= 8 and Voto <= 0), Lode boolean, check( Voto=0 or not Lode) ); 4 5 6 7 verifica che il voto sia tra 8 e 0 non permette la lode se il voto non è 0 8

Viste Una vista è il risultato di una select su altre tabelle, che viene mantenuta come una tabella virtuale Viene mantenuta aggiornata Si può usare come una tabella qualunque Se modificata, le modifiche vengono propagate alle tabelle di origine. 9

create view InfoVeicoli(Veicolo,Modello,Fabbrica) as select Targa, Nome_Modello, Nome_Fabbrica from Veicoli join Modelli join Fabbriche where Veicoli.Cod_Modello = Modelli.Cod_Modello and Modelli.Cod_Fabbrica = Fabbriche.Cod_Fabbrica; 4 5 Veicolo Modello Fabbrica A456X Mondeo Ford B56787Y Panda Fiat C76589AG Panda Fiat C78905GT Coupè Fiat C845905Z Ducato Fiat CFT40VB Clio Renault D9765W Vespa Piaggio DD4567XX Brava Fiat DGH789JC Civic Honda DH79567H Megane Renault ERG567NM Laguna Renault F9654NH Golf Volkswagen FGH67FV Seicento Fiat XCH56GJK V-0 Volvo XF5789CY Corolla Toyota 40

Trigger Un trigger (trad. innesco, detonatore) è una specifica sequenza di operazioni che viene innescata se si verifica una condizione precisa nella base di dati. Ha due componenti: la condizione di innesco le istruzioni da eseguire Può essere usata per mantenere dei vincoli di integrità dei dati troppo complessi per essere formalizzati con check o altro. 4

Controllo dell accesso SQL ha delle istruzioni per fornire/revocare privilegi agli utenti della base di dati. e.g. l utente Valentina può effettuare la select sulla tabella Dipartimenti. e.g. all utente Marco è stato impedito di modificare la tabella Stipendi. SQLite non è un sistema multi-utente, ma molti server SQL lo sono. 4

Transazioni Una transazione è una serie di operazioni che deve essere eseguita in maniera atomica, atrimenti lascia il DB in uno stato incoerente. Modifica la base di dati e termina con commit le modifiche vengono finalizzate oppure, in caso di errori o interruzioni, rollback le modifiche vengono azzerate 4