|
°°°SQL E SQL INJECTION°°°
[SQL]
Il
linguaggio SQL (Structured
Query Language)
è un linguaggio di tipo non procedurale che
consente di operare sui dati di un database tramite frasi che non fanno uso
di simboli matematici ed algebrici, ma solo di parole chiave prese dal
linguaggio corrente; questo, insieme alla sintassi che riprende forme
usuali, fa sì che le frasi abbiano una struttura lineare ed espressiva. In
particolare il termine Structured (strutturato) di SQL è riferito al fatto
che si può inserire un'interrogazione all'interno di un'altra
interrogazione; più in generale si parla di query innestate.
Per quanto riguarda il
linguaggio per la definizione dei dati si hanno tre istruzioni: CREATE,
ALTER, DROP.
Per quanto riguarda il
linguaggio per la manipolazione dei dati si hanno tre istruzioni: INSERT,
UPDATE, DELETE.
Per quanto riguarda il
linguaggio il controllo dei dati si hanno tre istruzioni: GRANT, REVOKE.
Per quanto riguarda i
vincoli di integrità generici abbiamo il CHECK.
L'istruzione SELECT serve per estrarre informazioni dal database.
La sua sintassi è la seguente:
SELECT [ ALL | DISTINCT ] colonne (*)
FROM tabelle
[ WHERE condizioni ]
[ GROUP BY lista_attributi ]
[ HAVING condizioni ]
[ ORDER BY lista_attributi ]
ALL
significa che vengono
restituite tutte le tuple ottenute dall'interrogazione; in genere, ALL è di
default cioè viene sottointeso a meno che non si usano condizioni where.
DISTINCT
significa che restituisce solo le tuple che sono uniche nel risultato, cioè
produce una "relazione" e non solamente una "tabella".
L'istruzione
DROP TABLE serve per cancellare una tabella esistente. L'istruzione è
DROP TABLE nome_tabella
L'istruzione DROP INDEX serve per cancellare un indice su una
tabella. L'istruzione è:
DROP INDEX nome_indice
L'istruzione DROP VIEW serve per cancellare una vista esistente.
L'istruzione è:
DROP VIEW nome_view
L'istruzione
DROP DATABASE serve per cancellare tutto il database.
Esempio del check
create table Impiegato (
Matricola
character(6)
primary key,
Cognome
character(20),
Sesso char
not null
check (Sesso in (‘M’,‘F’)),
Stipendio integer,
Superiore character(6),
check (Stipendio <= (select
Stipendio from Impiegato J where Superiore = J.Matricola)
)
Check
Check viene seguito da una
condizione, che puo’ essere espressa come se si
trattasse di una clausola where. Check e’ piu’ potente degli
altri costrutti per specificare vincoli di SQL.
GROUP
BY
L'operatore GROUP BY serve a raggruppare i risultati di una SELECT in
base al campo specificato dopo il BY. Un uso speciale dell’istruzione
GROUP BY è di associare una funzione di aggregazione (nella fattispecie
COUNT; conta il numero di righe in ciascun gruppo) con dei gruppi di righe.
SELECT
<campo><funzione
stat.>FROM <tabelle>[WHERE
<condizione>]GROUP BY <campo>
dove <campo> deve essere lo stesso nella
SELECT e nel GROUP BY.
SELECT
Luogo,COUNT(*) FROM Fotografie GROUP BY Luogo
|
Luogo |
COUNT(*) |
|
Venezia |
3 |
|
Bassano d.Grappa |
1 |
|
Roma |
2 |
WHERE E HAVING
Le clausole WHERE e HAVING di un'istruzione
SELECT consentono di specificare le righe delle tabelle di origine con cui
generare il set di risultati. Le clausole WHERE e HAVING sono filtri che
specificano una serie di condizioni di ricerca. Solo le righe che soddisfano
tali condizioni verranno incluse nel set di risultati. Tali righe sono
definite qualificate per partecipare al set di risultati. La clausola WHERE
nell'istruzione SELECT seguente consente, ad esempio, di restringere le
righe solo a una zona di vendita specifica:
SELECT * FROM <TABELLA> WHERE
TABELLA.NOME = “LUCA”
La clausola HAVING è generalmente utilizzata
insieme alla clausola GROUP BY per filtrare i risultati di valori aggregati.
È tuttavia possibile specificare la clausola HAVING senza la clausola GROUP
BY. La clausola HAVING specifica ulteriori filtri che vengono applicati
successivamente ai filtri specificati dalla clausola WHERE. Questi filtri
possono essere applicati a una funzione di aggregazione utilizzata
nell'elenco SELECT.
Like
“utile come motore di ricerca”
Like permette di ricercare nei
records parole, numeri o parti di essi (iniziali, centrali e finali). La
sintassi è leggermente diversa, ma molto semplice:
SELECT nome FROM anagrafici WHERE nome LIKE 'm'
In questo caso
vengono dati come risultati tutti i dati, che sono presenti nella colonna
nome e che iniziano per M. Per cercare invece nomi che finiscono per M si
utilizza la seguente query:
SELECT nome FROM anagrafici WHERE nome LIKE '%m'
Infine per cercare nomi che
finiscono, iniziano o che contengono la M, si utilizza la seguente query:
SELECT nome FROM anagrafici WHERE nome
LIKE '%m%'
USO UPDATE
Come gia detto la funzione update serve per aggiornare i dati
in una determinata tabella, adesso vediamo le sintassi:
1) UPDATE alunni SET cognome='COGb0' where
cognome like '%2%'
2) UPDATE alunni SET cognome= replace(cognome,'2','B')
Nel 1
caso aggiorniamo la tabella alunni e settiamo tutti i record di cognome a
COGb0 dove solo è presente precedentemente all’aggiornamento il carattere 2.
Nel caso
2 aggiorniamo facendo una sostituzione dove è possibile ovvero per ogni
record di alunni si controlla se nel campo cognome vi è il 2 contenuto se
vero verrà sostituito con B.
Operatori di aggregazione
SELECT
AVG(V.età) FROM Velisti V WHERE V.esperienza=10
SELECT
COUNT(*) FROM Velisti V
SELECT
AVG(DISTINCT V.età) FROM Velisti V WHERE V.esperienza = 10
SELECT
V.vnome FROM Velisti V WHERE V.esperienza =
(SELECT
MAX(V2.esperienza) FROM Velisti V2)
SELECT COUNT
(DISTINCT V.esperienza) FROM Velisti V WHERE V.vnome = ‘Bob’ |