Basi di dati e sistemi informativi I mod. laboratorio Alessandro De Luca Università degli Studi di Napoli Federico II Lezione, 11 marzo 2015
Soluzione 1, creazione CREATE TABLE Impiegato ( Cod NUMBER(4), Nome VARCHAR2(40), Cognome VARCHAR2(40) NOT NULL, Data_Assunto DATE NOT NULL, Stipendio NUMBER(8,2), Capo NUMBER(4), CONSTRAINT Impiegato_PK PRIMARY KEY (Cod), CONSTRAINT Impiegato_FK FOREIGN KEY (Capo) REFERENCES Impiegato (Cod) ) / A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 2 / 28
Soluzione 1, inserimento dati INSERT INTO Impiegato(Cod,Nome,Cognome,DataAssunto,Stipendio) VALUES (3,'Andrea','Verdi', TO_DATE('03/06/2010','DD/MM/YYYY'),5000); Poi INSERT INTO Impiegato(Cod,Nome,Cognome,DataAssunto,Stipendio,Capo) VALUES (2,'Alberto','Bianchi','02/01/2012',4000,3); INSERT INTO Impiegato VALUES (1,'Alessandro','Rossi','03/01/2013',3000,2); e tutti gli altri. A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 3 / 28
Soluzione 2 1 Email impiegati con stipendio 3000: SELECT LOWER(SUBSTR(Nome,1,1) Cognome) '@lazienda.it' AS Email FROM Impiegato; WHERE Stipendio <= 3000; 2 Sottoposti di Bianchi assunti da più di 6 mesi: SELECT I.Nome, I.Cognome FROM Impiegato I, Impiegato C WHERE MONTHS_BETWEEN(SYSDATE,I.Data_Assunto) > 6 AND I.Capo = C.Cod AND C.Cognome = 'Bianchi'; A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 4 / 28
Tracce 2014/15 Oltre che sul gruppo Google unina-bdi-2014-15, le tracce complete per i progetti di Software Repository 1 versioning e gestione issues 2 progettazione, implementazione 3 testing sono ora disponibili nel file tracce.txt. A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 5 / 28
Uso di SQL Developer Il primo passo è configurare connessioni (dal pannello a sinistra) Per usarlo con un Oracle DB locale, impostare localhost come host e 1521 come porta (a meno di non averla cambiata durante l installazione) Per creare altri utenti/schemi (consigliato), creare prima una connessione per l utente SYSTEM, poi... A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 6 / 28
Creazione utenti 1 Aprire la connessione a SYSTEM 2 Clic destro su Altri utenti 3 Selezionare Crea utente... 4 Configurazione consigliata: Tablespace USERS, temporanea TEMP Ruoli CONNECT e RESOURCE Privilegi: almeno CREATE TABLE, VIEW, PROCEDURE, SEQUENCE, TRIGGER, SYNONYM, TYPE Quota illimitata su USERS 5 In seguito si potrà creare una connessione al nuovo utente A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 7 / 28
Ancora stringhe: TRANSLATE TRANSLATE(stringa, da, verso) rimpiazza ordinatamente tutte le occorrenze di caratteri in da con i corrispondenti in verso. Esempio SELECT TRANSLATE('il mio file*', '* ''', ' ') AS Filename FROM DUAL; FILENAME il_mio_file_ A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 8 / 28
Espressioni regolari in Oracle Modelli (pattern) che individuano un insieme di stringhe, permettendo operazioni di ricerca e sostituzione più flessibili. Utilizzabili in: REGEXP_LIKE(stringa, pattern) Vero se (parte di) stringa verifica il modello pattern. REGEXP_SUBSTR(stringa, pattern [,pos,n]) Estrae un occorrenza in stringa di una sottostringa (massimale) verificante pattern (n-esima a partire da pos). REGEXP_INSTR(stringa, pattern [,pos,n]) Restituisce la posizione di un occorrenza ecc. REGEXP_REPLACE(stringa, pattern, rimpiazzo [,pos,n]) Sostituisce con rimpiazzo sottostringhe massimali verificanti pattern (tutte, se n è omesso o 0). A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 9 / 28
Sintassi dei modelli regexp Caratteri Interpretazione. (punto) Qualsiasi carattere [ ] Uno fra i caratteri racchiusi; pure con -, es.: [a-z] [^ ] Uno fra i caratteri non racchiusi * Zero o più occorrenze (del carattere o espressione immediatamente precedente) + Una o più occorrenze? Nessuna o una occorrenza {m,n} Da m a n occorrenze ^ Inizio della stringa $ Fine della stringa ( ) Raggruppamento, richiamabile con \1, \2,... Alternativa fra raggruppamenti \ Il carattere che segue, se non numerico, va interpretato letteralmente A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 10 / 28
Esempi SELECT RTRIM(REGEXP_SUBSTR('http://mio.sito.com/pagina.html', '[a-z0-9]+\.[a-z][a-z]+/'),'/') AS Dominio FROM DUAL; DOMINIO sito.com SELECT REGEXP_REPLACE('cosa?', '(.)', '\1-') AS Caratteri FROM DUAL; CARATTERI c-o-s-a-?- A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 11 / 28
Attenzione a REGEXP_LIKE SELECT Nome, Cognome FROM Docente WHERE REGEXP_LIKE(Cognome, '[aeiou]*'); NOME COGNOME...... Alessandro De Luca...... Normalmente basta che una sottostringa verifichi il modello; ^ (inizio stringa) e $ (fine) cambiano tale comportamento. Esempio REGEXP_LIKE('parola', 'a') vero, REGEXP_LIKE('parola', '^a') falso, -- come LIKE 'a%' REGEXP_LIKE('parola', '^[^P]+la$') vero A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 12 / 28
Altre funzioni e operatori Numeriche Aritmetiche: +, -, *, /, MOD, FLOOR, CEIL,... Esponenziazione: EXP, POWER, SQRT, LOG,... Trigonometriche e iperboliche: SIN, ACOS, TANH,...... Di conversione: Esempio TO _CHAR(numero,formato) TO _NUMBER(stringa,formato)... TO_CHAR(0.5, '90.99') ' 0.50') A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 13 / 28
Espressioni CASE Espressioni condizionali, utili nelle interrogazioni: CASE WHEN condizione1 THEN valore1 WHEN condizione2 THEN valore2... ELSE valoreelse END A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 14 / 28
Esempio di CASE SELECT Cognome, CASE WHEN Stipendio >= 4000 THEN 'Ricco' WHEN Stipendio < 1000 THEN 'Povero' ELSE 'Insomma' END AS Situazione FROM Impiegato; COGNOME SITUAZIONE Rossi Insomma Bianchi Ricco...... A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 15 / 28
Caso semplice: DECODE DECODE(originale,val_If1,val_Then1,val_If2,val_Then2,......,valElse) equivale a: CASE WHEN originale = val_if1 THEN val_then1 WHEN originale = val_if2 THEN val_then2... ELSE valelse END A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 16 / 28
Valori nulli: NVL2 e NVL NVL2(valore, senonnullo, senullo) equivale a: CASE WHEN valore IS NULL THEN senullo ELSE senonnullo END NVL(valore, senullo) equivale a: NVL2(valore,valore,seNullo) A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 17 / 28
DDL: RENAME, DROP TABLE e ALTER TABLE Ridenominazione: RENAME Tabella TO NuovoNome; Eliminazione tabelle: DROP TABLE Tabella [CASCADE CONSTRAINTS]; (le parentesi [ ] denotano argomenti opzionali) Aggiunta di vincoli: ALTER TABLE Tabella ADD CONSTRAINT NomeVincolo Vincolo; Esempio ALTER TABLE Neoassunto ADD CONSTRAINT Neoassunto_fk FOREIGN KEY(Cod) REFERENCES Impiegato(Cod); A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 18 / 28
Altre possibilità di ALTER TABLE RENAME COLUMN VecchioNome TO Nuovo; DROP (Colonna) [CASCADE CONSTRAINTS]; MODIFY PRIMARY KEY DISABLE CASCADE; ADD (Colonna Tipo); MODIFY (Colonna Tipo);... A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 19 / 28
DML, Popolamento: INSERT Istruzione di base: INSERT INTO Tabella(Colonne) VALUES (Valori); È anche possibile inserire dati calcolati e/o provenienti da altre tabelle: INSERT INTO Tabella(Colonne) Query; A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 20 / 28
Versione generale: INSERT ALL INSERT ALL INTO Tabella1(Colonne1) VALUES ( Valori1) INTO Tabella2(Colonne2) VALUES ( Valori2)... Query; dove i Valori possono essere anche nomi di colonne di Query. A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 21 / 28
Esempio d inserimento Date le tabelle: Rubrica(Codice, Tel1, Tel2, Cell, Email,... ) e Recapito(Codicepersona, Tipo, Valore,... ), inseriamo in Recapito i dati di Rubrica: INSERT ALL INTO Recapito(Codicepersona,Tipo,Valore) VALUES (Codice, 'Telefono',Tel1) INTO Recapito(Codicepersona,Tipo,Valore) VALUES (Codice, 'Telefono',Tel2) INTO Recapito(Codicepersona,Tipo,Valore) VALUES (Codice, 'Cellulare',Cell) INTO Recapito(Codicepersona,Tipo,Valore) VALUES (Codice, 'Posta elettr.',email) SELECT Codice,Tel1,Tel2,Cell,Email FROM Rubrica; A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 22 / 28
Aggiornamento: UPDATE UPDATE Tabella SET Colonna1=Valore1, Colonna2=Valore2,... ColonnaN=ValoreN WHERE Condizione; Esempio Aumentare del 10% lo stipendio degli assunti entro il 2011: UPDATE Impiegato SET Stipendio = Stipendio * 1.1 WHERE Data_Assunto < TO_DATE('01/01/2012','DD/MM/YYYY'); A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 23 / 28
Cancellare righe: DELETE DELETE FROM NomeTabella [WHERE Condizioni]; Riepilogo DDL («forma») DML («contenuto») CREATE ALTER DROP INSERT UPDATE DELETE A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 24 / 28
Aggiornamento/popolamento: MERGE MERGE INTO Tabella T USING (Query) F ON (T.Chiave=F.Chiave) WHEN MATCHED THEN UPDATE SET T.Colonna1=F.Colonna1,... T.ColonnaN=F.ColonnaN [DELETE WHERE NOT ( Condizione )] WHEN NOT MATCHED THEN INSERT (Chiave,Colonna1,... ) VALUES (F.Chiave,F.Colonna1,... ) [WHERE ( Condizione )]; A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 25 / 28
Esempio MERGE Aggiornare la tabella Neoassunto(Cod,Nome,Cognome,Filiale) con gli assunti dell ultimo anno (da Impiegato): MERGE INTO Neoassunto N USING (SELECT Cod, Nome, Cognome, Data_Assunto FROM Impiegato) F ON (N.Cod = F.Cod) WHEN MATCHED THEN UPDATE SET N.Nome = F.Nome, N.Cognome = F.Cognome, Filiale = 'Napoli' DELETE WHERE SYSDATE-F.Data_Assunto > 365 WHEN NOT MATCHED THEN INSERT (Cod,Nome,Cognome,Filiale) VALUES (F.Cod,F.Nome,F.Cognome,'Napoli') WHERE SYSDATE-F.Data_Assunto <= 365; A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 26 / 28
Creazione/popolamento: CREATE TABLE AS CREATE TABLE NomeTabella(Colonne) AS Query; Esempio CREATE TABLE Email(Cod,Indirizzo) AS SELECT Cod, LOWER(SUBSTR(Nome,1,1) Cognome) '@lazienda.it' FROM Impiegato; A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 27 / 28
Viste CREATE OR REPLACE VIEW NomeVista[(Colonne)] AS Query; Esempio CREATE OR REPLACE VIEW Lavora_xBianchi AS SELECT Nome, Cognome FROM Impiegato I1 WHERE Capo = (SELECT Cod FROM Impiegato I2 WHERE Cognome='Bianchi'); A. De Luca (Univ. Federico II) Basi di dati e sist. inf. I, laboratorio 11 marzo 2015 28 / 28