Imparare a programmare e manipolare i dati di uno o più database attraverso il linguaggio SQL. La guida è corredata di esempi. Ogni comando ed istruzione spiegata in modo semplice .
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.
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.
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
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
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';
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
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';
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;
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,).
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;
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
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.
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]
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:
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
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.
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;
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);
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.
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.