SQL
STRUCTURE QUERY LANGUAGE
SINTASSI DI SQL - Structure
Query Language
Come già detto é il
linguaggio che viene usato per ricercare o modificare i dati in un
database. Essendo uno standard é usato praticamente da tutti i
database anche se ognuno ha qualche funzionalità in più
o varia la sintassi di qualche comando. Vedremo le principali e
più diffuse istruzioni.
Lettura |
- select {colonne}
- from {tabelle}
- where {condizioni di ricerca}
- group
by {raggruppamento per colonne}
- having {condizioni}
- order
by {colonne}
|
La select é
listruzione di lettura dal database; é seguita da un o
più nomi di colonne delle tabelle separati da virgole. Nella from vanno inseriti i nomi delle tabelle da usare,
sempre separati da virgole. La where contiene delle
istruzioni di ricerca . Group by permette di
raggruppare i dati per le colonne indicate per evitare la ripetizione
di righe uguali mentre order by ordina i dati in
modo crescente o decrescente secondo le colonne. Ecco alcuni
esempi:
select nome, cognome from clienti |
estrai
nome e cognome di tutti i clienti |
select nome, cognome from clienti where cognome >=
'R' |
estrai
nome e cognome di tutti i clienti il cui cognome é
maggiore o uguale a 'R' |
select nome, cognome from clienti where codice >
100 and codice < 200 |
estrai
nome e cognome di tutti i clienti il cui codice é
maggiore di 100 e minore di 200 |
select * from clienti order by codice |
estrai
tutti i dati di tutti i clienti ordinati per codice |
lasterisco significa tutte le
colonne della tabella Nelle colonne della select possono comparire
anche delle funzioni come ad esempio:
count(*) |
conta il
numero di righe |
sum(nomeColonna) |
somma i
valori della colonna indicata tra parentesi |
Vediamo qualche
esempio
select count(*) from clienti |
estrai il
numero di colonne presenti in clienti |
select nome,count(*) from clienti group by nome |
estrai il
nome dei clienti e per ognuno quante volte é presente
nella tabella. |
La group by qui ha leffetto di
far raggruppare i nomi uguali
- select codiceCliente,sum(valore) from ordini
restituisce il valore degli ordini
fatti da tutti i clienti In una select possono comparire anche delle
colonne che sono derivate da altre, come ad esempio il valore di una
riga dordine é dato dalla moltiplicazione tra
quantità e prezzo. Oppure rappresenta lunione tra 2 o
più colonne stringa come lunione tra nom e e
cognome.
select prezzo * quantita from ordini |
valore
riga ordine |
select nome + cognome from clienti |
unione di
nome e cognome |
Le istruzioni che possono comparire
nella where sono: confronto tra 2 colonne o tra
colonna e una costante, con i simboli di maggiore, minore uguale, con
uso di and, or e not come in visual basic. Esempio:
a >
b |
a maggior
di b |
quantita
<= 10 |
quantita
minore uguale 10 |
quantita
> 10 and quantita < 15 |
quantita
maggiore 10 e minore di 15 |
b = 8 or b
= 17 |
b uguale a
8 o b uguale 17 |
c >
'as' and not (b = 17) |
c maggiore
di 'as' e b non uguale a 17 |
Lespressione: quantita >= 10
and quantita <= 15 si può scrivere anche come quantita between 10 and 15 Lespressione: b = 8 or b =
17 or b = 25 si può scrivere meglio come:
b in (8,17,25)
Listruzione like permette di ricerca un valore allinizio, alla fine o
contenuto nella colonna. Esempio:
nome like
'b%' |
nome che
comincia per b |
nome like
'%b' |
nome che
finisce per b |
nome like
'%b%' |
nome che
contiene una b La parola |
null assume un ruolo
particolare in sql; oltre ad indicare un valore nullo richiede una
sintassi tutta sua, con luso della parola is.
Esempio:
nome is
null |
nome
uguale a null |
cognome
not is null |
cognome
non uguale a null L'istruzione |
exists permette di
inserire una condizione di ricerca basata sul risultato di
unaltra select. Esempio:
- select nome from clienti
- where exists (select * from ordini where ordini.codice = clienti.codice)
significa estrai tutti nomi dalla
tabella clienti per i quali il codice cliente é uguale allo
stesso nella tabella ordini; in pratica estrae tutti nomi dei clienti
che hanno ordini. Le parentesi dopo la exists stanno a significare
che si attende un risult ato dalla select di vero o falso, di
esistenza di almeno un valore che soddisfa la select racchiusa) La group by serve per raggruppare il risultato di una
select nelle colonne indicate: Esempio:
- select codiceprodotto from ordini group by codiceprodotto
significa lestrazione di tutti
i codici prodotto che sono stati ordinati. Se avessi scritto
- select codiceprodotto from ordini
avrei avuto la stessa cosa ma anche
la duplicazione dei codice prodotto; in pratica se un prodotto fosse
stato ordinato 20 volte, sarebbe comparso 20 volte invece di una sola
volta usando il group by . La having serve per
compiere operazioni di selezione su raggruppamenti. Esempio:
- select codiceprodotto,sum(quantita)
- from ordini group by ordini having sum(quantita) > 25
estrae tutti i codici prodotto e
quantità totale dagli ordini quando il totale quantità
supera 25, estrae cioé tutti quei prodotti che sono stati
ordinati più di 25 volte. Non si può fare la selezione
nella where perché i test sono fatti per ogni riga, men tre
nella having i test sono fatti al livello di raggruppamento stabilito
nella group by. Order by ordina i dati di uscita per
le colonne indicate: é possibile sostituire il nome di colonna
con un numero che corrisponde alla posizione di una colonna nella
select ottenendo la possibilità di ordinare anche per colonne
che derivano da altre colonne o son o il risultato di funzioni o
operazioni. Esempio:
- select codiceprodotto,sum(quantita) from ordini order by 2
codice prodotto e quantita totali
degli ordini sono ordinate per quantità totali: in pratica
é lelenco dei prodotti più ordinati. Le
istruzioni asc e desc poste dopo
ogni colonna della order by, indicano se lordinamento va fatto
in modo crescente o decrescente. Nella from quando
compaiono più tabelle entra in gioco la join,
ovvero loperazione che mette in relazione più tabelle
tra loro. La sintassi che si usa varia da database a database, tutti
però alla fine si riconducono agli stessi modelli di join che
sono le inner join e le outer join.
Supponiamo di volere la lista con nome e cognome dei clienti che
hanno fatto ordini. Dal momento che la tabella ordini non ha ne
nome ne cognome dei clienti ma solo il codice cliente,
dovrò estarre tutti gli ordini e per ognuno di questi vedere
se il codice cliente é presente nella tabella clienti: se
é presente stampo nome e cognome. Questo é un esempio
di inner join: in lista mi compariranno quei clienti che sono
presenti sia nella tabella clienti sia negli ordini. La sintassi sql
potrebbe essere questa:
- select clienti.nome,clienti.cognome from clienti,ordini
- where clienti.codice = ordine.codice
Se invece volessi la lista dei
clienti con nome, cognome e valore totale degli ordini fatti, potrei
usare la sintassi di prima aggiungendo la colonna valore:
- select clienti.nome,clienti.cognome,sum(ordini.valore)
- from clienti,ordini
- where clienti.codice = ordine.codice
- group by clienti.nome,clienti.cognome
ma così non comparirebbero i
clienti che non hanno fatto ordini (la group by serve evitare che un
cliente compaia più volte se ha fatto più ordini);
questa sintassi risolve il problema:
- select clienti.nome,clienti.cognome,sum(ordini.valore)
- from clienti,ordini
- where clienti.codice *= ordine.codice
- group by clienti.nome,clienti.cognome
dove lunica differenza sta
nellasterisco posto prima delluguale e sta ad indicare
che verranno estratti comunque tutti i clienti anche se non presenti
negli ordini. Questa é un outer join che consiste quindi
nellestrarre sempre tutte le righe di una de lle 2 tabelle
messe in join, aggiungendo i valori della seconda tabella quando
presenti. La sintassi nelle join varia a seconda del database.
Inserimento
Per inserire una nuova riga in una
tabella si usa listruzione insert.
- INSERT into nomeTabella (elenco colonne) VALUE (valori colonne)
Le colonne da inserire sono quelle
della tabella, possono essere in qualsiasi ordine e non é
necessario inserirle tutte, salvo che nella definizione della tabella
una colonna non sia stata indicata come necessaria. I valori delle
colonne devono essere inse riti nelle stesso ordine delle colonne,
possono essere anche risultati di operazioni tra costanti o tra
colonne della stessa tabella. Di Insert esistono numerose altre
varianti con le quali é possibile inserire una riga leggendo i
valori da unaltra tabell a, o da unaltra tabella con
laggiunta o la modifica di valori e colonne: purtroppo tali
varianti dipendono dal tipo di database usato. Esempio:
- insert into clienti (nome,cognome,indirizzo)
- value (mario,rossi,via roma 43)
inserisce nei cliente una riga con
nome = mario, cognome = rossi, indirizzo =
via roma 43.
Modifica
Per la modifica si usa update
- update nomeTabella
- SET nomecolonna = valore colonna
- , nomecolonna =
valore colonna,,,,
- where condizioni
NomeTabella é il nome della
tabella da modificare; dopo listruzione set vanno indicate le
colonne da modificare con i relativi valori che possono essere
costanti, risultati di operazioni tra costanti o tra altre colonne o
addirittura risultati di select d i ricerca. Si possono usare delle
condizioni come nella where della select per parzializzare la
modifica a certe righe della tabella. Esempio:
- update ordini set quantita = 0 where codicecliente = 256
mette quantita zero nelle righe
ordine del cliente 256
Cancellazione
Per cancellare una o più righe
si usa delete
- delete nometabella where condizioni
dalla sintassi molto semplice
perché richiede solo il nome della tabella é
opzionalmente delle condizioni di ricerca uguali a quelle della
select. Esempio:
- delete ordini where quantita = 0
cancella tutti gli ordini con
quantità uguale a zero
DataRegion
|