SQL (Structured Query Language)

Un corso completo sul linguaggio SQL (Structured Query Language): definizioni, esempi ed esercizi

Espressioni e operatori condizionali

Capitolo 2

Espressioni e operatori 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.

Esempio:

STUDENTI
NOME Cognome ANNO Classe Sezione
Mario Bianchi 1976 1 A
Anna Bianco 1973 2 B
Marta Carli 1974 3 A
Gianni Rossi 1972 4 A
Giulio Mancini 1972 5 A
Max Zunini 1976 5 B

con l’espressione:

SELECT *

FROM STUDENTI

WHERE CLASSE = 5

AND SEZIONE = ‘A’;

si ottiene:

NOME Cognome ANNO Classe Sezione
Giulio Mancini 1972 5 A

Operatori aritmetici

Sono gli operatori aritmetici: + (somma), – (sottrazione), / (divisione), * (moltiplicazione).

L’operatore somma:

data la tabella

PREZZO
Elemento PrezzoIngrosso
Pomodori 340
Patate 510
Banane 670
Rape 450
Arance 890
Mele 230

nella seguente espressione:

SELECT ELEMENTO, PREZZOINGROSSO, PREZZOINGROSSO + 150

FROM PREZZO;

l’operatore + aggiunge 150 lire a ogni prezzo e genera la seguente tabella:

ELEMENTO PREZZOINGROSSO PREZZOINGROSSO + 150
Pomodori 340 490
Patate 510 660
Banane 670 820
Rape 450 600
Arance 890 1040
Mele 230 380

 

Operatore sottrazione:

l’operatore meno svolge due funzioni. La prima è quella di cambiare il segno a un numero, la seconda è quella di 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

con l’espressione

SELECT REGIONE, -TEMPMIN, -TEMPMAX

FROM MINMAX;

si ottiene

REGIONE TEMPMIN TEMPMAX
Piemonte 4 -10
Toscana -4 -13
Sicilia -10 -19
Lombardia 2 -9
Friuli 3 -8

Vediamo il secondo caso:

con l’espressione

SELECT REGIONE,

(TEMPMAX – TEMPMIN) Differenza

FROM MINMAX;

REGIONE DIFFERENZA
Piemonte 14
Toscana 9
Sicilia 9
Lombardia 11
Friuli 11

Operatore divisione (/):

Esempio: abbiamo la necessità di vendere a metà prezzo

PREZZO
Elemento PrezzoIngrosso
Pomodori 340
Patate 510
Banane 670
Rape 450
Arance 890
Mele 230

con l’espressione

SELECT Elemento, PrezzoIngrosso, (PrezzoIngrosso / 2) PrezzoVendita

FROM PREZZO;

si ottiene

ELEMENTO PREZZOINGROSSO PREZZOVENDITA
Pomodori 340 170
Patate 510 255
Banane 670 335
Rape 450 225
Arance 890 445
Mele 230 115

Operatore moltiplicazione (*):

Esempio: abbiamo la necessità di moltiplicare per 0.9

PREZZO
Elemento PrezzoIngrosso
Pomodori 340
Patate 510
Banane 670
Rape 450
Arance 890
Mele 230

con l’espressione

SELECT Elemento, PrezzoIngrosso, (PrezzoIngrosso * 0.9) NuovoPrezzo

FROM PREZZO;

si ottiene

ELEMENTO PREZZOINGROSSO NUOVOPREZZO
Pomodori 340 306
Patate 510 459
Banane 670 603
Rape 450 405
Arance 890 801
Mele 230 207

Operatori di confronto

L’operatore (=):

Esempio: 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’;

NOME COGNOME TELEFONO
Mario Rossi 02 435591

Gli operatori: maggiore (>) , maggiore o uguale (>=), minore (<), minore o uguale (<=), diverso (<>):

Questi operatori si usano allo stesso modo di come si usa l’operatore di uguaglianza. Vediamo alcuni esempi:

ANAGRAFICA
Nome Cognome Età
Giovanni Bruni 55
Antonio Rossi 43
Mario Rossi 49
Piero Bianchi 37

Voglio sapere chi ha più di 44 anni

SELECT *

FROM ANAGRAFICA

WHERE Età > 44;

NOME COGNOME ETÀ
Giovanni Bruni 55
Mario Rossi 49

Voglio sapere chi ha un’età diversa da 55 anni

SELECT *

FROM ANAGRAFICA

WHERE Età <> 55;

NOME COGNOME ETÀ
Antonio Rossi 43
Mario Rossi 49
Piero Bianchi 37

L’operatore IS:

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:

NOME COGNOME ETA
Giovanni Bruni 55
Antonio Rossi 43
Mario Rossi 49
Piero Bianchi 37
Esmeralda Gnocca

Ora vogliamo conoscere il nome e il cognome delle persone di cui non abbiamo il dato età:

SELECT *

FROM ANAGRAFICA

WHERE ETA IS NULL;

NOME COGNOME ETA
Esmeralda Gnocca

L’operatore IS funziona con la clausola NULL, ma possiamo sostituirlo anche con l’operatore (=): WHERE ETA = NULL;

Operatori di caratteri

Gli operatori di caratteri possono essere utilizzati per manipolare il modo in cui le stringhe devo essere ricercate.

Operatore LIKE:

È 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 Destra-Addome
Cuore Petto
Faringe Gola
Vertebre Centro-Dorso
Incudine Orecchio
Rene Dorso

SELECT *

FROM ANATOMIA

WHERE Posizione LIKE ‘%Dorso%’;

Nome Posizione
Vertebre Centro-Dorso
Rene Dorso

Si noti l’uso del segno ‘%’ dopo LIKE. Esso rappresenta zero, uno o più caratteri. Il corrispondente carattere implementato da Access è ‘*’.

Nome Posizione
Rene Dorso

SELECT *

FROM ANATOMIA

WHERE Nome LIKE ‘F%’;

Nome Posizione
Fegato Destra-Addome
Faringe Gola

Vediamo altri esempi:

NOMINATIVI
Nome Cognome Provincia
Giovanni Bruni CO
Antonio Rossi MI
Mario Rossi CT
Piero Bianchi PV

SELECT *

FROM NOMINATIVI

WHERE Provincia LIKE ‘C_’;

Nome Cognome Provincia
Giovanni Bruni CO
Mario Rossi CT

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,).

Operatore di concatenazione ()

Il simbolo serve a concatenare due stringhe. Il corrispettivo operatore che si usa con Access è ‘&’. Vediamo alcuni esempi:

AMICI
COGNOME NOME TELEFONO PR CAP
ROSSI ALESSANDRA 0761 556632 BG 01023
VERDI ALESSANDRA 02 345622 MI 03456
MERRILI 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;

NOMECOMPLETO
ALESSANDRAROSSI
ALESSANDRAVERDI
TITTIMERRILI
BARBYBANFI
MARIAPERSIANI
JOMAZZA
BORDONICHIARA

Access non implementa, oltre che l’operatore ‘’, anche questo modo di ridenominare le colonne estrapolate:

SELECT NOME COGNOME NOMECOMPLETO

Ecco un’altra applicazione dell’operatore di concatenazione:

SELECT COGNOME ‘, ’ NOME AMICO

FROM AMICI;

AMICO
ROSI, ALESSANDRA
VERDI, ALESSANDRA
MERRILI, TITTI
BANFI, BARBY
PERSIANI, MARIA
MAZZA, JO
BORDONI, CHIARA

Gli operatori logici

Per comprendere a pieno gli operatori logici bisogna introdurre i fondamenti dell’algebra di Boole.

Algebra di BOOLE

L’elemento essenziale del pensiero umano è la logica che permette all’uomo di formulare ragionamenti e di elaborare informazioni che gli vengono fornite dall’esterno. L’uomo si avvale di una logica esprimibile con un linguaggio che gli è congeniale e che si sa essere il linguaggio binario.

Il tipo di logica dei calcolatori è un modello applicativo di un sistema logico costituito nel secolo scorso dal matematico inglese George Boole che da lui prende il nome di ‘algebra booleana’.

Il sistema logico di Boole trae la sua prima ispirazione dal tentativo di introdurre un ‘calcolo logico’ o, più significativamente di ‘matematizzare’ le leggi del pensiero logico.

George Boole pubblicò nel 1856 un trattato in cui espose il suo articolato calcolo logico.

L’algebra delle proposizioni è la logica di cui si avvalgono i calcolatori per interpretare ed eseguire le istruzioni dei programmi; è anche la logica usata nella progettazione e per il funzionamento dei circuiti elettronici.

Algebra delle proposizioni

Le frasi del linguaggio della logica si differenziano notevolmente da quelle del linguaggio comune perché per ogni frase logica ha senso chiedersi se ciò che enuncia è vero o falso.

Le frasi del linguaggio della logica prendono il nome di proposizioni logiche o, più semplicemente, proposizioni ( o enunciati).

Per esempio, le frasi:

a: Roma è capitale d’Italia

b: 10 è un numero dispari

c: la rosa è un fiore;

sono proposizioni logiche. Infatti posiamo dire con certezza che gli enunciati a e c sono veri mentre l’enunciato b falso.

Consideriamo ora i seguenti enunciati:

d: che bello volare;

e: hai visto Maria?;

f : domani pioverà;

riferendoci a queste frasi non possiamo dire se sono vere o false. ‘Che bello volare’ può essere una proposizione vera per chi ama il volo, ma non per chi ne ha paura. La verità o la falsità della frase dipendono solo dalle emozioni soggettive. Così non si può dire se le frasi e e f sono vere o false. Quindi le frasi d, e, f non sono proposizioni logiche.

Da questo possiamo dire:

In logica si chiama proposizione ogni frase per la quale ha senso dire che è “vera”, o è “falsa”.

La logica delle proposizioni è anche detta logica bivalente proprio perché ogni proposizione può avere uno solo dei due valori: vero o falso.

Vediamo ora le operazioni sulle proposizioni.

Congiunzione logica:

Date le due proposizioni:

a: Mantova è una città;

b: L’Italia è una nazione;

la proposizione:

r: Mantova è una città e l’Italia è una nazione

è una proposizione composta, ottenuta operando sulle proposizioni a e b per mezzo del connettivo e. Il valore di verità di r dipende dai valori delle due proposizioni. L’operazione binaria che da come risultato il valore di verità r si chiama congiunzione logica.

DEFINIZIONE: Si chiama congiunzione logica un’operazione che ad ogni coppia di proposizioni a, b associa la proposizione composta r che è vera se a e b sono entrambe vere e falsa in tutti gi altri casi.

Il connettivo congiunzione viene indicato con AND. La tavola della verità della congiunzione logica è la seguente e si ottiene considerando tutte le possibile coppie di valori di verità attribuibili ad a e b.

a b r = a AND b
FALSO FALSO FALSO
FALSO VERO FALSO
VERO FALSO FALSO
VERO VERO VERO

Disgiunzione logica:

Date le proposizioni:

a: il quadrato è un poligono

b: Dante è un poeta

la proposizione:

r : il quadro è un poligono o Dante è un poeta

è una proposizione composta, ottenuta operando sulle proposizioni a e b per mezzo del connettivo o. L’operazione binaria che da come risultato il valore di verità r si chiama disgiunzione logica.

DEFINIZIONE: Si chiama disgiunzione logica un’operazione che ad ogni coppia di proposizioni a, b associa la proposizione composta r che è vera se almeno una delle due proposizioni è vera, falsa se a e b sono entrambe false.

Il connettivo disgiunzione logica viene indicato con OR. La tavola della verità della disgiunzione logica è la seguente e si ottiene considerando tutte le possibile coppie di valori di verità attribuibili ad a e b.

a b R = a OR b
FALSO FALSO FALSO
FALSO VERO VERO
VERO FALSO VERO
VERO VERO VERO

Negazione logica:

Date le proposizioni:

a: 3 è un numero dispari

b: 3 non è un numero dispari

è evidente che la proposizione b è la negazione della proposizione a. Possiamo dire che b si ottiene da a mediante la sua negazione.

DEFINIZIONE: Si chiama negazione logica un’operazione che ad una proposizione a, associa la proposizione b la quale risulta vera se a è falsa e falsa se a è vera.

La negazione logica viene indicata con NOT. La tavola della verità della negazione logica è la seguente.

a NOT a
FALSO VERO
VERO FALSO

Negli esempi che utilizzeremo, per meglio comprendere gli operatori logici, non appariranno espressioni booleane complesse ma espressioni semplici, cioè composte da un solo operatore. Dobbiamo far presente però, che tali operatori sono utilizzabili come qualsiasi altro operatore matematico, dunque nulla ci impedisce di creare delle vere e proprie espressioni algebriche lunghe a piacere.

La breve panoramica sull’algebra booleana termina qui; vista la semplicità dell’argomento lasciamo al lettore il compito di utilizzare e ‘trasferire’ quanto a appreso, alle specifiche del linguaggio SQL.

Operatore AND:

Indica che entrambe le espressioni che si trovano ai suoi lati devono essere soddisfatte, vediamo un esempio:

FERIE
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

vogliamo sapere quali impiegati hanno lavorato nell’azienda per 5 anni o più e hanno utilizzato più di 50 giorni di ferie.

SELECT COGNOME

FROM FERIE

WHERE ANNI >= 5

AND FERIE_GODUTE > 50;

COGNOME
BOLDI
GIALLI

L’operatore OR:

È sufficiente che una sola espressione sia verificata per ottenere il valore TRUE, 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.

SELECT COGNOME

FROM FERIE

WHERE ANNI <= 5

OR FERIE_GODUTE > 80;

COGNOME
MARINI
ROSSI
ZAPPA
VERDI
BOLDI

Operatore NOT:

Ha il compito di invertire il significato di una condizione, vediamo un esempio:

vogliamo conoscere i cognomi che non iniziano per B.

SELECT COGNOME

FROM FERIE

WHERE COGNOME NOT LIKE ‘B%’;

COGNOME
MARINI
ROSSI
ZAPPA
VERDI
GIALLI

Autore: Art Net

Condividi questo articolo su

15 Commenti

  1. SAlve, quindi non esiste una funzione come p.e. in Excel, che estragga alcuni caratteri a destra o sinistra?
    Ho provato cn right(nome, 3) ma non lo riconosce

    Rispondi al Commento
  2. SELECT COUNT (*)
    Buongiorno

    FROM IMPIEGATO
    WHERE DIPARTIMENTO = ‘PRODUZIONE’

    genera il seguente errore:
    “The data types text and varchar are incompatible in the equal to operator”.

    Invece, sostituendo con WHERE DIPARTIMENTO LIKE ‘PRODUZIONE’, la query funziona.

    Rispondi al Commento
  3. Ho imparato alcune cose buone qui. Certamente merita il bookmarking per la rivisitazione.

    Mi chiedo quanti sforzi hai impostato per creare questo tipo di fantastico sito informativo.

    Rispondi al Commento
  4. guida molto interessante grazie se ci fossero anche le istruzioni per creare la tabella sarebbe completa secondo me

    Rispondi al Commento
  5. Grazie per la guida. Semplice, interessante ed utile.
    Vorremmo segnalare due cose. Un errore ed un dubbio.
    Errore:
    SELECT DIVISIONE, AVG(STIPENDIO)
    FROM DIPENDENTI
    HAVING AVG(STIPENDIO) > 2200000;

    manca la “group by DIVISIONE” prima della HAVING.

    Di conseguenza il dubbio sul punto 6.
    HAVING non è necessario che venga posta dopo la clausola GROUP BY.
    Sicuri?

    Rispondi al Commento
  6. Guida Molto utile, segnalo un errore nella query 9, capitolo 2, delle soluzioni:
    PrezzoIngrosso è moltiplicato * 1,5 ma si chiedeva un aumento del 15%, ciò significa moltiplicare * 1,15

    Rispondi al Commento
  7. Veramente complimenti, una guida dettagliata, semplice e adatta a tutti 🙂

    FortyZone

    Rispondi al Commento
  8. Davvero complimenti ragazzi. La prima guida che per chi parte da zero è manna dal cielo…PERFETTA!!

    Rispondi al Commento
  9. nel punto 8 la soluzione non dovrebbe essere con HAVING MIN(IMPORTO) > 400 000; cioè: SELECT BENEFICIARI FROM ASSEGNI GROUP BY BENEFICIARIO HAVING MIN(IMPORTO) > 400 000;

    Rispondi al Commento
  10. un ottimo Manuale unico errore (se vogliamo chiamarlo cosi) i tipi di dati Char(5) number(5,2) cosa sono e come si usano

    Rispondi al Commento
  11. Complimenti ottimo sito! fatto davvero bene. Grazie!

    Rispondi al Commento

Invia commento

Il tuo indirizzo email non sarà pubblicato.