SISTEMI INFORMATIVI E TELEMEDICINA INFORMATICA MEDICA 3. Panoramica su SQL Prof. Mauro Giacomini
Sommario Introduzione Istruzione SELECT Tipi di Join Subquery Comandi DML Creazione delle tabelle
Introduzione SQL: linguaggio di interrogazione standard per DBMS relazionali Consente anche: manipolazione dati, riorganizzazione dati, esecuzione di comandi amministrativi Non è un linguaggio di programmazione completo Utilizzabile in ambienti di programmazione Sono disponibili shell di interpretazione dei comandi Nato nei primi anni 80 sulla spinta di IBM che ne ha curato anche la standardizzazione, l ultima versione è ISO/IEC 9075-2:2003
Istruzione SELECT Molto flessibile Restituisce una tabella temporanea Sintassi SELECT [ALL DISTINCT]<lista attributi> FROM <lista tabelle> [WHERE <condizione>] [GROUP BY <lista attributi>] [HAVING <condizione>] [ORDER BY <lista attributi> [ASC DESC]]
Istruzione SELECT (2) SELECT: attributi da selezionare FROM: tabelle che contengono gli attributi di cui sopra WHERE: condizione di scelta fra le righe GROUP BY: modo di raggruppamento HAVING: condizione sui gruppi ORDER BY: attributi di ordinamento ASC cerscente DESC decrescente
Proiezione Scelta di alcuni attributi da una tabella (*) Possibile ridenominazione (AS)
Restrizione Opera sulle righe Ottiene un sottoinsieme delle righe della tabella Dipende dalle condizioni specificate nel WHERE Operatori (<, <=, =, >=, >, <>) e connettori logici (AND, OR, NOT) Operatori BETWEEN, IN, IS NULL
LIKE Operatore per ricerche flessibili sulle stringhe Da usarsi con caratteri speciali % una qualsiasi sequenza di caratteri o (*) _ un singolo carattere qualsiasi o (?)
Operazioni sulle colonne Nella lista delle colonne Operatori matematici Concatenazione di stringhe o & o +
Funzioni scalari di gruppo Restituiscono un singolo valore e sono applicate su insiemi di righe Max Min AVG SUM (attributo) COUNT ( * Espressione) con * tutte le righe, con Espressione conta solo quelle in cui Espressione è <> NULL
Raggruppamenti GROUP BY: raggruppa righe secondo la lista degli attributi specificata HAVING: specifica delle condizioni sui gruppi formati dagli attributi della clausola GROUP BY
Join Prodotto Cartesiano (CROSS JOIN) SELECT <lista attributi> FROM <tabella1>,<tabella2> Giunzione Naturale (NATURAL JOIN) SELECT <lista attributi> FROM <tab1>,<tab2> WHERE <tab1.pk> = <tab2.fk>
Inner Join <tab1> INNER JOIN <tab2> [ON <condizione>] Non è limitato solo alle connessioni fra le chiavi Non è solo di uguaglianza Non è limitato alle sole tabelle connesse in fasi di costruzione dello schema
Outer Join SELECT <lista attributi> FROM <tab1> [LEFT RIGHT] JOIN <tab2> ON <tab1.campo1> <opconf> <tab2.campo2> <opconf> = < > = <= >= Fornisce tutte le righe anche quelle che non hanno corrispondenze dal lato indicato
Self Join Join che lega due occorrenze presenti nella stessa tabella Come i precedenti, solo che ha bisogno di due istanze della stessa tabella nel FROM con la ridenominazione
Join su più tabelle Come quello su due tabelle Non serve che siano collegate logicamente Bastano dei domini comuni a due a due
Subquery scalari (1) Esempio: selezione di righe sulla base del risultato di un altra query Def. : una query racchiusa da parentesi () che può essere inserita in un altra istruzione SQL, principalmente come parametro di una sezione di WHERE SELECT matricola, cognome, nome, eta FROM Studente WHERE eta > (SELECT AVG(eta) FROM studente)
Subquery scalari (2) Condizioni di uso Deve restituire un solo valore Deve comparire a destra dell operatore di confronto Non si possono confrontare due subquery Nella subquery non si possono usare (GROUP BY e HAVING)
Subquery e IN (1) Con la clausola IN si può controllare in un insieme, quindi possiamo usare subquery che restituiscono un vettore (colonna) di dati SELECT * FROM Impiegato WHERE Impiegato.matricola IN (SELECT DISTINCT Familiare.matricola FROM Familiare Where eta<18 AND legame = F )
Subquery e IN (2) SELECT DISTINCT * FROM Impiegato, Familiare WHERE Impiegato.matricola = Familiare.matricola and Familiare.eta<18 and Familiare.legame= F Da usare il Join se si vogliono in output campi anche della tabella familiare
Subquery annidate SELECT Filiale.* FROM Filiale WHERE codice IN (SELECT codice_filiale FROM Tariffa WHERE codice_categoria = (SELECT codice FROM Categoria WHERE descrizione = Lusso ) AND prezzo<30) Possibili problemi di efficienza
Tipi di linguaggi per il DBMS Data Manipulation Language (DML): comandi per inserire, modificare, cancellare occorrenze in una tabella Data Definition Language (DDL): comandi per la struttura del DB (creazione/eliminazione di tabelle/attributi/vincoli/viste) Data Control Language (DCL): comandi per il controllo sui dati, gestione degli utenti, diritti
INSERT (1) Inserimento di righe in tabelle Dati specificati nell istruzione INSERT INTO <nome_tabella> [lista_colonne] VALUES <lista_valori> Es: INSERT INTO Studente (matricola, cognome, nome) VALUES (2523789, Rossi, Mario ) Corrispondenza 1 a 1 fra lista colonne e lista valori Campi non presenti nella lista messi a NULL Se non c è la lista colonne, i valori saranno assegnati ai campi nell ordine in cui compaiono nella tabella Il valore della chiave primaria deve sempre essere assegnato
INSERT (2) Accoppiata con una SELECT per ottenere i dati da inserire INSERT INTO Studente_Laureato (SELECT * FROM Studente WHERE laureato = S ) La tabella Studente_Laureato deve essere già presente e deve avere la stessa struttura di Studente
UPDATE Modifica i dati già presenti Sintassi UPDATE <nome_tabella> SET <colonna>=<espressione> [{,<colonna>=<espressione>}] [WHERE <condizione>] L espressione può essere anche una subquery scalare
DELETE Elimina tutte le righe che rispettano la condizione scritta nella clausola WHERE Sintassi: DELETE FROM <nome_tabella> [WHERE <condizione>]
CREATE TABLE Comando per la creazione di tabelle Sintassi: CREATE TABLE <nome_tabella> ( { <nome_colonna> <tipo [ (dimensione) ] > [NOT NULL CONSTRAINT <nome_vincolo> PRIMARY KEY UNIQUE ] [,] } )
Tipi di dati CHAR (n): sequenza alfanumerica di n caratteri CHAR VARYING (n): come sopra ma qui n è un valore massimo DECIMAL (t,f) numero decimale di t cifre di cui f decimali INTEGER numero intero (4 byte) SMALLINT intero corto (2 byte) FLOAT (n) numero a virgola mobile a precisione variabile REAL / DOUBLE numeri a virgola mobile a precisione fissa DATE
Vincoli di integrità NOT NULL: attributo obbligatorio (specificabile anche senza il predicato CONSTRAINT) UNIQUE: valore che deve essere diverso in tutte le righe PRIMARY KEY: indica la chiave primaria della relazione, indicabile una sola volta nella creazione della tabella
Vincoli di integrità di tabella Chiave primaria composta di più attributi Da indicarsi alla fine della CREATE TABLE CONSTRAINT <vincolo> PRIMARY KEY ( {<attributo> [,] } ) Chiavi esterne CONSTRAINT <vincolo> FOREIGN KEY ({<attributo_nella_tabella> [,] }) REFERENCES <nome_tabella_esterna> ({<attributo_esterno> [,] })