Estratto del documento

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 “

Anteprima
Vedrai una selezione di 7 pagine su 30
Appunti ed esercizi SQL Pag. 1 Appunti ed esercizi SQL Pag. 2
Anteprima di 7 pagg. su 30.
Scarica il documento per vederlo tutto.
Appunti ed esercizi SQL Pag. 6
Anteprima di 7 pagg. su 30.
Scarica il documento per vederlo tutto.
Appunti ed esercizi SQL Pag. 11
Anteprima di 7 pagg. su 30.
Scarica il documento per vederlo tutto.
Appunti ed esercizi SQL Pag. 16
Anteprima di 7 pagg. su 30.
Scarica il documento per vederlo tutto.
Appunti ed esercizi SQL Pag. 21
Anteprima di 7 pagg. su 30.
Scarica il documento per vederlo tutto.
Appunti ed esercizi SQL Pag. 26
1 su 30
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher giovanniserravezza di informazioni apprese con la frequenza delle lezioni di Sistemi informativi sanitari e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Pavia o del prof Quaglini Silvana.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community