(Lezione SQL 3) Barbara Di Camillo Dipartimento di Ingegneria dell Informazione. Università degli Studi di Padova

Documenti analoghi
QL (Query Language) Alice Pavarani

Sistemi di Elaborazione delle Informazioni

Structured Query Language

4.SQL QUERY. Fare una query significa fare delle ricerche sul nostro database.

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

Lezioni di Laboratorio sui Data Base

SQL - Structured Query Language

Basi di Dati: Corso di laboratorio

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

(Lezione SQL 1) Barbara Di Camillo Dipartimento di Ingegneria dell Informazione. Università degli Studi di Padova

Basi di dati - Laboratorio

Basi di Dati: Corso di laboratorio

Operazioni. Lezione 8. Operazioni Relazionali. Operazioni insiemistiche Intersezione: Operazioni insiemistiche Unione:

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

Gestione dei valori nulli

Operazioni Relazionali. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto san giovanni

SQL: le funzioni di aggregazione

Corso di Informatica Medica

IL LINGUAGGIO SQL LE BASI

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

Linguaggio SQL seconda parte

Select From Where...

SQL Matteo Magnani, Danilo Montesi Università di Bologna SQL. SQL come Data Manipulation Language - (SELECT FROM WHERE ORDER BY)

Basi di Dati: Corso di laboratorio

Basi di Dati: Corso di laboratorio

Corso sul linguaggio SQL

SQL. Argomenti della lezione. Join esplicito. Interrogazioni complesse in SQL join esplicito outer join operatori aggregati interrogazioni nidificate

Consideriamo lo schema relazionale

Queries su più tabelle

SQL /10/2016 Basi di dati - SQL 1

Alessandra Raffaetà. Esercizio: Cinema

S.I.T. PER LA VALUTAZIONE E GESTIONE DEL TERRITORIO Corso di Laurea Magistrale in Scienze Ambientali. Alessandra Raffaetà

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

Modulo 2 Data Base 3

<Nome Tabella>.<attributo>

Interrogare una base di dati: Algebra relazionale e SQL. Alessandro Bardine Alessandro Ciaramella Vincenzo Galella Rudy Manganelli

(Lezione SQL 2) Barbara Di Camillo Dipartimento di Ingegneria dell Informazione. Università degli Studi di Padova

Esempi SQL con Access. Orazio Battaglia

Argomenti della lezione. Interrogazioni complesse in SQL join esplicito outer join operatori aggregati interrogazioni nidificate

Interrogazioni semplici

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

Principi di Progettazione del Software a.a Il linguaggio SQL. Il Linguaggio SQL

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

SQL operazioni sui dati: interrogazioni con join e prodotti cartesiano

Corso sul linguaggio SQL

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

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

Informatica Grafica. Basi di dati parte 2

E possibile ordinare le righe del risultato di una interrogazione attraverso la clausola order by, a chiusura di una interrogazione.

SQL - Structured Query Language

Operatori aggregati. Operatori aggregati. Interrogazioni con raggruppamento. Interrogazioni con raggruppamento

Database parte 2. Database azienda

SQL QUERY: Le interrogazioni del database

Lezione 6. Algebra e Calcolo Relazionale

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

BASI DATI: algebra relazionale

Basi di Dati. S Q L Lezione 2

Esercitazione 2 SQL.

BASI DATI: algebra relazionale INFORMATICA APPLICATA E SISTEMI DI ELABORAZIONE DELLE INFORMAZIONI

Microsoft Access. Relazioni e query SQL. Domenico Fabio Savo

Join esplicito. SELECT con join esplicito, sintassi. Ulteriore estensione: join naturale (meno diffuso) Outer join. Join esterno: "outer join"

Interrogazioni di tipo insiemistico. Select. Interrogazioni di tipo insiemistico. Interrogazioni nidificate

SQL è stato definito nel 1973 ed è oggi il linguaggio universale dei sistemi relazionali

V. Moriggia Modelli di Base Dati. Modelli di Base Dati. a.a. 2001/

Gestione delle informazioni. Tot. h 10. Base di Dati. Tot. h 56. Grafica in C# - Laboratorio- Tot. h 40. Dipartimento Informatica Materia Informatica

Operazioni su insiemi: unione, intersezione e differenza

Tabelle esempio: Impiegato/Dipartimento

Corso sul linguaggio SQL

Laboratorio di Basi di Dati e Web

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

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

Interrogazioni su più tabelle. Interrogazioni su più tabelle. Clausola where. Interrogazioni su più tabelle

Corso di. Basi di Dati I. 8. Esercitazioni in SQL: Interrogazioni nidificate

Il formato di base di un interrogazione in SQL è: SELECT R i1.c 1, R i2.c 2,..., R in.c n FROM R 1, R 2,..., R k WHERE F;

Algebra relazionale. Algebra relazionale. Operatori dell algebra relazionale. Operatori dell algebra relazionale. Algebra relazionale.

Le implementazioni nei vari DBMS relazionali commerciali

Interrogazioni complesse. SQL avanzato 1

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"

Interrogazioni. L istruzione base per le interrogazioni è select

Linguaggio SQL: fondamenti D B M G

INFORMATICA SANITARIA Domande ed Esercizi di Preparazione all Esame (Parti 5-7)

Dati una relazione r(x) e un sottoinsieme Y di X, la proiezione di r su Y si indica con

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

Join (naturale) Join. Join. Join

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

Tipi di operatori. Gli operatori dell algebra relazionale sono classificabili nelle seguenti categorie:

SQL: RAGGRUPPAMENTI, QUANTIFICAZIONE, METODO. Patrizio Dazzi a.a

Il theta-join, espresso come prodotto cartesiano seguito da una selezione, è il tipo di join operativamente più generale. Infatti:

Manuale SQL. Manuale SQL - 1 -

Basi di Dati. Esercitazione SQL. 17 novembre 2011

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

Parte III. L algebra relazionale

Basi di Dati: Corso di laboratorio

Esercitazione 3 SQL 2

Operatori aggregati. Gli operatori di aggregazione NON sono rappresentabili in Algebra Relazionale. conteggio, minimo, massimo, media, somma

Linguaggio SQL: fondamenti D B M G

Transcript:

Università degli Studi di Padova Corso di Laurea Magistrale in Bioingegneria A.A. 2010-20112011 INFORMATICA SANITARIA (Lezione SQL 3) Barbara Di Camillo Dipartimento di Ingegneria dell Informazione Università degli Studi di Padova Via Ognissanti 72, 35129 Padova e-mail: barbara.dicamillo@dei.unipd.it

Interrogazione di Tabelle: l istruzione SELECT e l algebra relazionale

SELECT e l algebra relazionale SELECT rimborso π FROM drg rimborso (σ rimborso>1000 (drg)) WHERE rimborso>1000 GROUP BY rimborso HAVING COUNT(*)>1 ORDER BY rimborso L istruzione SELECT permette di implementare gli operatori di algebra relazionale (tranne l UNIONE) e fornisce delle funzionalità aggiuntive FROM WHERE GROUP BY HAVING σ ρ SELECT π ρ ORDER BY

Operatori intersezione e differenza 2 tabelle (con lo stesso schema) 1 tabella (mantiene lo schema) Prescrizioni(codice, nome,costo) Prescr_old(codice, nome,costo) Prescrizioni Prescr_old Prescrizioni - Prescr_old INTERSEZIONE ( ) Agisco sulle righe; mantengo tutte le colonne SELECT Prescrizioni.* FROM Prescrizioni, Prescr_old WHERE Prescrizioni.codice=Prescr_old.codice; DIFFERENZA (-) SELECT Prescrizioni.* FROM Prescrizioni WHERE Prescrizioni.codice NOT IN (SELECT codice FROM Prescr_old);

SELECT Prescrizioni.* FROM Prescrizioni, Prescr_old Alcune note WHERE Prescrizioni.codice=Prescr_old.codice; SELECT prescrizioni.* FROM Prescrizioni WHERE Prescrizioni.codice NOT IN (SELECT codice FROM Prescr_old); Specifica full : tabella e attributo Evita ambiguità e rende più facile la lettura! Indica la selezione di tutte le colonne Con gli operatori insiemistici devo usare una condizione sulla chiave. Se la chiave è composita userò la parola chiave AND. Ad esempio, se la chiave fosse (codice,costo): SELECT Prescrizioni.* FROM Prescrizioni, Prescr_old WHERE Prescrizioni.codice=Prescr_old.codice AND Prescrizioni.costo=Prescr_old. costo;

Operatore unione 2 tabelle (con lo stesso schema) 1 tabella (mantiene lo schema) Prescrizioni(codice, nome,costo) Prescr_old(codice, nome,costo) Prescrizioni Prescr_old Agisco sulle righe; mantengo tutte le colonne UNIONE ( ) (SELECT * FROM Prescrizioni) UNION (SELECT * FROM Prescr_old);

Operatore di ridenominazione, 1 tabella 1 tabella (con schema uguale o diverso) RIDENOMINAZIONE (ρ) SELECT * RIDENOMINAZIONE TABELLA INTO Prescrizioni_new FROM Prescrizioni; SELECT * FROM Prescrizioni AS Prescrizioni_new; Utile per fare self-join, come vedremo RIDENOMINAZIONE COLONNE SELECT codice AS id, nome, costo FROM Prescrizioni; NOTA: l output di una query è una tabella virtuale (se non ho usato INTO <nome-nuova-tabella>)

Operatore AS AS si usa anche per dare il nome a nuove colonne oltre che per rinominare colonne già esistenti In genere conviene usarlo quando si fanno elaborazioni sui dati Esempi: SELECT rimborso/1000 FROM drg ; SELECT rimborso/1000 AS migliaia_di_euro FROM drg ; SELECT drg.*, round(rimborso/1000) AS migliaia_di_euro FROM drg ;

Operatori di proiezione e selezione 1 tabella 1 tabella (con schema uguale o diverso) PROIEZIONE (π) Estraggo colonne!!! SELECT DISTINCT codice, nome FROM Prescrizioni; SELEZIONE (σ) SELECT * Estraggo righe!!! FROM Prescrizioni WHERE costo<100;

Esempi SELECT cognome, nome FROM generale WHERE nascita IS NULL; π nome, cognome (σ nascita=null (generale)) SELECT nome,cognome,nascita FROM generale WHERE provincia= PD ; π nome, cognome, nascita (σ provincia=pd (generale)) SELECT nome,cognome,nascita FROM generale WHERE provincia= PD AND sesso= F ; π nome, cognome, nascita (σ provincia=pd AND sesso=f (generale)) SELECT codice_fisc, reparto FROM dipendenti WHERE codice_fisc IN (SELECT codice_fisc FROM ricoveri); π codice_fisc, reparto (σ codice_fisc ( π codice_fisc(ricoveri)) (dipendenti))

Operatori di JOIN (prod.cartesiano, join naturale, theta join) 2 tabelle (con schemi anche diversi) 1 tabella (con schema join ) RIPASSO: Il prodotto cartesiano di due relazioni è la relazione che si ottiene semplicemente affiancando ad ogni tupla della prima tabella tutte le tuple della seconda tabella. La join naturale è un operazione che concatena dati in relazioni diverse sulla base di valori uguali in attributi con lo stesso nome e lo stesso significato (in genere coinvolge una chiave esterna e una primaria). Se non ci sono campi in comune degenera nel prodotto cartesiano. La theta-join è un operazione che consente di correlare due relazioni sulla base del confronto tra i valori delle relazioni relativi ad attributi con nome diverso ma con significato comune. Se la condizione è l uguaglianza si parla in particolare di equi-join.

Prodotto Cartesiano Esprimiamo l operazione Prodotto cartesiano con l istruzione SELECT in cui: dopo SELECT usiamo * (selezioniamo tutte le colonne) nella clausola FROM viene referenziata più di una tabella Non specifichiamo la clausola WHERE SELECT * FROM Prescrizioni,drg;

Join Naturale e Theta join In SQL esprimiamo tutte e due le operazioni di Join nello stesso modo Se la condizione di JOIN è un egualglianza tra attributi con lo stesso nome e lo stesso campo ho un join naturale Se la condizione di JOIN è tra attributi con nome diverso (ma lo stesso campo) ho un theta-join (se poi la condizione è l eguaglianza ho un equi-join) Va specificato se uso un INNER JOIN o un OUTER (LEFT o RIGHT) JOIN: SELECT * FROM <nome_tab_left> INNER JOIN LEFT JOIN RIGHT JOIN ON <condizione di JOIN>; < nome_tab_right>

Join Naturale e Theta join SELECT * FROM generale INNER JOIN dipendenti ON generale.codice_fisc=dipendenti.codice_fisc; Generale Dipendenti SELECT * FROM interventi INNER JOIN dipendenti ON interventi.cf_medico=dipendenti.codice_fisc; SELECT * FROM interventi INNER JOIN visite ON interventi.data_intervento< visite.data ; SELECT * FROM interventi INNER JOIN visite ON interventi.codice_fisc = visite.cf_paziente WHERE data_intervento<data; Interventi cf_medico=codice_fisc Dipendenti Interventi Data_intervento<data Visite Interventi cf_medico=codice_fisc Visite AND Data_intervento<data

INNER e OUTER JOIN SELECT * FROM generale INNER JOIN dipendenti ON generale.codice_fisc=dipendenti.codice_fisc; Generale Dipendenti SELECT * FROM generale LEFT JOIN dipendenti ON generale.codice_fisc=dipendenti.codice_fisc; Generale LEFT Dipendenti SELECT * FROM generale RIGHT JOIN dipendenti ON generale.codice_fisc=dipendenti.codice_fisc; Generale RIGHT Dipendenti SELECT * FROM generale FULL JOIN dipendenti ON generale.codice_fisc=dipendenti.codice_fisc; Generale FULL Dipendenti

FULL JOIN in Access In Access non posso usare la parola chiave FULL (non è definita); quindi faccio un unione tra un left e un right JOIN: (SELECT * FROM generale LEFT JOIN dipendenti ON generale.codice_fisc=dipendenti.codice_fisc) UNION (SELECT * FROM generale RIGHT JOIN dipendenti ON generale.codice_fisc=dipendenti.codice_fisc); Generale FULL Dipendenti

SELF JOIN tramite SELECT Si possono inoltre utilizzare dei nomi interni (detti range variables) per denotare le tabelle e/o le colonne L uso delle range variables è indispensabile quando si debbano usare le stesse colonne della stessa tabella più volte, come nelle SELF JOIN Esempio di Join della tabella con se stessa (SELF JOIN) Trovare i coetanei (nome, cognome e nascita) nella tabella generale. SELECT DISTINCT gen1.nome, gen1.cognome,gen1.nascita FROM generale AS gen1 INNER JOIN generale AS gen2 ON gen1.nascita=gen2.nascita WHERE gen1.codice_fisc<>gen2.codice_fisc; π(σ gen1.codice_fisc<>gen2.codice_fisc (ρ gen1 (generale) gen1.nascita=gen2.nascita ρ gen2 (generale))

Esercizio (difficile) Si consideri la tabella ALBERO (si escludono omonimie) ALBERO Genitore Luca Rossi Maria Pavan Giorgio Rossi Silvia Di Carlo Enzo Pavan Figlio Anna Rossi Anna Rossi Luca Rossi Maria Pavan Maria Pavan Attraverso operazioni di ridenominazione, join, proiezione, produrre la tabella sotto Nonno Giorgio Rossi Silvia Di Carlo Enzo Pavan Nipote Anna Rossi Anna Rossi Anna Rossi

Esercizio (difficile) ALBERO Genitore Figlio Genitore Figlio Luca Rossi Anna Rossi Luca Rossi Anna Rossi Maria Pavan Anna Rossi Maria Pavan Anna Rossi Giorgio Rossi Luca Rossi Giorgio Rossi Luca Rossi Silvia Di Carlo Maria Pavan Silvia Di Carlo Maria Pavan Enzo Pavan Maria Pavan Enzo Pavan Maria Pavan SELECT alb1.genitore AS nonno, alb2.figlio AS nipote FROM (albero AS alb1) INNER JOIN (albero AS alb2) ON alb1.figlio=alb2.genitore;

Uso delle join annidate SELECT visite.data, generale.nome, generale.cognome, prescrizioni.nome, prescrizioni.costo FROM (visite INNER JOIN prescrizioni ON visite.prescrizione=prescrizioni.codice) INNER JOIN generale ON visite.cf_medico=generale.codice_fisc; La join annidata corrisponde a una tabella virtuale che è join tra la tabella visite e la tabella prescrizioni che è coinvolta in una join con la tabella generale

Uso delle join annidate SELECT visite.data, generale.nome, generale.cognome, prescrizioni.nome, prescrizioni.costo FROM (visite INNER JOIN prescrizioni ON visite.prescrizione=prescrizioni.codice) INNER JOIN generale ON visite.cf_medico=generale.codice_fisc; La condizione nella Join principale coinvolge la tabella generale e la tabella virtuale ottenuta dalla join annidata. Uso la specifica full per indicare la colonna della tabella virtuale a cui faccio riferimento. La condizione imposta nella Join annidata coinvolge le due tabelle visite a prescrizioni Tabella virtuale ottenuta con la join annidata: VISITE.CF_PAZIENTE VISITE.DATA VISITE.ALTEZZA VISITE.PESO VISITE.TEMPERATURA VISITE.P_DIASTOLICA VISITE.P_SISTOLICA VISITE.PRESCRIZIONE VISITE.NOTE VISITE.CF_MEDICO PRESCRIZIONE.codice PRESCRIZIONE.NOME PRESCRIZIONE.COSTO BRTPGR46T10A059G 12-Oct-02 180 80 38 80 120 1 ZNDLCU65H58A465M 1 emocromo 100 RCCCMN25P62B345T 06-Jan-00 160 75 39 75 110 3 DRSNNA66E48G224K 3 penicillina 50 MGLNMR99T52L577W 02-May-01 100 35 36 80 120 4 PLVJRN68C08D383W 4 antibiotici 40 BRTPGR46T10A059G 12-Oct-02 180 80 38 80 120 5 ZNDLCU65H58A465M 5 anticoagulanti 60 RCCCMN25P62B345T 10-Oct-00 160 70 37 80 100 6 TSTSST60D26G224A 6 dialisi 300 TNTNDR51C12A001A 16-Aug-04 175 90 37 90 140 7 DRSVNT62A61G570R 7 RX torace 100 RNZRNZ97T14L349T 06-Jun-03 110 45 38 70 100 9 ZNDLCU65H58A465M 9 TC encefalo 150 TNTNDR51C12A001A 16-Aug-04 175 90 37 90 140 10 DRSVNT62A61G570R 10 antiipertensivi 75 LMPDRA32P22A726F 07-Dec-97 170 68 38 110 190 10 iperteso DRNPLA65D29A161R 10 antiipertensivi 75

Uso delle join annidate SELECT. FROM tab1 INNER JOIN tab2 ON ; ( tab0a INNER JOIN tab0b ON ) ( tab0c INNER JOIN tab0d ON ) Le join vanno annidate in posizione corrispondente alla prima tabella (dopo FROM) Le join annidate sono racchiuse tra parentesi tonde Va sempre utilizzata la notazione full: nome_tabella.nome_colonna

Schema Riassuntivo funzioni e operatori parole chiave SELECT proiezione DISTINCT ALL ridenominazione colonna AS ridenominazione tabella (creazione) INTO operazioni sui dati,+, -, /, * funzioni di aggregazione SUM, AVG, COUNT, MIN, MAX FROM ridenominazione tabella AS Join INNER JOIN LEFT JOIN RIGHT JOIN, ON WHERE** operatori di uguaglianza/ disuguaglianza >,<,=,<=,>=,<>, operatori logici NOT, AND, NULL altri operatori BETWEEN, IN, LIKE, IS NULL predicati IN, EXIST, ANY, ALL * in rosso sono indicati gli operatori corrispondenti all'algebra relazionale ** la clausola WHERE corrisponde all'operatore SELEZIONE in algebra relazionale Gli operatori insiemistici intersezione e differenza non corrispondono ad un comando SQL, ma sono implementabili con l'istruzione SELECT. Per l'unione bisogna usare il comando UNION

Esercizio 1 Operazioni di Join e Query annidate Trovare Nome e Cognome dei pazienti ricoverati nel reparto di medicina interna Mi faccio restituire nei vari livelli di annidamento: 1. Codice del reparto medicina interna 2. CF dei pazienti ricoverati a medicina interna 3. Nome e cognome dei pazienti con CF ricavato al punto 2 SELECT nome, cognome FROM generale WHERE codice_fisc IN (SELECT codice_fisc FROM ricoveri WHERE reparto = (SELECT codice FROM reparti WHERE nome=''medicina interna'')); Realizzare la stessa query usando un Join tra generale e ricoveri e una sola query annidata

Esercizio 2 Operazioni di Join e Query annidate Qual è il nome e cognome e il reparto dei dipendenti dell ospedale che sono stati ricoverati? Suggerimento: JOIN tra generale e dipendenti per ricavare nome, cognome e reparto Con la condizione che i dipendenti siano stati ricoverati

Esercizio 3 Operazioni di Join e Query annidate a) Creare una rubrica rubrica_dipendenti con il cognome, nome, indirizzo, comune provincia e telefono dei dipendenti attualmente assunti b) Trovare il costo effettivo di ognuna delle prescrizioni effettuate in seguito a una visita (indicare data della visita, cf del medico, nome e costo della prescrizione) c) Trovare il costo effettivo di ognuna delle prescrizioni effettuate in seguito a una visita (indicare data della visita, nome del medico, nome e costo della prescrizione)