Esercitazione 4 SQL.

Documenti analoghi
Corso di. Basi di Dati I. 7. Esercitazioni in SQL: Definizione e manipolazione dei dati

Corso di. Basi di Dati I. 7. Esercitazioni in SQL: Definizione e manipolazione dei dati

Stringhe di caratteri

Sistemi di Elaborazione delle Informazioni

Laboratorio di Basi di Dati

Interrogazioni nidificate

Laboratorio di Basi di Dati

Esercitazione 2 SQL.

Interrogazioni nidificate

Basi di Dati SQL-92. Dettagli e Approfondimenti

A.A. 2018/2019. Esercitazione 11. Strutturazione di Istruzioni in Linguaggio SQL. [ Possibili Soluzioni ] FONDAMENTI DI INFORMATICA E PROGRAMMAZIONE

SQL /10/2016 Basi di dati - SQL 1

Basi di Dati. Dettagli e Approfondimenti SQL-92 25/02/2004. Dettagli e Approfondimenti. DDL: Tabelle. DML: Aggiornamenti.

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

A.A. 2018/2019. Esercitazione 12. Strutturazione di Istruzioni in Linguaggio SQL. [ Possibili Soluzioni ] FONDAMENTI DI INFORMATICA E PROGRAMMAZIONE

Manuale SQL. Manuale SQL - 1 -

Esercitazione 2 SQL.

SISTEMI INFORMATIVI E TELEMEDICINA INFORMATICA MEDICA. 3. Panoramica su SQL Prof. Mauro Giacomini

Basi di Dati SQL-92. Dettagli e Approfondimenti

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

Verifica di Informatica. Cognome e Nome: Classe 5ª Ci, Data

Corso di. Basi di Dati I. 9. Esercitazioni in SQL: Check, asserzioni, viste

PRODOTTO CARTESIANO Caso Generale

ESERCIZI SQL. Esercizio 1

Basi di Dati. Sistemi per Basi di Dati Relazionali: Modello Logico. Concetti Fondamentali. Concetti Fondamentali

4/16/07. Le Basi di Dati Relazionali. Concetti Fondamentali. Base di dati, tabella, ennupla, attributo, dominio. Valori nulli

Prova Pratica di Informatica, Modulo Basi di dati Appello 23/07/2018

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

SQL: DDL, VI, Aggiornamenti e Viste

Il linguaggio SQL costrutti DDL.

Basi di dati I Prova di autovalutazione 1 novembre 2016 Soluzioni

Esercitazione 3 SQL.

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

Corso di Basi di Dati A.A. 2015/2016

Corso di. Basi di Dati I. 11. Esercitazioni in SQL: Altri esercizi

Soluzione esercitazione 01

Il linguaggio SQL: DDL di base

Basi di Dati. Esercitazione SQL. 18 maggio 2007

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

SQL e ACCESS. Modello relazionale PROBLEMA ENTITA STUDENTE

Versione 1.0. (DB Visite Specialistiche)

Basi di dati I Prova di autovalutazione 30 ottobre 2014

Laboratorio di Basi di Dati Esercizio 8.4/9.1

SQL Matteo Magnani, Danilo Montesi Università di Bologna SQL. Linguaggio di interrogazione per basi di dati relazionali

Prova Scritta di Basi di Dati

Basi di Dati - Informatica umanistica Esercitazione (Lab)

DDL (Data Definition Language) schemi DML (Data Manipulation Language) DQL (Data Query Language) DCL (Data Control Language)

Versione 1.0. (DB Musei)

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

SQL - Structured Query Language

Basi di Dati Corso di Laura in Informatica Umanistica

SQL-DDL. Basi di Dati. Prof. Alfredo Cuzzocrea Università degli Studi di Trieste

IL MODELLO RELAZIONALE

Appunti dalle lezioni. Sistemi informativi e basi di dati. Il modello relazionale. SQL come DCL Utilizzo di un DBMS Reale.

SQL Esempi. 24/10-7/11/2016 Basi di dati - SQL 1

Basi di Dati e Sistemi Informativi

SQL. SQL come Data Manipulation Language - Inserimento, cancellazione e aggiornamento di righe

Basi di Dati. Esercitazione Algebra Relazionale e SQL. Ing. Paolo Cappellari. 15 maggio 2006

Interrogazioni in SQL

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

Basi di dati Corso di Laurea in Informatica Umanistica

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

Esempio di database relazionale con l utilizzo del prodotto MySQL

SQL Esempi /10/2017 Basi di dati - SQL 1

Esercizi di SQL Matteo Magnani, Danilo Montesi Università di Bologna. Esercizi di SQL

Versione 1.0. (Iniziamo ad interrogare il DB)

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Fondamenti di Informatica A. A / 1 9

PROGETTAZIONE DI DATABASE Linguaggio SQL

ESERCITAZIONE: AZIENDA

Basi di Dati: Corso di laboratorio

Primo Compitino di Basi di Dati

Laboratorio di Basi di Dati

Archivi e basi di dati - ing. M. Cossentino. Settore. Traccia 1. Traccia 200. Settore non polarizzato

Informatica documentale Laurea in Scienze della Comunicazione Prova scritta del 25 giugno Cognome e nome: Matricola:

CREATE TABLE Nome ( Attributo Tipo [Vincolo {, Vincolo }] {, Attributo Tipo [Vincolo {, Vincolo }]} [, VincoloDiTabella {, VincoloDiTabella}] )

Caratteristiche dei linguaggi per Database

Basi di Dati. Concetti Avanzati

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

SQL SQL. Definizione dei dati. Domini. Esistono 6 domini elementari:

Basi di Dati Prof. L. Tanca e F. A. Schreiber APPELLO DEL 6 MARZO 2015 Tempo: 2h30m

BASI di DATI. SQL: concetti fondamentali

Data Definition in MySQL

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

Informatica Grafica. Basi di dati parte 2

Laboratorio di Basi di Dati

Basi di Dati. Concetti Fondamentali SQL-92 25/02/2004. Concetti Fondamentali. Introduzione. Interrogazioni. Creazione ed eliminazione di bd

LABORATORIO di INFORMATICA

Basi di Dati CREAZIONE E POPOLAMENTO DI UNA BASE DI DATI

Aspetti avanzati nella definizione degli schemi DDL2 1

Basi di Dati SQL-92. Concetti Fondamentali

Principi di Progettazione del Software a.a Il linguaggio SQL. Prof. Luca Mainetti Università del Salento

PROGETTAZIONE DI DATABASE

Principi di Progettazione del Software a.a Il linguaggio SQL. Linguaggi per DBMS

SQL Sintassi Dei Comandi

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Corso di Informatica Linguaggio SQL prima parte

Transcript:

Esercitazione 4 SQL foglia@iet.unipi.it

DB Riferimento Il database di riferimento è il database UNIPI, creare una nuova istanza di database sul server e caricare i dati

CREATE TABLE 1. Creare una tabella studenti nel database unipi per rappresentare gli studenti immatricolati con la seguente struttura: studenti(matricola, Nome, Cognome, DataIscrizione) Rappresentare la matricola tramite una stringa a lunghezza fissa di 6 caratteri, Nome e Cognome tramite stringhe a lunghezza variabile (lunghezza massima 20) e DataIscrizione come una data. Imporre il vincolo di chiave primaria sull attributo Matricola e imporre il vincolo di unicita sugli attributi Nome e Congnome. Imporre un controllo sulla data di iscrizione successiva al 1980-01-01. 2. Creare una tabella corsi nel database unipi per rappresentare i corsi disponibili presso l ateneo: corsi(codice, NomeCorso, MatricolaDocente) Rappresentare il Codice attraverso un Integer, il NomeCorso attraverso una stringa a lunghezza variabile (lunghezza massima 20) e la MatricolaDocente come una stringa a lunghezza variabile (lunghezza massima 6). Imporre il vincolo di chiave su Codice, vincolo di unique su Nome e vincolo NOT NULL e un vincolo di chiave esterna su MatricolaDocente. La reference deve essere riferita al campo Matricola della relazione docenti. 3. Creare una tabella esami nel database unipi per rappresentare gli esami sostenuti dagli studenti: esami(codicecorso, MatricolaStudente, DataEsame, Annotazioni) Imporre gli appropriati vincoli di chiave esterna. Imporre il vincolo NOT NULL sulla Data. Imporre un controllo sulla data in cui l esame e sostenuto che non deve essere precedente alla data di iscrizione dello studente.

CREATE TABLE Es1 studenti(matricola, Nome, Cognome, DataIscrizione) CREATE TABLE studenti( Matricola CHAR(6), Nome VARCHAR(20), Cognome VARCHAR(20), DataIscrizione DATE, CONSTRAINT studenti_pk PRIMARY KEY (Matricola), CONSTRAINT studenti_un UNIQUE(Nome, Cognome), CONSTRAINT studenti_ch CHECK(DataIscrizione > '1980-01-01') )

CREATE TABLE Es2 corsi(codice, Nome, MatricolaDocente) CREATE TABLE corsi( Codice INTEGER, NomeCorso VARCHAR(20), MatricolaDocente VARCHAR(6) NOT NULL, CONSTRAINT corsi_pk PRIMARY KEY (Codice), CONSTRAINT corsi_un UNIQUE(NomeCorso), CONSTRAINT corsi_fk FOREIGN KEY(MatricolaDocente) REFERENCES docenti(matricola) )

CREATE TABLE Es3 esami(codicecorso, MatricolaStudente, DataEsame) TEXT è un tipo di dato alternativo a VARCHAR usato per memorizzare testi di grandi dimensioni di cui non è possibile sapere la lunghezza a priori CREATE TABLE esami( CodiceCorso Integer, MatricolaStudente VARCHAR(6), DataEsame Date NOT NULL, Annotazioni TEXT, CONSTRAINT esami_fk1 FOREIGN KEY(CodiceCorso) REFERENCES corsi(codice), CONSTRAINT esami_fk2 FOREIGN KEY(MatricolaStudente) REFERENCES studenti(matricola), CONSTRAINT esami_ch CHECK( studenti.dataiscrizione < DataEsame ) ) NOTA: Un attributo al quale viene imposto il vincolo di chiave esterna deve avere lo stesso dominio di quello riferito.

INSERT INTO/1 Inserire i valori seguenti dentro le tabelle studenti: insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('369871', 'Brandon', 'Graham', '2015-08-04'); insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('515140', 'Heather', 'Holmes', '2015-09-27'); insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('090456', 'Kevin', 'Mills', '2016-01-16'); insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('579555', 'Stephanie', 'Snyder', '2015-08-12'); insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('018701', 'Bobby', 'Gibson', '2015-08-15'); insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('582320', 'Craig', 'Burton', '2016-01-20');

INSERT INTO/2 Cosa succede se inseriamo il seguente dato? insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('582321', Craig', 'Burton', '1989-01- 20'); E questa? insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('582321', 'Jessie', 'Burton', '1979-01- 20'); E questa? insert into studenti (Matricola, Nome, Cognome, DataIscrizione) values ('582321', Mary', Clinton', 2000-01- 20');

MySQL e CHECK The CHECK clause is parsed but ignored by all storage engines., MySQL manual (versione 5.5) http://dev.mysql.com/doc/refman/5.5/en/createtable.html Il controllo CHECK e invece controllato effettivamente dalla maggior parte degli altri sistemi DBMS

INSERT INTO/3 Inserire i valori seguenti dentro le tabelle corsi: insert into corsi (Codice, NomeCorso, MatricolaDocente) values (1, Matematica', '014500'); insert into corsi (Codice, NomeCorso, MatricolaDocente) values (2, Informatica', '004178'); insert into corsi (Codice, NomeCorso, MatricolaDocente) values (3, Letteratura Greca', '000485'); insert into corsi (Codice, NomeCorso, MatricolaDocente) values (4, Medicina I', '010277'); insert into corsi (Codice, NomeCorso, MatricolaDocente) values (5, Fisica I', '020150'); insert into corsi (Codice, NomeCorso, MatricolaDocente) values (6, Costruzioni', '002473');

INSERT INTO/4 Provare ad aggiungere: insert into corsi (Codice, NomeCorso, MatricolaDocente) values (7, 'Basi Di Dati', '001111'); Oppure insert into corsi (Codice, NomeCorso, MatricolaDocente) values (5, Costruzioni II, '002473'); Qual e il risultato?

INSERT INTO/5 1. Aggiungere un esame di matematica a tutti gli studenti che si sono iscritti dopo il 1 Settembre 2015, l esame e verbalizzato il 1 Giugno 2016 2. Aggiungere un esame di Fisica I a tutti quelli che hanno la lettera h nel nome. L esame viene verbalizzato con la data di oggi. A tal fine usare il costrutto CURDATE() che ritorna la data odierna.

INSERT INTO Es1 INSERT INTO esami(codicecorso, MatricolaStudente, DataEsame) SELECT 1, Matricola, '2016-06-01' FROM studenti WHERE DataIscrizione > '2015-09-01'; Oppure INSERT INTO esami(codicecorso, MatricolaStudente, DataEsame) SELECT codice, Matricola, '2016-06-01' FROM studenti,corsi WHERE DataIscrizione > '2015-09-01'and NomeCorso='Matematica'; Oppure INSERT INTO esami(codicecorso, MatricolaStudente, DataEsame) SELECT codice, Matricola, '2016-06-01' FROM studenti join corsi ON (DataIscrizione > '2015-09-01'and NomeCorso='Matematica ); oppure INSERT INTO esami(codicecorso, MatricolaStudente, DataEsame) SELECT (SELECT Codice FROM corsi WHERE NomeCorso = 'Matematica'), Matricola, '2016-06-01' FROM studenti WHERE DataIscrizione > '2015-09-01';

INSERT INTO Es2 INSERT INTO esami(codicecorso, MatricolaStudente, DataEsame) SELECT 5, Matricola, CURDATE() FROM studenti WHERE Nome LIKE '%h%'; Oppure INSERT INTO esami(codicecorso, MatricolaStudente, DataEsame) SELECT codice, Matricola, CURDATE() FROM studenti, corsi WHERE Nome LIKE '%h%' and NomeCorso = 'Fisica I'; Oppure INSERT INTO esami(codicecorso, MatricolaStudente, DataEsame) SELECT (SELECT Codice FROM corsi WHERE NomeCorso = Fisica I'), Matricola, CURDATE() FROM studenti WHERE Nome LIKE '%h% ;

ALTER TABLE 1. Aggiungere la colonna Voto alla tabella esame, il tipo del nuovo valore deve essere Integer e NOT NULL. Impostare come valore di default 18. 2. Aggiungere una colonna Lode alla tabella esame, il nuovo tipo deve essere un solo carattere che puo assumere L o NULL. 3. Aggiungere un controllo imponendo che la lode possa essere L solo se il voto e pari a 30. 4. Rimuovere tale controllo e poi rimuovere la colonna Lode

ALTER TABLE ALTER TABLE esami ADD COLUMN Voto Integer NOT NULL DEFAULT 18 ALTER TABLE esami ADD COLUMN Lode char(1) DEFAULT NULL CHECK(Lode IN ('L', NULL)) ALTER TABLE esami ADD CONSTRAINT ch CHECK (Voto = 30 AND Lode = 'L' OR Voto < 30 AND Lode IS NULL) ALTER TABLE esami DROP INDEX ch ALTER TABLE esami DROP COLUMN Lode NOTA: in alcune versioni la ADD CONSTRAINT ch CHECK e la DROP INDEX ch possono generare un errore (in my sql non viene generato il check e dunque il drop di ch fallisce).

UPDATE/DELETE 1. Alzare il voto di 10 punti a tutti gli esami sostenuti da studenti con matricola dispari 2. Alzare il voto di 5 punti a tutti gli studenti con cognome che comincia con la letter H 3. Cancellare gli esami a tutti gli studenti che hanno sostenuto l esame con la professoressa Scherbatsky 4. Aggiornare la data di assunzione di tutti I docenti portandola avanti di 15 giorni NOTA: Per abilitare gli update e le delete di questo tipo (che non contengono una chiave primaria nella condizione where) dentro il workbench andare in Preferences -> SQL Editor e togliere la spunta sulla voce Safe Updates e poi chiudere e riaprire. (o una limit)

UPDATE/DELETE UPDATE esami SET Voto = Voto + 10 WHERE MatricolaStudente % 2 = 1 UPDATE esami SET Voto = Voto + 10 WHERE MatricolaStudente IN (SELECT Matricola FROM studenti WHERE Nome LIKE 'H%') DELETE FROM esami WHERE CodiceCorso IN (SELECT Codice FROM corsi INNER JOIN docenti ON Matricola = MatricolaDocente WHERE Cognome = 'Scherbatsky') NOTA: In questo caso la Matricola in docenti e MatricolaDocente in corsi hanno nome diverso, quindi non puo essere usato un NATURAL JOIN. UPDATE docenti SET DataAssunzione = DataAssunzione + INTERVAL 15 DAY In alternativa UPDATE docenti SET DataAssunzione = DataAssunzione + INTERVAL 15 DAY

ON DELETE/ON UPDATE 1. Aggiungere una colonna Tutor alla tabella studenti. La colonna deve contenere la matricola del docente che fa tutoraggio nei confronti dello studente. 2. Aggiungere il vincolo di chiave esterna facendo in modo che se il docente viene cancellato la matricola del Tutor viene impostata a null. 3. Impostare come Tutor di tutti gli studenti il Prof. Vallati. 4. Cancellare il Prof. Vallati da studenti mettendo il campo tutor a 0 5. Cancellare il Prof. Vallati dai docenti 6. Opzionale: Impostare come Tutor di tutti gli studenti il Prof. Underwood 7. Opzionale: cancellare il Prof. Underwood dai docenti. Che succede?

ON DELETE/ON UPDATE 1. ALTER TABLE studenti ADD COLUMN Tutor VARCHAR(6); 2. ALTER TABLE studenti ADD CONSTRAINT fk FOREIGN KEY (Tutor) REFERENCES docenti(matricola) ON UPDATE SET NULL ON DELETE SET NULL; 3. UPDATE studenti SET Tutor = '005698 ; Oppure UPDATE studenti SET Tutor = (SELECT Matricola FROM docenti WHERE Cognome = Vallati') limit 40; 4. UPDATE studenti SET Tutor = 0 ; cosa succede? 5. DELETE FROM docenti WHERE cognome = 'vallati' limit 10; -- cosa succede a studenti?

View 1. Creare una vista che mostri solo i nomi e i cognomi dei docenti che sono stati assunti dopo il 2013 2. Creare una vista che mostri solo i nomi e i codici dei dipartimenti che hanno più costi che finanziamenti (DipinRosso). Utilizzare tale vista per mostrare nome e cognome dei docenti che afferiscono a dipartimenti che hanno più costi che finanziamenti. 3. Creare una vista che mostri il codice del dipartimento e la media del costo di ogni ora di lezione (Rapporto Stipendio/OreLezione). 4. Creare una vista che mostri solo i dipartimenti in cui la somma degli stipendi dei docenti supera la meta del finanziamento totale 5. Add (nel DB motorizzazione) Creare una vista che ad ogni veicolo (targa) associ il numero di passaggi di proprietà. Usando tale vista recuperare il valor medio del numero di passaggi di proprietà per ogni autoveicolo (risolto come subquery nel from in esercitazione 2).

Viste Es1 Creare una vista che mostri solo i nomi e i cognomi dei docenti che sono stati assunti dopo il 2013 CREATE VIEW DocentiNeoAssunti (Nome, Cognome) AS SELECT Nome, Cognome FROM docenti WHERE DataAssunzione > '2013-01-01 ;

Viste Es2 Creare una vista che mostri solo i nomi e i codici dei dipartimenti che hanno più costi che finanziamenti (DipinRosso). Utilizzare tale vista per mostrare nome e cognome dei docenti che afferiscono a dipartimenti che hanno più costi che finanziamenti. CREATE VIEW DipartimentiRosso (Codice, Nome) AS SELECT CodiceDipartimento, NomeDipartimento FROM dipartimenti WHERE CostiTotaliAnnui > FinanziamentoTotaleAnnuo; SELECT doc.nome, doc.cognome FROM docenti as doc JOIN DipartimentiRosso as dipr ON dipr.codice=doc.codicedipartimento;

Viste Es3 Creare una vista che mostri il codice del dipartimento e la media del costo di ogni ora di lezione (Rapporto Stipendio/OreLezione). CREATE VIEW CostoOra (CodiceDipartimento, CostoMedio) AS SELECT CodiceDipartimento, AVG(StipendioAnnuo / OreLezioneAnnue) FROM docenti GROUP BY CodiceDipartimento

Viste Es4 Creare una vista che mostri solo i dipartimenti in cui la somma degli stipendi dei docenti supera la meta del finanziamento totale CREATE or replace VIEW DipartimentiAltoCostoDocenti AS SELECT CodiceDipartimento, NomeDipartimento, Indirizzo, Citta, NumeroDipendenti, CostiTotaliAnnui, FinanziamentoTotaleAnnuo FROM dipartimenti JOIN docenti USING (codicedipartimento) GROUP BY CodiceDipartimento HAVING FinanziamentoTotaleAnnuo/2 < SUM(StipendioAnnuo); oppure (subquery) CREATE or replace VIEW DipartimentiAltoCostoDocenti AS SELECT * FROM dipartimenti WHERE codicedipartimento IN (SELECT codicedipartimento FROM dipartimenti JOIN docenti USING(codicedipartimento) GROUP BY CodiceDipartimento HAVING FinanziamentoTotaleAnnuo/2 < SUM(StipendioAnnuo) );

Viste Es4 Creare una vista che mostri solo i dipartimenti in cui la somma degli stipendi dei docenti supera la meta del finanziamento totale Soluzione con trasferimento di binding CREATE VIEW DipartimentiAltoCostoDocenti AS SELECT * FROM dipartimenti AS d WHERE FinanziamentoTotaleAnnuo/2 < (SELECT SUM(StipendioAnnuo) FROM docenti WHERE CodiceDipartimento = d.codicedipartimento);

Viste Es5 add (nel DB motorizzazione) Creare una vista che ad ogni veicolo (targa) associ il numero di passaggi di proprietà. Usando tale vista recuperare il valor medio del numero di passaggi di proprietà per ogni autoveicolo. CREATE OR REPLACE VIEW conteggio_passaggi(targa, passaggi) AS SELECT v.targa, COUNT(*) AS passaggi FROM veicoli AS v NATURAL JOIN proprieta AS p GROUP BY v.targa; SELECT AVG(passaggi) FROM conteggio_passaggi;

Viste Es5 add (nel DB motorizzazione) Creare una vista che ad ogni veicolo (targa) associ il numero di passaggi di proprietà. Usando tale vista recuperare il valor medio del numero di passaggi di proprietà per ogni autoveicolo. Soluzione con subquery nel from (e senza viste) SELECT AVG(conto.passaggi) FROM ( SELECT v.targa, COUNT(*) AS passaggi FROM veicoli AS v NATURAL JOIN proprieta AS p GROUP BY v.targa ) AS conto