Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999 Capitolo 4:SQL 11/10/2001.

Slides:



Advertisements
Presentazioni simili
Numeri a 100 Electronic flashcard. 1 uno ritorno.
Advertisements

1 MeDeC - Centro Demoscopico Metropolitano Provincia di Bologna - per Valutazione su alcuni servizi erogati nel.
Microsoft SQL Server 2008 Utilizzo. Creazione DataBase CREATE DATABASE CREATE DATABASE Cinema.
SQL (Standard query language) Istruzioni per la creazione di una tabella: Create table ( tipo, (, [vincoli]) Primary key ( ) CHIVE PRIMARIA Foreign key(
Sequential Statements. – Il VHDL simula lo svolgersi in parallelo di varie operazioni – Loggetto fondamentale e il PROCESS – Un PROCESS contiene una serie.
SQL.
Un DataBase Management System (DBMS) relazionale client/server.
MySQL Esercitazioni. Ripasso Connessione a MySQL. Creazione delle basi di dati e delle tablelle. Inserimento dei dati. Interrogazioni.
XXIV Congresso ACOI 2005 Montecatini Terme Maggio 2005
Istruzione SELECT (versione base)
Canale A. Prof.Ciapetti AA2003/04
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999
SQL Esercitazione per il corso “Basi di Dati” Gabriel Kuper
1 Implementazione di Linguaggi 2 PARTE 6 Implementazione di Linguaggi 2 PARTE 6 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
MP/RU 1 Dicembre 2011 ALLEGATO TECNICO Evoluzioni organizzative: organico a tendere - ricollocazioni - Orari TSC.
SQL1 Structured Query Language Data Definition Language Data Manipulation Language Evoluzione Sequel IBM (1974) Standardizzazione ANSI/ISO: SQL-89, SQL-
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
Array Ricerca Ordinamento Fusione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% % Accrescimento della PECORA IN TASMANIA % % dal 1820 ad oggi % % ( MODELLO LOGISTICO ) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Cos’è un problema?.
Gli italiani e il marketing di relazione: promozioni, direct marketing, digital marketing UNA RICERCA QUANTITATIVA SVOLTA DA ASTRA RICERCHE PER ASSOCOMUNICAZIONE.
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.
Manipolazione dei dati I comandi SQL che permettono di modificare il contenuto di una base di dati sono insertdeleteupdate insert ha la seguente sintassi:
Sequence. CREARE UNA SEQUENCE CREATE SEQUENCE nome [INCREMENT BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE]
Gestione dati DML Statement. DML – Data Manipultion Language Unoperazione DML viene eseguita quando: aggiungendo nuove righe ad una tabella modificando.
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.
PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.
FUNZIONI DI GRUPPO Le funzioni di gruppo operano su un set di record restituendo un risultato per il gruppo. AVG ([DISTINCT|ALL] n) media, ignora i valori.
Constraints.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, Capitolo 4:SQL 16/10/2002.
SQL per la definizione di basi di dati SQL non è solo un linguaggio di interrogazione (Query Language), ma Un linguaggio per la definizione di basi di.
Monitoraggio a.s. 2008/2009Analisi dei dati RETE REGIONALE AU.MI.
E. Giunchiglia Basi di dati 1 (trasparenze basate su Atzeni, Ceri, Paraboschi, Torlone: Basi di dati, Capitolo 4) SQL 05/10/2004.
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
OO _60-59_ OI_53-54 _ OL _ OR_52-47_ OO= Orientamento allOBIETTIVO OI= Orientamento all'INNOVAZIONE OL= Orientamento alla LEADERSHIPOR= Orientamento.
CHARGE PUMP Principio di Funzionamento
Regolarità nella griglia dei numeri
Q UESTIONI ETICHE E BIOETICHE DELLA DIFESA DELLA VITA NELL AGIRE SANITARIO 1 Casa di Cura Villa San Giuseppe Ascoli Piceno 12 e 13 dicembre 2011.
ORDINE DI CHIAMATA a 1minuto e 2 minuti PRINCIPALI TEMPI DELLA COMPETIZIONE ORDINE DI CHIAMATA a 1minuto e 2 minuti PRINCIPALI TEMPI DELLA COMPETIZIONE.
ISTITUTO COMPRENSIVO “G. BATTAGLINI” MARTINA FRANCA (TA)
GEOGRAFIA DEI NUMERI Accademia dei Lincei - Roma 18 Ottobre2011
Un trucchetto di Moltiplicazione per il calcolo mentale
21 marzo 2002 (ri-)Avvisi: Giovedi 28 marzo la lezione e sospesa. Nuovo indirizzo di Spedire messaggi e esercizi solo.
1 Il Linguaggio SQL Il Linguaggio SQL Prof. Lorenzo Vita, Ing. Luigi Testa.
SUBQUERY Chi ha un salario maggiore di quello di Abel? Occorre scomporre la query in due sotto problemi: MAIN : quali impiegati hanno un salario maggiore.
Esempi risolti mediante immagini (e con excel)
Basi di dati - Modelli e linguaggi di interrogazione- Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone Copyright © The McGraw-Hill.
1 Sky 2 Sky 3 Sky L’Universo Aperto La teoria del Big Bang prevede che, se la densità globale dell’universo non raggiunge un valore di Ωo (Omega Zero)
1 Basi di dati (Sistemi Informativi) Scuola di Dottorato in Scienze Veterinarie per la Salute Animale e la Sicurezza Alimentare a.a Ing. Mauro.
Collection & Generics in Java
NO WASTE Progetto continuità scuola primaria scuola secondaria Salorno a.s. 2013_
SQL Developer Lanciare sqldeveloper (alias sul desktop) / c:\Oracle\sqldeveloper Associare tutti i tipi di file, se volete Tasto destro sulla spina “connection”
Dynamic SQL.
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,
Customer satisfaction anno 2013 Ospedale di Circolo Fondazione Macchi Varese Presentazione risultati (Febbraio 2014)
DIRETTIVI UNITARI SPI-CGI – FNP-CISL - UILP-UIL TERRITORIO LODIGIANO Lunedì 23 marzo 2015 dalle ore 9,00 alle ore 13,00 Presso la sala Conferenze Confartigianato.
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.
SQL (III) Data Definition Language/ Data Manipulation Language.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, Capitolo 4:SQL 24/09/2002.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 3
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Quantificazione Esistenziale ed Universale
Transcript della presentazione:

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999 Capitolo 4:SQL 11/10/2001

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 2 SQL Structured Query Language è un linguaggio con varie funzionalità: contiene sia il DDL sia il DML ne esistono varie versioni vediamo gli aspetti essenziali, non i dettagli

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 3 SQL: "storia" prima proposta SEQUEL (1974); prime implementazioni in SQL/DS e Oracle (1981) dal 1983 ca. "standard di fatto" standard (1986, poi 1989 e infine 1992, 1999) recepito in parte

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 4 Definizione dei dati in SQL Istruzione CREATE TABLE: definisce uno schema di relazione e ne crea unistanza vuota specifica attributi, domini e vincoli

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 5 CREATE TABLE, esempio CREATE TABLE Impiegato( Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15), Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 6 Domini Domini elementari (predefiniti) Domini definiti dall'utente (semplici, ma riutilizzabili)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 7 Domini elementari Carattere: singoli caratteri o stringhe, anche di lunghezza variabile Bit: singoli booleani o stringhe Numerici, esatti e approssimati Data, ora, intervalli di tempo

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 8 Definizione di domini Istruzione CREATE DOMAIN: definisce un dominio (semplice), utilizzabile in definizioni di relazioni, anche con vincoli e valori di default

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 9 CREATE DOMAIN, esempio CREATE DOMAIN Voto AS SMALLINT DEFAULT NULL CHECK ( value >=18 AND value <= 30 )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 10 Vincoli intrarelazionali NOT NULL UNIQUE definisce chiavi PRIMARY KEY: chiave primaria (una sola, implica NOT NULL) CHECK, vedremo più avanti

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 11 UNIQUE e PRIMARY KEY due forme: nella definzione di un attributo, se forma da solo la chiave come elemento separato

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 12 CREATE TABLE, esempio CREATE TABLE Impiegato( Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15), Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 13 Matricola CHAR(6) PRIMARY KEY Matricola CHAR(6), …, PRIMARY KEY (Matricola) PRIMARY KEY, alternative

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 14 CREATE TABLE, esempio CREATE TABLE Impiegato( Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15), Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 15 Chiavi su più attributi, attenzione Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, UNIQUE (Cognome,Nome), NomeCHAR(20) NOT NULL UNIQUE, Cognome CHAR(20) NOT NULL UNIQUE, Non è la stessa cosa!

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 16 Vincoli interrelazionali CHECK, vedremo più avanti REFERENCES e FOREIGN KEY permettono di definire vincoli di integrità referenziale di nuovo due sintassi per singoli attributi su più attributi E' possibile definire politiche di reazione alla violazione

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 17 Matricola Vigili Cognome Rossi Neri Nome Luca Piero Mario MoriGino7543 Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 18 Infrazioni Codice Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile ProvNumero MI TO PR 39548K E Auto ProvNumero MI TO PR 39548K E Cognome Rossi Neri Nome Mario Luca

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 19 CREATE TABLE, esempio CREATE TABLE Infrazioni( Codice CHAR(6) NOT NULL PRIMARY KEY, Data DATE NOT NULL, Vigile INTEGER NOT NULL REFERENCES Vigili(Matricola), Provincia CHAR(2), Numero CHAR(6), FOREIGN KEY(Provincia, Numero) REFERENCES Auto(Provincia, Numero) )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 20 Modifiche degli schemi ALTER DOMAIN ALTER TABLE DROP DOMAIN DROP TABLE...

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 21 Definzione degli indici è rilevante dal punto di vista delle prestazioni ma è a livello fisico e non logico in passato era importante perché in alcuni sistemi era l'unico mezzo per definire chiavi CREATE INDEX

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 22 In pratica In molti sistemi si utilizzano strumenti diversi dal codice SQL per definire lo schema della base di dati

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 23 SQL, operazioni sui dati interrogazione: SELECT modifica: INSERT, DELETE, UPDATE

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 24 Istruzione SELECT SELECT ListaAttributi FROM ListaTabelle [ WHERE Condizione ] "target list" clausola FROM clausola WHERE

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 25 NomeEtà Persone Reddito Andrea27 Maria55 Anna50 Filippo26 Luigi50 Franco60 Olga30 Sergio85 Luisa75 Aldo Madre Maternità Figlio Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 26 Selezione e proiezione Nome e reddito delle persone con meno di trenta anni PROJ Nome, Reddito ( SEL Eta<30 (Persone)) select nome, reddito from persone where eta < 30

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 27 NomeEtà Persone Reddito Andrea2721 Maria5542 Anna5035 Filippo2630 Luigi5040 Franco6020 Olga3041 Sergio8535 Luisa7587 Aldo2515 Andrea2721 Aldo2515 Filippo2630 Andrea2721 Aldo2515 Filippo Reddito

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 28 SELECT, abbreviazioni select nome, reddito from persone where eta < 30 select p.nome as nome, p.reddito as reddito from persone p where p.eta < 30

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 29 Selezione, senza proiezione Nome, età e reddito delle persone con meno di trenta anni SEL Eta<30 (Persone) select * from persone where eta < 30

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 30 SELECT, abbreviazioni select * from persone where eta < 30 select nome, età, reddito from persone where eta < 30

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 31 Proiezione, senza selezione Nome e reddito di tutte le persone PROJ Nome, Reddito (Persone) select nome, reddito from persone

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 32 SELECT, abbreviazioni R(A,B) select * from R equivale (intutivamente) a select X.A as A, X.B as B from R X where true

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 33 Espressioni nella target list select Reddito/2 as redditoSemestrale from Persone where Nome = 'Luigi'

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 34 Condizione complessa select * from persone where reddito > 25 and (eta 60)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 35 Condizione LIKE Le persone che hanno un nome che inizia per 'A' e ha una 'd' come terza lettera select * from persone where nome like 'A_d%'

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 36 CognomeFilialeEtàMatricola NeriMilano RossiRoma BruniMilano NULL 9553 Impiegati NeriMilano BruniMilano NULL 9553 SEL Età > 40 OR Età IS NULL (Impiegati) NeriMilano BruniMilano NULL 9553 Gestione dei valori nulli

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 37 Gli impiegati la cui età è o potrebbe essere maggiore di 40 SEL Età > 40 OR Età IS NULL (Impiegati) select * from impiegati where eta > 40 or eta is null

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 38 SQL e algebra relazionale R1(A1,A2) R2(A3,A4) select R1.A1, R2.A4 from R1, R2 where R1.A2 = R2.A3 prodotto cartesiano (FROM) selezione (WHERE) proiezione (SELECT)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 39 SQL e algebra relazionale R1(A1,A2) R2(A3,A4) select R1.A1, R2.A4 from R1, R2 where R1.A2 = R2.A3 PROJ A1,A4 (SEL A2=A3 (R1 JOIN R2))

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 40 possono essere necessarie ridenominazioni nel prodotto cartesiano nella target list select X.A1 AS B1,... from R1 X, R2 Y, R1 Z where X.A2 = Y.A3 AND...

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 41 select X.A1 AS B1, Y.A4 AS B2 from R1 X, R2 Y, R1 Z where X.A2 = Y.A3 AND Y.A4 = Z.A1 REN B1,B2 A1,A4 ( PROJ A1,A4 ( SEL A2 = A3 AND A4 = C1 ( R1 JOIN R2 JOIN REN C1,C2 A1,A2 (R1))))

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 42 CognomeFilialeStipendioMatricola NeriMilano NeriNapoli RossiRoma RossiRoma cognome e filiale di tutti gli impiegati PROJ Cognome, Filiale (Impiegati)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 43 CognomeFiliale NeriMilano NeriNapoli RossiRoma CognomeFiliale NeriMilano NeriNapoli RossiRoma RossiRoma select cognome, filiale from impiegati select distinct cognome, filiale from impiegati

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 44 NomeEtà Persone Reddito Andrea27 Maria55 Anna50 Filippo26 Luigi50 Franco60 Olga30 Sergio85 Luisa75 Aldo Madre Maternità Figlio Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 45 Selezione, proiezione e join I padri di persone che guadagnano più di venti milioni PROJ Padre (paternita JOIN Figlio =Nome SEL Reddito>20 (persone)) select distinct padre from persone, paternita where figlio = nome and reddito > 20

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 46 Join naturale Padre e madre di ogni persona paternita JOIN maternita select paternita.figlio,padre, madre from maternita, paternita where paternita.figlio = maternita.figlio

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 47 Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre PROJ Nome, Reddito, RP (SEL Reddito>RP (REN NP,EP,RP Nome,Eta,Reddito (persone) JOIN NP=Padre (paternita JOIN Figlio =Nome persone))) select f.nome, f.reddito, p.reddito from persone p, paternita, persone f where p.nome = padre and figlio = f.nome and f.reddito > p.reddito

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 48 SELECT, con ridenominazione del risultato select figlio, f.reddito as reddito, p.reddito as redditoPadre from persone p, paternita, persone f where p.nome = padre and figlio = f.nome and.reddito > p.reddito

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 49 Join esplicito Padre e madre di ogni persona select paternita.figlio,padre, madre from maternita, paternita where paternita.figlio = maternita.figlio select madre, paternita.figlio, padre from maternita join paternita on paternita.figlio = maternita.figlio

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 50 SELECT con join esplicito, sintassi SELECT … FROM Tabella { … JOIN Tabella ON CondDiJoin }, … [ WHERE AltraCondizione ]

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 51 Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre select f.nome, f.reddito, p.reddito from persone p, paternita, persone f where p.nome = padre and figlio = f.nome and f.reddito > p.reddito select f.nome, f.reddito, p.reddito from persone p join paternita on p.nome = padre join persone f on figlio = f.nome where f.reddito > p.reddito

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 52 Ulteriore estensione: join naturale (meno diffuso) PROJ Figlio,Padre,Madre ( paternita JOIN Figlio = Nome REN Nome=Figlio (maternita)) paternita JOIN maternita select madre, paternita.figlio, padre from maternita join paternita on paternita.figlio = maternita.figlio select madre, paternita.figlio, padre from maternita natural join paternita

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 53 Join esterno: "outer join" Padre e, se nota, madre di ogni persona select paternita.figlio, padre, madre from paternita left join maternita on paternita.figlio = maternita.figlio select paternita.figlio, padre, madre from paternita left outer join maternita on paternita.figlio = maternita.figlio outer e' opzionale

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 54 Outer join select paternita.figlio, padre, madre from maternita join paternita on maternita.figlio = paternita.figlio select paternita.figlio, padre, madre from maternita left outer join paternita on maternita.figlio = paternita.figlio select paternita.figlio, padre, madre from maternita full outer join paternita on maternita.figlio = paternita.figlio

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 55 Ordinamento del risultato Nome e reddito delle persone con meno di trenta anni in ordine alfabetico select nome, reddito from persone where eta < 30 order by nome

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 56 Persone NomeReddito Andrea21 Aldo15 Filippo30 Persone NomeReddito Andrea21 Aldo15 Filippo30 select nome, reddito from persone where eta < 30 select nome, reddito from persone where eta < 30 order by nome

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 57 Operatori aggregati Nelle espressioni della target list possiamo avere anche espressioni che calcolano valori a partire da insiemi di ennuple: conteggio, minimo, massimo, media, totale sintassi base (semplificata): Funzione ( [ DISTINCT ] * ) Funzione ( [ DISTINCT ] Attributo )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 58 Operatori aggregati: COUNT Il numero di figli di Franco select count(*) as NumFigliDiFranco from Paternita where Padre = 'Franco' loperatore aggregato (count) viene applicato al risultato dellinterrogazione: select * from Paternita where Padre = 'Franco'

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 59 Padre Paternità Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Franco Andrea Aldo NumFigliDiFranco 2

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 60 COUNT e valori nulli select count(*) from persone select count(reddito) from persone select count(distinct reddito) from persone NomeEtàPersoneReddito Andrea27 Maria55 Anna50 Aldo NULL

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 61 Altri operatori aggregati SUM, AVG, MAX, MIN Media dei redditi dei figli di Franco select avg(reddito) from persone join paternita on nome=figlio where padre='Franco'

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 62 Operatori aggregati e valori nulli select avg(reddito) as redditomedio from persone NomeEtàPersoneReddito Andrea27 Maria55 Anna50 Aldo NULL

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 63 Operatori aggregati e target list uninterrogazione scorretta: select nome, max(reddito) from persone di chi sarebbe il nome? La target list deve essere omogenea select min(eta), avg(reddito) from persone

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 64 Le funzioni possono essere applicate a partizioni delle relazioni Clausola GROUP BY: GROUP BY listaAttributi Operatori aggregati e raggruppamenti

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 65 Il numero di figli di ciascun padre select padre, count(*) AS NumFigli from paternita group by Padre Operatori aggregati e raggruppamenti Padre paternita Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Franco PadreNumFigli Luigi Sergio 2 Franco2 1

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 66 Semantica di interrogazioni con operatori aggregati e raggruppamenti 1. interrogazione senza group by e senza operatori aggregati select * from paternita 2. si raggruppa e si applica loperatore aggregato a ciascun gruppo

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 67 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 =p.nome group by padre corretta select padre, avg(f.reddito), p.reddito from persone f join paternita on figlio = nome join persone p on padre =p.nome group by padre, p.reddito

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 68 Condizioni sui gruppi I padri i cui figli hanno un reddito medio maggiore di 25 select padre, avg(f.reddito) from persone f join paternita on figlio = nome group by padre having avg(f.reddito) > 25

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 69 WHERE o HAVING? I padri i cui figli sotto i 30 anni hanno un reddito medio maggiore di 20 select padre, avg(f.reddito) from persone f join paternita on figlio = nome where eta < 30 group by padre having avg(f.reddito) > 25

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 70 Sintassi, riassumiamo SelectSQL ::= select ListaAttributiOEspressioni from ListaTabelle [ where CondizioniSemplici ] [ group by ListaAttributiDiRaggruppamento ] [ having CondizioniAggregate ] [ order by ListaAttributiDiOrdinamento ]

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 71 Unione, intersezione e differenza La select da sola non permette di fare unioni; serve un costrutto esplicito: select … union [all] select... i duplicati vengono eliminati (a meno che si usi all); anche dalle proiezioni!

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 72 Notazione posizionale! select padre from paternita union select madre from maternita quali nomi per gli attributi del risultato? nessuno quelli del primo operando …

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 73 Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi PadreFiglio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 74 Notazione posizionale, 2 select padre, figlio from paternita union select figlio, madre from maternita select padre, figlio from paternita union select madre, figlio from maternita

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 75 Notazione posizionale, 3 Anche con le ridenominazioni non cambia niente: select padre as genitore, figlio from paternita union select figlio, madre as genitore from maternita Corretta: select padre as genitore, figlio from paternita union select madre as genitore, figlio from maternita

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 76 Differenza select Nome from Impiegato except select Cognome as Nome from Impiegato vedremo che si può esprimere con select nidificate

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 77 Intersezione select Nome from Impiegato intersect select Cognome as Nome from Impiegato equivale a select I.Nome from Impiegato I, Impiegato J where I.Nome = J.Cognome

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 78 Interrogazioni nidificate le condizioni atomiche permettono anche il confronto fra un attributo (o più, vedremo poi) e il risultato di una sottointerrogazione quantificazioni esistenziali

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 79 nome e reddito del padre di Franco select Nome, Reddito from Persone, Paternita where Nome = Padre and Figlio = 'Franco' select Nome, Reddito from Persone where Nome = (select Padre from Paternita where Figlio = 'Franco')

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 80 Interrogazioni nidificate, commenti La forma nidificata è meno dichiarativa, ma talvolta più leggibile (richiede meno variabili) La forma piana e quella nidificata possono essere combinate Le sottointerrogazioni non possono contenere operatori insiemistici (lunione si fa solo al livello esterno); la limitazione non è significativa

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 81 Nome e reddito dei padri di persone che guadagnano più di 20 milioni select distinct P.Nome, P.Reddito from Persone P, Paternita, Persone F where P.Nome = Padre and Figlio = F.Nome and F.Reddito > 20 select Nome, Reddito from Persone where Nome in (select Padre from Paternita where Figlio = any (select Nome from Persone where Reddito > 20))

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 82 Nome e reddito dei padri di persone che guadagnano più di 20 milioni select distinct P.Nome, P.Reddito from Persone P, Paternita, Persone F where P.Nome = Padre and Figlio = F.Nome and F.Reddito > 20 select Nome, Reddito from Persone where Nome in (select Padre from Paternita, Persone where Figlio = Nome and Reddito > 20)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 83 Interrogazioni nidificate, commenti, 2 La prima versione di SQL prevedeva solo la forma nidificata (o strutturata), con una sola relazione in ogni clausola FROM. Il che è insoddisfacente: la dichiaratività è limitata non si possono includere nella target list attributi di relazioni nei blocchi interni

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 84 Nome e reddito dei padri di persone che guadagnano più di 20 milioni, con indicazione del reddito del figlio select distinct P.Nome, P.Reddito, F.Reddito from Persone P, Paternita, Persone F where P.Nome = Padre and Figlio = F.Nome and F.Reddito > 20 select Nome, Reddito, ???? from Persone where Nome in (select Padre from Paternita where Figlio = any (select Nome from Persone where Reddito > 20))

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 85 Interrogazioni nidificate, commenti, 3 regole di visibilità: non è possibile fare riferimenti a variabili definite in blocchi più interni se un nome di variabile è omesso, si assume riferimento alla variabile più vicina in un blocco si può fare riferimento a variabili definite in blocchi più esterni; la semantica base (prodotto cartesiano, selezione, proiezione) non funziona più, vedremo presto

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 86 Quantificazione esistenziale Ulteriore tipo di condizione EXISTS ( Sottoespressione )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 87 Le persone che hanno almeno un figlio select * from Persone where exists (select * from Paternita where Padre = Nome) or exists (select * from Maternita where Madre = Nome)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 88 I padri i cui figli guadagnano tutti più di venti milioni select distinct Padre from Paternita Z where not exists ( select * from Paternita W, Persone where W.Padre = Z.Padre and W.Figlio = Nome and Reddito <= 20)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 89 Semantica delle espressioni correlate Linterrogazione interna viene eseguita una volta per ciascuna ennupla dellinterrogazione esterna

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 90 Visibilità scorretta: select * from Impiegato where Dipart in (select Nome from Dipartimento D1 where Nome = 'Produzione') or Dipart in (select Nome from Dipartimento D2 where D2.Citta = D1.Citta)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 91 Disgiunzione e unione (ma non sempre) select * from Persone where Reddito > 30 union select F.* from Persone F, Paternita, Persone P where F.Nome = Figlio and Padre = P.Nome and P.Reddito > 30 select * from Persone F where Reddito > 30 or exists (select * from Paternita, Persone P where F.Nome = Figlio and Padre = P.Nome and P.Reddito > 30)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 92 Differenza e nidificazione select Nome from Impiegato except select Cognome as Nome from Impiegato select Nome from Impiegato I where not exists (select * from Impiegato where Cognome = I.Nome)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 93 Massimo e nidificazione La persona (o le persone) con il reddito massimo select * from persone where reddito = (select max(reddito) from persone)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 94 Operazioni di aggiornamento operazioni di inserimento: insert eliminazione: delete modifica: update di una o più ennuple di una relazione sulla base di una condizione che può coinvolgere anche altre relazioni

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 95 Inserimento INSERT INTO Tabella [ ( Attributi ) ] VALUES( Valori ) oppure INSERT INTO Tabella [ ( Attributi )] SELECT...

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 96 INSERT INTO Persone VALUES ('Mario',25,52) INSERT INTO Persone(Nome, Eta, Reddito) VALUES('Pino',25,52) INSERT INTO Persone(Nome, Reddito) VALUES('Lino',55) INSERT INTO Persone ( Nome ) SELECT Padre FROM Paternita WHERE Padre NOT IN (SELECT Nome FROM Persone)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 97 Inserimento, commenti lordinamento degli attributi (se presente) e dei valori è significativo le due liste debbono avere lo stesso numero di elementi se la lista di attributi è omessa, si fa riferimento a tutti gli attributi della relazione, secondo lordine con cui sono stati definiti se la lista di attributi non contiene tutti gli attributi della relazione, per gli altri viene inserito un valore nullo (che deve essere permesso) o un valore di default

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 98 Eliminazione di ennuple DELETE FROM Tabella [ WHERE Condizione ]

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4 99 DELETE FROM Persone WHERE Eta < 35 DELETE FROM Paternita WHERE Figlio NOT in (SELECT Nome FROM Persone) DELETE FROM Paternita

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Eliminazione, commenti elimina le ennuple che soddisfano la condizione può causare (se i vincoli di integrità referenziale sono definiti con politiche di reazione cascade) eliminiazioni da altre relazioni ricordare: se la where viene omessa, si intende where true

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Modifica di ennuple UPDATE NomeTabella SET Attributo = < Espressione | SELECT … | NULL | DEFAULT > [ WHERE Condizione ]

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo UPDATE Persone SET Reddito = 45 WHERE Nome = 'Piero' UPDATE Persone SET Reddito = Reddito * 1.1 WHERE Eta < 30

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Vincoli di integrità generici: check Specifica di vincoli di ennupla (e anche vincoli più complessi) check ( Condizione )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Check, esempio create table Impiegato ( Matricola character(6), Cognome character(20), Nome character(20), Sesso character not null check (sesso in (M,F)) Stipendio integer, Superiore character(6), check (Stipendio <= (select Stipendio from Impiegato J where Superiore = J.Matricola) )

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Vincoli di integrità generici: asserzioni Specifica vincoli a livello di schema create assertion NomeAss check ( Condizione ) create assertion AlmenoUnImpiegato check (1 <= (select count(*) from Impiegato ))

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Viste create view NomeVista [ ( ListaAttributi ) ] as SelectSQL [ with [ local | cascaded ] check option ] create view ImpiegatiAmmin (Matricola, Nome, Cognome, Stipendio) as select Matricola, Nome, Cognome, Stipendio from Impiegato where Dipart = 'Amministrazione' and Stipendio > 10

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo create view ImpiegatiAmminPoveri as select * from ImpiegatiAmmin where Stipendio < 50 with check option

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Uninterrogazione non standard La nidificazione nella having non è ammessa select Dipart from Impiegato group by Dipart having sum(Stipendio) >= all (select sum(Stipendio) from Impiegato group by Dipart)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Soluzione con le viste create view BudgetStipendi(Dip,TotaleStipendi) as select Dipart, sum(Stipendio) from Impiegato group by Dipart select Dip from BudgetStipendi where TotaleStipendi =(select max(TotaleStipendi) from BudgetStipendi)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Ancora sulle viste Interrogazione scorretta select avg(count(distinct Ufficio)) from Impiegato group by Dipart Con una vista create view DipartUffici(NomeDip,NroUffici) as select Dipart, count(distinct Ufficio) from Impiegato group by Dipart; select avg(NroUffici) from DipartUffici

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Access control Every element of the DB can be protected (tables, attributes, views, domains, etc.) The creator of a resource assigns privileges to others A predefined user _system represents the database administrator and has complete access to all the resources A privilege is characterized by: the resource the user who grants the privilege the user who receives the privilege the action that is allowed on the resource whether or not the privilege can be passed on to other users

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Types of privilege SQL offers six types of privilege insert: to insert a new object into the resource update: to modify the resource content delete: to remove an object from the resource select: to access the resource content in a query references: to build a referential integrity constraint with the resource (may limit the ability to modify the resource) usage: to use the resource in a schema definition (e.g., a domain)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo grant and revoke To grant a privilege to a user: grant on Resource to Users [ with grant option ] grant option specifies whether the privilege of propagating the privilege to other users must be granted grant select on Department to Stefano To take away privileges: revoke Privileges on Resource from Users [ restrict | cascade ]

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo SQL immerso in linguaggio ospite "embedded SQL" in applicazioni complesse, è spesso necessario immergere istruzioni SQL in programmi tradizionali (Pascal, COBOL, C, C++, Java) i programmi con SQL immerso sono analizzati da precompilatori che traducono le istruzioni SQL le variabili del programma possono essere usate come parametri nelle istruzioni SQL (precedute da ':')

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Embedded SQL select che producano una sola ennupla e operazioni di aggiornamento possono essere immerse senza problemi (con opportuno meccanismo di trasmissione dei risultati) esiste di solito una variabile di sistema sqlcode che dopo l'esecuzione di un'operazione assume valore zero se essa ha avuto successo e valore diverso altrimenti

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Relazioni e record: cursori problema fondamentale: disadattamento di impedenza i linguaggi tradizionali gestiscono record uno alla volta SQL produce insiemi di ennuple soluzione: cursore accede a tutte le ennuple di una interrogazione in modo globale le trasmette al programma una alla volta

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Operazioni sui cursori Definizione del cursore declare NomeCursore [ scroll ] cursor for Select … Esecuzione dell'interrogazione open NomeCursore Utilizzo dei risultati (una ennupla alla volta) fetch NomeCursore into ListaVariabili Disabilitazione del cursore close cursor NomeCursore Accesso alla ennupla corrente (di un cursore su singola relazione a fini di aggiornamento) current of NomeCursore nella clausola where

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo write('nome della citta''?'); readln(citta); EXEC SQL DECLARE P CURSOR FOR SELECT NOME, REDDITO FROM PERSONE WHERE CITTA = :citta ; EXEC SQL OPEN P ; EXEC SQL FETCH P INTO :nome, :reddito ; while SQLCODE = 0 do begin write('nome della persona:', nome, 'aumento?'); readln(aumento); EXEC SQL UPDATE PERSONE SET REDDITO = REDDITO + :aumento WHERE CURRENT OF P EXEC SQL FETCH P INTO :nome, :reddito end; EXEC SQL CLOSE CURSOR P

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo void VisualizzaStipendiDipart(char NomeDip[]) { char Nome[20], Cognome[20]; long int Stipendio; $ declare ImpDip cursor for select Nome, Cognome, Stipendio from Impiegato where Dipart = :NomeDip; $ open ImpDip; $ fetch ImpDip into :Nome, :Cognome, :Stipendio; printf("Dipartimento %s\n",NomeDip); while (sqlcode == 0) { printf("Nome e cognome dell'impiegato: %s %s",Nome,Cognome); printf("Attuale stipendio: %d\n",Stipendio); $ fetch ImpDip into :Nome, :Cognome, :Stipendio; } $ close cursor ImpDip; }

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Dynamic SQL When applications do not know at compile-time the SQL statement to execute, they need dynamic SQL Major problem: managing the transfer of parameters between the program and the SQL environment For direct execution: execute immediate SQLStatement For execution preceded by the analysis of the statement: prepare CommandName from SQLStatement followed by: execute CommandName [ into TargetList ] [ using ParameterList ]

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Procedures SQL-2 allows for the definition of procedures, also known as stored procedures Stored procedures are part of the schema procedure AssignCity(:Dep char(20), :City char(20)) update Department set City = :City where Name = :Dep SQL-2 does not handle the writing of complex procedures Most systems offer SQL extensions that permit to write complex procedures (e.g., Oracle PL/SQL)

11/10/2001Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo Procedure in Oracle PL/SQL Procedure Debit(ClientAccount char(5),Withdrawal integer) is OldAmount integer; NewAmount integer; Threshold integer; begin select Amount, Overdraft into OldAmount, Threshold from BankAccount where AccountNo = ClientAccount for update of Amount; NewAmount := OldAmount - WithDrawal; if NewAmount > Threshold then update BankAccount set Amount = NewAmount where AccountNo = ClientAccount; else insert into OverDraftExceeded values(ClientAccount,Withdrawal,sysdate); end if; end Debit;