Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
SELECT V.DATA, “+AP.COGNOME AS PAZIENTE,
AP.NOME+”
AM.NOME+” “+AM.COGNOME AS MEDICO
FROM ANAGRAFICA AP, ANAGRAFICA AM, VISITE V
WHERE V.CF = AP.CF AND V.CFM = AM.CF
➔ Tutte le volte che devo prendere da una stessa tabella attributi che vado a mettere in colonne
diverse della tabella risultante devo raddoppiare la tabella di partenza
DECODIFICA DELLE INFORMAZIONI
• Esempio: voglio estrarre le informazioni decodificate (al posto del codice fiscale voglio ottenere
nome e cognome, al posto di codice professione voglio ottenere la professione), voglio vedere i
dati della tabella esercita_prof decodificati
➢ Tabella esercita_prof
CODICE_FISC CODICE_PROF DATA_INIZIO DATA_FINE
CF1 2.4.1.1 01.11.2019
CF1 1.3 03.03.1990 04.03.1995
CF2 2.4.1.4 01.01.2022 10.01.2022
➢ Oltre alla tabella esercita_prof devo prendere le tabelle con i dati decodificati, ovvero generale e
professioni
➢ Tabella generale
CODICE_FISC COGNOME NOME NASCITA SESSO CITTÀ TELEFONO
➢ Tabella professioni
CODICE DESCRIZIONE RETRIBUZIONE_BASE
➔ SELECT EP.CODICE_FISC,
G.COGNOME,
G.NOME,
P.DESCRIZIONE,
EP.DATA_INIZIO,
EP.DATA_FINE
FROM ESERCITA_PROF EP, GENERALE G, PROFESSIONI P
WHERE EP.CODICE_FISC = G.CODICE_FISC
AND EP.CODICE_FISC = P.CODICE_FISC
ORDER BY EP.CODICE_FISC, EP.DATA_INIZIO
▪ Posso aggiungere gli alias AS e UCASE per migliorare la tabella risultante
• Esempio: mostrare i dati della tabella ricoveri con le loro decodifiche, ovvero id ricovero,
codice fiscale del paziente, nome e cognome del paziente, nome del reparto, data ingresso e data
uscita, descrizione della diagnosi ricovero, descrizione del DRG, codice fiscale del medico,
nome e cognome del medico
➢ Tabella ricoveri:
ID CODICE_FISC REPARTO DATA_I DATA_U DIAGNOSI_RIC DRG CF_MED
➔ SELECT R.ID_RICOVERO, R.CODICE_FISC, GP.NOME, GP.COGNOME, REP.NOME,
R.DATA_INGRESSO, R.DATA_USCITA, I.DESCRIZIONE, D.DESCRIZIONE, R.CF_MED,
GM.NOME, GM.COGNOME
FROM RICOVERI R, GENERALE GP, GENERALE GM, ICD9 I, DRG D, REPART REP
WHERE R.CODICE_FISC = GP.CODICE_FISC AND
R.DRG = D.CODICE AND
R.DIAGNOSI_RICOVERO = I.CODICE AND
R.CF_MED = GM.CF_MED AND
R.REPARTO = REP.CODICE
• Esempio: descrivere le prescrizioni mettendo il paziente a cui si riferisce, il nome del farmaco,
la data in cui è stata fatta la prescrizione
➢ Tabelle prescrizione
ID_PRESC ID_VISITA COD_FARMACO DATA_I DATA_F DOSE_GIORNO
➔ SELECT G.CODICE_FISC, G.NOME, G.COGNOME, F.DESCRIZIONE, V.DATA
FROM PRESCRIZIONE P, VISITE V, GENERALE G, FARMACI F
WHERE P.ID_VISITA = V.ID_VISITA AND
P.COD_FARMACO = F.CODICE AND
V.CF_PAZIENTE = G.CODICE_FISC
▪ Nella tabella farmaci il codice farmaco non è un numero, ma una stringa di testo che ha uno
spazientì davanti quindi devo andare a modificare il codice farmaco nella tabella prescrizione
andando ad aggiungere lo spazio
➔ Istruzione per togliere/ignorare gli spazi prima e dopo di una stringa: trim(attributo)
➔ Posso andare a modificare la query aggiungendo nella WHERE
AND TRIM(P.COD_FARMACO) = TRIM(F.CODICE)
• Esempio: ad ogni prescrizione che il medico fa ci si aspetta delle somministrazioni del farmaco
da parte degli infermieri; descrivere le somministrazioni mettendo il paziente a cui è stato dato il
farmaco, la data della prescrizione, la data della somministrazione, il farmaco somministrato, il
dosaggio e l’infermiere che ha effettuato la somministrazione
➢ Tabella somministrazione
ID_SOM ID_PRESC DATA_ORA DOSE_SOM EVENTUALI_PROB CF_INF
01.01.2000
1 1 5 - CF15
09:30:00
01.01.2000
2 1 5 Nausea CF13
20:00:00
02.01.2000 Il paziente rifiuta la
3 1 3 CF15
08:00:00 dose intera
03.01.2000
4 2 25 - CF15
12:00:00
▪ Attenzione: per riempire la tabella somministrazione fare riferimento alla tabella prescrizione
➔ SELECT GP.CODICE_FISC, GP.NOME, GP.COGNOME, S.DATAORA, F.DESCRIZIONE,
S.DOSESOMMINISTRATA, GI.CODICE_FISC, GI.NOME, GI.COGNOME
FROM GENERALE GP, GENERALE GI, SOMMINISTRAZIONE S, FARMACI F,
PRESCRIZIONE P, VISITE V
WHERE S.CF_INFERMIERE = GI.CODICE_FISC AND
S.ID_PRESC =VAL(P.ID_PRESC) AND
P.ID_VISITA = V.ID_VISITA AND
GP.CODICE-FISC = V.CF_PAZIENTE AND
P.COD_FARMACO = F.CODICE
▪ non corrispondente nell’espressione”
Error:“Tipo = in una qualche condizione, in una delle
uguaglianze si stanno confrontando due valori di tipo diverso
▪ L’ID della prescrizione nella tabella prescrizione è un carattere quindi uso l’istruzione val per
trasformarla in un numero SUBQUERY
• e significa “sta in”
Operatore in: sostituisce una serie di or
➢ Esempio: X IN (1,2,3,4) questa espressione equivale a scrivere X=1 OR X=2 OR X=3 OR X=4
▪ L’espressione significa “x sta in insieme”
➢ Esempio:
SELECT * FROM GENERALE
WHERE COGNOME IN (“VERDI”, “BIANCHI”)
▪ Questa query prende solo le righe della tabella generale con i pazienti che hanno cognome verdi
e Bianchi
• “non sta in”
Operatore not in: significa
➢ Esempio:
SELECT * FROM GENERALE
(“VERDI”, “BIANCHI”)
WHERE COGNOME NOT IN
Questa query prende tutte le righe della tabella generale escludendo i pazienti che hanno
cognome Verdi e Bianchi
• SUBQUERY = si tratta di una query all’interno di un’altra query che è al query principale e puó
essere usata per imporre delle condizioni anche su altre tabelle, altre rispetto alla from della
query principale
➢ Le subquery vengono usate nella where
➢ Quando si usano le query, anche se nella from abbiamo solo una tabella, è sempre meglio nella
per la tabella (vogliamo indicare a quale tabella quell’attribuzione si
select usare gli alias
riferisce)
➢ La subquery va sempre messa da parentesi
➢ Quando é possibile bisogna evitare le subquery perché dal punto di vista del calcolo sono più
onerose rispetto a una query unica: quando è possibile devo usare la join
➢ Quando dentro la subquery si usano attributi di una tabella presente nella query principale si
dice che la subquery e la query principale sono CORRELATE TRA LORO
➢ Nel momento in cui assegno l’alias a una tabella nella query principale, i suoi attributi possono
essere usati anche nella subquery
• Esempio: trovare le persone (ovvero CF, nome, cognome) che non sono mai state visitate
➢ Voglio trovare tutte le persone che sono presenti nella tabella generale ma che non compaiono
nella tabella visite in cui l’attributo che si riferisce alla persona è il codice fiscale
➢ Faccio una query principale in cui prendo CF, nome e cognome dalla tabella generale
➢ Faccio una subquery per imporre la condizione che il codice fiscale del paziente (in generale)
non si trovi nella tabella visite
SELECT G.CODICE_FISC, G.NOME, G.COGNOME
FROM GENERALE G
WHERE G.CODICE_FISC NOT IN (SELECT V.CF_PAZIENTE FROM VISITE V WHERE
V.CF_PAZIENTE IS NOT NULL)
▪ non funziona quindi devo aggiungere e un’altra
Attenzione: se ci sono dei valori nulli la not in
condizione
➢ Questo esercizio non è risolvibile con la join perché con la join posso solo eguagliare i codici
fiscali
• Esempio: trovare le persone che sono state visitate (prova questa)
SELECT G.CODICE_FISC, G.NOME, G.COGNOME
FROM GENERALE G
WHERE G.CODICE_FISC IN (SELECT V.CF_PAZIENTE FROM VISITE V)
➢ Posso risolvere il problema senza usare la subquery
SELECT DISTINCT G.CODICE_FISC, G.NOME, G.COGNOME
FROM GENERALE G, VISITE V
WHERE G.CODICE_FISC = V.CF_PAZIENTE
▪ Attenzione: siccome un paziente può fare più visite, questo compare tante volte (nel prodotto
cartesiano la stessa riga di un paziente nella tabella generale viene appaiata più volte con le
righe del paziente nella tabella visite). Per risolvere il problema posso usare distinct che elimina
i doppioni dal risultato
• Esempio: trovare le persone che sono state ricoverate ma non hanno subito un intervento
chirurgico
➢ Tabella interventi
ID_INTERVENTO CODICE_FISC DATA_INT CODICE_INT CF_CHIRURGO
1 CF1 14.05.2000 98.13 CF10
2 CF1 02.04.2022 98.12 CF10
3 CF2 05.12.2001 98.14 CF10
➢ Il testo dell’esercizio è ambiguo perché potrebbe essere interpretata in due modi:
1. Trovare le persone che sono state ricoverata ma non hanno mai subito un intervento chirurgico
2. Trovare le perone che, durante un ricovero, non hanno mai subito un intervento
➢ Richieste dell’esercizio:
1. Per la domanda 1 voglio CF, nome e cognome
2. Per la domanda 2 voglio CF, nome, cognome e data del ricovero senza intervento (per quella
stessa persona può esserci anche un ricovero in cui è stata operata, ma noi prendiamo solo quelli
in cui non è stata operata)
➢ Risoluzione dell’esercizio:
1. Per la domanda 1 possiamo fare una join in cui cerchiamo le persone che sono in generale e in
ricoveri e poi facciamo un and specificando che il codice fiscale del paziente non deve trovarsi
nella tabella interventi
SELECT DISTINCT G.CODICE_FISC, G.NOME, G.COGNOME
FROM GENERALE G, RICOVERI R
WHERE G.CODICE_FISC AND R.CODICE_FISC AND G.CODICE_FISC NOT IN
(SELECT I.CODICE_FISC
FROM INTERVENTI I
WHERE I.CODICE_FISC IS NOT NULL)
▪ Con la prima condizione della where ho preso le persone che sono state ricoverate, quindi il cui
codice fiscale si torva sia nella tabella generale sia nella tabella ricoveri
▪ messa dopo l’and
Con la seconda condizione della where prendo i pazienti che non hanno mai
subito un intervento, quindi il cui codice fiscale non si trova nella tabella interventi
▪ Meglio mettere anche la distinct perché una persona può essere ricoverata tante volte
▪ Attenzione: se ho la not in devo aggiungere la condizione where codice_fisc is non null
2. Per la domanda 2 voglio i pazienti che hanno subito un ricovero e dentro a quel ricovero non
hanno subito l’intervento: devo quindi escludere i pazienti la cui data dell’intervento, presente
nella tabella interventi, si trova tra la data di ingresso e la data di uscita, presenti invece nella
tabella ricoveri
SELECT G.CODICE_FISC, G.NOME, G.COGNOME, R.DATA_INGRESSO AS
RICOVERO_SENZA_INTERVENTO
FROM GENERALE G, RICOVERI R
WHERE G.CODICE_FISC = R.CODICE_FISC AND G.CODICE_FISC NOT IN
(SELECT I.CODICE_FISC
FROM INTERVENTI I
WHERE I.DATA_INTERVENTO BETWEEN R.DATA_INGRESSO AND R.DATA_USCITA)
▪ La subquery in questo caso è una subquery correlata perché usa attributi definiti nella query
principale
▪ Dato che nella query principale ho definito la tabella ricoveri con l’alias R i suoi attributi li ho
potuti usare anche nella subquery
• Esempio: trovare i pazienti che durante le vis