SQL
E’ importante capire che il risultato di una query, pur essendo visualizzato come una tabella, NON è
fisicamente memorizzato nel DB. Chiusa la query, il risultato scompare. La tabella che si ottiene da una query
è chiamata VISTA.
La query può essere salvata, ma quando si salva una query non viene salvato il suo risultato, bensì la sua
formulazione in SQL. Ogni volta che la query verrà richiamata, agirà sulle tabelle a cui si riferisce. Pertanto,
se i dati nelle tabelle cambiano, anche il risultato delle query cambierà.
CREATE TABLE : creazione di tabelle
Esempi: CREATE TABLE REPARTI(CODICE INTEGER PRIMARY KEY, NOME CHAR(20), COSTO_GIORNO INTEGER,
NIM_LETTI INTEGER NOT NULL)
INTEGER = numero intero
CHAR = stringa di caratteri, in questo caso 20
PRIMARY KEY = imposti codice come chiave primaria
NOT NULL = quell’attributo non può essere vuoto o nullo
Se la chiave è formata da più attributi, posso prima mettere tutti gli attributi e poi alla fine scrivere
con all’interno la lista di attributi che fanno della chiave primaria
primary key(…),
CREATE TABLE VISITE (ID_VISITA INTEGER, …, DATA DATE)
DATE = per creare una dato di tipo data (giorno/mese/anno ora-minuti-secondi)
INSERT INTO … VALUES : inserire i valori degli attributi all’interno di una tabella
Questa istruzione permettere di inserire una riga per volta.
Esempi: INSERT INTO GENERALE VALUES(“SRRGNN…”, ”SERRAVEZZA”, ”GIOVANNI”, …, #14-08-1999#)
= inserimento stringhe
“…” = inserimento date
#...#
Se voglio solamente alcuni valori in una tabella posso scrivere:
INSERT INTO GENERALE(CODICE_FISCALE, COGNOME) VALUES(“SRRGNN…”, ”SERRAVEZZA”)
DROP TABLE = cancella la tabella sia come struttura che come dati;
T
DELETE * FROM T = cancella solo i dati (rimangono A,B e C);
= corrisponde a tutti gli attributi
‘*’
SELECT : E’ l’istruzione SQL che serve ad estrarre i dati da una o più tabelle.
SELECT * FROM nome_tabella = rilascia tutti gli attributi con tutte le loro righe di quella tabella
(forma semplice);
Esempi:
In una SELECT posso mettere una lista di attributi:
SELECT CODICE_FISC,NOME,COGNOME FROM GENERALE
Si possono anche effettuare ‘operazioni’:
SELECT CODICE_FISC, PESO/(ALTEZZA*ALTEZZA), DATA FROM VISITE: il secondo attributo non è altro
che il calcolo del BMI che viene calcolato in quel modo.
CODICE_FISC EXPR0025 DATA
(nome di default)
Dato che alla nuova colonna viene dato un nome di default , se vogliamo dare un nome a quell’attributo
aggiungiamo ‘AS BMI’ dopo la formula:
SELECT CODICE_FISC, PESO/(ALTEZZA*ALTEZZA) AS BMI, DATA FROM VISITE
CODICE_FISC BMI DATA
PESO>80 AS PESANTE, FROM VISITE : oltre ai dati richiesti ci fa vedere
SELECT CODICE_FISC, DATA,
l’espressione logica true o false. CODICE_FISC DATA PESANTE
CF1 01-01-2000 -1 (TRUE)
CF2 01-01-2001 0 (FALSE)
OR = somma logica;
AND = prodotto logico;
AND precedenza su OR!!!
Esempi ( ESPRESSIONI LOGICHE)
A=5; B=-1; C=”OCA”; D=”ASINO”;
B/A <= -0.1 OR ( C > D AND B > A-2 ) OR D < “UPUPA” -1 OR -1 AND 0 OR -1 -1 OR 0 OR -1
-1 (TRUE)
WHERE
SELECT LISTA FROM TABELLA WHERE ‘condizione logica’ : ci fa vedere solo le righe di lista in cui è
verificata la condizione logica indicata.
Se A > 1 abbiamo
A B A B
1 -1 2 4
2 3 4 10
4 10
SELECT CODICE_FISC, NOME, COGNOME FROM GENERALE WHERE CITTA = “PAVIA” : mi fornisce
tutte le persone di Pavia.
SELECT CODICE_FISC, NOME, COGNOME FROM GENERALE WHERE CITTA = “PAVIA” AND SESSO = “F”
AND MORTE IS NOT NULL : trova tutte le donne di Pavia che sono morte.
IS NULL : espressione logica che indica un valore nullo;
IS NOT NULL : espressione logica che indica un valore non nullo;
DATE() = fornisce la data odierna, quindi viene utilizzata per trovare l’età delle persone;
Esempio :
SELECT CODICE_FISC, DATE() – NASCITA AS ETA FROM GENERALE : ci fornisce l’età in giorni, mentre
INT
dividendo per 365.25 ci viene fornita in anni. Se aggiungiamo davanti all’espressione e scriviamo
cioè INT((DATE() – NASCITA)/365.25) ci viene fornita solo la parte intera del risultato e quindi gli anni
compiuti;
Esercizi :
Trovare la durata in mesi delle degenze che superano i 60 gg.
SELECT ID_RICOVERO, (DATA_USCITA – DATA_INGRESSO)/30.4 AS MESI_DEGENZA
FROM RICOVERI
WHERE (DATA_USCITA – DATA_INGRESSO) > 60 (AND DATA_USCITA IS NOT NULL);
Non vengono considerate automaticamente le righe in cui DATA_USCITA non è presente.
Ora consideriamo anche i ricoveri in corso:
SELECT ID_RICOVERO, (DATA_USCITA – DATA_INGRESSO)/30.4 AS MESI
DEGENZA_RICOVERICONCLUSI, (DATE() – DATA_INGRESSO)/30.4 AS
MESI_DEGENZA_RICOVERIINCORSO, DATA_USCITA
FROM RICOVERI
WHERE (DATA_USCITA – DATA_INGRESSO) > 60 AND DATA_USCITA IS NOT NULL OR
(DATE() – DATA_INGRESSO) > 60 AND DATA_USCITA IS NULL
RICOVERI
ID_RICOVERO DATA_INGRESSO DATA_USCITA
1 03-05-2017 10-08-2017
2 01-03-2018 05-06-2018
3 11-07-2019 ---------------
RISULTATO
ID_RICOVERO MESI_DEGENZA_RICCONCLUSI MESI_DEGENZA_RICINCORSO DATA_USCITA
1 3.5 28 10-08-2017
2 3.1 20 05-06-2018
3 ---- 4 ---------------
La colonna MESI_DEGENZA_RICINCORSO non ha senso per i ricoveri terminati.
UNION (IF) : C’è la possibilità di eseguire un’unica istruzione che contiene diverse SELECT facendo in
modo che i risultati delle diverse SELECT vengano accodati. Tale possibilità è data dalla UNION.
Per poter funzionare, la UNION deve unire SELECT che producono lo stesso numero di attributi, e tali attributi
ALIAS
devono avere tutti la stessa struttura o tipo. Gli eventuali vengono forniti nella prima SELECT. Se si
mettono degli ALIAS anche nelle altre SELECT, essi vengono ignorati
SELECT ID_RICOVERO, (DATA_USCITA – DATA_INGRESSO)/30.4 AS MESI DEGENZA, “CHIUSO” AS TIPO
FROM RICOVERI
WHERE (DATA_USCITA – DATA_INGRESSO) > 60 AND DATA_USCITA IS NOT NULL
UNION
SELECT ID_RICOVERO, (DATE() – DATA_INGRESSO)/30.4, “APERTO” (i nomi degli attributi li mettiamo solo
nella prima SELECT)
FROM RICOVERI
WHERE DATA_USCITA IS NULL AND (DATE()-DATA_INGRESSO) > 60
Non possiamo scrivere:
SELECT CODICE_FISC, NOME, COGNOME
FROM GENERALE
WHERE NASCITA < #01-01-1950#
UNION
SELECT CODICE_FISC, NOME
FROM GENERALE
WHERE NASCITA >= #01-01-1950#
In questo caso vengono accodate due tabelle, una con tre colonne e una con due, quindi il nostro database
ci dà errore. ORDER BY
Le SELECT che si uniscono possono essere più di due. Per ordinare il risultato di una UNION, la si
mette alla fine, dopo l’ultima SELECT, e deve fare riferimento ai soli campi della prima query. Non è possibile
fare ordinamenti diversi nelle diverse SELECT, perché il risultato prodotto dalle UNION è l’insieme unione dei
vari insiemi prodotti da ciascuna SELECT, e in quanto insieme unico risultante, può subire un unico
ordinamento.
Le SELECT possono riferirsi a tabelle diverse, basta che gli attributi in uscita siano dello stesso numero e dello
stesso tipo.
UPDATE … SET
UPDATE nome_tabella SET nome_attributi1 = valore1, nome_attributo2 = valore2
Se li voglio aggiungere solo su alcune righe uso la WHERE condizione
Esempio :
UPDATE REPARTI SET COSTO_GIORNO = COSTO_GIORNO + 50 : tutti i costo_giorno dovrebbero esseri
aggiornati di 50 euro, dato che non ho messo nessuna where.
Es. Tutti i costi giornalieri vanno aumentati del 10%:
UPDATE REPARTI SET COSTO_GIORNO = COSTO_GIORNO * 0,1
UPDATE GENERALE SET COGNOME="ROSSINI" WHERE="PAOLO" AND COGNOME="ROSSI" :
in questo caso nelle where non è conveniente mettere i dati anagrafici ma è preferibile inserire il codice
fiscale in quanto possono esserci diverse persone omonime.
ORDER BY (attributo o lista di attributi separati da virgola ) [ASC/DESC]
Messa alla fine della query, ordina il risultato in senso crescente (ASC) o decrescente (DESC). Il default è il
senso crescente (quindi ASC si può anche non mettere). Inoltre nella lista di attributi non bisogna
necessariamente mettere tutti gli attributi inseriti nella SELECT.
SELECT CODICE_FISC, NOME, COGNOME FROM GENERALE : ordina automaticamente per codice
fiscale. Se aggiungiamo ORDER BY COGNOME, NOME ordina prima in base al cognome e poi in base
al nome.
ORDER BY COGNOME DESC, NOME ASC: ordina prima per cognome in ordine decrescente e per nome
messi in ordine crescente/ascendente;
All’interno di SELECT si possono mettere anche delle costanti:
SELECT 5 FROM GENERALE : ti fa vedere una colonna di tutti 5 della lunghezza degli elementi presenti
in GENERALE;
SELECT 5,”PIPPO” FROM GENERALE : ti fa vedere due colonne, una di 5 e una con scritto “PIPPO”,
con tante righe quante sono quelle presenti in GENERALE;
DISTINCT (UNIQUE-MALAB) : messa appena dopo la parola SELECT , elimina i “doppioni” nel
risultato. Ovvero, se nel risultato ci fossero più righe identiche, esse vengono “collassate” in una sola
riga. SELECT DISTINCT PESO FROM VISITE: elimina le righe uguali riferite alla colonna PESO, cioè ci dà come
risultato tutti i pesi delle visite prese una sola volta.
65 65
80 80
65 70
70 71
71
SELECT DISTINCT PESO, ALTEZZA FROM VISITE : elimina solo le righe che hanno lo stesso peso e la
stessa altezza, in quanto se abbiamo due righe con lo stesso peso ma con altezza diversa, le righe
sono diverse.
Esercizi :
1. Selezionare le visite in cui si è vista ipertensione in persone che pesano più di 90 Kg.
IPERTENSIONE : pressione sistolica > 140 mmHg oppure pressione diastolica > 90 mmHg
SELECT *(tutti gli attributi)
FROM VISITE
WHERE (P_SISTOLICA > 140 OR P_DIASTOLICA > 90) AND PESO > 90
2. Selezionare i maschi giovani e le femmine anziane provenienti da Milano.
GIOVANI : persone con età <= 60
SELECT *
FROM GENERALE
WHERE ((DATE() – NASCITA)/365.25 <= 60 AND UCASE(SESSO) = “M”
OR (DATE() – NASCITA)/365.25 > 60 AND UCASE(SESSO) = “F”)
AND CITTA=”MILANO”
STR : trasforma un numero in stringa
SELECT NOME + “ “ + COGNOME + “ “ + INT((DATE() – NASCITA)/365.25) + “ANNI” AS IDENTITA
FROM GENERALE :
il database ci dà un errore perché in questo caso concateniamo delle stringhe con dei numeri; per fare ciò
dobbiamo usare proprio la funzione STR e diventa:
SELECT NOME + “ “ + COGNOME + “ “ + STR(INT((DATE() – NASCITA)/365.25)) + “ANNI” AS IDENTITA
FROM GENERALE IDENTITA
MARIO VERDI 23 ANNI
MARCO ROSSI 21 ANNI
GIANNI SERRA 20 ANNI
VAL : trasforma una stringa di testo in numero
“53” 53
“__53” 53
“00053” 53
“AB8” 0
SELECT CODICE , VAL(CODICE) FROM FARMACI Che differenza c’è fra i valori estratti?
CODICE, pur apparendo a prima vista come un numero, è un attributo di tipo testo, quindi nella vista di
ACCESS viene allineato a sinistra. Inoltre si notano alcuni codici con degli “0” iniziali oppure con degli “ “
(spazi) iniziali, cosa che non può succedere nei numeri.
VAL(CODICE) converte il testo in numero, quindi apparirà allineato a sinistra e senza caratteri “non
significativi” iniziali, quindi senza “0” e senza “
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.