SlideShare uma empresa Scribd logo
1 de 228
TREYresearch
Programmatore: Barbieri Andrea
Cell: 3296664935
Email: btftraduzioniseoweb@gmail.com
Pagina Linkedin
https://www.linkedin.com/in/andrea-barbieri/
Sito web:
https://btftraduzioniseoweb.altervista.org
Programmatore, web designer, traduttore.
1
GuidaSQL:lebasi
TREYresearch
Lanostramissione
Imparare le basi del linguaggio SQL
3
QuestafotodiAutoresconosciutoè
concessoinlicenzadaCCBY-NC-ND
TREYresearch
Checos’è
SQL?
TREYresearch
5
SQL appartiene alla famiglia dei linguaggi di gestione dei
database. Ed è il linguaggio più utilizzato e diffuso nel
mondo.
TREYresearch
Checosaèun
database?
E’ un archivio di dati
strutturati che consente in
modo pratico di gestire i
dati al suo interno. Tutto ciò
consente l’aggiornamento
delle informazioni (inserire
nuovi dati, cancellare dati
oppure cercare dati).
6
TREYresearch
7
Abbiamo detto che SQL è un linguaggio. Ma cosa
s’intende per linguaggio ?
In informatica un linguaggio è composto da un insieme finito
di simboli.
TREYresearch
8
Conosciamo meglio SQL
SQL, la cui pronuncia è Sequel, rappresenta l’acronimo
Structured Query Language. SQL è un linguaggio di
programmazione per database.
TREYresearch
AbbiamodettocheSQLèun
linguaggiodi
programmazione.
Ma cos’è un linguaggio di
programmazione ?
9
Questa foto di Autore sconosciuto è concesso in licenza da CC BY
TREYresearch
10
Un linguaggio di programmazione è composto da un serie di
istruzioni che restituiscono un output all’utente.
TREYresearch
11
SQL è un linguaggio usato per creare:
• trasformare e recuperare informazioni in un RDBMS
(Relational Database Management System). Più
semplicemente definito come Sistema per la Gestione dei
Database Relazionali.
TREYresearch
12
Esempio di una Tabella in RDBMS
TREYresearch
13
I requisiti minimi per il sistema RDBMS sono:
- deve presentare i dati all'utente sotto forma di relazioni (una
presentazione a tabelle può soddisfare questa proprietà)
- deve fornire operatori relazionali per manipolare i dati in
forma tabellare.
TREYresearch
14
Il sistema RDBMS è stato sviluppato negli anni 70
dall’informatico Edgar F. Cood. Ed ha definito il modello
matematico. Il sistema viene gestito grazie ad applicazioni
come SQL Server Express.
TREYresearch
Cosasipuòfarecon
questolinguaggiodi
programmazione?
1
5
TREYresearch
16
Il linguaggio di programmazione SQL consente:
• creare e modificare schemi di database;
• Inserire, modificare e gestire i dati memorizzati;
• Interrogare i dati memorizzati;
• creare e gestire strumenti di controllo;
• e accesso a tutti i dati sopra citati;
Che cosa abbiamo capito fin qui ?
SQL non è solamente un query language, ma ha anche
funzioni di gestione e controllo di database tipiche di
altri linguaggi di programmazione
TREYresearch
17
La query language è un linguaggio d’interrogazione per
implementare query (ricerche) sul database da parte degli
utenti. Ha lo scopo di rendere possibile l’estrazione di
informazioni dal database, attraverso il RDBMS, interrogando
la base dati. Ed interfacciandosi con l’utente e le sue richieste.
Questa foto di Autore sconosciuto è concesso in
TREYresearch
SQL:lastoria1
SQL nasce nel 1974. Presso i
laboratori della IBM negli Stati
Uniti. Ad opera di Donald
Chamberlin. All’inizio doveva
servire per gestire i database
relazionali. E per sostituire
l’ormai obsoleto SEQUEL.
18
TREYresearch
SQL:lastoria2
Ci vollero degli anni, affinché
questo linguaggio di
programmazione per database
risultasse completo. Solo nel
1986 venne adottato come
standard dall’ANSI.
19
TREYresearch
SQL:lastoria3
Nel 1987 anche l’International
Standardization Organization
lo adottò come sandard. Da
questo momento SQL divenne
ufficialmente il linguaggio
predefinito per i sistemi di
gestione di database
relazionali RDBSM. 20
TREYresearch
SQL:lastoria4
In circa 30 anni di vita, SQL ha
avuto molti aggiornamenti e
migliorie. Che gli hanno
consentito di rimanere sempre
al passo con le nuove
tecnologie.
21
TREYresearch
SQL:RBDSM1
RDBSM è l’acronimo Relational
Database Management
System. E per comprendere
ogni aspetto di SQL è
necessario capire cosa sono.
22
TREYresearch
SQL:RBDSM1
In un sistema razionale, tutti i
dati sono rappresentati come
relazioni e manipolati con gli
operatori dell’algebra
relazionale.
Che cosa è un database
relazionale ?
23
TREYresearch
SQL:RBDSM2
Un database relazionale è un
insieme di relazioni che
contengono dei valori.
E il risultato di ogni
interrogazione posta al
database stesso è a sua volta
una relazione.
24
TREYresearch
SQL:RBDSM3
Quindi, RBDSM è un sistema di
gestione di basi di dati
(database). Ed il suo
comportamento si fonda sui
principi dell’algebra
relazionale.
25
TREYresearch
SQL:RBDSM4
Grazie alla sua semplicità di uso
questi sistemi si sono diffusi in:
• economia e finanza;
• nella gestione delle risorse.
Andando a sostituire altri
sistemi come quello gerarchico
e reticolare. 26
TREYresearch
27
Che cosa è un database di tipo gerarchico ? 1
Un database gerarchico è un insieme di archivi. Gli archivi sono composti da
record chiamati segmenti. I segmenti sono in rapporto gerarchico tra loro
attraverso legami di tipo padre-figlio.
TREYresearch
28
Che cosa è un database di tipo gerarchico ? 2
La struttura ad albero che caratterizza il modello gerarchico si basa sulla possibilità di
individuare un segmento principale, il padre o la radice, dal quale dipendono n
segmenti figli, che a loro volta si trasformano in padri per altri figli e così via. A questi,
in virtù della totale dipendenza dal padre, è possibile fare riferimento solo attraverso il
passaggio dal nodo principale. Non è possibile dal figlio risalire al padre
TREYresearch
29
Che cosa è un database di tipo gerarchico ? 3
Questa architettura mal si adatta ad una gestione
moderna e dinamica delle basi di dati.
TREYresearch
30
Che cosa è un database di tipo reticolare ? 1
Il modello gerarchico rappresenta una prima soluzione al problema della gestione
di grosse moli di dati ma la sua intrinseca rigidità ne limita la potenzialità; per
questo, nasce il modello reticolare che dotato di maggiore flessibilità, può
adattarsi a situazioni più complesse.
Il modello reticolare può essere visto come un’estensione del modello gerarchico, a
cui sono apportati importanti miglioramenti.
• In una struttura gerarchica un segmento figlio può avere solo un segmento
padre; non è così nel modello reticolare;
• ogni record può avere un numero qualsiasi di record subordinati e di record
precedenti;
• le correlazioni vengono espresse attraverso record particolari, chiamati record
di collegamento (member), che formano delle catene tra le varie parti del
sistema.
TREYresearch
31
Che cosa è un database di tipo reticolare ? 2
Le strutture utilizzate nel modello reticolare sono due, il record (si pensi ai
comuni file) e il set, che permette di correlare i record, per mezzo di catene
di puntatori. Dunque una base di dati reticolare è definita con riferimento ad
uno schema, che contiene tipi record collegati fra loro da tipo set.
TREYresearch
SQL:lecaratteristiche
1
Lo Structured Query Language è un
linguaggio di programmazione
dichiarativo, in cui non è necessario
implementare una serie di
operazioni. Ma è necessario e
sufficiente dichiarare le proprietà
logiche delle informazioni che
s’intende cercare.
32
TREYresearch
33
Che cosa è un linguaggio di programmazione dichiarativo ? 1
I linguaggi dichiarativi (o logici) hanno la caratteristica che le istruzioni
rappresentano delle clausole capaci di definire una relazione che esiste tra i
dati. Ed in modo contestuale tra i dati ed il risultato desiderato. In questo
caso, le esecuzioni non avranno un ordine specifico. Infatti, il compito
dell’elaborazione è affidato ad un interprete e non alla sintassi del
linguaggio.
Un semplice esempio di linguaggio dichiarativo potrebbe essere la seguente
istruzione SQL:
TREYresearch
34
Che cosa è un linguaggio di programmazione dichiarativo ?
2
In pratica, quello dichiarativo è un paradigma attraverso il quale è possibile
“dichiarare” la natura del risultato atteso, non la procedura che un
elaboratore dovrà seguire per ottenerlo, come accade nei linguaggi
imperativi.
TREYresearch
SQL:lecaratteristiche
2 Questo linguaggio consente di
interrogare e gestire i database. Per
mezzo di costrutti di programmazione
denominati query. In questo modo è
possibile leggere, modificare e cancellare i
dati presenti nel database, oltre a
esercitare funzioni gestionali e
amministrative sul sistema di database
stesso.
35
TREYresearch
SQL:lastruttura
Lo SQL si compone di cinque parti
fondamentali:
1. Data Definition Language
2. Data Manipulation Language
3. Data Control Language
4. Query language
5. Device Media Control Language
36
TREYresearch
37
Struttura di SQl
1. Data Definition Language: permette di creare o cancellare
database o modificarne la struttura;
2. Data Manipulation Language: permette di inserire, cancellare e
modificare dati;
3. Data Control Language: permette di gestire gli accessi e i permessi
dei vari utenti del database
4. Query language: permette di interrogare il database;
5. Device Media Control Language: permette di amministrare i supporti
dove vengono salvati i dati.
TREYresearch
Introduzioneallequery
Gli elementi del linguaggio SQL per
la programmazione di un data base.
38
QuestafotodiAutoresconosciutoè
concessoinlicenzadaCCBY-NC-ND
Questa foto di Autore sconosciuto è concesso in licenza da CC BY-SA-NC
TREYresearch
39
Introduzione alle query: Prime elementari regole 1
La sintassi del linguaggio SQL è abbastanza flessibile, sebbene ci siano
delle regole da rispettare come in qualsiasi linguaggio di
programmazione.
SELECT COGNOME, NOME
FROM PRESIDENTE
WHERE COGNOME = ‘Mattarella’
In questo esempio tutti i caratteri, a parte ‘Mattarella', sono scritti in
maiuscolo, ma non deve essere necessariamente così.
TREYresearch
40
Introduzione alle query: Prime elementari regole 2
Avremmo potuto anche scrivere
così:
select cognome, nome
from presidente
where cognome = ‘Mattarella’
Dobbiamo osservare che: ‘Mattarella' è scritto sempre nello stesso
modo.
Note Bene: i riferimenti ai contenuti di un database devono essere scritti
con lo stesso tipo di caratteri
in cui sono stati registrati.
TREYresearch
41
Introduzione alle query: Prime elementari regole 2
Che cosa significa tutto ciò ?
Significa che le istruzioni del linguaggio non sono case
sensitive. Quindi, il linguaggio riconosce le istruzioni con
ogni tipo di scrittura
TREYresearch
42
Introduzione alle query: Prime elementari regole 2
Ogni linguaggio di programmazione ha le sue parole chiavi. Le parole
chiavi determinano l’azione desiderata del programmatore.
Abbiamo usato nel precedente esempio queste parole chiavi per
determinare la query:
• SELECT
• FROM
• WHERE
'cognome' e 'nome' sono dei campi e 'presidente' è una tabella. Quindi il
comando recita: seleziona visualizzandoli, i campi cognome e nome della
tabella presidente la dove cognome = ‘Mattarella'.
TREYresearch
43
Introduzione alle query: Prime elementari regole 3
Istruzione select*. Abbiamo una tabella di tipo Assegni.
Assegno Beneficiari Importo Note
1 Computer Shop 500 euro Stampante
2 Assicurazioni Asso 1000 euro Assicurazione auto
3 SNAM 700 euro Riscaldamento casa
4 Supermarket GS 600 euro Alimentari
5 Scuola 600 euro Scuola di musica
Assegni
TREYresearch
44
Introduzione alle query: Prime elementari regole 3
Usiamo l’istruzione select* from Assegni. E si ottiene questa tabella.
L'asterisco (*) di select * indica al database di fornire tutte le colonne
associate alla tabella specificata dalla clausola FROM.
Assegno Beneficiari Importo Note
1 Computer Shop 500 euro Stampante
2 Assicurazioni Asso 1000 euro Assicurazione auto
3 SNAM 700 euro Riscaldamento casa
4 Supermarket GS 600 euro Alimentari
5 Scuola 600 euro Scuola di musica
TREYresearch
45
Introduzione alle query: Prime elementari regole 5
Selezionare le colonne o cambiare l'ordine di apparizione:
dalla tabella precedente.
Con l’espressione:
select Importo, Assegno from Assegni;
Importo Assegno
500 € 1
1000 € 2
700 € 3
600 € 4
600 € 5
TREYresearch
46
Introduzione alle query: Prime elementari regole 6
Clausola DISTINCT (query senza duplicati): dalla tabella precedente.
Con l’espressione:
select distinct Importo from Assegni;
Esaminando il contenuto del campo importo della tabella di nome
Assegni si hanno due valori uguali. Infatti, 600 € appare due volte. E’
possibile visualizzare questa colonna facendo comparire i risultati
ripetuti una sola volta.
Importo
500 €
1000 €
700 €
600 €
TREYresearch
47
Introduzione alle query: Prime elementari regole 7
Altro esempio. Analizziamo la tabella.
Nome Cognome Materia
Lara Bianco Italiano
Lara Bianco Storia
Mario Guidi Diritto
Mario Guidi Economia
Anna Rossi Matematica
Docenti
TREYresearch
48
Introduzione alle query: Prime elementari regole 8
Con l’espressione: SELECT Nome, Cognome
FROM DOCENTI;
Si ottiene questa tabella:
DOCENTI
Nome Cognome
Lara Bianco
Mario Guidi
Anna Rossi
TREYresearch
Espressionieoperatori
condizionali
Condizioni
Tutte le volte che si vuole trovare un
particolare elemento o gruppo di
elementi in un database, occorre
specificare una o più condizioni. Le
condizioni sono introdotte dalla
clausola WHERE.
49
TREYresearch
50
Prendiamo in esame questa tabella:
Studenti
Nome Cognome Anno Classe Sezione
Mario Bianchi 1976 1 A
Anna Bianco 1973 2 B
Marta Carli 1976 3 A
Gianni Rossi 1972 4 A
Giulio Mancini 1972 5 A
Max Zunini 1976 6 B
Si richiede di estrarre i seguenti dati dalla tabella Studenti:
1. La prima condizione Classe = 5
2. La seconda condizione è Sezione = ‘A’
Qual è il codice sorgente di questa query ? Mostrare anche la nuova tabella.
TREYresearch
51
Prendiamo in esame questa tabella:
Studenti
Nome Cognome Anno Classe Sezione
Mario Bianchi 1976 1 A
Anna Bianco 1973 2 B
Marta Carli 1976 3 A
Gianni Rossi 1972 4 A
Giulio Mancini 1972 5 A
Max Zunini 1976 6 B
SELECT *
FROM Studenti
WHERE Classe = 5
AND Sezione = 'A';
TREYresearch
OperatoriAritmetici
Condizioni
Sono gli operatori
aritmetici: + (somma), -
(sottrazione), /
(divisione), *
(moltiplicazione). 52
TREYresearch
53
Prendiamo in esame questa tabella: operatore somma +
Prezzo
Si richiede di estrarre i seguenti dati dalla tabella Prezzo
aggiungendo a PrezzoIngrosso 150.
Qual è il codice sorgente di questa query ?
Mostrare anche il risultato della tabella.
Elemento PrezzoIngrosso
Pomodori 340
Patate 510
Banane 670
Rape 450
Arance 890
Mele 230
TREYresearch
54
Prendiamo in esame questa tabella: l'operatore + aggiunge
150 lire a ogni prezzo e genera la seguente tabella.
Prezzo
SELECT Elemento, PrezzoIngrosso, PrezzoIngrosso + 150
FROM Prezzo;
Elemento PrezzoIngrosso PrezzoIngrosso+150
Pomodori 340 490
Patate 510 660
Banane 670 820
Rape 450 600
Arance 890 1040
Mele 230 380
TREYresearch
55
Prendiamo in esame questa tabella: operatore sottrazione -
L'operatore meno svolge due funzioni:
1. cambiare il segno a un numero,
2. sottrarre i valori di una colonna da quelli di un'altra colonna.
Vediamo il primo caso:
MinMax
Regione TempMin TempMax
Piemonte -4 10
Toscana 4 13
Sicilia 10 19
Lombardia -2 9
Friuli -3 8
TREYresearch
56
Prendiamo in esame questa tabella: operatore sottrazione -
Si desidera ottenere una tabella dove valori di entrambe le colonne
hanno cambiato di segno. Questa è la tabella che si ottiene:
MinMax
Regione TempMin TempMax
Piemonte 4 -10
Toscana -4 -13
Sicilia -10 -19
Lombardia 2 -9
Friuli 3 -8
Scrivere il codice SQL che effettua quest’operazione.
TREYresearch
57
Prendiamo in esame questa tabella: operatore sottrazione -
MinMax
Regione TempMin TempMax
Piemonte 4 -10
Toscana -4 -13
Sicilia -10 -19
Lombardia 2 -9
Friuli 3 -8
SELECT REGIONE, -TEMPMIN, -TEMPMAX
FROM MINMAX;
TREYresearch
58
Prendiamo in esame questa tabella: operatore sottrazione -
Vediamo il secondo caso: sottrarre i valori di una colonna da quelli di
un'altra colonna. Ecco un’altra tabella:
MinMax
Regione Differenza
Piemonte 14
Toscana 9
Sicilia 9
Lombardia 11
Friuli 11
SELECT REGIONE,
(TEMPMAX - TEMPMIN) Differenza
FROM MINMAX;
TREYresearch
59
Prendiamo in esame questa tabella: operatore divisione /
Prezzo
Elemento PrezzoIngrosso
Pomodori 340
Patate 510
Banane 670
Rape 450
Arance 890
Mele 230
Abbiamo la necessita di vendere a metà prezzo.
TREYresearch
60
Prendiamo in esame questa tabella: operatore divisione /
Prezzo
L’algoritmo che risolve il problema è: (PrezzoIngrosso/2)
Elementi PrezzoIngrosso PrezzoVendita
Pomodori 340 170
Patate 510 255
Banane 670 335
Rape 450 225
Arance 890 445
Mele 230 115
TREYresearch
Operatoridiconfronto
Condizioni
L’operatori di confronto =
confrontano di dati di una tabella
alla ricerca dell’informazione
desiderata dall’utente.
61
TREYresearch
62
L'operatore (=): dalla seguente tabella vogliamo estrapolare tutti i dati dell'amico
Mario
Amici
Nome Cognome Telefono
Giovanni Bruni 0763 546432
Antonio Rossi 06 756499
Mario Rossi 02 435591
Piero Bianchi 06 326799
SELECT *
FROM AMICI
WHERE NOME = 'Mario';
TREYresearch
63
L'operatore (=): dalla seguente tabella vogliamo estrapolare tutti i dati dell'amico
Mario
Amici
Nome Cognome Telefono
Mario Rossi 02 435591
SELECT *
FROM AMICI
WHERE NOME = 'Mario';
TREYresearch
Operatorirelazionali
Condizioni
Gli operatori: maggiore (>) ,
maggiore o uguale (>=), minore
(<), minore
o uguale (<=), diverso (<>).
64
TREYresearch
65
Questi operatori si usano allo stesso modo di come si usa l'operatore di
uguaglianza. Vediamo alcuni esempi:
Anangrafica
Nome Cognome Eta
Giovanni Bruni 55
Antonio Rossi 43
Mario Rossi 49
Piero Bianchi 37
Voglio sapere chi ha più di 44 anni
SELECT *
FROM ANAGRAFICA
WHERE Eta > 44;
TREYresearch
66
Si ottiene questa tabella:
Anangrafica
Nome Cognome Eta
Giovanni Bruni 55
Mario Rossi 49
Voglio sapere chi ha più di 44 anni
SELECT *
FROM ANAGRAFICA
WHERE Eta > 44;
TREYresearch
67
Adesso voglio sapere chi ha un'età diversa da 55 anni:
Anangrafica
Nome Cognome Eta
Giovanni Bruni 55
Antonio Rossi 43
Mario Rossi 49
Piero Bianchi 37
Voglio sapere chi ha più di 44 anni
SELECT *
FROM ANAGRAFICA
WHERE Eta <> 55;
TREYresearch
68
Si ottiene questa tabella:
Anangrafica
Nome Cognome Eta
Antonio Rossi 43
Mario Rossi 49
Piero Bianchi 37
Voglio sapere chi ha più di 44 anni
SELECT *
FROM ANAGRAFICA
WHERE Eta <> 55;
TREYresearch
OperatoreIS
Condizioni
Modifichiamo ora la tabella Anagrafica
inserendo un altro nominativo di
cui però non sappiamo l'età. In questo
caso nel campo Eta verrà inserito in
maniera 'automatica' il valore NULL che
identifica l'assenza di dati.
69
TREYresearch
70
Modifichiamo ora la tabella Anagrafica inserendo un altro nominativo di
cui però non sappiamo l'età. In questo caso nel campo Eta verrà inserito in
maniera 'automatica' il valore NULL che identifica l'assenza di dati:
Anangrafica
Nome Cognome Eta
Giovanni Bruni 55
Antonio Rossi 43
Mario Rossi 49
Piero Bianchi 37
Esmeralda Carli
SELECT *
FROM ANAGRAFICA
WHERE Eta IS NULL;
TREYresearch
71
Modifichiamo ora la tabella Anagrafica inserendo un altro nominativo di
cui però non sappiamo l'età. In questo caso nel campo Eta verrà inserito in
maniera 'automatica' il valore NULL che identifica l'assenza di dati:
Anangrafica
Nome Cognome Eta
Giovanni Bruni 55
Antonio Rossi 43
Mario Rossi 49
Piero Bianchi 37
Esmeralda Carli
SELECT *
FROM ANAGRAFICA
WHERE Eta IS NULL;
TREYresearch
72
E si ottiene:
Anangrafica
Nome Cognome Eta
Esmeralda Carli
SELECT *
FROM ANAGRAFICA
WHERE Eta IS NULL;
Versione equivalente del operatore IS:
L'operatore IS funziona con la clausola NULL, ma possiamo sostituirlo
anche
con l'operatore (=): WHERE Eta = NULL;
TREYresearch
Operatoridicaratteri
Condizioni
Gli operatori di caratteri possono
essere utilizzati per manipolare il
modo in cui le stringhe devo essere
ricercate.
73
TREYresearch
74
È possibile estrarre da un database quei dati che assomigliano a un certo schema, senza
essere perfettamente identici allo schema specificato. Vediamo qualche esempio:
Anatomia
Nome Posizione
Fegato DestraAddome
Cuore Petto
Faringe Gola
Vertebre CentroDorso
Incudine Orecchio
Rene Dorso
SELECT *
FROM ANATOMIA
WHERE Posizione LIKE '%Dorso%';
TREYresearch
75
È possibile estrarre da un database quei dati che assomigliano a un certo schema, senza
essere perfettamente identici allo schema specificato. Vediamo qualche esempio:
Anatomia
Nome Posizione
Vertebre CentroDorso
Rene Dorso
SELECT *
FROM ANATOMIA
WHERE Posizione LIKE '%Dorso%';
Si noti l'uso del segno '%' dopo LIKE. Esso rappresenta zero, uno o più
caratteri. Il corrispondente carattere implementato da Access è '*'.
TREYresearch
76
In questo altro esempio sono prese in considerazione le righe in cui i dati iniziano con F:
Anatomia
Nome Posizione
Fegato DestraAddome
Faringe Gola
SELECT *
FROM Anatomia
WHERE Posizione LIKE ‘F%';
TREYresearch
77
È possibile estrarre da un database quei dati che assomigliano a un certo schema, senza
essere perfettamente identici allo schema specificato. Vediamo qualche esempio:
Anatomia
Nome Posizione
Vertebre CentroDorso
Rene Dorso
SELECT *
FROM ANATOMIA
WHERE Posizione LIKE '%Dorso%';
Si noti l'uso del segno '%' dopo LIKE. Esso rappresenta zero, uno o più
caratteri. Il corrispondente carattere implementato da Access è '*'.
TREYresearch
78
Vediamo un altro esempio:
Nominativi
Nome Cognome Provincia
Giovanni Bruni CO
Antonio Rossi Mi
Mario Rossi CT
Piero Bianchi PV
SELECT *
FROM Nominativi
WHERE Provincia LIKE 'C_';
TREYresearch
79
E si ottiene:
Nominativi
Nome Posizione
Nome Cognome Provincia
Giovanni Bruni CO
Mario Rossi CT
SELECT *
FROM Nominativi
WHERE Provincia LIKE 'C_';
Il carattere di sottolineatura (_) è un carattere che sostituisce un singolo
carattere e non il carattere spazio. Il suo corrispettivo implementato da
Access è '?'. Access implementa anche il segno '#' che sostituisce
qualsiasi singola cifra (0, 1, 2, 3, ecc,).
TREYresearch
Operatoridiconcatenazione
Condizioni
Il simbolo || serve a concatenare
due stringhe. Il corrispettivo
operatore
che si usa con Access è '&'.
80
TREYresearch
81
Vediamo alcuni esempi:
Amici
Cognome Nome Telefono Provincia CAP
Rossi Alessandra 0761 556632 BG 01023
Verdi Alessandra 02 345622 Mi 03456
Merilli Titti 0732 433388 CO 01255
Banfi Barby 0722 114381 BR 03367
Persiani Maria 0581 931522 CA 09941
Mazza Jo 0359 118267 PV 01944
Bordoni Chiara 0445 668193 CT 01042
SELECT Nome || Cognome NomeCompleto
FROM Amici;
TREYresearch
82
Questo e quello che si ottiene:
Amici
Cognome
AlessandraRossi
AlessandraVerdi
TittiMerilli
BarbiBanfy
MariaPersiani
JoMazza
ChiaraBordoni
SELECT Nome || Cognome NomeCompleto
FROM Amici;
TREYresearch
83
Access non implementa, oltre che l'operatore '||', anche questo modo di
ridenominare le colonne estrapolate:
Amici
Cognome
AlessandraRossi
AlessandraVerdi
TittiMerilli
BarbiBanfy
MariaPersiani
JoMazza
ChiaraBordoni
SELECT NOME || COGNOME NOMECOMPLETO;
TREYresearch
84
Ecco un'altra applicazione dell'operatore di concatenazione:
Amici
Cognome
AlessandraRossi
AlessandraVerdi
TittiMerilli
BarbiBanfy
MariaPersiani
JoMazza
ChiaraBordoni
SELECT Cognome || ', ' || NOME Amico
FROM Amici;
TREYresearch
85
Ecco un'altra applicazione dell'operatore di concatenazione:
Amico
Rossi, Alessandra
Verdi, Alessandra
Merilli, Titti
Banfi, Barbi
Persiani, Maria
Mazza, Jo
Bordoni, Chiara
SELECT Cognome || ', ' || NOME Amico
FROM Amici;
TREYresearch
Operatorilogici
Condizioni
I comandi e le istruzioni derivanti
dall’Algebra di Boole.
86
TREYresearch
87
Operatore AND: Indica che entrambe le espressioni che si trovano ai suoi lati devono
essere soddisfatte. Vediamo un esempio:
Cognome Id_dipendente Anni Ferie_godute
Marini 101 2 4
Rossi 104 5 23
Zappa 107 8 45
Verdi 233 4 80
Boldi 210 15 100
Gialli 211 10 78
Ferie
TREYresearch
88
Vogliamo sapere quali impiegati hanno lavorato nell'azienda per 5 anni o più
e hanno utilizzato più di 50 giorni di ferie:
Cognome
Boldi
Gialli
Ferie
SELECT Cognome
FROM Ferie
WHERE Anni >= 5
AND Ferie_Godute > 50;
TREYresearch
89
L'operatore OR: È sufficiente che una sola espressione sia verificata per ottenere il
valoreTRUE. Vediamo un esempio:
vogliamo sapere i cognomi dei dipendenti che non hanno più di 5 anni di
servizio o hanno goduto ferie per più di 80 giorni.
Cognome Id_dipendente Anni Ferie_godute
Marini 101 2 4
Rossi 104 5 23
Zappa 107 8 45
Verdi 233 4 80
Boldi 210 15 100
Gialli 211 10 78
Ferie
TREYresearch
90
L'operatore OR: questo è quello che si ottiene
Cognome
Marini
Rossi
Zappa
Verdi
Boldi
Ferie
SELECT Cognome
FROM Ferie
WHERE Anni <= 5
OR Ferie_godute > 80;
TREYresearch
91
L'operatore NOT: Ha il compito di invertire il significato di una condizione. Vediamo un
esempio:
Vogliamo conoscere i cognomi che non iniziano per B.
Cognome Id_dipendente Anni Ferie_godute
Marini 101 2 4
Rossi 104 5 23
Zappa 107 8 45
Verdi 233 4 80
Boldi 210 15 100
Gialli 211 10 78
Ferie
SELECT Cognome
FROM Ferie
WHERE Cognome NOT LIKE 'B%';
TREYresearch
92
L'operatore NOT: Ha il compito di invertire il significato di una condizione. Vediamo un
esempio:
Vogliamo conoscere i cognomi che non iniziano per B. Si ottiene
Cognome
Marini
Rossi
Zappa
Verdi
Gialli
Ferie
SELECT Cognome
FROM Ferie
WHERE Cognome NOT LIKE 'B%';
TREYresearch
Glioperatoridiinsieme
Condizioni
SQL mette a disposizione degli operatori
insiemistici, da applicare nella
scrittura delle nostre interrogazioni. Tali operatori
operano sul risultato di più
select. Gli attributi interessati dagli operatori di
insieme devono esser di
tipo compatibile tra loro.
Gli operatori disponibili sono gli operatori di
UNION (unione), INTERSECT
(intersezione) e MINUS (differenza). Il significato
è analogo ai corrispondenti operatori dell'algebra
insiemistica.
93
TREYresearch
94
Operatore UNION e UNION ALL: l'operatore UNION restituisce il risultato di più query
escludendo le righe duplicate. Vediamo un esempio:
Nome
Marini
Bravo
Rossi
Verdi
Marroni
Gialli
Giannini
Calcio
SELECT Nome FROM CALCETTO
MINUS
SELECT NOME FROM CALCIO;
Nome
Marini
Bacco
Rossi
Dini
Marroni
Falcone
Giannini
Calcetto
Nome
Bravo
Verdi
Gialli
TREYresearch
95
Nome
Marini
Bacco
Rossi
Dini
Marroni
Falcone
Giannini
Marini
Bravo
Rossi
Verdi
Marroni
Gialli
Giannini
SELECT Nome FROM CALCETTO
UNION ALL
SELECT NOME FROM CALCIO;
TREYresearch
96
Operatore INTERSECT: Restituisce l'intersezione (valori comuni a tutti gli insiemi
coinvolti) del
risultato delle query. La seguente istruzione SELECT mostra l'elenco dei
giocatori che appartengono sia alla squadra di calcio che di calcetto. (Vedere
le tabelle Calcio e Calcetto). Questo operatore non è implementato
da Access.
SELECT Nome FROM Calcetto
INTERSECT
SELECT Nome FROM Calcio;
NOME
Marini
Rossi
Marroni
Giannini
TREYresearch
97
Operatore MINUS (differenza): Restituisce le righe della prima query che non sono
presenti nella seconda. Questo operatore non è implementato da Access.
SELECT Nome FROM Calcetto
MINUS
SELECT Nome FROM Calcio;
NOME
Marini
Rossi
Marroni
Giannini
TREYresearch
98
Altri operatori: IN e BETWEEN: gli operatori IN e BETWEEN forniscono una scorciatoia
per quelle
operazioni che possono essere svolte anche in altri modi. Ad esempio, per
trovare tutti gli amici che vivono in provincia di Como, Pavia, e Bergamo.
Amici
Cognome Nome Telefono PR CAP
Rossi Maria 0761 556632 BG 01023
Verdi Maria 02 345622 Mi 03456
Marroni Antonio 0732 433388 CO 01255
Banfi Barby 0722 114381 BR 03367
Persiani Luca 0581 931522 CA 09941
Mazza Alberto 0359 118267 PV 01944
Battisti Chiara 0445 668193 CT 01042
Vediamo come si costruisce l’istruzione nella pagina
seguente:
TREYresearch
99
Amici
Cognome Nome Telefono PR CAP
Rossi Maria 0761 556632 BG 01023
Marroni Antonio 0732 433388 CO 01255
Mazza Alberto 0359 118267 PV 01944
SELECT *
FROM Amici
WHERE
PR = 'CO'
OR
PR = 'PV'
OR
PR = 'BG';
SELECT *
FROM Amici
WHERE PR IN ('CO', 'PV', 'BG');
TREYresearch
100
Altri operatori: IN e BETWEEN: gli operatori IN e BETWEEN forniscono una scorciatoia
per quelle
operazioni che possono essere svolte anche in altri modi. Facciamo un altro esempio con
un’altra tabella.
Prezzo
Elemento Prezzo_Ingrosso
Pomodori 340
Patate 510
Banane 670
Rape 450
Arance 890
Mele 230
SELECT *
FROM Prezzo
WHERE Prezzo_Ingrosso
>= 250
AND
Prezzo_Ingrosso <= 750;
SELECT *
FROM PREZZO
WHERE PREZZO_INGROSSO
BETWEEN 250
AND 750;
TREYresearch
Aggiungere un piè di pagina 101
Cognome Nome PR
Rossi Maria BG
Verdi Maria Mi
Marroni Antonio CO
Banfi Barby BR
Persiani Luca CA
Mazza Alberto PV
Battisti Chiara CT
Amici
Esercizio di programmazione. Dalla seguente tabella determinare:
1. Scrivere una query per selezionare tutti i cognomi che iniziano con la lettera M.
2. Scrivere una query per selezionare gli amici che vivono in provincia di Bergamo (BG) e il cui nome è MARIA.
3. Scrivere un’istruzione usando i campi nome e cognome. Lo scopo dell’istruzione è cercare i dati Maria o
Mazza.
Quale scorciatoia potrebbe essere utilizzata in alternativa a WHERE A >=
10 AND A <= 30 ?
TREYresearch
LefunzioniinSQL
102
Le funzioni, nell'ambito dei linguaggi di
terza generazioni (linguaggi
procedurali), sono delle particolari
procedure le quali passandogli dei valori
(parametri) esse ci restituiscono
(ritornano) un valore.
TREYresearch
Aggiungere un piè di pagina 103
Anche se SQL non è un linguaggio procedurale (C/C++, Java), implementa le
funzioni nella stessa maniera ma con una differenza sostanziale: nei linguaggi
procedurali noi stessi possiamo crearci delle funzioni, con SQL
ciò non è possibile e quindi possiamo utilizzare solo quelle funzioni che ci
mette a disposizione il DBMS che stiamo usando.
In questo parte vedremo molte funzioni, ma soltanto le prime 5 (COUNT,
SUM, AVG, MAX e MIN) sono definite nello standard SQL. Queste prime
cinque funzioni sono le più importanti e dobbiamo impararle bene, esse sono
sempre presenti nella maggior parte dei DBMS a differenza delle restanti, che
a volte non appaiono affatto o sono implementate con una sintassi diversa.
TREYresearch
104
Funzioni aggregate: Le funzioni che analizzeremo in questo paragrafo
hanno la particolarità di restituire un solo valore. Inoltre, dato che
operano su insiemi di righe, vengono anche chiamate funzioni di gruppo.
Gli esempi utilizzano la tabella Impiegato:
Nome Cognome Dipartimento Ufficio Stipendio
Mario Rossi Amministrazione 10 4500
Carlo Bianchi Produzione 20 360
Giuseppe Verdi Amministrazione 20 4000
Franco Neri Distribuzione 16 4500
Carlo Rossi Direzione 14 7300
Lorenzo Lanzi Direzione 7 730
Paola Borroni Amministrazione 75 4000
Marco Franco Produzione 46 4000
Impiegato
TREYresearch
105
COUNT: restituisce il numero di righe che soddisfano la condizione
specificata nella clausola WHERE. Vediamo un esempio: voglio conoscere
il numero di impiegati che appartengono al dipartimento produzione.
Impiegato
2
SELECT COUNT (*)
FROM Impiegato
WHERE Dipartimento = ‘Produzione’;
TREYresearch
106
AVG: calcola la media aritmetica dei valori di una colonna. Vediamo un
esempio. Voglio conoscere lo stipendio medio della tabella IMPIEGATO.
Questa funzione opera soltanto con i numeri.
Impiegato
3265,555
periodo
SELECT AVG(Stipendio)
FROM Impiegato;
TREYresearch
107
MAX: Questa funzione serve a trovare il valore massimo di una colonna.
Per esempio vogliamo sapere a quanto ammonta lo stipendio maggiore.
Impiegato
7300
SELECT MAX(Stipendio)
FROM Impiegato;
TREYresearch
108
MIN: Questa funzione opera in modo analogo a MAX, ad eccezione del
fatto che restituisce il valore minimo di una colonna. Per trovare il
minimo stipendio della tabella IMPIEGATO si usa la seguente espressione.
La funzione MIN opera anche con i caratteri: la stringa 'AAA' è minore
della stringa 'BB'.
Impiegato
360
SELECT MIN(Stipendio)
FROM Impiegato;
TREYresearch
Aggiungere un piè di pagina 109
Nome Cognome Provincia
Giovanni Bruni CO
Antonio Rossi Mi
Mario Rossi CT
Piero Bianchi PV
Nominativi
Dalla seguente tabella creare le seguenti query:
1. Creare la tabella Nominativi;
2. Creare i campi della tabella Nominativi;
3. Inserire all’interno della tabella Nominativi i dati della tabella di esempio;
4. Estrapolare i dati dalla tabella Nominativi, prendendo in esame il campo provincia. Devono essere
visualizzati tutti i dati della colonna Provincia secondo una data condizione. Tutte le sigle di
provincia che iniziano con C.
5. Ogni query deve essere eseguita singolarmente al database.
TREYresearch
Aggiungere un piè di pagina 110
Nome Cognome Provincia
Giovanni Bruni CO
Antonio Rossi Mi
Mario Rossi CT
Piero Bianchi PV
Andrea Barbieri SI
Gianni Perla SO
Nominativi
Dalla seguente tabella creare le seguenti query:
1. Creare la tabella Nominativi;
2. Creare i campi della tabella Nominativi;
3. Inserire all’interno della tabella Nominativi i dati della tabella di esempio;
4. Estrapolare i dati dalla tabella Nominativi, prendendo in esame il campo provincia. Devono essere
visualizzati tutti i dati della colonna Provincia secondo una data condizione. Tutte le sigle di
provincia che iniziano con C, M, P e S.
TREYresearch
111
Dalla seguenti tabella eseguire le seguenti query:
1. Creare la tabella ed i campi della tabella;
2. Inserire le informazioni in ogni campo della tabelle;
3. Individuare nel campo Posizione uno schema comune. Esempio: CentroDorso e
CentroDorso. Ed seguire la query per la visualizzazione di questi dati.
Anatomia
Nome Posizione
Fegato DestraAddome
Cuore Petto
Faringe Gola
Vertebre CentroDorso
Incudine Orecchio
Rene Dorso
TREYresearch
Aggiungere un piè di pagina 112
Id_contatto Nome Cognome Provincia
1 Giovanni Bruni CO
2 Antonio Rossi Mi
3 Mario Rossi CT
4 Piero Bianchi PV
5 Beatrice Gorli LI
6 Annamaria Voleri MO
7 Valeria Boschetti RN
8 Sandro Lucci FI
Nominativi
Dalla seguente tabella creare le seguenti query:
1. Creare la tabella Nominativi;
2. Creare i campi della tabella Nominativi;
3. Inserire all’interno della tabella Nominativi i dati della tabella di esempio;
4. Aggiornare la tabella con questi nuovi dati: Marina, Aleandri, CA. Id_contatto = 5.
5. Cancellare una riga con la condizione id_contatto > 3, id_contatto < 5, id_contatto < 8.
6. Ogni query deve essere eseguita singolarmente al database.
TREYresearch
113
Anagrafica
Id_contatto Nome Cognome Eta
1 Giovanni Bruni 55
2 Antonio Rossi 43
3 Mario Rossi 49
4 Piero Bianchi 37
5 Esmeralda Carli
6 Angela Berletti 44
7 Simone Cudraro 37
8 Corsari Luca 22
9 Elena Basalto 37
10 Franco Basalto 34
1. Creare la tabella Anagrafica. Ed inserire nella query i campi ed i dati presenti nelle colonne.
2. Usare un comando SQL per individuare tutti i dati presenti nella tabell.
3. Aggiornare la tabella con il comanda UPDATE secondo la condizione.
4. Cancellare una riga o più righe con il comando DELETE con la condizione id_contatto < 3 .
5. Selezionare le righe tramite il comando SELECT* con la condizione Eta > 22.
TREYresearch
114
Prezzo
Articoli venditaIngrosso Dettaglio
Pomodori o.34
Patate 0.51
Banane 0.67
Rape 0.45
Formaggio 0.89
Mele 0.23
Sedano 0.50
Carote 0.24
Pesche 0.51
Ciliegie 0.37
Il magazzino Rossi ha ricevuto nuova merce. Ed è necessario dire ai commessi qual è il prezzo al dettaglio
della merce.
SELECT* Articoli, venditaIngrosso, (venditaIngrosso + 0.15) Dettaglio
FROM Prezzo
TREYresearch
115
Prodotti venditaIngrosso Dettaglio
Pomodori o.34
Patate 0.51
Banane 0.67
Rape 0.45
Formaggio 0.89
Mele 0.23
Sedano 0.50
Carote 0.24
Pesche 0.51
Ciliegie 0.37
L’azienda Rossi per motivi di ambiguità decide di cambiare il nome del campo Articoli con Prodotti.
SELECT Articoli Prodotti, venditaIngrosso, venditaIngrosso + 0.15
Dettaglio
FROM Prezzo;
Prezzo
TREYresearch
116
State Hightemp Lowtemp
CA -50 120
FL 20 110
LA 15 99
ND -70 101
NE -60 100
Viene data una tabella sulle temperature americane. Si richiede di
cambiare di segno alle temperature. Inoltre, viene richiesto creare i
campi High e Low per inserire i nuovi dati.
SELECT State, -HIGHTEMP LOWS, -LOWTEMP HIGHS
FROM HILOW;
Temperature
State Low High
CA -50 120
FL 20 110
LA 15 99
ND -70 101
NE -60 100
Temperature
TREYresearch
117
Viene data una tabella sulle temperature americane. Si richiede di
cambiare di segno alle temperature. Inoltre, viene richiesto di creare
dei sinonimi per Hightemp e Lowtemp.
SELECT State, -HIGHTEMP LOWS, -LOWTEMP HIGHS
FROM Temperature;
Temperature Temperature
TREYresearch
118
Sempre dalla tabella Temperature trovare le differenze tra la
temperatura Highs e Lows.
SELECT STATE, HIGHTEMP LOWS, LOWTEMP HIGHS,
(LOWTEMP - HIGHTEMP) DIFFERENCE
FROM Temperature;
Temperature Temperature
Funzionidi
temporali
Queste funzioni operano su date e
orari; sono molto potenti.
Alcuni DBMS, come Access, non le
implementano o usano sintassi
diverse.
Aggiungere un piè di pagina 119
Questa foto di Autore sconosciuto è concesso in licenza da CC BY-NC-ND
TREYresearch
Aggiungere un piè di pagina 120
Formatidelledate
Format Name Date Format Date Example Time Format Time Example
American mm/dd/yyyy 5/19/1960 hh:mm
am/pm
2:18 PM
European dd.mm.yyyy 19.5.1960 hh.mm.ss 14.18.08
Japanese yyyy-mm-dd 1960-5-19 hh:mm:ss 14:18:08
ISO yyyy-mm-dd 1960-5-19 hh.mm.ss 14.18.08
TIMESTAMP
format
yyyy-mm-
ddhh.
mm.ss.nnn
nnn
yyyy-mm-ddhh.
mm.ss.nnn
nnn
TREYresearch
Aggiungere un piè di pagina 121
Formatidelledate:esempi
• March 15, 1990 Mar 15 1990 3/15/1990 3-15-90 1990 MAR 15: ecco alcuni esempi di
date e ora legale di SQL Server;
• 15:30:25 3:30:25 PM 3:30:25 pm 3 PM: ecco alcuni esempi di ora legale costanti
TREYresearch
Aggiungere un piè di pagina 122
Siadatalaseguentetabella:
Inseriamo i dati nella tabella con la seguente
istruzione:
TREYresearch
Siottienequestatabellagiàcompilataconledate:
Aggiungere un piè di pagina 123
TREYresearch
Aggiungere un piè di pagina 124
Adessopossiamousarelefunzionitemporali.
LAST DAY : Questa funzione fornisce l'ultimo giorno di un mese specificato (se il mese
è di 30, 31, 29 o 28 giorni).
TREYresearch
DATE_DIFF:
restituisce il
tempotra
duedate
Aggiungere un piè di pagina 125
TREYresearch
CURRENT
TIME_STAMP:
questafunzione
restituisceladatae
oradelsistema.
Aggiungere un piè di pagina 126
TREYresearch
Approfondimentosul
caricamentodeidati.
Abbiamo visto che per inserire le righe, e
popolare una tabella è possibile usare il
comando.
INSERT INTO nome_tabella (campo1, campo2,
………… campon-1 )
VALUES (valore1, valore2, valoren-1 );
Ma è possibile usare il comando INSERT anche
in altri e più utili modi. A sinistra la tabella di
esempio. Prendiamo questo codice come
esempio.
127
TREYresearch
Aggiungere un piè di pagina 128
Come abbiamo già visto questa istruzione consente di omettere i dati. Come in questo esempio:
INSERT INTO amici VALUES (‘’, 'Mario’, 'Rossi’, '123456789’);
In questo caso abbiamo passato un valore vuoto per il campo "id" in quanto, essendo auto-incrementale, si
popola da se con giusto valore numerico.
TREYresearch
INSERTINTO…….SET
• Una sintassi meno conosciuta ed utilizzata è
quella che prevede di utilizzare il comando
INSERT INTO in comunione con la clausola SET.
Da un punto di vista funzionale non vi è alcuna
differenza con l'istruzione basata su INSERT
INTO ... VALUES.
Aggiungere un piè di pagina 129
TREYresearch
130
INSERTINTO….. SELECT
Un modo particolare di popolare le tabelle prevede di utilizzare il comando INSERT INTO in
comunione con il comando SELECT: così facendo, in poche parole, viene popolato una tabella
inserendo dei dati estratti da una seconda tabella. Nell'esempioabbiamo immaginato di popolare di
dati la tabella "amici" inserendo automaticamente i dati già presenti in un'ipotetica tabella
"parenti".
TREYresearch
INSERTIGNORE
INTO……..
• Il comando insert può essere modificato nel
suo comportamento di default mediante
l'inserimento di alcune keywords, tra
cui IGNORE. Aggiungendo questa parola dopo
il comando INSERT si invita il DBMS a non
mostrare errori nel caso si cerchi di inserire un
valore duplicato per un campo PRIMARY KEY
o UNIQUE. Qualora ciò accada, semplicemente,
MySQL ignorerà il comando.
Aggiungere un piè di pagina 131
TREYresearch
INSERT ON…..
DUPLICATEKEY
La clausola ON DUPLICATE
KEY serve a regolare situazioni
analoghe a quelle appena
"ignorate". Mediante questa
sintassi si chiede al DBMS di
effettuare una specifica
operazione qualora, in sede di
INSERT, si stia cercando di
caricare dati duplicati per
chiavi primarie o uniche.
Vediamo un esempio di
istruzione SQL:
Aggiungere un piè di pagina 132
TREYresearch
133
REPLACE
Il comando REPLACE in MySQL è un'estensione dello standard SQL. Utilizzando REPLACE al posto di
INSERT, MySQL effettuerà la sostituzione dei dati qualora siano già presenti all'interno del database,
qualora invece non siano presenti effettuerà una normale operazione di inserimento.
Prima del comando Dopo l’istruzione
TREYresearch
134
REPLACE
Come potete vedere la sintassi è la medesima di INSERT.
Da un punto di vista tecnico è da segnalare REPLACE non effettua un UPDATE del record ma procederà
alla cancellazione del record precedente ed all'inserimento di un nuovo record (per questo motivo
questa query restituirà "Affected rows: 2").
Prima del comando Dopo l’istruzione
TREYresearch
CREATE TABLE ……
SELECT
Esiste possibilità di creare delle tabelle già
popolate di dati. Ciò è possibile mediante l'uso
congiunto dei comandi CREATE
TABLE e SELECT. Col primo, ovviamente, si
crea la tabella, col secondo si caricano al suo
interno i dati prelevati da una seconda tabella.
Il suo funzionamento, in pratica, è analogo a
quello di INSERT INTO ... SELECT.
Aggiungere un piè di pagina 135
TREYresearch
Aggiungere un piè di pagina 136
PRIMARY KEY: è un vincolo che ci consente di dichiarare un campo come chiave
primaria. La chiave primaria rappresenta quel campo il cui valore rappresenta in
modo univoco la riga. Infatti, non è possibile trovare all’interno della tabella due
valori uguali della chiave primaria. Di solito rappresenta un numero. Ad esempio, se
cancelliamo NOME con identificativo 15, quella chiave viene persa per sempre.
TREYresearch
Aggiungere un piè di pagina 137
FunzioniSQLinAccess:funzionidistringhe
Funzioni Descrizione
ASC Restituisce un valore ASCII per uno
specifico carattere.
Chr Restituisce il carattere per uno specifico
codice numerico ASCII
Concat with & Aggiunge due o più stringhe insieme
CurDir Restituisce il percorso completo di un
drive.
Format Formatta un valore in un formato
specifico.
InStr Ottiene la posizione della prima
occorrenza di un’altra.
InstrRev Ottiene la posizione della prima
occorrenza di una strina in un’altra,
dalla fine della stringa.
LCase Converte una stringa in lettere
minuscole
TREYresearch
ClausoleSQL:WHERE
Aggiungere un piè di pagina 138
TREYresearch
ClausoleSQL:WHERE
Aggiungere un piè di pagina 139
SELECT * FROM ASSEGNI
WHERE IMPORTO < 150;
TREYresearch
ClausoleSQL:,ORDERBY
Aggiungere un piè di pagina 140
In alcuni casi potrebbe essere necessario presentare i risultati di una query in un
certo ordine, la clausola ORDER BY assolve a questo scopo. Vediamo alcuni
esempi:
SELECT *
FROM ASSEGNI
ORDER BY BENEFICIARIO;
TREYresearch
ClausoleSQL:,ORDERBY
Aggiungere un piè di pagina 141
E’ possibile ordinare i record anche in senso inverso, con la lettera o il numero più
alto. Usando la parola chiave DESC.
SELECT *
FROM ASSEGNI
ORDER BY BENEFICIARIO DESC;
TREYresearch
ClausoleSQL:,ORDERBY
Aggiungere un piè di pagina 142
Esiste anche la parola chiave facoltativa ASC per l'ordinamento ascendente.
Comunque questa parola chiave è raramente utilizzata in quanto superflua.
Infatti ORDER BY, se non viene specificato diversamente, ordina per
l'appunto in modo ascendente. La clausola ORDER BY può essere applicata a più
campi.
SELECT BENEFICIARIO, NOTE
FROM ASSEGNI
ORDER BY BENEFICIARIO, NOTE;
TREYresearch
ClausoleSQL:,ORDERBY
Aggiungere un piè di pagina 143
Esiste anche la parola chiave facoltativa ASC per l'ordinamento ascendente.
Comunque questa parola chiave è raramente utilizzata in quanto superflua.
Infatti ORDER BY, se non viene specificato diversamente, ordina per
l'appunto in modo ascendente. La clausola ORDER BY può essere applicata a più
campi.
SELECT BENEFICIARIO, NOTE
FROM ASSEGNI
ORDER BY BENEFICIARIO, NOTE
DESC;
TREYresearch
ClausoleSQL:,ORDERBY
Aggiungere un piè di pagina 144
Possiamo far riferimento ai campi da ordinare dopo ORDER BY indicando
invece del loro nome il valore dell'ordine di apparizione all'interno della
tabella. I dati sono stati visualizzati ordinandoli per il campo IMPORTO che è
appunto il terzo campo che appare nella tabella ASSEGNI. Vediamo un esempio:
SELECT BENEFICIARIO, NOTE
FROM ASSEGNI
ORDER BY 3;
TREYresearch
ClausoleSQL: GroupBY
Aggiungere un piè di pagina 145
Questa clausola ci permette di formare dei sottoinsiemi per quelle colonne
specificate. Vediamo cosa significa quanto affermato.
SELECT BENEFICIARIO
FROM ASSEGNI
GROUP BY BENEFICIARIO;
Il risultato della query è una lista di beneficiari, che appaiono però una sola volta,
anche se nella tabella di origine la maggior parte di essi compare più
volte.
TREYresearch
ClausoleSQL: GroupBY
Aggiungere un piè di pagina 146
Questa clausola è usata molto spesso per applicare le funzioni di gruppo non
a tutte le righe indistintamente, ma a sottoinsiemi di esse. Vediamo un esempio.
Vogliamo sapere quanto è stato elargito, in totale, per ogni beneficiario:
SELECT BENEFICIARIO, SUM(IMPORTO)
FROM ASSEGNI
GROUP BY BENEFICIARIO;;
In questa query viene applicata la funzione di gruppo SUM per ogni
sottoinsieme di BENEFICIARIO.
TREYresearch
ClausoleSQL: GroupBY
147
Alla tabella ASSEGNI sono aggiunti altri quattro record. Questa è la tabella
aggiornata:
TREYresearch
ClausoleSQL: GroupBY
148
Alla tabella ASSEGNI sono aggiunti altri quattro record. Questa è la tabella
aggiornata. Si può applicare la clausola GROUP BY anche a più di un campo per
volta. Vediamo come funziona nella prossima slide:
TREYresearch
ClausoleSQL: GroupBY
149
Anche per la clausola GROUP BY è possibile prendere in considerazione più di un
campo.
In questa query le righe selezionate sono 11
contro le 15 della tabella
originale, cosa è successo?
È avvenuto che la dove il beneficiario
presentava le stesse note, veniva
visualizzato una volta sola.
Si veda quante volte appare, nella tabella
ASSEGNI, in NOTE 'libri
cancelleria', 'gas'(per beneficiario Biogas SRL),
'controller' e 'pantaloni'.
TREYresearch
ClausoleSQL: GroupBY
150
Analizziamo altri esempi con la clausola GROUP BY. Ci interessa sapere oltre a
quanto è stato elargito per ogni beneficiario, quante volte il singolo beneficiario
compare nella tabella:
SELECT BENEFICIARIO, SUM(IMPORTO),
COUNT(BENEFICIARIO)
FROM ASSEGNI
GROUP BY BENEFICIARIO;
Abiti Bella compare nella tabella tre volte,
Assicurazioni ASSO una volta, ecc.
TREYresearch
ClausoleSQL: GroupBY
151
Siamo interessati a sapere il totale dell'importo per ogni nota che facendo parte
dello stesso beneficiario compaia una o più volte. Sapere quante volte
quella stessa nota appare per lo stesso beneficiario. E siamo anche interessati a
visualizzare le note:
SELECT BENEFICIARIO, NOTE,
SUM(IMPORTO),
COUNT(BENEFICIARIO)
FROM ASSEGNI
GROUP BY BENEFICIARIO, NOTE;
TREYresearch
ClausoleSQL: GroupBY
152
Nella prima riga della tabella estrapolata con la query precedente, vediamo che
COUNT(BENEFICIARIO) vale 1; ciò significa che la nota 'Completo donna' per quel
beneficiario è presente nella tabella di origine una sola volta.
Mentre invece, la nota 'Pantaloni', sempre per il medesimo beneficiario vale 2,
questo significa che quella nota per quel beneficiario è presente nella tabella ben
due volte.
SELECT BENEFICIARIO, NOTE,
SUM(IMPORTO),
COUNT(BENEFICIARIO)
FROM ASSEGNI
GROUP BY BENEFICIARIO, NOTE;
TREYresearch
ClausoleSQL: GroupBY
153
Adesso vogliamo estrapolare i stessi dati della query precedente, ma
ordinandoli per le note.
SELECT BENEFICIARIO, NOTE,
SUM(IMPORTO),
COUNT(BENEFICIARIO)
FROM ASSEGNI
GROUP BY BENEFICIARIO, NOTE
ORDER BY NOTE;
TREYresearch
ClausoleSQL:
HAVING
Abbiamo visto come tramite la clausola GROUP BY le righe
possano venire raggruppate in sottoinsiemi. Una
particolare interrogazione può avere la necessità di
estrapolare solo quei sottoinsiemi di righe che soddisfano
certe condizioni, in questo caso però non è possibile usare
la clausola WHERE in quanto tale clausola verifica la
condizione che la segue, su tutte le righe e non in maniera
singola sui valori estrapolati per ogni sottoinsieme di
righe. Questa è la nuova tabella presa come esempio.
154
TREYresearch
ClausoleSQL: HAVING
155
Vogliamo conoscere le medie dei stipendi per ogni divisione che superano i
2.200.000 di lire. Il codice proposto genera errore alla riga 4.
SELECT DIVISIONE, AVG(STIPENDIO)
FROM DIPENDENTI
GROUP BY DIVISIONE
WHERE AVG(STIPENDIO) > 2200000;
Nella query scritta sopra possiamo vedere come la clausola WHERE sia stata
posta per ultima, infatti bisogna verificare la condizione solo dopo che sono
stati formati i sottoinsiemi dalla clausola GROUP BY. Il risultato però, è comunque un
avviso di errore, proprio perché non è possibile utilizzare WHERE per verificare
condizioni sui risultati di funzioni di gruppo.
TREYresearch
ClausoleSQL: HAVING
156
Vediamo adesso come risolvere il problema. In questo caso la clausola WHERE è
stata usata non sugli insiemi delle righe, in quanto posta prima della clausola
GROUP BY.
SELECT DIVISIONE, AVG(STIPENDIO)
FROM DIPENDENTI
WHERE DIVISIONE = 'VENDITE'
GROUP BY DIVISIONE;
TREYresearch
ClausoleSQL: HAVING
157
Voglio conoscere la media dei giorni di ferie godute per dipartimento, ma solo
di quei dipendenti che percepiscono stipendi superiori ai 2.050.000
SELECT DIVISIONE, AVG(FERIE_GODUTE)
FROM DIPENDENTI
WHERE STIPENDIO > 2050000
GROUP BY DIVISIONE;
In questo caso abbiamo usato la clausola WHERE in quanto la condizione va
verificata per tutte le righe e non per singoli valori estrapolati da singoli
sottoinsiemi di righe.
TREYresearch
ClausoleSQL: HAVING
158
Adesso vogliamo escludere dal risultato della query precedente quelle divisioni la
cui media delle ferie godute, calcolata solo per quei dipendenti il cui stipendio
supera i 2.050.000 di lire, è uguale a zero:
SELECT DIVISIONE, AVG(FERIE_GODUTE)
FROM DIPENDENTI
WHERE STIPENDIO > 2050000
GROUP BY DIVISIONE
HAVING AVG(FERIE_GODUTE) <> 0;
TREYresearch
Cosaabbiamoimparato?1
159
Dagli esempi precedenti, dalle cose che sono state dette e da eventuali esperimenti
che potremmo fare, possiamo enunciare degli assiomi che riguardano l'uso delle
clausole viste in questo capitolo:
1. WHERE non può essere usato per verificare condizioni su risultati di funzioni
di gruppo,
2. WHERE non può essere usato per verificare condizioni su sottoinsiemi delle
varie righe.
1. GROUP BY: tutte le colonne che vengono selezionate (colonne che seguono la
clausola SELECT) devono essere elencate nella clausola GROUP BY.
TREYresearch
Cosaabbiamoimparato?2
160
1. HAVING può essere seguita da una o più funzioni di gruppo e verificare condizioni su i valori
ritornati. da tali funzioni.
2. HAVING può verificare condizioni sui valori dei sottoinsiemi creati dalla clausola GROUP BY.
3. HAVING può verificare condizioni combinate sui valori dei sottoinsiemi creati dalla clausola
GROUP BY e condizioni sui valori ritornati da funzioni di gruppo.
4. HAVING i campi che vi appaiono devono essere specificati nella clausola GROUP BY,
5. HAVING è necessario, per il suo utilizzo, la presenza della clausola GROUP BY.
6. HAVING non è necessario che venga posta dopo la clausola GROUP BY.
TREYresearch
Cosaabbiamoimparato?3
161
1. ORDER BY è necessario che venga posta dopo la clausola GROUP BY e dopo la
clausola HAVING.
Riassumendo vediamo come può essere la forma sintetica di una query che
fa uso delle clausole viste in questo capitolo:
select lista attributi o espressioni
from lista tabelle
[where condizioni semplici]
[group by lista attributi di raggruppamento]
[having condizioni aggregate]: MIN() , MAX(), SUM(), AVG(), STDEV() , VARIANCE(),
COUNT()
[order by lista attributi di ordinamento]
SQLJOIN–
Combinazioneditabelle
16
2
Aggiungere un piè di pagina
Questa foto di Autore sconosciuto è concesso in licenza da CC BY-SA
TREYresearch
Aggiungere un piè di pagina 163
Join-Combinazioneditabelle
Questo capitolo tratta un importante tipo di operazione tra le tabelle: il Join. Il
vocabolo join significa unione e nel caso di SQL sta ad indicare unione tra tabelle.
Esistono vari tipi di join, ma tutti derivano o possono essere ricondotti
a vari operatori dell'algebra insiemistica. L'importanza principale del join risiede nella
possibilità che ci offre per correlare e visualizzare dati appartenenti a tabelle diverse
o alla medesima tabella, logicamente correlati tra di loro. I semplici dati, da noi uniti,
possono assumere la forma di complesse informazioni così come noi li vogliamo.
TREYresearch
164
CrossJoin
Per comprendere a pieno l'operazione CROSS JOIN (unione incrociata)bisogna aver
ben chiaro il concetto di prodotto cartesiano:
........................................................... Prodotto
cartesiano...........................................................
Dati due insiemi D1 e D2 si chiama prodotto cartesiano di D1 e D2, l'insieme delle coppie
ordinate (v1, v2), tali che v1 è un elemento di D1 e v2 un elemento di D2. Vediamo cosa
significa quanto affermato con un esempio:
TREYresearch
165
CrossJoin
Il prodotto cartesiano dell’insieme A e B è:
A x B = {(2, r), (2, s), (2, d), (2, 4), (f, r), (f, s), (f, d), (f, 4), (r, r), (r, s), (r, d), (r,4)}
TREYresearch
166
CrossJoin
Il prodotto cartesiano dell’insieme A e B è:
A x B = {(2, r), (2, s), (2, d), (2, 4), (f, r), (f, s), (f, d), (f, 4), (r, r), (r, s), (r, d), (r,4)}
Come possiamo vedere il prodotto cartesiano fra i due insiemi è dato da tutti gli
elementi di A combinati con ogni elemento di B. Nella rappresentazione delle varie
coppie dobbiamo rispettare l'ordine di apparizione degli elementi,
in quanto l'appartenenza dell'elemento all'insieme è individuabile proprio dalla suo
ordine di apparizione.
TREYresearch
167
CrossJoin
Nell'esempio abbiamo usato solo due insiemi ma il prodotto cartesiano è applicabile
anche a più di due insiemi. Ora considerando che le tabelle non sono altro che insiemi i
cui elementi sono le righe ecco che possiamo individuare l'operazione di CROSS JOIN
equivale al prodotto cartesiano appartenente alle teorie degli insiemi. Dunque il
prodotto cartesiano tra due o più tabelle si traduce in una istruzione chiamata CROSS
JOIN. Il CROSS JOIN si ottiene in maniera molto semplice elencando dopo la FROM le
tabelle che devono essere coinvolte. Vediamo un esempio di CROSS JOIN.
TREYresearch
168
CrossJoin
Per lo scopo usiamo due tabelle: TAB1 e TAB2. Il CROSS JOIN non è particolarmente utile e viene
usato raramente, ma se in una CROSS JOIN si utilizza la clausola WHERE potremmo ottenere join molto più
interessanti.
TAB1
COLONTAB1
RIG1 TAB1
RIG2TAB1
RIG3 TAB1
RIG3 TAB1
RIG4 TAB1
RIG4 TAB1
TAB2
COLONTAB2
RIG1 TAB2
RIG2TAB2
RIG3 TAB2
RIG3 TAB2
RIG4 TAB2
RIG4 TAB2
SELECT *
FROM TAB1, TAB2;
TREYresearch
169
NaturalJoin
Il NATURAL JOIN è un tipo di operazione che ci permette di correlare due o più
tabelle sulla base di valori uguali in attributi contenenti lo stesso tipo di dati. Vediamo
un esempio chiarificatore. Per lo scopo usiamo due tabelle: PERSONE e AUTO. La
tabella AUTO fa riferimento alla persona proprietaria dell'auto attraverso il campo
PROPRIETARIO in cui sono riportati i numeri di patente. Lo stesso tipo di dato è
presente nella tabella PERSONE nel campo PATENTE.
Tabella AUTO Tabella PERSONE
TREYresearch
170
NaturalJoin
Vogliamo ottenere un join delle righe delle due tabelle la dove i valori dei campi
PROPRIETARIO e PATENTE sono uguali .
SELECT *
FROM PERSONE, AUTO
WHERE PATENTE = PROPRIETARIO;
TREYresearch
171
NaturalJoin
Nel caso le due tabelle originarie avessero avuto i campi interessati al join (PATENTE e
PROPRIETARIO) con lo stesso nome in entrambe, avremmo dovuto specificare dopo la
WHERE prima del nome del campo il nome della
tabella a cui facevamo riferimento. Facciamo un esempio considerando le tabelle
PERSONE e AUTO così modificate.
Tabella AUTO Tabella PERSONE
TREYresearch
172
NaturalJoin
E si ottiene con questo codice:
SELECT *
FROM PERSONE, AUTO
WHERE PERSONE.NUM_PATENTE = AUTO.NUM_PATENTE;
TREYresearch
173
InnerJoin
È un tipo di join in cui le righe delle tabelle vengono combinate solo se i campi
collegati con join soddisfano una determinata condizione. Vediamo un esempio.
Vogliamo ottenere un join delle righe delle due tabelle PERSONE e AUTO, la dove i
valori dei campi PROPRIETARIO e PATENTE sono uguali e dove il valore del campo
NOME è uguale ad 'ARTURO'.
TREYresearch
InnerJoin
Esistono anche, delle parole
chiavi specifiche per eseguire
l'operazione di INNER JOIN. Il
risultato che otteniamo è lo
stesso, ma la sintassi usata non è
accettata da SQL Plus 8.0 Oracle,
infatti questa query e quelle
successive in cui appaiono parole
chiave specifiche, sono state
testate utilizzato Microsoft
Access. Usando le parole chiave
specifiche dobbiamo indicare, per
alcuni DBMS come nel caso di
Access, a quale tabella
appartengono i campi. C'è inoltre
da far notare che quello che
segue la clausola ON va messo
tra parentesi se è presente più di
una condizione. 174
TREYresearch
InnerJoin
Vediamo altri esempi. Usando
le parole chiave specifiche,
vogliamo ottenere lo stesso
JOIN che
abbiamo usato come esempio
nel paragrafo del NATURAL
JOIN. Possiamo renderci conto
che questo tipo di join è simile
al natural join;
infatti il natural join è un
particolare caso di inner join.
175
TREYresearch
Aggiungere un piè di pagina 176
OUTERJOIN
Con l'OUTER JOIN è possibile estrapolare anche quei dati, appartenenti ad una delle
tabelle, che non verrebbero estrapolati nei tipi di join visti fino a questo momento.
Infatti OUTER significa esterno; dati esterni al normale tipo
di join. Dobbiamo specificare quale è la tabella di cui vogliamo estrapolare i dati anche se
non soddisfano la condizione di join, questo lo facciamo indicando con LEFT o RIGHT se
la tabella in questione è quella che appare a destra o
a sinistra del comando JOIN.
SELECT . . .
FROM tabella1 [LEFT | RIGHT] JOIN tabella2
ON tabella1.campox condizione tabella2.campoy
TREYresearch
Aggiungere un piè di pagina 177
OUTERJOIN
Con l'OUTER JOIN è possibile estrapolare anche quei dati, appartenenti ad una delle
tabelle, che non verrebbero estrapolati nei tipi di join visti fino a questo momento.
Infatti OUTER significa esterno; dati esterni al normale tipo
di join. Dobbiamo specificare quale è la tabella di cui vogliamo estrapolare i dati anche se
non soddisfano la condizione di join, questo lo facciamo indicando con LEFT o RIGHT se
la tabella in questione è quella che appare a destra o
a sinistra del comando JOIN.
SELECT . . .
FROM tabella1 [LEFT | RIGHT] JOIN tabella2
ON tabella1.campox condizione tabella2.campoy
TREYresearch
OUTERJOIN
Aggiungere un piè di pagina 178
TREYresearch
OUTERJOIN
Aggiungere un piè di pagina 179
TREYresearch
180
SELFJOIN
Il SELF JOIN ci consente di unire una tabella con se stessa. La sintassi è simile a quella
della query vista nel paragrafo che trattava il CROSS JOIN. Vediamo un esempio usando
la tabella TAB2:
TAB2
COLONTAB2
-------------------
RIG1 TAB2
RIG2 TAB2
RIG3 TAB2
SELECT R1.COLONTAB2, R2.COLONTAB2
FROM TAB2 R1, TAB2 R2;
TREYresearch
181
SELFJOIN
R1.COLONTAB2 R2.COLONTAB2
RIG1 TAB2 RIG1 TAB2
RIG2 TAB2 RIG1 TAB2
RIG3 TAB2 RIG1 TAB2
RIG1 TAB2 RIG2 TAB2
RIG2 TAB2 RIG2 TAB2
RIG3 TAB2 RIG2 TAB2
RIG1 TAB2 RIG3 TAB2
RIG2 TAB2 RIG3 TAB2
RIG3 TAB2 RIG3 TAB2
Dalla query si ottiene un prodotto cartesiano. Inoltre, dopo la parola chiave
SELECT siamo costretti a simulare l'esistenza di due tabelle mentre ne abbiamo
una soltanto.
TREYresearch
Aggiungere un piè di pagina 182
SELFJOIN
Dopo la parola chiave FROM faremo riferimento al nome delle colonne e alla tabella a
cui appartengono:
SELECT nomeTabellaInesitente1.nomeColonna,
nomeTabellaInesitente2.nomeColonna
FROM nomeColonna nomeTabellaInesitente1, nomeColonna
nomeTabellaInesitente2
[WHERE condizioni];
TREYresearch
SELFJOIN
Questo tipo di select non è particolarmente utile a meno
che non si utilizzi la clausola where per unire dati che
soddisfano una particolare condizione. Vediamo un
esempio.
La select funziona ma però ci accorgiamo che le coppie
vengono ripetute e
questo non è esattamente quello che volevamo. Come
possiamo risolvere il
problema?
Aggiungere un piè di pagina 183
TREYresearch
Aggiungere un piè di pagina 184
JOIN tra tabelle usando operatori di confronto che non siano il segno uguale (=)
Possiamo usare dopo la clausola WHERE anche tipi di operatori che non siano
l'operatore di uguale (=). In casi del genere il join che si ottiene è abbastanza
inusuale, ma può accadere che si renda necessario eseguire query di questo tipo. La
sintassi, dunque sarà uguale a quella di tutti i join visti in precedenza con la sola
differenza che la dove appare il segno di uguale (=) possiamo usare, al suo posto,
qualsiasi altro operatore di confronto.
TREYresearch
Aggiungere un piè di pagina 185
JOIN su più di due tabelle 1
Come il prodotto cartesiano può essere eseguito su più di due insiemi, anche i vari
tipi di join possono essere applicati a più di due tabelle. Fa eccezione il self join, ma
che comunque può simulare l'esistenza anche di più di due tabelle; vediamo un
esempio senza però visualizzare il risultato della query:
SELECT T1.NOME, T2.NOME, T3.NOME
FROM PERSONE T1, PERSONE T2, PERSONE T3
WHERE . . .
TREYresearch
Aggiungere un piè di pagina 186
JOIN su più di due tabelle 2
Un altro caso particolare è quello dell’OUTER JOIN che per essere applicato a più di
due tabelle ha bisogno di una sintassi particolare; vediamo uno schema generale e
rimandiamo l'approfondimento di tale tipo di sintassi al capitolo seguente.
SELECT . . .
FROM tabella1 [LEFT | RIGHT] JOIN ( specifiche di join
tra altre due o più tabelle)
ON . . .
TREYresearch
Aggiungere un piè di pagina 187
JOIN su più di due tabelle 3
I restanti tipi di join non presentano particolari sintassi o eccezioni ad essere
applicati su più di due tabelle. Vediamo ora un caso di join che si presenta
frequentemente tra tre tabelle: chi conosce bene il modello relazionale sa che non è
possibile 'correlare' due tabelle usando una relazione di tipo molti a molti. In questo
caso si utilizza una terza tabella che contiene come chiavi esterne la chiave primaria
della prima tabella e la chiave primaria della seconda tabella. Nell'esempio seguente
abbiamo la tabella PERSONE correlata con la tabella CONTICORRENTI; il tipo di
relazione è di tipo molti a molti. Infatti una persona può avere più conti correnti e un
conto corrente può appartenere a più persone.
TREYresearch
JOIN su più di due tabelle 4
Aggiungere un piè di pagina 188
TREYresearch
Aggiungere un piè di pagina 189
JOIN su più di due tabelle 5
Se vogliamo visualizzare i dati così correlati usiamo la seguente query:
SELECT . . .
FROM PERSONE, UNIONE, CONTI-CORRENTI
WHERE PERSONE.ID-PERSONA = UNIONE.ID-PERSONA
AND UNIONE.ID-CONTI = CONTI-CORRENTI.ID-CONTI;
Alla select precedente nulla ci impedisce di aggiungere altre condizioni,
magari per poter visualizzare soltanto i conti appartenenti al Sig. Rossi
Antonio.
TREYresearch
Aggiungere un piè di pagina 190
Funzioniaritmetiche1
A volte è necessario che i dati che vengono estrapolati da un database richiedono
delle operazioni matematiche. Molte implementazioni di SQL includono delle funzioni
aritmetiche simili a queste.
ABS Questa funzione calcola il valore assoluto del numero specificato. Vediamo
un esempio:
SELECT ABS(A)VALORE_ASSOLUTO
FROM NUMERI;
VALORE_ASSOLUTO
3,1415
45
5
57,667
15
7,2
TREYresearch
Aggiungere un piè di pagina 191
Funzioniaritmetiche2:CEIL
Questa funzione fornisce il più piccolo numero intero che è maggiore o uguale al suo
argomento. Questa sintassi non è implementata da Access.
SELECT A, CEIL(A) MAX_INTERI
FROM NUMERI;
TREYresearch
Aggiungere un piè di pagina 192
Funzioniaritmetiche3:FLOOR
Questa funzione fornisce il più grande numero intero che è minore o uguale al suo
argomento.
Questa sintassi non è implementata da Access.
SELECT A, FLOOR(A) MINIMI_INTERI
FROM NUMERI;
TREYresearch
Aggiungere un piè di pagina 193
Funzioniaritmetiche5:SIGN
La funzione SIGN restituisce -1 se il suo argomento è minore di zero e restituisce 1 se il
suo argomento è maggiore o uguale a zero. Questa sintassi non è implementata da
Access. Vediamo un esempio:
SELECT A, SIGN(A)
FROM NUMERI;
È possibile anche utilizzare SIGN in una query SELECT . . . WHERE come questa:
SELECT A
FROM NUMERI
WHERE SIGN(A) = 1;
TREYresearch
Aggiungere un piè di pagina 194
Funzionitrigonometriche1:COS
Le funzioni trigonometriche COS, SIN, TAN sono molto utili in applicazioni in cui si
richiede l'uso di tali calcoli. Tutte queste funzioni operano supponendo che l'angolo n
sia espresso in radianti. Queste funzioni, stranamente, sono implementate da Access.
Vediamo alcuni esempi usando la tabella ANGOLI:
SELECT RADIANTI, COS(RADIANTI)
FROM ANGOLI;
TREYresearch
Aggiungere un piè di pagina 195
Funzionitrigonometriche2:SIN
Calcola il seno del parametro passatogli come angolo espresso in radianti:
SELECT RADIANTI, SIN(RADIANTI)
FROM ANGOLI;
TREYresearch
Aggiungere un piè di pagina 196
Funzionitrigonometriche3:TANG
Calcola la tangente del parametro passatogli come angolo espresso in radianti:
SELECT RADIANTI, TAN(RADIANTI)
FROM ANGOLI;
TREYresearch
Aggiungere un piè di pagina 197
Funzionisullepotenze,logaritmieradici1:EXP
Questa funzione permette di elevare e a un esponente (e è una costante matematica
che viene utilizzata in varie formule). Vediamo l’istruzione:
SELECT A, EXP(A)
FROM NUMERI;
TREYresearch
Aggiungere un piè di pagina 198
Funzionisullepotenze,logaritmieradici2:LN
Questa funzione calcola il logaritmo naturale. Questa funzione non è
implementata da Access . Questa è l’istruzione da usare:
SELECT A, LN(A)
FROM NUMERI;
Osservazioni:
• non è possibile determinare un logaritmo di un valore negativo quando la base è
positiva,
• non esiste nessun esponente che elevato ad e (valore positivo) ci da come risultato
un valore negativo.
TREYresearch
Aggiungere un piè di pagina 199
Funzionisullepotenze,logaritmieradici2:LN
Il 'problema' può essere risolto inserendo all'interno della funzione LN la funzione ABS
che ci restituisce i valori assoluti di quelli specificati:
SELECT A, LN(ABS(A))
FROM NUMERI;
TREYresearch
Aggiungere un piè di pagina 200
Funzionisullepotenze,logaritmieradici3:LOG
Questa funzione richiede due argomenti e calcola il logaritmo del secondo avendo
come base il primo. Questa funzione non ci permette, però, di calcolare il logaritmo in
cui la base è negativa, dunque il primo argomento che viene passato alla funzione
dovrà essere sempre maggiore di zero.
SELECT B, LOG(B, 2)
FROM NUMERI;
TREYresearch
Aggiungere un piè di pagina 201
Funzionisullepotenze,logaritmieradici4:POWER
Questa funzione non è implementata da Access. Questa funzione consente di elevare
un numero alla potenza di un altro. Il primo argomento è elevato alla potenza del
secondo.
SELECT A, B, POWER(A, B)
FROM NUMERI;
ERRORE:
ORA-01428: l'argomento '-45' è esterno all'intervallo
TREYresearch
Aggiungere un piè di pagina 202
Funzionisullepotenze,logaritmieradici5:POWER
Sembrerebbe che non sia possibile (matematicamente) elevare un valore negativo ad un
indice frazionario, ma non è così, il problema dunque sussiste forse solamente per SQL
implementato da Oracle.
SELECT A, B, POWER(B, A)
FROM NUMERI;
SQL:Subquery
Un nuovo strumento
Aggiungere un piè di pagina 203
Questa foto di Autore sconosciuto è concesso in licenza da CC BY-SA-NC
TREYresearch
Aggiungere un piè di pagina 204
Checos’èunasubquery?
E’ una query che sta all'interno di un'altra interrogazione. La query interna passa i
risultati alla query esterna che li verifica nella condizione che segue la clausola
WHERE. Ci sono diversi tipi di subquery:
• Subquery che ci restituiscono un solo valore
• Subquery con IN
• Subquery annidate
• EXISTS
• SOME, ANY, ALL
TREYresearch
Aggiungere un piè di pagina 205
Subquerychecirestituisconounsolovalore
Prendiamo ancora come esempio la tabella dipendenti:
TREYresearch
Aggiungere un piè di pagina 206
Subquerychecirestiuisconounsolovalore
Vogliamo conoscere il nome dei dipendenti le cui ferie godute superino la media delle
ferie godute da tutti. Per risolvere il problema, probabilmente, scrivereste questo
codice, che però da un messaggio di errore:
SELECT NOME
FROM DIPENDENTI
WHERE FERIE_GODUTE > AVG(FERIE_GODUTE);
TREYresearch
Aggiungere un piè di pagina 207
Subquerychecirestiuisconounsolovalore
Ecco il messaggio di errore. Perché accade questo ?
TREYresearch
Aggiungere un piè di pagina 208
Subquerychecirestiuisconounsolovalore
La precedente lezione abbiamo imparato che non è possibile far seguire la clausola
WHERE da funzioni di gruppo. Infatti, AVG() è una funzione di gruppo.
TREYresearch
Aggiungere un piè di pagina 209
Subquerychecirestiuisconounsolovalore
Proviamo un’altra strada e vediamo cosa succede con questo codice usando HAVING ?
SELECT NOME
FROM DIPENDENTI
HAVING FERIE_GODUTE > AVG(FERIE_GODUTE);
TREYresearch
Aggiungere un piè di pagina 210
Subquerychecirestiuisconounsolovalore
Anche in questo caso si ha un messaggio di errore. Perché?
TREYresearch
Aggiungere un piè di pagina 211
Subquerychecirestiuisconounsolovalore
• Non è possibile usare la clausola HAVING in espressioni dove non compare la
clausola GROUP BY.
• Inoltre, non è possibile, nella nostra interrogazione, eseguire raggruppamenti.
Per risolvere il problema è necessario inserire dopo clausola WHERE una subquery:
SELECT NOME
FROM DIPENDENTI
WHERE FERIE_GODUTE > (SELECT AVG(FERIE_GODUTE)
FROM DIPENDENTI);
TREYresearch
212
Subquerychecirestiuisconounsolovalore
Questo è il risultato del codice proposto inserendo una subquery dopo la clausola
WHERE.
TREYresearch
213
Subquerychecirestiuisconounsolovalore
È evidente che il risultato della subquery è un unico valore; infatti non è possibile, con
questo tipo di sintassi, estrapolare dalla subquery più di un valore e non è possibile
usare le clausole GROUP BY e HAVING.
Riassumendo elenchiamo delle regole valide per l'utilizzo di questo tipo
di subquery:
• La subquery deve restituire un unico valore
• Nella subquery non possono apparire le clausole GROUP BY e HAVING
• La subquery deve comparire alla destra dell'operatore di confronto
• Non si possono confrontare due subquery (conseguenza della regola
• precedente).
TREYresearch
214
SubqueryconIN
Questo operatore ci consente di estrapolare dalla subquery non un solo valore, ma
più valori da cui verrà verificata la corrispondenza. Per capirne il funzionamento
prendiamo in esame due tabelle.
TREYresearch
215
SubqueryconIN
Nella tabella ISCRITTI sono presenti gli associati ad un club di cacciatori, nella tabella
FAMILIARI sono registrati gli appartenenti alla famiglia di ogni associato. Vogliamo
visualizzare gli associati che hanno almeno un
famigliare. Come fare ?
TREYresearch
216
SubqueryconIN
Nella tabella ISCRITTI sono presenti gli associati ad un club di cacciatori, nella tabella
FAMILIARI sono registrati gli appartenenti alla famiglia di ogni associato. Vogliamo
visualizzare gli associati che hanno almeno un
famigliare. Come fare ?
TREYresearch
217
SubqueryconIN
Come possiamo vedere sono stati estrapolati solo i nominativi Antonio e Giovanni, gli
unici che hanno familiari, dunque la subquery (quella tra parentesi) estrapola una serie
di matricole le quali la dove c'è corrispondenza con le
matricole della prima select la condizione è verificata. Adesso vogliamo visualizzare gli
associati che hanno uno o più figlie.
TREYresearch
218
Subquery annidate
Con il termine annidate si identificano quelle query che si trovano all'interno di
subquery.
SELECT nome campi
FROM nome tabella
WHERE (SUBQUERY condizione (SUBQUERY condizione (SUBQUERY )));
In questa istruzione formale abbiamo inserito tre subquery nella prima select una
dentro l'altra come se fossero scatole cinesi, ma avremo potuto inserirne anche più. La
potenza di una simile struttura è notevole anche se la sua
complessità richiede nella sua applicazione una particolare attenzione e tecnica di
'costruzione’. Consiglio: se possibile evitare di superare il terzo gradi di annidazione.
Ci potrebbero essere problemi durante le fase di debug.
TREYresearch
Subquery
annidate
Ecco un esempio che
consente di comprendere
il tipo di struttura
sintattica visto nella
precedente slide . La
struttura sottostante
rappresenta il database
che conserva le
informazioni inerenti
all'attività che andremo
ad analizzare:
219
TREYresearch
Aggiungere un piè di pagina 220
Subqueryannidate:spiegazionedelmodellomatematico
Si ha una azienda che noleggia auto. L'azienda opera su tutto il territorio nazionale tramite agenzie
presenti nelle maggiori città. Le automobili non possono essere associabili alle singole agenzie e il loro
costo di noleggio
dipende oltre che dalla categoria dell'auto (utilitaria, sport, gran turismo, ecc.) anche dall'agenzia da
dove è stata noleggiata: una automobile noleggiata all'agenzia di Milano costa di più della stessa
automobile noleggiata tramite
l'agenzia di Catania.
Nello schema si vedono tre tabelle; la tabella Agenzie è associata alla tabella Auto tramite la tabella
Unione. Questo tipo di struttura è necessaria per far fronte al tipo di relazione, molti a molti, che si ha tra
una agenzia e un'auto.
Infatti la stessa auto viene associata a tutte le agenzie e ad una agenzia associamo tutte le auto; in
questo modo per mezzo dell'attributo tariffa sappiamo il costo di ogni auto noleggiata per ogni agenzia.
Supponiamo ora che vogliamo conoscere il nome delle agenzie che applicano una tariffa inferiore alle
100 € per automobili di categoria sport.
TREYresearch
Aggiungere un piè di pagina 221
Subqueryannidate:spiegazionedelmodellomatematico
Si ha una azienda che noleggia auto. L'azienda opera su tutto il territorio nazionale tramite agenzie
presenti nelle maggiori città. Le automobili non possono essere associabili alle singole agenzie e il loro
costo di noleggio
dipende oltre che dalla categoria dell'auto (utilitaria, sport, gran turismo, ecc.) anche dall'agenzia da
dove è stata noleggiata: una automobile noleggiata all'agenzia di Milano costa di più della stessa
automobile noleggiata tramite
l'agenzia di Catania.
Nello schema si vedono tre tabelle; la tabella Agenzie è associata alla tabella Auto tramite la tabella
Unione. Questo tipo di struttura è necessaria per far fronte al tipo di relazione, molti a molti, che si ha tra
una agenzia e un'auto.
Infatti la stessa auto viene associata a tutte le agenzie e ad una agenzia associamo tutte le auto; in
questo modo per mezzo dell'attributo tariffa sappiamo il costo di ogni auto noleggiata per ogni agenzia.
Supponiamo ora che vogliamo conoscere il nome delle agenzie che applicano una tariffa inferiore alle
100 € per automobili di categoria sport.
TREYresearch
Aggiungere un piè di pagina 222
Subqueryannidate:programmazionemodulare
Per facilitare la programmazione è consigliabile sviluppare più moduli che svolgono
operazioni singole. Ovvero, programmare con i concetti della programmazione
modulare.
Iniziamo dalla selezione delle automobili di tipo sport:
SELECT TARGA
FROM AUTO
WHERE CATEGORIA = 'sport’ ;
Questa query la chiameremo Q1.
TREYresearch
Aggiungere un piè di pagina 223
Subqueryannidate:programmazionemodulare2
Continuiamo selezionando le tariffe che soddisfano le condizioni del quesito:
SELECT ID_AGENZIA
FROM UNIONE
WHERE TARGA IN (Q1)
AND TARIFFA < 100;
Questa query la chiamiamo Q2.
TREYresearch
Aggiungere un piè di pagina 224
Subqueryannidate:programmazionemodulare3
A questo punto abbiamo a disposizione i codici delle agenzie che soddisfano il nostro
quesito, ma non abbiamo ancora a disposizione i nomi di tali agenzie. Inoltre i codici
delle agenzie sono inutilmente ripetuti più volte, dunque la successiva query che
soddisfa completamente il quesito è:
SELECT NOME_AGENZIA
FROM AGENZIE
WHERE ID_AGENZIA IN (Q2);
TREYresearch
Aggiungere un piè di pagina 225
Subqueryannidate:programmazionemodulare3
Vediamo ora la query scritta in modo completo:
SELECT NOME_AGENZIA
FROM AGENZIE
WHERE ID_AGENZIA IN
(SELECT ID_AGENZIA
FROM UNIONE
WHERE TARGA IN
(SELECT TARGA
FROM AUTO
WHERE CATEGORIA = 'SPORT';)
AND TARIFFA < 100000;);
TREYresearch
Aggiungere un piè di pagina 226
Subqueryannidate:programmazionemodulare4
Considerando il modo in cui abbiamo costruito questa interrogazione, possiamo
renderci conto che la maniera migliore per effettuare la lettura e comprensione di una
query di questo tipo, è iniziare ad analizzare le subquery più interne e man mano
passare a quelle più esterne. Questa considerazione è importante ed è valida anche per
la scrittura della query. In quest'ultimo caso però, decidere quale sarà la subquery più
interna è difficile, comunque sia dobbiamo affidarci non tanto a delle eventuali regole
assiomatiche, ma alla nostra logica che se utilizzata con rigore non può tradirci.
TREYresearch
Aggiungere un piè di pagina 227
Subquery:EXISTS
Sempre dalla tabella DIPENDENTI:
TREYresearch
Subquery:EXISTS
Vogliamo estrapolare tutti i dati di
NOME e DIVISIONE da questa
tabella solo se e soltanto se è
presente il nominativo Neri.
Da questa interrogazione i dati
vengono estrapolati perché essendo
presente la stringa 'NERI' la parola
chiave EXISTS restituisce il valore true.
Nel caso la stringa 'NERI' non fosse
stato presente la parola chiave EXISTS
avrebbe restituito false e in questo
caso l'interrogazione non avrebbe
visualizzato nessun valore.

Mais conteúdo relacionado

Semelhante a Guida SQL: le basi per iniziare a programmare i database

Semelhante a Guida SQL: le basi per iniziare a programmare i database (20)

Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
 
MySQL
MySQLMySQL
MySQL
 
Basi Di Dati 01
Basi Di Dati 01Basi Di Dati 01
Basi Di Dati 01
 
Database relazionali
Database relazionaliDatabase relazionali
Database relazionali
 
No Sql Intro
No Sql IntroNo Sql Intro
No Sql Intro
 
Basi di dati
Basi di dati Basi di dati
Basi di dati
 
Dbms
DbmsDbms
Dbms
 
Database Data Aggregator
Database Data AggregatorDatabase Data Aggregator
Database Data Aggregator
 
Presentazione bd2
Presentazione bd2Presentazione bd2
Presentazione bd2
 
MongoDB
MongoDBMongoDB
MongoDB
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
 
6. I protocolli SBN
6. I protocolli SBN6. I protocolli SBN
6. I protocolli SBN
 
Data base elvira asile
Data base elvira asileData base elvira asile
Data base elvira asile
 
3 database dbms
3 database dbms3 database dbms
3 database dbms
 
noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]
 
DATABASE (Basi di dati)
DATABASE (Basi di dati)DATABASE (Basi di dati)
DATABASE (Basi di dati)
 
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
 
Hosting: gli indici SQL, cosa sono e come funzionano #TipOfTheDay
Hosting: gli indici SQL, cosa sono e come funzionano  #TipOfTheDayHosting: gli indici SQL, cosa sono e come funzionano  #TipOfTheDay
Hosting: gli indici SQL, cosa sono e come funzionano #TipOfTheDay
 
Appunti di big data
Appunti di big dataAppunti di big data
Appunti di big data
 
Database introduzione
Database introduzioneDatabase introduzione
Database introduzione
 

Mais de BTF Traduzioni SEO Sviluppo Web

Come aumentare visibilità sito web con SEMrush con SEMrush.pdf
Come aumentare visibilità sito web con SEMrush con SEMrush.pdfCome aumentare visibilità sito web con SEMrush con SEMrush.pdf
Come aumentare visibilità sito web con SEMrush con SEMrush.pdf
BTF Traduzioni SEO Sviluppo Web
 
Come creare un sito web gratis con Google Sites in 10 step
Come creare un sito web gratis con Google Sites in 10 stepCome creare un sito web gratis con Google Sites in 10 step
Come creare un sito web gratis con Google Sites in 10 step
BTF Traduzioni SEO Sviluppo Web
 
Come deve essere fatto un sito web: guida completa
Come deve essere fatto un sito web: guida completaCome deve essere fatto un sito web: guida completa
Come deve essere fatto un sito web: guida completa
BTF Traduzioni SEO Sviluppo Web
 

Mais de BTF Traduzioni SEO Sviluppo Web (13)

SEMrush 14 passaggi per il posizionamento Google .pdf
SEMrush 14 passaggi per il posizionamento Google .pdfSEMrush 14 passaggi per il posizionamento Google .pdf
SEMrush 14 passaggi per il posizionamento Google .pdf
 
Come aumentare visibilità sito web con SEMrush con SEMrush.pdf
Come aumentare visibilità sito web con SEMrush con SEMrush.pdfCome aumentare visibilità sito web con SEMrush con SEMrush.pdf
Come aumentare visibilità sito web con SEMrush con SEMrush.pdf
 
Come creare un sito web gratis con Google Sites in 10 step
Come creare un sito web gratis con Google Sites in 10 stepCome creare un sito web gratis con Google Sites in 10 step
Come creare un sito web gratis con Google Sites in 10 step
 
Come progettare un sito web: 8 passi un sito che vende
Come progettare un sito web: 8 passi un sito che vendeCome progettare un sito web: 8 passi un sito che vende
Come progettare un sito web: 8 passi un sito che vende
 
Come deve essere fatto un sito web: guida completa
Come deve essere fatto un sito web: guida completaCome deve essere fatto un sito web: guida completa
Come deve essere fatto un sito web: guida completa
 
106 Motori di ricerca alternativi a Google per la SEO
106 Motori di ricerca alternativi a Google per la SEO106 Motori di ricerca alternativi a Google per la SEO
106 Motori di ricerca alternativi a Google per la SEO
 
Come creare siti web gratis nel 2024: guida per principianti
Come creare siti web gratis nel 2024: guida per principiantiCome creare siti web gratis nel 2024: guida per principianti
Come creare siti web gratis nel 2024: guida per principianti
 
Link buiding i parametri importanti
Link buiding i parametri importantiLink buiding i parametri importanti
Link buiding i parametri importanti
 
Lettera formale inglese
Lettera formale ingleseLettera formale inglese
Lettera formale inglese
 
Generatore follower Instagram gratis.pdf
Generatore follower Instagram gratis.pdfGeneratore follower Instagram gratis.pdf
Generatore follower Instagram gratis.pdf
 
Posizionamento Google Volume 1
Posizionamento Google Volume 1Posizionamento Google Volume 1
Posizionamento Google Volume 1
 
Growth Hacking Anteprima
Growth Hacking Anteprima Growth Hacking Anteprima
Growth Hacking Anteprima
 
Banner pubblicitari dimensioni
Banner pubblicitari dimensioniBanner pubblicitari dimensioni
Banner pubblicitari dimensioni
 

Guida SQL: le basi per iniziare a programmare i database

  • 1. TREYresearch Programmatore: Barbieri Andrea Cell: 3296664935 Email: btftraduzioniseoweb@gmail.com Pagina Linkedin https://www.linkedin.com/in/andrea-barbieri/ Sito web: https://btftraduzioniseoweb.altervista.org Programmatore, web designer, traduttore. 1
  • 3. TREYresearch Lanostramissione Imparare le basi del linguaggio SQL 3 QuestafotodiAutoresconosciutoè concessoinlicenzadaCCBY-NC-ND
  • 5. TREYresearch 5 SQL appartiene alla famiglia dei linguaggi di gestione dei database. Ed è il linguaggio più utilizzato e diffuso nel mondo.
  • 6. TREYresearch Checosaèun database? E’ un archivio di dati strutturati che consente in modo pratico di gestire i dati al suo interno. Tutto ciò consente l’aggiornamento delle informazioni (inserire nuovi dati, cancellare dati oppure cercare dati). 6
  • 7. TREYresearch 7 Abbiamo detto che SQL è un linguaggio. Ma cosa s’intende per linguaggio ? In informatica un linguaggio è composto da un insieme finito di simboli.
  • 8. TREYresearch 8 Conosciamo meglio SQL SQL, la cui pronuncia è Sequel, rappresenta l’acronimo Structured Query Language. SQL è un linguaggio di programmazione per database.
  • 9. TREYresearch AbbiamodettocheSQLèun linguaggiodi programmazione. Ma cos’è un linguaggio di programmazione ? 9 Questa foto di Autore sconosciuto è concesso in licenza da CC BY
  • 10. TREYresearch 10 Un linguaggio di programmazione è composto da un serie di istruzioni che restituiscono un output all’utente.
  • 11. TREYresearch 11 SQL è un linguaggio usato per creare: • trasformare e recuperare informazioni in un RDBMS (Relational Database Management System). Più semplicemente definito come Sistema per la Gestione dei Database Relazionali.
  • 12. TREYresearch 12 Esempio di una Tabella in RDBMS
  • 13. TREYresearch 13 I requisiti minimi per il sistema RDBMS sono: - deve presentare i dati all'utente sotto forma di relazioni (una presentazione a tabelle può soddisfare questa proprietà) - deve fornire operatori relazionali per manipolare i dati in forma tabellare.
  • 14. TREYresearch 14 Il sistema RDBMS è stato sviluppato negli anni 70 dall’informatico Edgar F. Cood. Ed ha definito il modello matematico. Il sistema viene gestito grazie ad applicazioni come SQL Server Express.
  • 16. TREYresearch 16 Il linguaggio di programmazione SQL consente: • creare e modificare schemi di database; • Inserire, modificare e gestire i dati memorizzati; • Interrogare i dati memorizzati; • creare e gestire strumenti di controllo; • e accesso a tutti i dati sopra citati; Che cosa abbiamo capito fin qui ? SQL non è solamente un query language, ma ha anche funzioni di gestione e controllo di database tipiche di altri linguaggi di programmazione
  • 17. TREYresearch 17 La query language è un linguaggio d’interrogazione per implementare query (ricerche) sul database da parte degli utenti. Ha lo scopo di rendere possibile l’estrazione di informazioni dal database, attraverso il RDBMS, interrogando la base dati. Ed interfacciandosi con l’utente e le sue richieste. Questa foto di Autore sconosciuto è concesso in
  • 18. TREYresearch SQL:lastoria1 SQL nasce nel 1974. Presso i laboratori della IBM negli Stati Uniti. Ad opera di Donald Chamberlin. All’inizio doveva servire per gestire i database relazionali. E per sostituire l’ormai obsoleto SEQUEL. 18
  • 19. TREYresearch SQL:lastoria2 Ci vollero degli anni, affinché questo linguaggio di programmazione per database risultasse completo. Solo nel 1986 venne adottato come standard dall’ANSI. 19
  • 20. TREYresearch SQL:lastoria3 Nel 1987 anche l’International Standardization Organization lo adottò come sandard. Da questo momento SQL divenne ufficialmente il linguaggio predefinito per i sistemi di gestione di database relazionali RDBSM. 20
  • 21. TREYresearch SQL:lastoria4 In circa 30 anni di vita, SQL ha avuto molti aggiornamenti e migliorie. Che gli hanno consentito di rimanere sempre al passo con le nuove tecnologie. 21
  • 22. TREYresearch SQL:RBDSM1 RDBSM è l’acronimo Relational Database Management System. E per comprendere ogni aspetto di SQL è necessario capire cosa sono. 22
  • 23. TREYresearch SQL:RBDSM1 In un sistema razionale, tutti i dati sono rappresentati come relazioni e manipolati con gli operatori dell’algebra relazionale. Che cosa è un database relazionale ? 23
  • 24. TREYresearch SQL:RBDSM2 Un database relazionale è un insieme di relazioni che contengono dei valori. E il risultato di ogni interrogazione posta al database stesso è a sua volta una relazione. 24
  • 25. TREYresearch SQL:RBDSM3 Quindi, RBDSM è un sistema di gestione di basi di dati (database). Ed il suo comportamento si fonda sui principi dell’algebra relazionale. 25
  • 26. TREYresearch SQL:RBDSM4 Grazie alla sua semplicità di uso questi sistemi si sono diffusi in: • economia e finanza; • nella gestione delle risorse. Andando a sostituire altri sistemi come quello gerarchico e reticolare. 26
  • 27. TREYresearch 27 Che cosa è un database di tipo gerarchico ? 1 Un database gerarchico è un insieme di archivi. Gli archivi sono composti da record chiamati segmenti. I segmenti sono in rapporto gerarchico tra loro attraverso legami di tipo padre-figlio.
  • 28. TREYresearch 28 Che cosa è un database di tipo gerarchico ? 2 La struttura ad albero che caratterizza il modello gerarchico si basa sulla possibilità di individuare un segmento principale, il padre o la radice, dal quale dipendono n segmenti figli, che a loro volta si trasformano in padri per altri figli e così via. A questi, in virtù della totale dipendenza dal padre, è possibile fare riferimento solo attraverso il passaggio dal nodo principale. Non è possibile dal figlio risalire al padre
  • 29. TREYresearch 29 Che cosa è un database di tipo gerarchico ? 3 Questa architettura mal si adatta ad una gestione moderna e dinamica delle basi di dati.
  • 30. TREYresearch 30 Che cosa è un database di tipo reticolare ? 1 Il modello gerarchico rappresenta una prima soluzione al problema della gestione di grosse moli di dati ma la sua intrinseca rigidità ne limita la potenzialità; per questo, nasce il modello reticolare che dotato di maggiore flessibilità, può adattarsi a situazioni più complesse. Il modello reticolare può essere visto come un’estensione del modello gerarchico, a cui sono apportati importanti miglioramenti. • In una struttura gerarchica un segmento figlio può avere solo un segmento padre; non è così nel modello reticolare; • ogni record può avere un numero qualsiasi di record subordinati e di record precedenti; • le correlazioni vengono espresse attraverso record particolari, chiamati record di collegamento (member), che formano delle catene tra le varie parti del sistema.
  • 31. TREYresearch 31 Che cosa è un database di tipo reticolare ? 2 Le strutture utilizzate nel modello reticolare sono due, il record (si pensi ai comuni file) e il set, che permette di correlare i record, per mezzo di catene di puntatori. Dunque una base di dati reticolare è definita con riferimento ad uno schema, che contiene tipi record collegati fra loro da tipo set.
  • 32. TREYresearch SQL:lecaratteristiche 1 Lo Structured Query Language è un linguaggio di programmazione dichiarativo, in cui non è necessario implementare una serie di operazioni. Ma è necessario e sufficiente dichiarare le proprietà logiche delle informazioni che s’intende cercare. 32
  • 33. TREYresearch 33 Che cosa è un linguaggio di programmazione dichiarativo ? 1 I linguaggi dichiarativi (o logici) hanno la caratteristica che le istruzioni rappresentano delle clausole capaci di definire una relazione che esiste tra i dati. Ed in modo contestuale tra i dati ed il risultato desiderato. In questo caso, le esecuzioni non avranno un ordine specifico. Infatti, il compito dell’elaborazione è affidato ad un interprete e non alla sintassi del linguaggio. Un semplice esempio di linguaggio dichiarativo potrebbe essere la seguente istruzione SQL:
  • 34. TREYresearch 34 Che cosa è un linguaggio di programmazione dichiarativo ? 2 In pratica, quello dichiarativo è un paradigma attraverso il quale è possibile “dichiarare” la natura del risultato atteso, non la procedura che un elaboratore dovrà seguire per ottenerlo, come accade nei linguaggi imperativi.
  • 35. TREYresearch SQL:lecaratteristiche 2 Questo linguaggio consente di interrogare e gestire i database. Per mezzo di costrutti di programmazione denominati query. In questo modo è possibile leggere, modificare e cancellare i dati presenti nel database, oltre a esercitare funzioni gestionali e amministrative sul sistema di database stesso. 35
  • 36. TREYresearch SQL:lastruttura Lo SQL si compone di cinque parti fondamentali: 1. Data Definition Language 2. Data Manipulation Language 3. Data Control Language 4. Query language 5. Device Media Control Language 36
  • 37. TREYresearch 37 Struttura di SQl 1. Data Definition Language: permette di creare o cancellare database o modificarne la struttura; 2. Data Manipulation Language: permette di inserire, cancellare e modificare dati; 3. Data Control Language: permette di gestire gli accessi e i permessi dei vari utenti del database 4. Query language: permette di interrogare il database; 5. Device Media Control Language: permette di amministrare i supporti dove vengono salvati i dati.
  • 38. TREYresearch Introduzioneallequery Gli elementi del linguaggio SQL per la programmazione di un data base. 38 QuestafotodiAutoresconosciutoè concessoinlicenzadaCCBY-NC-ND Questa foto di Autore sconosciuto è concesso in licenza da CC BY-SA-NC
  • 39. TREYresearch 39 Introduzione alle query: Prime elementari regole 1 La sintassi del linguaggio SQL è abbastanza flessibile, sebbene ci siano delle regole da rispettare come in qualsiasi linguaggio di programmazione. SELECT COGNOME, NOME FROM PRESIDENTE WHERE COGNOME = ‘Mattarella’ In questo esempio tutti i caratteri, a parte ‘Mattarella', sono scritti in maiuscolo, ma non deve essere necessariamente così.
  • 40. TREYresearch 40 Introduzione alle query: Prime elementari regole 2 Avremmo potuto anche scrivere così: select cognome, nome from presidente where cognome = ‘Mattarella’ Dobbiamo osservare che: ‘Mattarella' è scritto sempre nello stesso modo. Note Bene: i riferimenti ai contenuti di un database devono essere scritti con lo stesso tipo di caratteri in cui sono stati registrati.
  • 41. TREYresearch 41 Introduzione alle query: Prime elementari regole 2 Che cosa significa tutto ciò ? Significa che le istruzioni del linguaggio non sono case sensitive. Quindi, il linguaggio riconosce le istruzioni con ogni tipo di scrittura
  • 42. TREYresearch 42 Introduzione alle query: Prime elementari regole 2 Ogni linguaggio di programmazione ha le sue parole chiavi. Le parole chiavi determinano l’azione desiderata del programmatore. Abbiamo usato nel precedente esempio queste parole chiavi per determinare la query: • SELECT • FROM • WHERE 'cognome' e 'nome' sono dei campi e 'presidente' è una tabella. Quindi il comando recita: seleziona visualizzandoli, i campi cognome e nome della tabella presidente la dove cognome = ‘Mattarella'.
  • 43. TREYresearch 43 Introduzione alle query: Prime elementari regole 3 Istruzione select*. Abbiamo una tabella di tipo Assegni. Assegno Beneficiari Importo Note 1 Computer Shop 500 euro Stampante 2 Assicurazioni Asso 1000 euro Assicurazione auto 3 SNAM 700 euro Riscaldamento casa 4 Supermarket GS 600 euro Alimentari 5 Scuola 600 euro Scuola di musica Assegni
  • 44. TREYresearch 44 Introduzione alle query: Prime elementari regole 3 Usiamo l’istruzione select* from Assegni. E si ottiene questa tabella. L'asterisco (*) di select * indica al database di fornire tutte le colonne associate alla tabella specificata dalla clausola FROM. Assegno Beneficiari Importo Note 1 Computer Shop 500 euro Stampante 2 Assicurazioni Asso 1000 euro Assicurazione auto 3 SNAM 700 euro Riscaldamento casa 4 Supermarket GS 600 euro Alimentari 5 Scuola 600 euro Scuola di musica
  • 45. TREYresearch 45 Introduzione alle query: Prime elementari regole 5 Selezionare le colonne o cambiare l'ordine di apparizione: dalla tabella precedente. Con l’espressione: select Importo, Assegno from Assegni; Importo Assegno 500 € 1 1000 € 2 700 € 3 600 € 4 600 € 5
  • 46. TREYresearch 46 Introduzione alle query: Prime elementari regole 6 Clausola DISTINCT (query senza duplicati): dalla tabella precedente. Con l’espressione: select distinct Importo from Assegni; Esaminando il contenuto del campo importo della tabella di nome Assegni si hanno due valori uguali. Infatti, 600 € appare due volte. E’ possibile visualizzare questa colonna facendo comparire i risultati ripetuti una sola volta. Importo 500 € 1000 € 700 € 600 €
  • 47. TREYresearch 47 Introduzione alle query: Prime elementari regole 7 Altro esempio. Analizziamo la tabella. Nome Cognome Materia Lara Bianco Italiano Lara Bianco Storia Mario Guidi Diritto Mario Guidi Economia Anna Rossi Matematica Docenti
  • 48. TREYresearch 48 Introduzione alle query: Prime elementari regole 8 Con l’espressione: SELECT Nome, Cognome FROM DOCENTI; Si ottiene questa tabella: DOCENTI Nome Cognome Lara Bianco Mario Guidi Anna Rossi
  • 49. TREYresearch Espressionieoperatori condizionali Condizioni Tutte le volte che si vuole trovare un particolare elemento o gruppo di elementi in un database, occorre specificare una o più condizioni. Le condizioni sono introdotte dalla clausola WHERE. 49
  • 50. TREYresearch 50 Prendiamo in esame questa tabella: Studenti Nome Cognome Anno Classe Sezione Mario Bianchi 1976 1 A Anna Bianco 1973 2 B Marta Carli 1976 3 A Gianni Rossi 1972 4 A Giulio Mancini 1972 5 A Max Zunini 1976 6 B Si richiede di estrarre i seguenti dati dalla tabella Studenti: 1. La prima condizione Classe = 5 2. La seconda condizione è Sezione = ‘A’ Qual è il codice sorgente di questa query ? Mostrare anche la nuova tabella.
  • 51. TREYresearch 51 Prendiamo in esame questa tabella: Studenti Nome Cognome Anno Classe Sezione Mario Bianchi 1976 1 A Anna Bianco 1973 2 B Marta Carli 1976 3 A Gianni Rossi 1972 4 A Giulio Mancini 1972 5 A Max Zunini 1976 6 B SELECT * FROM Studenti WHERE Classe = 5 AND Sezione = 'A';
  • 52. TREYresearch OperatoriAritmetici Condizioni Sono gli operatori aritmetici: + (somma), - (sottrazione), / (divisione), * (moltiplicazione). 52
  • 53. TREYresearch 53 Prendiamo in esame questa tabella: operatore somma + Prezzo Si richiede di estrarre i seguenti dati dalla tabella Prezzo aggiungendo a PrezzoIngrosso 150. Qual è il codice sorgente di questa query ? Mostrare anche il risultato della tabella. Elemento PrezzoIngrosso Pomodori 340 Patate 510 Banane 670 Rape 450 Arance 890 Mele 230
  • 54. TREYresearch 54 Prendiamo in esame questa tabella: l'operatore + aggiunge 150 lire a ogni prezzo e genera la seguente tabella. Prezzo SELECT Elemento, PrezzoIngrosso, PrezzoIngrosso + 150 FROM Prezzo; Elemento PrezzoIngrosso PrezzoIngrosso+150 Pomodori 340 490 Patate 510 660 Banane 670 820 Rape 450 600 Arance 890 1040 Mele 230 380
  • 55. TREYresearch 55 Prendiamo in esame questa tabella: operatore sottrazione - L'operatore meno svolge due funzioni: 1. cambiare il segno a un numero, 2. sottrarre i valori di una colonna da quelli di un'altra colonna. Vediamo il primo caso: MinMax Regione TempMin TempMax Piemonte -4 10 Toscana 4 13 Sicilia 10 19 Lombardia -2 9 Friuli -3 8
  • 56. TREYresearch 56 Prendiamo in esame questa tabella: operatore sottrazione - Si desidera ottenere una tabella dove valori di entrambe le colonne hanno cambiato di segno. Questa è la tabella che si ottiene: MinMax Regione TempMin TempMax Piemonte 4 -10 Toscana -4 -13 Sicilia -10 -19 Lombardia 2 -9 Friuli 3 -8 Scrivere il codice SQL che effettua quest’operazione.
  • 57. TREYresearch 57 Prendiamo in esame questa tabella: operatore sottrazione - MinMax Regione TempMin TempMax Piemonte 4 -10 Toscana -4 -13 Sicilia -10 -19 Lombardia 2 -9 Friuli 3 -8 SELECT REGIONE, -TEMPMIN, -TEMPMAX FROM MINMAX;
  • 58. TREYresearch 58 Prendiamo in esame questa tabella: operatore sottrazione - Vediamo il secondo caso: sottrarre i valori di una colonna da quelli di un'altra colonna. Ecco un’altra tabella: MinMax Regione Differenza Piemonte 14 Toscana 9 Sicilia 9 Lombardia 11 Friuli 11 SELECT REGIONE, (TEMPMAX - TEMPMIN) Differenza FROM MINMAX;
  • 59. TREYresearch 59 Prendiamo in esame questa tabella: operatore divisione / Prezzo Elemento PrezzoIngrosso Pomodori 340 Patate 510 Banane 670 Rape 450 Arance 890 Mele 230 Abbiamo la necessita di vendere a metà prezzo.
  • 60. TREYresearch 60 Prendiamo in esame questa tabella: operatore divisione / Prezzo L’algoritmo che risolve il problema è: (PrezzoIngrosso/2) Elementi PrezzoIngrosso PrezzoVendita Pomodori 340 170 Patate 510 255 Banane 670 335 Rape 450 225 Arance 890 445 Mele 230 115
  • 61. TREYresearch Operatoridiconfronto Condizioni L’operatori di confronto = confrontano di dati di una tabella alla ricerca dell’informazione desiderata dall’utente. 61
  • 62. TREYresearch 62 L'operatore (=): dalla seguente tabella vogliamo estrapolare tutti i dati dell'amico Mario Amici Nome Cognome Telefono Giovanni Bruni 0763 546432 Antonio Rossi 06 756499 Mario Rossi 02 435591 Piero Bianchi 06 326799 SELECT * FROM AMICI WHERE NOME = 'Mario';
  • 63. TREYresearch 63 L'operatore (=): dalla seguente tabella vogliamo estrapolare tutti i dati dell'amico Mario Amici Nome Cognome Telefono Mario Rossi 02 435591 SELECT * FROM AMICI WHERE NOME = 'Mario';
  • 64. TREYresearch Operatorirelazionali Condizioni Gli operatori: maggiore (>) , maggiore o uguale (>=), minore (<), minore o uguale (<=), diverso (<>). 64
  • 65. TREYresearch 65 Questi operatori si usano allo stesso modo di come si usa l'operatore di uguaglianza. Vediamo alcuni esempi: Anangrafica Nome Cognome Eta Giovanni Bruni 55 Antonio Rossi 43 Mario Rossi 49 Piero Bianchi 37 Voglio sapere chi ha più di 44 anni SELECT * FROM ANAGRAFICA WHERE Eta > 44;
  • 66. TREYresearch 66 Si ottiene questa tabella: Anangrafica Nome Cognome Eta Giovanni Bruni 55 Mario Rossi 49 Voglio sapere chi ha più di 44 anni SELECT * FROM ANAGRAFICA WHERE Eta > 44;
  • 67. TREYresearch 67 Adesso voglio sapere chi ha un'età diversa da 55 anni: Anangrafica Nome Cognome Eta Giovanni Bruni 55 Antonio Rossi 43 Mario Rossi 49 Piero Bianchi 37 Voglio sapere chi ha più di 44 anni SELECT * FROM ANAGRAFICA WHERE Eta <> 55;
  • 68. TREYresearch 68 Si ottiene questa tabella: Anangrafica Nome Cognome Eta Antonio Rossi 43 Mario Rossi 49 Piero Bianchi 37 Voglio sapere chi ha più di 44 anni SELECT * FROM ANAGRAFICA WHERE Eta <> 55;
  • 69. TREYresearch OperatoreIS Condizioni Modifichiamo ora la tabella Anagrafica inserendo un altro nominativo di cui però non sappiamo l'età. In questo caso nel campo Eta verrà inserito in maniera 'automatica' il valore NULL che identifica l'assenza di dati. 69
  • 70. TREYresearch 70 Modifichiamo ora la tabella Anagrafica inserendo un altro nominativo di cui però non sappiamo l'età. In questo caso nel campo Eta verrà inserito in maniera 'automatica' il valore NULL che identifica l'assenza di dati: Anangrafica Nome Cognome Eta Giovanni Bruni 55 Antonio Rossi 43 Mario Rossi 49 Piero Bianchi 37 Esmeralda Carli SELECT * FROM ANAGRAFICA WHERE Eta IS NULL;
  • 71. TREYresearch 71 Modifichiamo ora la tabella Anagrafica inserendo un altro nominativo di cui però non sappiamo l'età. In questo caso nel campo Eta verrà inserito in maniera 'automatica' il valore NULL che identifica l'assenza di dati: Anangrafica Nome Cognome Eta Giovanni Bruni 55 Antonio Rossi 43 Mario Rossi 49 Piero Bianchi 37 Esmeralda Carli SELECT * FROM ANAGRAFICA WHERE Eta IS NULL;
  • 72. TREYresearch 72 E si ottiene: Anangrafica Nome Cognome Eta Esmeralda Carli SELECT * FROM ANAGRAFICA WHERE Eta IS NULL; Versione equivalente del operatore IS: L'operatore IS funziona con la clausola NULL, ma possiamo sostituirlo anche con l'operatore (=): WHERE Eta = NULL;
  • 73. TREYresearch Operatoridicaratteri Condizioni Gli operatori di caratteri possono essere utilizzati per manipolare il modo in cui le stringhe devo essere ricercate. 73
  • 74. TREYresearch 74 È possibile estrarre da un database quei dati che assomigliano a un certo schema, senza essere perfettamente identici allo schema specificato. Vediamo qualche esempio: Anatomia Nome Posizione Fegato DestraAddome Cuore Petto Faringe Gola Vertebre CentroDorso Incudine Orecchio Rene Dorso SELECT * FROM ANATOMIA WHERE Posizione LIKE '%Dorso%';
  • 75. TREYresearch 75 È possibile estrarre da un database quei dati che assomigliano a un certo schema, senza essere perfettamente identici allo schema specificato. Vediamo qualche esempio: Anatomia Nome Posizione Vertebre CentroDorso Rene Dorso SELECT * FROM ANATOMIA WHERE Posizione LIKE '%Dorso%'; Si noti l'uso del segno '%' dopo LIKE. Esso rappresenta zero, uno o più caratteri. Il corrispondente carattere implementato da Access è '*'.
  • 76. TREYresearch 76 In questo altro esempio sono prese in considerazione le righe in cui i dati iniziano con F: Anatomia Nome Posizione Fegato DestraAddome Faringe Gola SELECT * FROM Anatomia WHERE Posizione LIKE ‘F%';
  • 77. TREYresearch 77 È possibile estrarre da un database quei dati che assomigliano a un certo schema, senza essere perfettamente identici allo schema specificato. Vediamo qualche esempio: Anatomia Nome Posizione Vertebre CentroDorso Rene Dorso SELECT * FROM ANATOMIA WHERE Posizione LIKE '%Dorso%'; Si noti l'uso del segno '%' dopo LIKE. Esso rappresenta zero, uno o più caratteri. Il corrispondente carattere implementato da Access è '*'.
  • 78. TREYresearch 78 Vediamo un altro esempio: Nominativi Nome Cognome Provincia Giovanni Bruni CO Antonio Rossi Mi Mario Rossi CT Piero Bianchi PV SELECT * FROM Nominativi WHERE Provincia LIKE 'C_';
  • 79. TREYresearch 79 E si ottiene: Nominativi Nome Posizione Nome Cognome Provincia Giovanni Bruni CO Mario Rossi CT SELECT * FROM Nominativi WHERE Provincia LIKE 'C_'; Il carattere di sottolineatura (_) è un carattere che sostituisce un singolo carattere e non il carattere spazio. Il suo corrispettivo implementato da Access è '?'. Access implementa anche il segno '#' che sostituisce qualsiasi singola cifra (0, 1, 2, 3, ecc,).
  • 80. TREYresearch Operatoridiconcatenazione Condizioni Il simbolo || serve a concatenare due stringhe. Il corrispettivo operatore che si usa con Access è '&'. 80
  • 81. TREYresearch 81 Vediamo alcuni esempi: Amici Cognome Nome Telefono Provincia CAP Rossi Alessandra 0761 556632 BG 01023 Verdi Alessandra 02 345622 Mi 03456 Merilli Titti 0732 433388 CO 01255 Banfi Barby 0722 114381 BR 03367 Persiani Maria 0581 931522 CA 09941 Mazza Jo 0359 118267 PV 01944 Bordoni Chiara 0445 668193 CT 01042 SELECT Nome || Cognome NomeCompleto FROM Amici;
  • 82. TREYresearch 82 Questo e quello che si ottiene: Amici Cognome AlessandraRossi AlessandraVerdi TittiMerilli BarbiBanfy MariaPersiani JoMazza ChiaraBordoni SELECT Nome || Cognome NomeCompleto FROM Amici;
  • 83. TREYresearch 83 Access non implementa, oltre che l'operatore '||', anche questo modo di ridenominare le colonne estrapolate: Amici Cognome AlessandraRossi AlessandraVerdi TittiMerilli BarbiBanfy MariaPersiani JoMazza ChiaraBordoni SELECT NOME || COGNOME NOMECOMPLETO;
  • 84. TREYresearch 84 Ecco un'altra applicazione dell'operatore di concatenazione: Amici Cognome AlessandraRossi AlessandraVerdi TittiMerilli BarbiBanfy MariaPersiani JoMazza ChiaraBordoni SELECT Cognome || ', ' || NOME Amico FROM Amici;
  • 85. TREYresearch 85 Ecco un'altra applicazione dell'operatore di concatenazione: Amico Rossi, Alessandra Verdi, Alessandra Merilli, Titti Banfi, Barbi Persiani, Maria Mazza, Jo Bordoni, Chiara SELECT Cognome || ', ' || NOME Amico FROM Amici;
  • 86. TREYresearch Operatorilogici Condizioni I comandi e le istruzioni derivanti dall’Algebra di Boole. 86
  • 87. TREYresearch 87 Operatore AND: Indica che entrambe le espressioni che si trovano ai suoi lati devono essere soddisfatte. Vediamo un esempio: Cognome Id_dipendente Anni Ferie_godute Marini 101 2 4 Rossi 104 5 23 Zappa 107 8 45 Verdi 233 4 80 Boldi 210 15 100 Gialli 211 10 78 Ferie
  • 88. TREYresearch 88 Vogliamo sapere quali impiegati hanno lavorato nell'azienda per 5 anni o più e hanno utilizzato più di 50 giorni di ferie: Cognome Boldi Gialli Ferie SELECT Cognome FROM Ferie WHERE Anni >= 5 AND Ferie_Godute > 50;
  • 89. TREYresearch 89 L'operatore OR: È sufficiente che una sola espressione sia verificata per ottenere il valoreTRUE. Vediamo un esempio: vogliamo sapere i cognomi dei dipendenti che non hanno più di 5 anni di servizio o hanno goduto ferie per più di 80 giorni. Cognome Id_dipendente Anni Ferie_godute Marini 101 2 4 Rossi 104 5 23 Zappa 107 8 45 Verdi 233 4 80 Boldi 210 15 100 Gialli 211 10 78 Ferie
  • 90. TREYresearch 90 L'operatore OR: questo è quello che si ottiene Cognome Marini Rossi Zappa Verdi Boldi Ferie SELECT Cognome FROM Ferie WHERE Anni <= 5 OR Ferie_godute > 80;
  • 91. TREYresearch 91 L'operatore NOT: Ha il compito di invertire il significato di una condizione. Vediamo un esempio: Vogliamo conoscere i cognomi che non iniziano per B. Cognome Id_dipendente Anni Ferie_godute Marini 101 2 4 Rossi 104 5 23 Zappa 107 8 45 Verdi 233 4 80 Boldi 210 15 100 Gialli 211 10 78 Ferie SELECT Cognome FROM Ferie WHERE Cognome NOT LIKE 'B%';
  • 92. TREYresearch 92 L'operatore NOT: Ha il compito di invertire il significato di una condizione. Vediamo un esempio: Vogliamo conoscere i cognomi che non iniziano per B. Si ottiene Cognome Marini Rossi Zappa Verdi Gialli Ferie SELECT Cognome FROM Ferie WHERE Cognome NOT LIKE 'B%';
  • 93. TREYresearch Glioperatoridiinsieme Condizioni SQL mette a disposizione degli operatori insiemistici, da applicare nella scrittura delle nostre interrogazioni. Tali operatori operano sul risultato di più select. Gli attributi interessati dagli operatori di insieme devono esser di tipo compatibile tra loro. Gli operatori disponibili sono gli operatori di UNION (unione), INTERSECT (intersezione) e MINUS (differenza). Il significato è analogo ai corrispondenti operatori dell'algebra insiemistica. 93
  • 94. TREYresearch 94 Operatore UNION e UNION ALL: l'operatore UNION restituisce il risultato di più query escludendo le righe duplicate. Vediamo un esempio: Nome Marini Bravo Rossi Verdi Marroni Gialli Giannini Calcio SELECT Nome FROM CALCETTO MINUS SELECT NOME FROM CALCIO; Nome Marini Bacco Rossi Dini Marroni Falcone Giannini Calcetto Nome Bravo Verdi Gialli
  • 96. TREYresearch 96 Operatore INTERSECT: Restituisce l'intersezione (valori comuni a tutti gli insiemi coinvolti) del risultato delle query. La seguente istruzione SELECT mostra l'elenco dei giocatori che appartengono sia alla squadra di calcio che di calcetto. (Vedere le tabelle Calcio e Calcetto). Questo operatore non è implementato da Access. SELECT Nome FROM Calcetto INTERSECT SELECT Nome FROM Calcio; NOME Marini Rossi Marroni Giannini
  • 97. TREYresearch 97 Operatore MINUS (differenza): Restituisce le righe della prima query che non sono presenti nella seconda. Questo operatore non è implementato da Access. SELECT Nome FROM Calcetto MINUS SELECT Nome FROM Calcio; NOME Marini Rossi Marroni Giannini
  • 98. TREYresearch 98 Altri operatori: IN e BETWEEN: gli operatori IN e BETWEEN forniscono una scorciatoia per quelle operazioni che possono essere svolte anche in altri modi. Ad esempio, per trovare tutti gli amici che vivono in provincia di Como, Pavia, e Bergamo. Amici Cognome Nome Telefono PR CAP Rossi Maria 0761 556632 BG 01023 Verdi Maria 02 345622 Mi 03456 Marroni Antonio 0732 433388 CO 01255 Banfi Barby 0722 114381 BR 03367 Persiani Luca 0581 931522 CA 09941 Mazza Alberto 0359 118267 PV 01944 Battisti Chiara 0445 668193 CT 01042 Vediamo come si costruisce l’istruzione nella pagina seguente:
  • 99. TREYresearch 99 Amici Cognome Nome Telefono PR CAP Rossi Maria 0761 556632 BG 01023 Marroni Antonio 0732 433388 CO 01255 Mazza Alberto 0359 118267 PV 01944 SELECT * FROM Amici WHERE PR = 'CO' OR PR = 'PV' OR PR = 'BG'; SELECT * FROM Amici WHERE PR IN ('CO', 'PV', 'BG');
  • 100. TREYresearch 100 Altri operatori: IN e BETWEEN: gli operatori IN e BETWEEN forniscono una scorciatoia per quelle operazioni che possono essere svolte anche in altri modi. Facciamo un altro esempio con un’altra tabella. Prezzo Elemento Prezzo_Ingrosso Pomodori 340 Patate 510 Banane 670 Rape 450 Arance 890 Mele 230 SELECT * FROM Prezzo WHERE Prezzo_Ingrosso >= 250 AND Prezzo_Ingrosso <= 750; SELECT * FROM PREZZO WHERE PREZZO_INGROSSO BETWEEN 250 AND 750;
  • 101. TREYresearch Aggiungere un piè di pagina 101 Cognome Nome PR Rossi Maria BG Verdi Maria Mi Marroni Antonio CO Banfi Barby BR Persiani Luca CA Mazza Alberto PV Battisti Chiara CT Amici Esercizio di programmazione. Dalla seguente tabella determinare: 1. Scrivere una query per selezionare tutti i cognomi che iniziano con la lettera M. 2. Scrivere una query per selezionare gli amici che vivono in provincia di Bergamo (BG) e il cui nome è MARIA. 3. Scrivere un’istruzione usando i campi nome e cognome. Lo scopo dell’istruzione è cercare i dati Maria o Mazza. Quale scorciatoia potrebbe essere utilizzata in alternativa a WHERE A >= 10 AND A <= 30 ?
  • 102. TREYresearch LefunzioniinSQL 102 Le funzioni, nell'ambito dei linguaggi di terza generazioni (linguaggi procedurali), sono delle particolari procedure le quali passandogli dei valori (parametri) esse ci restituiscono (ritornano) un valore.
  • 103. TREYresearch Aggiungere un piè di pagina 103 Anche se SQL non è un linguaggio procedurale (C/C++, Java), implementa le funzioni nella stessa maniera ma con una differenza sostanziale: nei linguaggi procedurali noi stessi possiamo crearci delle funzioni, con SQL ciò non è possibile e quindi possiamo utilizzare solo quelle funzioni che ci mette a disposizione il DBMS che stiamo usando. In questo parte vedremo molte funzioni, ma soltanto le prime 5 (COUNT, SUM, AVG, MAX e MIN) sono definite nello standard SQL. Queste prime cinque funzioni sono le più importanti e dobbiamo impararle bene, esse sono sempre presenti nella maggior parte dei DBMS a differenza delle restanti, che a volte non appaiono affatto o sono implementate con una sintassi diversa.
  • 104. TREYresearch 104 Funzioni aggregate: Le funzioni che analizzeremo in questo paragrafo hanno la particolarità di restituire un solo valore. Inoltre, dato che operano su insiemi di righe, vengono anche chiamate funzioni di gruppo. Gli esempi utilizzano la tabella Impiegato: Nome Cognome Dipartimento Ufficio Stipendio Mario Rossi Amministrazione 10 4500 Carlo Bianchi Produzione 20 360 Giuseppe Verdi Amministrazione 20 4000 Franco Neri Distribuzione 16 4500 Carlo Rossi Direzione 14 7300 Lorenzo Lanzi Direzione 7 730 Paola Borroni Amministrazione 75 4000 Marco Franco Produzione 46 4000 Impiegato
  • 105. TREYresearch 105 COUNT: restituisce il numero di righe che soddisfano la condizione specificata nella clausola WHERE. Vediamo un esempio: voglio conoscere il numero di impiegati che appartengono al dipartimento produzione. Impiegato 2 SELECT COUNT (*) FROM Impiegato WHERE Dipartimento = ‘Produzione’;
  • 106. TREYresearch 106 AVG: calcola la media aritmetica dei valori di una colonna. Vediamo un esempio. Voglio conoscere lo stipendio medio della tabella IMPIEGATO. Questa funzione opera soltanto con i numeri. Impiegato 3265,555 periodo SELECT AVG(Stipendio) FROM Impiegato;
  • 107. TREYresearch 107 MAX: Questa funzione serve a trovare il valore massimo di una colonna. Per esempio vogliamo sapere a quanto ammonta lo stipendio maggiore. Impiegato 7300 SELECT MAX(Stipendio) FROM Impiegato;
  • 108. TREYresearch 108 MIN: Questa funzione opera in modo analogo a MAX, ad eccezione del fatto che restituisce il valore minimo di una colonna. Per trovare il minimo stipendio della tabella IMPIEGATO si usa la seguente espressione. La funzione MIN opera anche con i caratteri: la stringa 'AAA' è minore della stringa 'BB'. Impiegato 360 SELECT MIN(Stipendio) FROM Impiegato;
  • 109. TREYresearch Aggiungere un piè di pagina 109 Nome Cognome Provincia Giovanni Bruni CO Antonio Rossi Mi Mario Rossi CT Piero Bianchi PV Nominativi Dalla seguente tabella creare le seguenti query: 1. Creare la tabella Nominativi; 2. Creare i campi della tabella Nominativi; 3. Inserire all’interno della tabella Nominativi i dati della tabella di esempio; 4. Estrapolare i dati dalla tabella Nominativi, prendendo in esame il campo provincia. Devono essere visualizzati tutti i dati della colonna Provincia secondo una data condizione. Tutte le sigle di provincia che iniziano con C. 5. Ogni query deve essere eseguita singolarmente al database.
  • 110. TREYresearch Aggiungere un piè di pagina 110 Nome Cognome Provincia Giovanni Bruni CO Antonio Rossi Mi Mario Rossi CT Piero Bianchi PV Andrea Barbieri SI Gianni Perla SO Nominativi Dalla seguente tabella creare le seguenti query: 1. Creare la tabella Nominativi; 2. Creare i campi della tabella Nominativi; 3. Inserire all’interno della tabella Nominativi i dati della tabella di esempio; 4. Estrapolare i dati dalla tabella Nominativi, prendendo in esame il campo provincia. Devono essere visualizzati tutti i dati della colonna Provincia secondo una data condizione. Tutte le sigle di provincia che iniziano con C, M, P e S.
  • 111. TREYresearch 111 Dalla seguenti tabella eseguire le seguenti query: 1. Creare la tabella ed i campi della tabella; 2. Inserire le informazioni in ogni campo della tabelle; 3. Individuare nel campo Posizione uno schema comune. Esempio: CentroDorso e CentroDorso. Ed seguire la query per la visualizzazione di questi dati. Anatomia Nome Posizione Fegato DestraAddome Cuore Petto Faringe Gola Vertebre CentroDorso Incudine Orecchio Rene Dorso
  • 112. TREYresearch Aggiungere un piè di pagina 112 Id_contatto Nome Cognome Provincia 1 Giovanni Bruni CO 2 Antonio Rossi Mi 3 Mario Rossi CT 4 Piero Bianchi PV 5 Beatrice Gorli LI 6 Annamaria Voleri MO 7 Valeria Boschetti RN 8 Sandro Lucci FI Nominativi Dalla seguente tabella creare le seguenti query: 1. Creare la tabella Nominativi; 2. Creare i campi della tabella Nominativi; 3. Inserire all’interno della tabella Nominativi i dati della tabella di esempio; 4. Aggiornare la tabella con questi nuovi dati: Marina, Aleandri, CA. Id_contatto = 5. 5. Cancellare una riga con la condizione id_contatto > 3, id_contatto < 5, id_contatto < 8. 6. Ogni query deve essere eseguita singolarmente al database.
  • 113. TREYresearch 113 Anagrafica Id_contatto Nome Cognome Eta 1 Giovanni Bruni 55 2 Antonio Rossi 43 3 Mario Rossi 49 4 Piero Bianchi 37 5 Esmeralda Carli 6 Angela Berletti 44 7 Simone Cudraro 37 8 Corsari Luca 22 9 Elena Basalto 37 10 Franco Basalto 34 1. Creare la tabella Anagrafica. Ed inserire nella query i campi ed i dati presenti nelle colonne. 2. Usare un comando SQL per individuare tutti i dati presenti nella tabell. 3. Aggiornare la tabella con il comanda UPDATE secondo la condizione. 4. Cancellare una riga o più righe con il comando DELETE con la condizione id_contatto < 3 . 5. Selezionare le righe tramite il comando SELECT* con la condizione Eta > 22.
  • 114. TREYresearch 114 Prezzo Articoli venditaIngrosso Dettaglio Pomodori o.34 Patate 0.51 Banane 0.67 Rape 0.45 Formaggio 0.89 Mele 0.23 Sedano 0.50 Carote 0.24 Pesche 0.51 Ciliegie 0.37 Il magazzino Rossi ha ricevuto nuova merce. Ed è necessario dire ai commessi qual è il prezzo al dettaglio della merce. SELECT* Articoli, venditaIngrosso, (venditaIngrosso + 0.15) Dettaglio FROM Prezzo
  • 115. TREYresearch 115 Prodotti venditaIngrosso Dettaglio Pomodori o.34 Patate 0.51 Banane 0.67 Rape 0.45 Formaggio 0.89 Mele 0.23 Sedano 0.50 Carote 0.24 Pesche 0.51 Ciliegie 0.37 L’azienda Rossi per motivi di ambiguità decide di cambiare il nome del campo Articoli con Prodotti. SELECT Articoli Prodotti, venditaIngrosso, venditaIngrosso + 0.15 Dettaglio FROM Prezzo; Prezzo
  • 116. TREYresearch 116 State Hightemp Lowtemp CA -50 120 FL 20 110 LA 15 99 ND -70 101 NE -60 100 Viene data una tabella sulle temperature americane. Si richiede di cambiare di segno alle temperature. Inoltre, viene richiesto creare i campi High e Low per inserire i nuovi dati. SELECT State, -HIGHTEMP LOWS, -LOWTEMP HIGHS FROM HILOW; Temperature State Low High CA -50 120 FL 20 110 LA 15 99 ND -70 101 NE -60 100 Temperature
  • 117. TREYresearch 117 Viene data una tabella sulle temperature americane. Si richiede di cambiare di segno alle temperature. Inoltre, viene richiesto di creare dei sinonimi per Hightemp e Lowtemp. SELECT State, -HIGHTEMP LOWS, -LOWTEMP HIGHS FROM Temperature; Temperature Temperature
  • 118. TREYresearch 118 Sempre dalla tabella Temperature trovare le differenze tra la temperatura Highs e Lows. SELECT STATE, HIGHTEMP LOWS, LOWTEMP HIGHS, (LOWTEMP - HIGHTEMP) DIFFERENCE FROM Temperature; Temperature Temperature
  • 119. Funzionidi temporali Queste funzioni operano su date e orari; sono molto potenti. Alcuni DBMS, come Access, non le implementano o usano sintassi diverse. Aggiungere un piè di pagina 119 Questa foto di Autore sconosciuto è concesso in licenza da CC BY-NC-ND
  • 120. TREYresearch Aggiungere un piè di pagina 120 Formatidelledate Format Name Date Format Date Example Time Format Time Example American mm/dd/yyyy 5/19/1960 hh:mm am/pm 2:18 PM European dd.mm.yyyy 19.5.1960 hh.mm.ss 14.18.08 Japanese yyyy-mm-dd 1960-5-19 hh:mm:ss 14:18:08 ISO yyyy-mm-dd 1960-5-19 hh.mm.ss 14.18.08 TIMESTAMP format yyyy-mm- ddhh. mm.ss.nnn nnn yyyy-mm-ddhh. mm.ss.nnn nnn
  • 121. TREYresearch Aggiungere un piè di pagina 121 Formatidelledate:esempi • March 15, 1990 Mar 15 1990 3/15/1990 3-15-90 1990 MAR 15: ecco alcuni esempi di date e ora legale di SQL Server; • 15:30:25 3:30:25 PM 3:30:25 pm 3 PM: ecco alcuni esempi di ora legale costanti
  • 122. TREYresearch Aggiungere un piè di pagina 122 Siadatalaseguentetabella: Inseriamo i dati nella tabella con la seguente istruzione:
  • 124. TREYresearch Aggiungere un piè di pagina 124 Adessopossiamousarelefunzionitemporali. LAST DAY : Questa funzione fornisce l'ultimo giorno di un mese specificato (se il mese è di 30, 31, 29 o 28 giorni).
  • 127. TREYresearch Approfondimentosul caricamentodeidati. Abbiamo visto che per inserire le righe, e popolare una tabella è possibile usare il comando. INSERT INTO nome_tabella (campo1, campo2, ………… campon-1 ) VALUES (valore1, valore2, valoren-1 ); Ma è possibile usare il comando INSERT anche in altri e più utili modi. A sinistra la tabella di esempio. Prendiamo questo codice come esempio. 127
  • 128. TREYresearch Aggiungere un piè di pagina 128 Come abbiamo già visto questa istruzione consente di omettere i dati. Come in questo esempio: INSERT INTO amici VALUES (‘’, 'Mario’, 'Rossi’, '123456789’); In questo caso abbiamo passato un valore vuoto per il campo "id" in quanto, essendo auto-incrementale, si popola da se con giusto valore numerico.
  • 129. TREYresearch INSERTINTO…….SET • Una sintassi meno conosciuta ed utilizzata è quella che prevede di utilizzare il comando INSERT INTO in comunione con la clausola SET. Da un punto di vista funzionale non vi è alcuna differenza con l'istruzione basata su INSERT INTO ... VALUES. Aggiungere un piè di pagina 129
  • 130. TREYresearch 130 INSERTINTO….. SELECT Un modo particolare di popolare le tabelle prevede di utilizzare il comando INSERT INTO in comunione con il comando SELECT: così facendo, in poche parole, viene popolato una tabella inserendo dei dati estratti da una seconda tabella. Nell'esempioabbiamo immaginato di popolare di dati la tabella "amici" inserendo automaticamente i dati già presenti in un'ipotetica tabella "parenti".
  • 131. TREYresearch INSERTIGNORE INTO…….. • Il comando insert può essere modificato nel suo comportamento di default mediante l'inserimento di alcune keywords, tra cui IGNORE. Aggiungendo questa parola dopo il comando INSERT si invita il DBMS a non mostrare errori nel caso si cerchi di inserire un valore duplicato per un campo PRIMARY KEY o UNIQUE. Qualora ciò accada, semplicemente, MySQL ignorerà il comando. Aggiungere un piè di pagina 131
  • 132. TREYresearch INSERT ON….. DUPLICATEKEY La clausola ON DUPLICATE KEY serve a regolare situazioni analoghe a quelle appena "ignorate". Mediante questa sintassi si chiede al DBMS di effettuare una specifica operazione qualora, in sede di INSERT, si stia cercando di caricare dati duplicati per chiavi primarie o uniche. Vediamo un esempio di istruzione SQL: Aggiungere un piè di pagina 132
  • 133. TREYresearch 133 REPLACE Il comando REPLACE in MySQL è un'estensione dello standard SQL. Utilizzando REPLACE al posto di INSERT, MySQL effettuerà la sostituzione dei dati qualora siano già presenti all'interno del database, qualora invece non siano presenti effettuerà una normale operazione di inserimento. Prima del comando Dopo l’istruzione
  • 134. TREYresearch 134 REPLACE Come potete vedere la sintassi è la medesima di INSERT. Da un punto di vista tecnico è da segnalare REPLACE non effettua un UPDATE del record ma procederà alla cancellazione del record precedente ed all'inserimento di un nuovo record (per questo motivo questa query restituirà "Affected rows: 2"). Prima del comando Dopo l’istruzione
  • 135. TREYresearch CREATE TABLE …… SELECT Esiste possibilità di creare delle tabelle già popolate di dati. Ciò è possibile mediante l'uso congiunto dei comandi CREATE TABLE e SELECT. Col primo, ovviamente, si crea la tabella, col secondo si caricano al suo interno i dati prelevati da una seconda tabella. Il suo funzionamento, in pratica, è analogo a quello di INSERT INTO ... SELECT. Aggiungere un piè di pagina 135
  • 136. TREYresearch Aggiungere un piè di pagina 136 PRIMARY KEY: è un vincolo che ci consente di dichiarare un campo come chiave primaria. La chiave primaria rappresenta quel campo il cui valore rappresenta in modo univoco la riga. Infatti, non è possibile trovare all’interno della tabella due valori uguali della chiave primaria. Di solito rappresenta un numero. Ad esempio, se cancelliamo NOME con identificativo 15, quella chiave viene persa per sempre.
  • 137. TREYresearch Aggiungere un piè di pagina 137 FunzioniSQLinAccess:funzionidistringhe Funzioni Descrizione ASC Restituisce un valore ASCII per uno specifico carattere. Chr Restituisce il carattere per uno specifico codice numerico ASCII Concat with & Aggiunge due o più stringhe insieme CurDir Restituisce il percorso completo di un drive. Format Formatta un valore in un formato specifico. InStr Ottiene la posizione della prima occorrenza di un’altra. InstrRev Ottiene la posizione della prima occorrenza di una strina in un’altra, dalla fine della stringa. LCase Converte una stringa in lettere minuscole
  • 139. TREYresearch ClausoleSQL:WHERE Aggiungere un piè di pagina 139 SELECT * FROM ASSEGNI WHERE IMPORTO < 150;
  • 140. TREYresearch ClausoleSQL:,ORDERBY Aggiungere un piè di pagina 140 In alcuni casi potrebbe essere necessario presentare i risultati di una query in un certo ordine, la clausola ORDER BY assolve a questo scopo. Vediamo alcuni esempi: SELECT * FROM ASSEGNI ORDER BY BENEFICIARIO;
  • 141. TREYresearch ClausoleSQL:,ORDERBY Aggiungere un piè di pagina 141 E’ possibile ordinare i record anche in senso inverso, con la lettera o il numero più alto. Usando la parola chiave DESC. SELECT * FROM ASSEGNI ORDER BY BENEFICIARIO DESC;
  • 142. TREYresearch ClausoleSQL:,ORDERBY Aggiungere un piè di pagina 142 Esiste anche la parola chiave facoltativa ASC per l'ordinamento ascendente. Comunque questa parola chiave è raramente utilizzata in quanto superflua. Infatti ORDER BY, se non viene specificato diversamente, ordina per l'appunto in modo ascendente. La clausola ORDER BY può essere applicata a più campi. SELECT BENEFICIARIO, NOTE FROM ASSEGNI ORDER BY BENEFICIARIO, NOTE;
  • 143. TREYresearch ClausoleSQL:,ORDERBY Aggiungere un piè di pagina 143 Esiste anche la parola chiave facoltativa ASC per l'ordinamento ascendente. Comunque questa parola chiave è raramente utilizzata in quanto superflua. Infatti ORDER BY, se non viene specificato diversamente, ordina per l'appunto in modo ascendente. La clausola ORDER BY può essere applicata a più campi. SELECT BENEFICIARIO, NOTE FROM ASSEGNI ORDER BY BENEFICIARIO, NOTE DESC;
  • 144. TREYresearch ClausoleSQL:,ORDERBY Aggiungere un piè di pagina 144 Possiamo far riferimento ai campi da ordinare dopo ORDER BY indicando invece del loro nome il valore dell'ordine di apparizione all'interno della tabella. I dati sono stati visualizzati ordinandoli per il campo IMPORTO che è appunto il terzo campo che appare nella tabella ASSEGNI. Vediamo un esempio: SELECT BENEFICIARIO, NOTE FROM ASSEGNI ORDER BY 3;
  • 145. TREYresearch ClausoleSQL: GroupBY Aggiungere un piè di pagina 145 Questa clausola ci permette di formare dei sottoinsiemi per quelle colonne specificate. Vediamo cosa significa quanto affermato. SELECT BENEFICIARIO FROM ASSEGNI GROUP BY BENEFICIARIO; Il risultato della query è una lista di beneficiari, che appaiono però una sola volta, anche se nella tabella di origine la maggior parte di essi compare più volte.
  • 146. TREYresearch ClausoleSQL: GroupBY Aggiungere un piè di pagina 146 Questa clausola è usata molto spesso per applicare le funzioni di gruppo non a tutte le righe indistintamente, ma a sottoinsiemi di esse. Vediamo un esempio. Vogliamo sapere quanto è stato elargito, in totale, per ogni beneficiario: SELECT BENEFICIARIO, SUM(IMPORTO) FROM ASSEGNI GROUP BY BENEFICIARIO;; In questa query viene applicata la funzione di gruppo SUM per ogni sottoinsieme di BENEFICIARIO.
  • 147. TREYresearch ClausoleSQL: GroupBY 147 Alla tabella ASSEGNI sono aggiunti altri quattro record. Questa è la tabella aggiornata:
  • 148. TREYresearch ClausoleSQL: GroupBY 148 Alla tabella ASSEGNI sono aggiunti altri quattro record. Questa è la tabella aggiornata. Si può applicare la clausola GROUP BY anche a più di un campo per volta. Vediamo come funziona nella prossima slide:
  • 149. TREYresearch ClausoleSQL: GroupBY 149 Anche per la clausola GROUP BY è possibile prendere in considerazione più di un campo. In questa query le righe selezionate sono 11 contro le 15 della tabella originale, cosa è successo? È avvenuto che la dove il beneficiario presentava le stesse note, veniva visualizzato una volta sola. Si veda quante volte appare, nella tabella ASSEGNI, in NOTE 'libri cancelleria', 'gas'(per beneficiario Biogas SRL), 'controller' e 'pantaloni'.
  • 150. TREYresearch ClausoleSQL: GroupBY 150 Analizziamo altri esempi con la clausola GROUP BY. Ci interessa sapere oltre a quanto è stato elargito per ogni beneficiario, quante volte il singolo beneficiario compare nella tabella: SELECT BENEFICIARIO, SUM(IMPORTO), COUNT(BENEFICIARIO) FROM ASSEGNI GROUP BY BENEFICIARIO; Abiti Bella compare nella tabella tre volte, Assicurazioni ASSO una volta, ecc.
  • 151. TREYresearch ClausoleSQL: GroupBY 151 Siamo interessati a sapere il totale dell'importo per ogni nota che facendo parte dello stesso beneficiario compaia una o più volte. Sapere quante volte quella stessa nota appare per lo stesso beneficiario. E siamo anche interessati a visualizzare le note: SELECT BENEFICIARIO, NOTE, SUM(IMPORTO), COUNT(BENEFICIARIO) FROM ASSEGNI GROUP BY BENEFICIARIO, NOTE;
  • 152. TREYresearch ClausoleSQL: GroupBY 152 Nella prima riga della tabella estrapolata con la query precedente, vediamo che COUNT(BENEFICIARIO) vale 1; ciò significa che la nota 'Completo donna' per quel beneficiario è presente nella tabella di origine una sola volta. Mentre invece, la nota 'Pantaloni', sempre per il medesimo beneficiario vale 2, questo significa che quella nota per quel beneficiario è presente nella tabella ben due volte. SELECT BENEFICIARIO, NOTE, SUM(IMPORTO), COUNT(BENEFICIARIO) FROM ASSEGNI GROUP BY BENEFICIARIO, NOTE;
  • 153. TREYresearch ClausoleSQL: GroupBY 153 Adesso vogliamo estrapolare i stessi dati della query precedente, ma ordinandoli per le note. SELECT BENEFICIARIO, NOTE, SUM(IMPORTO), COUNT(BENEFICIARIO) FROM ASSEGNI GROUP BY BENEFICIARIO, NOTE ORDER BY NOTE;
  • 154. TREYresearch ClausoleSQL: HAVING Abbiamo visto come tramite la clausola GROUP BY le righe possano venire raggruppate in sottoinsiemi. Una particolare interrogazione può avere la necessità di estrapolare solo quei sottoinsiemi di righe che soddisfano certe condizioni, in questo caso però non è possibile usare la clausola WHERE in quanto tale clausola verifica la condizione che la segue, su tutte le righe e non in maniera singola sui valori estrapolati per ogni sottoinsieme di righe. Questa è la nuova tabella presa come esempio. 154
  • 155. TREYresearch ClausoleSQL: HAVING 155 Vogliamo conoscere le medie dei stipendi per ogni divisione che superano i 2.200.000 di lire. Il codice proposto genera errore alla riga 4. SELECT DIVISIONE, AVG(STIPENDIO) FROM DIPENDENTI GROUP BY DIVISIONE WHERE AVG(STIPENDIO) > 2200000; Nella query scritta sopra possiamo vedere come la clausola WHERE sia stata posta per ultima, infatti bisogna verificare la condizione solo dopo che sono stati formati i sottoinsiemi dalla clausola GROUP BY. Il risultato però, è comunque un avviso di errore, proprio perché non è possibile utilizzare WHERE per verificare condizioni sui risultati di funzioni di gruppo.
  • 156. TREYresearch ClausoleSQL: HAVING 156 Vediamo adesso come risolvere il problema. In questo caso la clausola WHERE è stata usata non sugli insiemi delle righe, in quanto posta prima della clausola GROUP BY. SELECT DIVISIONE, AVG(STIPENDIO) FROM DIPENDENTI WHERE DIVISIONE = 'VENDITE' GROUP BY DIVISIONE;
  • 157. TREYresearch ClausoleSQL: HAVING 157 Voglio conoscere la media dei giorni di ferie godute per dipartimento, ma solo di quei dipendenti che percepiscono stipendi superiori ai 2.050.000 SELECT DIVISIONE, AVG(FERIE_GODUTE) FROM DIPENDENTI WHERE STIPENDIO > 2050000 GROUP BY DIVISIONE; In questo caso abbiamo usato la clausola WHERE in quanto la condizione va verificata per tutte le righe e non per singoli valori estrapolati da singoli sottoinsiemi di righe.
  • 158. TREYresearch ClausoleSQL: HAVING 158 Adesso vogliamo escludere dal risultato della query precedente quelle divisioni la cui media delle ferie godute, calcolata solo per quei dipendenti il cui stipendio supera i 2.050.000 di lire, è uguale a zero: SELECT DIVISIONE, AVG(FERIE_GODUTE) FROM DIPENDENTI WHERE STIPENDIO > 2050000 GROUP BY DIVISIONE HAVING AVG(FERIE_GODUTE) <> 0;
  • 159. TREYresearch Cosaabbiamoimparato?1 159 Dagli esempi precedenti, dalle cose che sono state dette e da eventuali esperimenti che potremmo fare, possiamo enunciare degli assiomi che riguardano l'uso delle clausole viste in questo capitolo: 1. WHERE non può essere usato per verificare condizioni su risultati di funzioni di gruppo, 2. WHERE non può essere usato per verificare condizioni su sottoinsiemi delle varie righe. 1. GROUP BY: tutte le colonne che vengono selezionate (colonne che seguono la clausola SELECT) devono essere elencate nella clausola GROUP BY.
  • 160. TREYresearch Cosaabbiamoimparato?2 160 1. HAVING può essere seguita da una o più funzioni di gruppo e verificare condizioni su i valori ritornati. da tali funzioni. 2. HAVING può verificare condizioni sui valori dei sottoinsiemi creati dalla clausola GROUP BY. 3. HAVING può verificare condizioni combinate sui valori dei sottoinsiemi creati dalla clausola GROUP BY e condizioni sui valori ritornati da funzioni di gruppo. 4. HAVING i campi che vi appaiono devono essere specificati nella clausola GROUP BY, 5. HAVING è necessario, per il suo utilizzo, la presenza della clausola GROUP BY. 6. HAVING non è necessario che venga posta dopo la clausola GROUP BY.
  • 161. TREYresearch Cosaabbiamoimparato?3 161 1. ORDER BY è necessario che venga posta dopo la clausola GROUP BY e dopo la clausola HAVING. Riassumendo vediamo come può essere la forma sintetica di una query che fa uso delle clausole viste in questo capitolo: select lista attributi o espressioni from lista tabelle [where condizioni semplici] [group by lista attributi di raggruppamento] [having condizioni aggregate]: MIN() , MAX(), SUM(), AVG(), STDEV() , VARIANCE(), COUNT() [order by lista attributi di ordinamento]
  • 162. SQLJOIN– Combinazioneditabelle 16 2 Aggiungere un piè di pagina Questa foto di Autore sconosciuto è concesso in licenza da CC BY-SA
  • 163. TREYresearch Aggiungere un piè di pagina 163 Join-Combinazioneditabelle Questo capitolo tratta un importante tipo di operazione tra le tabelle: il Join. Il vocabolo join significa unione e nel caso di SQL sta ad indicare unione tra tabelle. Esistono vari tipi di join, ma tutti derivano o possono essere ricondotti a vari operatori dell'algebra insiemistica. L'importanza principale del join risiede nella possibilità che ci offre per correlare e visualizzare dati appartenenti a tabelle diverse o alla medesima tabella, logicamente correlati tra di loro. I semplici dati, da noi uniti, possono assumere la forma di complesse informazioni così come noi li vogliamo.
  • 164. TREYresearch 164 CrossJoin Per comprendere a pieno l'operazione CROSS JOIN (unione incrociata)bisogna aver ben chiaro il concetto di prodotto cartesiano: ........................................................... Prodotto cartesiano........................................................... Dati due insiemi D1 e D2 si chiama prodotto cartesiano di D1 e D2, l'insieme delle coppie ordinate (v1, v2), tali che v1 è un elemento di D1 e v2 un elemento di D2. Vediamo cosa significa quanto affermato con un esempio:
  • 165. TREYresearch 165 CrossJoin Il prodotto cartesiano dell’insieme A e B è: A x B = {(2, r), (2, s), (2, d), (2, 4), (f, r), (f, s), (f, d), (f, 4), (r, r), (r, s), (r, d), (r,4)}
  • 166. TREYresearch 166 CrossJoin Il prodotto cartesiano dell’insieme A e B è: A x B = {(2, r), (2, s), (2, d), (2, 4), (f, r), (f, s), (f, d), (f, 4), (r, r), (r, s), (r, d), (r,4)} Come possiamo vedere il prodotto cartesiano fra i due insiemi è dato da tutti gli elementi di A combinati con ogni elemento di B. Nella rappresentazione delle varie coppie dobbiamo rispettare l'ordine di apparizione degli elementi, in quanto l'appartenenza dell'elemento all'insieme è individuabile proprio dalla suo ordine di apparizione.
  • 167. TREYresearch 167 CrossJoin Nell'esempio abbiamo usato solo due insiemi ma il prodotto cartesiano è applicabile anche a più di due insiemi. Ora considerando che le tabelle non sono altro che insiemi i cui elementi sono le righe ecco che possiamo individuare l'operazione di CROSS JOIN equivale al prodotto cartesiano appartenente alle teorie degli insiemi. Dunque il prodotto cartesiano tra due o più tabelle si traduce in una istruzione chiamata CROSS JOIN. Il CROSS JOIN si ottiene in maniera molto semplice elencando dopo la FROM le tabelle che devono essere coinvolte. Vediamo un esempio di CROSS JOIN.
  • 168. TREYresearch 168 CrossJoin Per lo scopo usiamo due tabelle: TAB1 e TAB2. Il CROSS JOIN non è particolarmente utile e viene usato raramente, ma se in una CROSS JOIN si utilizza la clausola WHERE potremmo ottenere join molto più interessanti. TAB1 COLONTAB1 RIG1 TAB1 RIG2TAB1 RIG3 TAB1 RIG3 TAB1 RIG4 TAB1 RIG4 TAB1 TAB2 COLONTAB2 RIG1 TAB2 RIG2TAB2 RIG3 TAB2 RIG3 TAB2 RIG4 TAB2 RIG4 TAB2 SELECT * FROM TAB1, TAB2;
  • 169. TREYresearch 169 NaturalJoin Il NATURAL JOIN è un tipo di operazione che ci permette di correlare due o più tabelle sulla base di valori uguali in attributi contenenti lo stesso tipo di dati. Vediamo un esempio chiarificatore. Per lo scopo usiamo due tabelle: PERSONE e AUTO. La tabella AUTO fa riferimento alla persona proprietaria dell'auto attraverso il campo PROPRIETARIO in cui sono riportati i numeri di patente. Lo stesso tipo di dato è presente nella tabella PERSONE nel campo PATENTE. Tabella AUTO Tabella PERSONE
  • 170. TREYresearch 170 NaturalJoin Vogliamo ottenere un join delle righe delle due tabelle la dove i valori dei campi PROPRIETARIO e PATENTE sono uguali . SELECT * FROM PERSONE, AUTO WHERE PATENTE = PROPRIETARIO;
  • 171. TREYresearch 171 NaturalJoin Nel caso le due tabelle originarie avessero avuto i campi interessati al join (PATENTE e PROPRIETARIO) con lo stesso nome in entrambe, avremmo dovuto specificare dopo la WHERE prima del nome del campo il nome della tabella a cui facevamo riferimento. Facciamo un esempio considerando le tabelle PERSONE e AUTO così modificate. Tabella AUTO Tabella PERSONE
  • 172. TREYresearch 172 NaturalJoin E si ottiene con questo codice: SELECT * FROM PERSONE, AUTO WHERE PERSONE.NUM_PATENTE = AUTO.NUM_PATENTE;
  • 173. TREYresearch 173 InnerJoin È un tipo di join in cui le righe delle tabelle vengono combinate solo se i campi collegati con join soddisfano una determinata condizione. Vediamo un esempio. Vogliamo ottenere un join delle righe delle due tabelle PERSONE e AUTO, la dove i valori dei campi PROPRIETARIO e PATENTE sono uguali e dove il valore del campo NOME è uguale ad 'ARTURO'.
  • 174. TREYresearch InnerJoin Esistono anche, delle parole chiavi specifiche per eseguire l'operazione di INNER JOIN. Il risultato che otteniamo è lo stesso, ma la sintassi usata non è accettata da SQL Plus 8.0 Oracle, infatti questa query e quelle successive in cui appaiono parole chiave specifiche, sono state testate utilizzato Microsoft Access. Usando le parole chiave specifiche dobbiamo indicare, per alcuni DBMS come nel caso di Access, a quale tabella appartengono i campi. C'è inoltre da far notare che quello che segue la clausola ON va messo tra parentesi se è presente più di una condizione. 174
  • 175. TREYresearch InnerJoin Vediamo altri esempi. Usando le parole chiave specifiche, vogliamo ottenere lo stesso JOIN che abbiamo usato come esempio nel paragrafo del NATURAL JOIN. Possiamo renderci conto che questo tipo di join è simile al natural join; infatti il natural join è un particolare caso di inner join. 175
  • 176. TREYresearch Aggiungere un piè di pagina 176 OUTERJOIN Con l'OUTER JOIN è possibile estrapolare anche quei dati, appartenenti ad una delle tabelle, che non verrebbero estrapolati nei tipi di join visti fino a questo momento. Infatti OUTER significa esterno; dati esterni al normale tipo di join. Dobbiamo specificare quale è la tabella di cui vogliamo estrapolare i dati anche se non soddisfano la condizione di join, questo lo facciamo indicando con LEFT o RIGHT se la tabella in questione è quella che appare a destra o a sinistra del comando JOIN. SELECT . . . FROM tabella1 [LEFT | RIGHT] JOIN tabella2 ON tabella1.campox condizione tabella2.campoy
  • 177. TREYresearch Aggiungere un piè di pagina 177 OUTERJOIN Con l'OUTER JOIN è possibile estrapolare anche quei dati, appartenenti ad una delle tabelle, che non verrebbero estrapolati nei tipi di join visti fino a questo momento. Infatti OUTER significa esterno; dati esterni al normale tipo di join. Dobbiamo specificare quale è la tabella di cui vogliamo estrapolare i dati anche se non soddisfano la condizione di join, questo lo facciamo indicando con LEFT o RIGHT se la tabella in questione è quella che appare a destra o a sinistra del comando JOIN. SELECT . . . FROM tabella1 [LEFT | RIGHT] JOIN tabella2 ON tabella1.campox condizione tabella2.campoy
  • 180. TREYresearch 180 SELFJOIN Il SELF JOIN ci consente di unire una tabella con se stessa. La sintassi è simile a quella della query vista nel paragrafo che trattava il CROSS JOIN. Vediamo un esempio usando la tabella TAB2: TAB2 COLONTAB2 ------------------- RIG1 TAB2 RIG2 TAB2 RIG3 TAB2 SELECT R1.COLONTAB2, R2.COLONTAB2 FROM TAB2 R1, TAB2 R2;
  • 181. TREYresearch 181 SELFJOIN R1.COLONTAB2 R2.COLONTAB2 RIG1 TAB2 RIG1 TAB2 RIG2 TAB2 RIG1 TAB2 RIG3 TAB2 RIG1 TAB2 RIG1 TAB2 RIG2 TAB2 RIG2 TAB2 RIG2 TAB2 RIG3 TAB2 RIG2 TAB2 RIG1 TAB2 RIG3 TAB2 RIG2 TAB2 RIG3 TAB2 RIG3 TAB2 RIG3 TAB2 Dalla query si ottiene un prodotto cartesiano. Inoltre, dopo la parola chiave SELECT siamo costretti a simulare l'esistenza di due tabelle mentre ne abbiamo una soltanto.
  • 182. TREYresearch Aggiungere un piè di pagina 182 SELFJOIN Dopo la parola chiave FROM faremo riferimento al nome delle colonne e alla tabella a cui appartengono: SELECT nomeTabellaInesitente1.nomeColonna, nomeTabellaInesitente2.nomeColonna FROM nomeColonna nomeTabellaInesitente1, nomeColonna nomeTabellaInesitente2 [WHERE condizioni];
  • 183. TREYresearch SELFJOIN Questo tipo di select non è particolarmente utile a meno che non si utilizzi la clausola where per unire dati che soddisfano una particolare condizione. Vediamo un esempio. La select funziona ma però ci accorgiamo che le coppie vengono ripetute e questo non è esattamente quello che volevamo. Come possiamo risolvere il problema? Aggiungere un piè di pagina 183
  • 184. TREYresearch Aggiungere un piè di pagina 184 JOIN tra tabelle usando operatori di confronto che non siano il segno uguale (=) Possiamo usare dopo la clausola WHERE anche tipi di operatori che non siano l'operatore di uguale (=). In casi del genere il join che si ottiene è abbastanza inusuale, ma può accadere che si renda necessario eseguire query di questo tipo. La sintassi, dunque sarà uguale a quella di tutti i join visti in precedenza con la sola differenza che la dove appare il segno di uguale (=) possiamo usare, al suo posto, qualsiasi altro operatore di confronto.
  • 185. TREYresearch Aggiungere un piè di pagina 185 JOIN su più di due tabelle 1 Come il prodotto cartesiano può essere eseguito su più di due insiemi, anche i vari tipi di join possono essere applicati a più di due tabelle. Fa eccezione il self join, ma che comunque può simulare l'esistenza anche di più di due tabelle; vediamo un esempio senza però visualizzare il risultato della query: SELECT T1.NOME, T2.NOME, T3.NOME FROM PERSONE T1, PERSONE T2, PERSONE T3 WHERE . . .
  • 186. TREYresearch Aggiungere un piè di pagina 186 JOIN su più di due tabelle 2 Un altro caso particolare è quello dell’OUTER JOIN che per essere applicato a più di due tabelle ha bisogno di una sintassi particolare; vediamo uno schema generale e rimandiamo l'approfondimento di tale tipo di sintassi al capitolo seguente. SELECT . . . FROM tabella1 [LEFT | RIGHT] JOIN ( specifiche di join tra altre due o più tabelle) ON . . .
  • 187. TREYresearch Aggiungere un piè di pagina 187 JOIN su più di due tabelle 3 I restanti tipi di join non presentano particolari sintassi o eccezioni ad essere applicati su più di due tabelle. Vediamo ora un caso di join che si presenta frequentemente tra tre tabelle: chi conosce bene il modello relazionale sa che non è possibile 'correlare' due tabelle usando una relazione di tipo molti a molti. In questo caso si utilizza una terza tabella che contiene come chiavi esterne la chiave primaria della prima tabella e la chiave primaria della seconda tabella. Nell'esempio seguente abbiamo la tabella PERSONE correlata con la tabella CONTICORRENTI; il tipo di relazione è di tipo molti a molti. Infatti una persona può avere più conti correnti e un conto corrente può appartenere a più persone.
  • 188. TREYresearch JOIN su più di due tabelle 4 Aggiungere un piè di pagina 188
  • 189. TREYresearch Aggiungere un piè di pagina 189 JOIN su più di due tabelle 5 Se vogliamo visualizzare i dati così correlati usiamo la seguente query: SELECT . . . FROM PERSONE, UNIONE, CONTI-CORRENTI WHERE PERSONE.ID-PERSONA = UNIONE.ID-PERSONA AND UNIONE.ID-CONTI = CONTI-CORRENTI.ID-CONTI; Alla select precedente nulla ci impedisce di aggiungere altre condizioni, magari per poter visualizzare soltanto i conti appartenenti al Sig. Rossi Antonio.
  • 190. TREYresearch Aggiungere un piè di pagina 190 Funzioniaritmetiche1 A volte è necessario che i dati che vengono estrapolati da un database richiedono delle operazioni matematiche. Molte implementazioni di SQL includono delle funzioni aritmetiche simili a queste. ABS Questa funzione calcola il valore assoluto del numero specificato. Vediamo un esempio: SELECT ABS(A)VALORE_ASSOLUTO FROM NUMERI; VALORE_ASSOLUTO 3,1415 45 5 57,667 15 7,2
  • 191. TREYresearch Aggiungere un piè di pagina 191 Funzioniaritmetiche2:CEIL Questa funzione fornisce il più piccolo numero intero che è maggiore o uguale al suo argomento. Questa sintassi non è implementata da Access. SELECT A, CEIL(A) MAX_INTERI FROM NUMERI;
  • 192. TREYresearch Aggiungere un piè di pagina 192 Funzioniaritmetiche3:FLOOR Questa funzione fornisce il più grande numero intero che è minore o uguale al suo argomento. Questa sintassi non è implementata da Access. SELECT A, FLOOR(A) MINIMI_INTERI FROM NUMERI;
  • 193. TREYresearch Aggiungere un piè di pagina 193 Funzioniaritmetiche5:SIGN La funzione SIGN restituisce -1 se il suo argomento è minore di zero e restituisce 1 se il suo argomento è maggiore o uguale a zero. Questa sintassi non è implementata da Access. Vediamo un esempio: SELECT A, SIGN(A) FROM NUMERI; È possibile anche utilizzare SIGN in una query SELECT . . . WHERE come questa: SELECT A FROM NUMERI WHERE SIGN(A) = 1;
  • 194. TREYresearch Aggiungere un piè di pagina 194 Funzionitrigonometriche1:COS Le funzioni trigonometriche COS, SIN, TAN sono molto utili in applicazioni in cui si richiede l'uso di tali calcoli. Tutte queste funzioni operano supponendo che l'angolo n sia espresso in radianti. Queste funzioni, stranamente, sono implementate da Access. Vediamo alcuni esempi usando la tabella ANGOLI: SELECT RADIANTI, COS(RADIANTI) FROM ANGOLI;
  • 195. TREYresearch Aggiungere un piè di pagina 195 Funzionitrigonometriche2:SIN Calcola il seno del parametro passatogli come angolo espresso in radianti: SELECT RADIANTI, SIN(RADIANTI) FROM ANGOLI;
  • 196. TREYresearch Aggiungere un piè di pagina 196 Funzionitrigonometriche3:TANG Calcola la tangente del parametro passatogli come angolo espresso in radianti: SELECT RADIANTI, TAN(RADIANTI) FROM ANGOLI;
  • 197. TREYresearch Aggiungere un piè di pagina 197 Funzionisullepotenze,logaritmieradici1:EXP Questa funzione permette di elevare e a un esponente (e è una costante matematica che viene utilizzata in varie formule). Vediamo l’istruzione: SELECT A, EXP(A) FROM NUMERI;
  • 198. TREYresearch Aggiungere un piè di pagina 198 Funzionisullepotenze,logaritmieradici2:LN Questa funzione calcola il logaritmo naturale. Questa funzione non è implementata da Access . Questa è l’istruzione da usare: SELECT A, LN(A) FROM NUMERI; Osservazioni: • non è possibile determinare un logaritmo di un valore negativo quando la base è positiva, • non esiste nessun esponente che elevato ad e (valore positivo) ci da come risultato un valore negativo.
  • 199. TREYresearch Aggiungere un piè di pagina 199 Funzionisullepotenze,logaritmieradici2:LN Il 'problema' può essere risolto inserendo all'interno della funzione LN la funzione ABS che ci restituisce i valori assoluti di quelli specificati: SELECT A, LN(ABS(A)) FROM NUMERI;
  • 200. TREYresearch Aggiungere un piè di pagina 200 Funzionisullepotenze,logaritmieradici3:LOG Questa funzione richiede due argomenti e calcola il logaritmo del secondo avendo come base il primo. Questa funzione non ci permette, però, di calcolare il logaritmo in cui la base è negativa, dunque il primo argomento che viene passato alla funzione dovrà essere sempre maggiore di zero. SELECT B, LOG(B, 2) FROM NUMERI;
  • 201. TREYresearch Aggiungere un piè di pagina 201 Funzionisullepotenze,logaritmieradici4:POWER Questa funzione non è implementata da Access. Questa funzione consente di elevare un numero alla potenza di un altro. Il primo argomento è elevato alla potenza del secondo. SELECT A, B, POWER(A, B) FROM NUMERI; ERRORE: ORA-01428: l'argomento '-45' è esterno all'intervallo
  • 202. TREYresearch Aggiungere un piè di pagina 202 Funzionisullepotenze,logaritmieradici5:POWER Sembrerebbe che non sia possibile (matematicamente) elevare un valore negativo ad un indice frazionario, ma non è così, il problema dunque sussiste forse solamente per SQL implementato da Oracle. SELECT A, B, POWER(B, A) FROM NUMERI;
  • 203. SQL:Subquery Un nuovo strumento Aggiungere un piè di pagina 203 Questa foto di Autore sconosciuto è concesso in licenza da CC BY-SA-NC
  • 204. TREYresearch Aggiungere un piè di pagina 204 Checos’èunasubquery? E’ una query che sta all'interno di un'altra interrogazione. La query interna passa i risultati alla query esterna che li verifica nella condizione che segue la clausola WHERE. Ci sono diversi tipi di subquery: • Subquery che ci restituiscono un solo valore • Subquery con IN • Subquery annidate • EXISTS • SOME, ANY, ALL
  • 205. TREYresearch Aggiungere un piè di pagina 205 Subquerychecirestituisconounsolovalore Prendiamo ancora come esempio la tabella dipendenti:
  • 206. TREYresearch Aggiungere un piè di pagina 206 Subquerychecirestiuisconounsolovalore Vogliamo conoscere il nome dei dipendenti le cui ferie godute superino la media delle ferie godute da tutti. Per risolvere il problema, probabilmente, scrivereste questo codice, che però da un messaggio di errore: SELECT NOME FROM DIPENDENTI WHERE FERIE_GODUTE > AVG(FERIE_GODUTE);
  • 207. TREYresearch Aggiungere un piè di pagina 207 Subquerychecirestiuisconounsolovalore Ecco il messaggio di errore. Perché accade questo ?
  • 208. TREYresearch Aggiungere un piè di pagina 208 Subquerychecirestiuisconounsolovalore La precedente lezione abbiamo imparato che non è possibile far seguire la clausola WHERE da funzioni di gruppo. Infatti, AVG() è una funzione di gruppo.
  • 209. TREYresearch Aggiungere un piè di pagina 209 Subquerychecirestiuisconounsolovalore Proviamo un’altra strada e vediamo cosa succede con questo codice usando HAVING ? SELECT NOME FROM DIPENDENTI HAVING FERIE_GODUTE > AVG(FERIE_GODUTE);
  • 210. TREYresearch Aggiungere un piè di pagina 210 Subquerychecirestiuisconounsolovalore Anche in questo caso si ha un messaggio di errore. Perché?
  • 211. TREYresearch Aggiungere un piè di pagina 211 Subquerychecirestiuisconounsolovalore • Non è possibile usare la clausola HAVING in espressioni dove non compare la clausola GROUP BY. • Inoltre, non è possibile, nella nostra interrogazione, eseguire raggruppamenti. Per risolvere il problema è necessario inserire dopo clausola WHERE una subquery: SELECT NOME FROM DIPENDENTI WHERE FERIE_GODUTE > (SELECT AVG(FERIE_GODUTE) FROM DIPENDENTI);
  • 212. TREYresearch 212 Subquerychecirestiuisconounsolovalore Questo è il risultato del codice proposto inserendo una subquery dopo la clausola WHERE.
  • 213. TREYresearch 213 Subquerychecirestiuisconounsolovalore È evidente che il risultato della subquery è un unico valore; infatti non è possibile, con questo tipo di sintassi, estrapolare dalla subquery più di un valore e non è possibile usare le clausole GROUP BY e HAVING. Riassumendo elenchiamo delle regole valide per l'utilizzo di questo tipo di subquery: • La subquery deve restituire un unico valore • Nella subquery non possono apparire le clausole GROUP BY e HAVING • La subquery deve comparire alla destra dell'operatore di confronto • Non si possono confrontare due subquery (conseguenza della regola • precedente).
  • 214. TREYresearch 214 SubqueryconIN Questo operatore ci consente di estrapolare dalla subquery non un solo valore, ma più valori da cui verrà verificata la corrispondenza. Per capirne il funzionamento prendiamo in esame due tabelle.
  • 215. TREYresearch 215 SubqueryconIN Nella tabella ISCRITTI sono presenti gli associati ad un club di cacciatori, nella tabella FAMILIARI sono registrati gli appartenenti alla famiglia di ogni associato. Vogliamo visualizzare gli associati che hanno almeno un famigliare. Come fare ?
  • 216. TREYresearch 216 SubqueryconIN Nella tabella ISCRITTI sono presenti gli associati ad un club di cacciatori, nella tabella FAMILIARI sono registrati gli appartenenti alla famiglia di ogni associato. Vogliamo visualizzare gli associati che hanno almeno un famigliare. Come fare ?
  • 217. TREYresearch 217 SubqueryconIN Come possiamo vedere sono stati estrapolati solo i nominativi Antonio e Giovanni, gli unici che hanno familiari, dunque la subquery (quella tra parentesi) estrapola una serie di matricole le quali la dove c'è corrispondenza con le matricole della prima select la condizione è verificata. Adesso vogliamo visualizzare gli associati che hanno uno o più figlie.
  • 218. TREYresearch 218 Subquery annidate Con il termine annidate si identificano quelle query che si trovano all'interno di subquery. SELECT nome campi FROM nome tabella WHERE (SUBQUERY condizione (SUBQUERY condizione (SUBQUERY ))); In questa istruzione formale abbiamo inserito tre subquery nella prima select una dentro l'altra come se fossero scatole cinesi, ma avremo potuto inserirne anche più. La potenza di una simile struttura è notevole anche se la sua complessità richiede nella sua applicazione una particolare attenzione e tecnica di 'costruzione’. Consiglio: se possibile evitare di superare il terzo gradi di annidazione. Ci potrebbero essere problemi durante le fase di debug.
  • 219. TREYresearch Subquery annidate Ecco un esempio che consente di comprendere il tipo di struttura sintattica visto nella precedente slide . La struttura sottostante rappresenta il database che conserva le informazioni inerenti all'attività che andremo ad analizzare: 219
  • 220. TREYresearch Aggiungere un piè di pagina 220 Subqueryannidate:spiegazionedelmodellomatematico Si ha una azienda che noleggia auto. L'azienda opera su tutto il territorio nazionale tramite agenzie presenti nelle maggiori città. Le automobili non possono essere associabili alle singole agenzie e il loro costo di noleggio dipende oltre che dalla categoria dell'auto (utilitaria, sport, gran turismo, ecc.) anche dall'agenzia da dove è stata noleggiata: una automobile noleggiata all'agenzia di Milano costa di più della stessa automobile noleggiata tramite l'agenzia di Catania. Nello schema si vedono tre tabelle; la tabella Agenzie è associata alla tabella Auto tramite la tabella Unione. Questo tipo di struttura è necessaria per far fronte al tipo di relazione, molti a molti, che si ha tra una agenzia e un'auto. Infatti la stessa auto viene associata a tutte le agenzie e ad una agenzia associamo tutte le auto; in questo modo per mezzo dell'attributo tariffa sappiamo il costo di ogni auto noleggiata per ogni agenzia. Supponiamo ora che vogliamo conoscere il nome delle agenzie che applicano una tariffa inferiore alle 100 € per automobili di categoria sport.
  • 221. TREYresearch Aggiungere un piè di pagina 221 Subqueryannidate:spiegazionedelmodellomatematico Si ha una azienda che noleggia auto. L'azienda opera su tutto il territorio nazionale tramite agenzie presenti nelle maggiori città. Le automobili non possono essere associabili alle singole agenzie e il loro costo di noleggio dipende oltre che dalla categoria dell'auto (utilitaria, sport, gran turismo, ecc.) anche dall'agenzia da dove è stata noleggiata: una automobile noleggiata all'agenzia di Milano costa di più della stessa automobile noleggiata tramite l'agenzia di Catania. Nello schema si vedono tre tabelle; la tabella Agenzie è associata alla tabella Auto tramite la tabella Unione. Questo tipo di struttura è necessaria per far fronte al tipo di relazione, molti a molti, che si ha tra una agenzia e un'auto. Infatti la stessa auto viene associata a tutte le agenzie e ad una agenzia associamo tutte le auto; in questo modo per mezzo dell'attributo tariffa sappiamo il costo di ogni auto noleggiata per ogni agenzia. Supponiamo ora che vogliamo conoscere il nome delle agenzie che applicano una tariffa inferiore alle 100 € per automobili di categoria sport.
  • 222. TREYresearch Aggiungere un piè di pagina 222 Subqueryannidate:programmazionemodulare Per facilitare la programmazione è consigliabile sviluppare più moduli che svolgono operazioni singole. Ovvero, programmare con i concetti della programmazione modulare. Iniziamo dalla selezione delle automobili di tipo sport: SELECT TARGA FROM AUTO WHERE CATEGORIA = 'sport’ ; Questa query la chiameremo Q1.
  • 223. TREYresearch Aggiungere un piè di pagina 223 Subqueryannidate:programmazionemodulare2 Continuiamo selezionando le tariffe che soddisfano le condizioni del quesito: SELECT ID_AGENZIA FROM UNIONE WHERE TARGA IN (Q1) AND TARIFFA < 100; Questa query la chiamiamo Q2.
  • 224. TREYresearch Aggiungere un piè di pagina 224 Subqueryannidate:programmazionemodulare3 A questo punto abbiamo a disposizione i codici delle agenzie che soddisfano il nostro quesito, ma non abbiamo ancora a disposizione i nomi di tali agenzie. Inoltre i codici delle agenzie sono inutilmente ripetuti più volte, dunque la successiva query che soddisfa completamente il quesito è: SELECT NOME_AGENZIA FROM AGENZIE WHERE ID_AGENZIA IN (Q2);
  • 225. TREYresearch Aggiungere un piè di pagina 225 Subqueryannidate:programmazionemodulare3 Vediamo ora la query scritta in modo completo: SELECT NOME_AGENZIA FROM AGENZIE WHERE ID_AGENZIA IN (SELECT ID_AGENZIA FROM UNIONE WHERE TARGA IN (SELECT TARGA FROM AUTO WHERE CATEGORIA = 'SPORT';) AND TARIFFA < 100000;);
  • 226. TREYresearch Aggiungere un piè di pagina 226 Subqueryannidate:programmazionemodulare4 Considerando il modo in cui abbiamo costruito questa interrogazione, possiamo renderci conto che la maniera migliore per effettuare la lettura e comprensione di una query di questo tipo, è iniziare ad analizzare le subquery più interne e man mano passare a quelle più esterne. Questa considerazione è importante ed è valida anche per la scrittura della query. In quest'ultimo caso però, decidere quale sarà la subquery più interna è difficile, comunque sia dobbiamo affidarci non tanto a delle eventuali regole assiomatiche, ma alla nostra logica che se utilizzata con rigore non può tradirci.
  • 227. TREYresearch Aggiungere un piè di pagina 227 Subquery:EXISTS Sempre dalla tabella DIPENDENTI:
  • 228. TREYresearch Subquery:EXISTS Vogliamo estrapolare tutti i dati di NOME e DIVISIONE da questa tabella solo se e soltanto se è presente il nominativo Neri. Da questa interrogazione i dati vengono estrapolati perché essendo presente la stringa 'NERI' la parola chiave EXISTS restituisce il valore true. Nel caso la stringa 'NERI' non fosse stato presente la parola chiave EXISTS avrebbe restituito false e in questo caso l'interrogazione non avrebbe visualizzato nessun valore.