• Non ci sono risultati.

Sistemi per il recupero delle informazioni

N/A
N/A
Protected

Academic year: 2021

Condividi "Sistemi per il recupero delle informazioni"

Copied!
83
0
0

Testo completo

(1)

Sistemi per il recupero delle informazioni

IL LINGUAGGIO SQL

(2)

Accesso ai Dati nei Sistemi Relazionali

Una base di dati può essere utilizzata con due modalità:

interattivamente: l’utente interagisce direttamente con la base di dati presentando al sistema una richiesta di dati. Tale richiesta prende il nome di interrogazione (query). L’interrogazione viene interpretata dal sistema, che in risposta restituisce i dati richiesti. Nella richiesta devono essere specificate le proprietà dei dati che interessano. Se ad es. vogliamo l’elenco dei libri scritti da Calvino, nella richiesta deve essere specificata questa proprietà. L’interrogazione deve essere formulata per mezzo di un linguaggio formale.

mediante programmi: questo uso è riservato ad utenti programmatori.

Le interrogazioni fanno parte di un programma applicativo che può essere eseguito dal sistema numerose volte, ed il risultato delle interrogazioni può essere utilizzato dal programma per successive elaborazioni

(3)

INTRODUZIONE

Le interrogazioni devono essere scritte in un linguaggio formale con caratteristiche tali da renderlo adatto ad esprimere interrogazioni sulla BD, e da essere facilmente interpretato dal sistema. Il linguaggio generalmente usato si chiama SQL (Structured Query Language)

È un linguaggio di interrogazione e manipolazione della base dati e delle informazioni in essa contenute

Creato negli anni ’70 presso IBM , inizialmente solo come linguaggio di interrogazione. Ora è linguaggio di riferimento per DataBase relazionali.

Standardizzato grazie al lavoro di ISO (international standard organization) e ANSI (american national standard institute)

(4)

CREAZIONE DI TABELLE

Per definire una relazione (detta tabella nella terminologia SQL), si usa il comando “create table”, ad esempio

Libri(titolo, autore, codice_isbn)

(5)

VINCOLI

A ogni attributo possono essere associati dei vincoli

■ default: indica il valore che un attributo deve avere quando viene inserito un record che, in corrispondenza di quell’attributo non ha assegnato alcun valore

■ not null: i valori inseriti in quel campo devono essere diversi non nulli

■ unique: il valore può comparire una volta sola

■ primary key: chiave primaria

Il valore di un attributo dichiarato NOT NULL va obbligatoriamente specificato quando si aggiunge un’ennupla alla relazione. Un altro vincolo è l’eventuale chiave primaria dichiarata con l’opzione primary key. Gli attributi della chiave primaria non possono assumere valori NULL.

Quando nella definizione di una tabella sono dichiarati dei vincoli il sistema che gestisce la BD controlla che le operazioni che modificano la tabella inserendo nuove ennuple o modificando i valori di attributi non violino i vincoli dichiarati. Se un vincolo può essere violato l’operazione non viene eseguita e

(6)

ESEMPIO

create table libri (

titolo char(30) not null,

autore char(15) default ‘anonimo’, ISBN char(13) not null,

data_acquisto date,

collocazione char(5) unique, primary key (ISBN)

)

(7)

CHIAVI ESTERNE

Vediamo come introdurre una chiave esterna attraverso il comando Foreign Key

create table studenti ( nome char(20),

matricola char(8) not null, provincia char(2),

anno_nascita smallint, primary key (matricola)

foreign key (codice) references CDL,

on delete no action, )

create table CDL ( facoltà char(20),

nome char(20) not null, primary key (codice), )

(8)

CHIAVI ESTERNE

Quando si dichiara un vincolo di chiave esterna, il sistema fa i seguenti controlli:

1. quando si inserisce un’ennupla nella tabella Studenti, o quando si modifica il campo chiave esterna, il valore della chiave esterna deve essere presente in un’ennupla della tabella CDL;

2. quando si elimina un’ennupla dalla tabella CDL, se il valore della sua chiave primaria è usato come valore di una chiave esterna di un’ennupla della tabella Studenti, allora sono possibili tre scelte:

a. on delete no action: per proibire la cancellazione dell’ennupla da CDL.

Questa opzione vale anche quando si modifica il valore della chiave primaria di CDL;

b. on delete cascade, per eliminare sia l’ennupla da CDL che tutte le ennuple di Studenti che usano il valore della chiave primaria dell’ennupla che si elimina;

c. on delete set null, per eliminare l’ennupla da CDL e porre a null il valore della chiave esterna di tutte le ennuple di Studenti che usano il valore della chiave primaria dell’ennupla che si elimina.

(9)

MODIFICA DEI DATI

Nuovi dati si inseriscono nella tabella con il comando INSERT.

Ad esempio, per aggiungere una nuova ennupla alla relazione Studenti si dà il comando

INSERT INTO Studenti VALUES ("Tizio", "081575", "MI", “1985”)

Per cambiare invece l’attributo Provincia da “MI” a “TO” per lo studente con Matricola "081575", si dà il comando:

UPDATE Studenti SET Provincia = “TO”

WHERE Matricola = "081575"

Per eliminare invece l’ennupla dello studente con matricola "081575", si dà il comando:

DELETE Studenti WHERE Matricola = "081575"

(10)

RECUPERO DEI DATI:

IL COMANDO SELECT

OBIETTIVI: Scrivere una query in linguaggio SQL

selezionare ed elencare tutte le righe e le colonne di una tabella

selezionare ed elencare determinate colonne di una tabella

selezionare ed elencare le colonne di più tabelle

Anche se la parola query può essere tradotta in interrogazione o domanda, una query SQL non è necessariamente una domanda, può essere un comando per svolgere una delle seguenti operazioni:

creare o cancellare una tabella

inserire, modificare o cancellare campi

ricercare informazioni specifiche in più tabelle e restituire i risultati in un particolare ordine

modificare i parametri di protezione di un database

(11)

ESEMPIO - I

Si consideri il seguente schema relazionale

Catalogo ( ISBN, Titolo, CasaEd, AnnoEd)

Supponiamo che interessi conoscere il titolo e la casa editrice dei libri pubblicati nel 2001. Occorre:

1. consultare la relazione Catalogo

(12)

ESEMPIO - II

2. considerare solo le ennuple in cui AnnoEd = 2001

3. prelevare da queste ennuple i valori degli attributi Titolo e CasaEd

Questa sequenza di operazioni viene eseguita dal SGBD, purché gli venga trasmesso un opportuno comando (interrogazione) nel linguaggio SQL:

SELECT Titolo, CasaEd FROM Catalogo WHERE AnnoEd = 2001

dove SELECT, FROM e WHERE sono parole riservate del linguaggio SQL.

(13)

STRUTTURA DEL COMANDO

Una interrogazione (query) SQL agisce sulle relazioni definite nella base di dati, e restituisce come risultato una relazione.

questa viene in generale visualizzata sul monitor, oppure stampata; può anche essere memorizzata nella base di dati o può essere utilizzata in altre interrogazioni.

Nei casi più semplici una interrogazione SQL deve specificare

quali sono le informazioni che interessano

in quali relazioni si trovano

quali proprietà devono avere

(14)

SELECT

Quali sono le informazioni che interessano

SELECT Attributo1,Attributo2,...

è presente in ogni interrogazione e definisce lo schema della relazione risultato. Più avanti vedremo che può avere una forma più complessa.

Esempio:

SELECT Titolo, CasaEd significa che ci interessano il titolo e la casa editrice

Le singole colonne verranno elencate nello stesso ordine indicato.

Il comando Select in SQL equivale all’operazione di proiezione dell’algebra relazionale.

(15)

FROM

In quali relazioni si trovano

FROM Relazione1,Relazione2,...

è presente in ogni interrogazione e specifica quali relazioni occorre visitare per ottenere il risultato.

Esempio:

FROM Catalogo

significa che per estrarre le informazioni che interessano occorre prendere in esame la relazione Catalogo.

Per selezionare dati da un’altra tabella è sufficiente modificare la clausola FROM

(16)

WHERE

Quali proprietà devono essere soddisfatte

WHERE Condizione

La condizione è espressa sugli attributi delle relazioni specificate nella clausola FROM.

Può non essere presente, quando non si vogliono specificare condizioni.

Esempio:

WHERE AnnoEd = 2001

significa che interessano informazioni relative ai libri editi nel 2001.

(17)

ESEMPIO - I

Abbiamo visto che l’interrogazione

SELECT Titolo, CasaED FROM Catalogo

WHERE AnnoEd = 2001 restituisce la relazione

contenente titolo e casa editrice dei libri editi nel 2001

(18)

ESEMPIO - II

Invece l’interrogazione

SELECT Titolo, CasaED FROM Catalogo

restituisce la relazione

contenente titolo e casa editrice di tutti i libri presenti nel catalogo

(19)

Riassumendo…

Riepilogando la forma generale di un interrogazione SQL è, nei casi più semplici, la seguente:

SELECT Attributo1,Attributo2,...

FROM Relazione1,Relazione2,...

WHERE Condizione

Le parole in maiuscolo sono parole riservate del linguaggio SQL, sono fisse e specificano le clausole dell’ interrogazione; la clausola WHERE può mancare

Le parole in minuscolo sono variabili, e rappresentano le relazioni, gli attributi, le condizioni che riguardano la specifica interrogazione

(20)

EVITARE I DUPLICATI

Si consideri la seguente interrogazione

SELECT CasaEd FROM Catalogo

Se una casa editrice è presente nel catalogo con 1000 libri, il suo nome comparirà 1000 volte nel risultato

Se vogliamo evitare che ciò avvenga, scriveremo SELECT DISTINCT CasaEd

FROM Catalogo

che ha come risultato le case editrici presenti nel catalogo, rappresentate una sola volta

(21)

DISTINCT

In generale la specifica DISTINCT nella clausola SELECT elimina i duplicati dal risultato

La forma generale di un interrogazione SQL che abbiamo visto fin qui è quindi la seguente:

SELECT [DISTINCT] Attributo1,Attributo2,...

FROM Relazione1,Relazione2,...

[ WHERE Condizione]

dove le parti racchiuse tra parentesi quadre possono mancare

(22)

L’uso di *

Nella clausola SELECT si può specificare * in luogo della lista di attributi; in tal caso il risultato contiene tutti gli attributi delle relazioni specificate nella clausola FROM.

L’asterisco (*) di select * indica al database di fornire TUTTE le colonne associate alla tabella

SELECT * FROM Catalogo

WHERE CasaEd = “Feltrinelli”

Restituisce come risultato

(23)

Le parole SELECT e FROM consentono a una query di caricare dei dati.

La parola chiave DISTINCT limita l’output delle query poiché consente di escludere i valori duplicati di una colonna.

E’ possibile creare una query generica e includere tutte le colonne con l’istruzione SELECT *. E’ anche possibile selezionare solo alcune colonne e anche modificare l’ordine in cui devono essere presentate.

RIEPILOGO

(24)

Obiettivi

approfondire le clausole SELECT e FROM

ampliare la query con qualche nuovo termine

introdurre gli operatori.

In particolare impareremo a:

capire cos’è una espressione e come si utilizza

capire cos’è una condizione e come si utilizza

familiarizzare con la clausola WHERE

imparare ad usare gli operatori aritmetici, di confronto, di caratteri, logici e di insiemi

conoscere altri utili operatori

ESPRESSIONI, CONDIZIONI E OPERATORI

(25)

ESPRESSIONI

La definizione di espressione è semplice: un’espressione restituisce un valore

Nella seguente istruzione, NOME, INDIRIZZO, TELEFONO E RUBRICA sono espressioni:

SELECT NOME, INDIRIZZO, TELEFONO, RUBRICA FROM RUBRICA;

La seguente espressione:

WHERE NOME = ‘ROSSI’

contiene una condizione di una espressione booleana. Questa condizione potrà essere TRUE (vera) o FALSE (falsa) rispettivamente se la colonna NOME contiene ROSSI oppure no.

(26)

CONDIZIONI - I

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.

nell’esempio precedente la condizione è NOME = ‘ROSSI’. Per trovare tutti gli impiegati che hanno lavorato più di 100 ore la condizione potrebbe essere: NUMERODIORE > 100

Le condizioni consentono di effettuare query selettive. Nella forma più comune includono una variabile, una costante e un operatore di confronto.

Variabile……….. NOME

Costante………..’ROSSI’

Operatore di confronto………. >

Per scrivere una query condizionale bisogna conoscere la clausola WHERE e gli operatori. La condizione presente nella clausola WHERE può avere una struttura molto complessa

(27)

CONDIZIONI - II

In generale le condizioni sono formate combinando predicati con gli operatori booleani and, or e not

Predicato: è una condizione semplice del tipo E1 cfr E2 ove:

cfr è un operatore di confronto, cioè uno degli operatori

= < > <= >= <> (diverso)

E1 ed E2 sono espressioni, che possono essere attributi, costanti oppure espressioni formate con gli usuali operatori aritmetici. Molto spesso E1 è un attributo. E2 può essere un comando SELECT

Esempi

· AnnoEd > 1980 and CasaEd = “Feltrinelli”

· AnnoEd = 2000 and (CasaEd = “Einaudi” or CasaEd = “Mondadori”)

I predicati hanno valore true (vero) oppure false (falso).

(28)

TABELLA DI VERITA’

Gli operatori booleani rispettano le seguenti tabelle di verità:

true and true = true true or true = true

not true = false

true and false = false true or false = true not false = true

false and false = false false or false = false

(29)

LA CLAUSOLA WHERE

La sintassi della clausola WHERE è la seguente:

WHERE <condizione di ricerca>

La condizione presente nella clausola WHERE è ottenuta combinando predicati con gli operatori booleani. Gli attributi che compaiono nei predicati devono appartenere alle relazioni presenti nella clausola FROM

La clausola WHERE rende selettive le query, senza questa clausola la query visualizzerebbe tutti i record della tabella

Consideriamo il solito schema di relazione Catalogo e una sua istanza

(30)

LA CLAUSOLA WHERE - III

SELECT Titolo, CasaEd FROM Catalogo

WHERE Anno = 2001 and CasaEd = “Einaudi”

SELECT Titolo, CasaEd FROM Catalogo

WHERE Anno = 2001 or CasaEd = “Einaudi”

SELECT Titolo, CasaEd FROM Catalogo

WHERE Anno = 2000 and CasaEd <> “Feltrinelli”

(31)

ESEMPIO

SELECT CasaEd, Anno FROM Catalogo

WHERE Titolo = “L’amante” and

Anno = (SELECT max(Anno) FROM Catalogo WHERE Titolo = “L’amante” )

Viene dapprima calcolata la SELECT tra parentesi, ed il suo risultato viene utilizzato per valutare la condizione; La SELECT esterna restituisce come risultato la CasaEd e L’Anno della più recente edizione dell’ Amante presente nel Catalogo

In questo esempio è stato fatto uso di una struttura detta SOTTOSELECT , o SELECT annidata. Questa ha lo scopo di estrarre dalla BD un valore da utilizzare in una espressione. Si osservi che la Sottoselect ha come risultato un singolo valore, altrimenti il confronto non si può effettuare

(32)

E’ un potente gruppo di strumenti a base della conoscenza del linguaggio SQL

Gli operatori sono gli elementi utilizzati all’interno delle espressioni per specificare le condizioni necessarie a caricare i dati.

Possono essere divisi nei seguenti gruppi:

 aritmetici

 di confronto

 di caratteri

 logici

 di insieme

GLI OPERATORI

(33)

Non funziona con i tipi di dati che hanno cifre decimali I primi quattro operatori si spiegano da soli.

L’operatore modulo restituisce il resto di una divisione.

Ad esempio:

5 % 2 = 1 6 % 2 = 0

1. + (somma)

2. - (sottrazione)

3. / (divisione)

4. * (moltiplicazione) 5. % (modulo o resto)

GLI OPERATORI ARITMETICI

(34)

GLI OPERATORI ARITMETICI

2 * 6 + 9 / 3

vale

12 + 3 = 15

mentre l’espressione

2 * (6 + 9) / 3

vale

2 * 15 / 3 = 10

Se vengono inseriti più operatori aritmetici in una espressione senza parentesi, essi vengono valutati nell’ordine: moltiplicazione, divisione, modulo, somma e sottrazione.

Ad esempio:

(35)

SQL> SELECT * FROM PREZZO

ELEMENTO PREZZOINGROSSO

Pomodori 3,40

Patate 5,10

Banane 6,70

Rape 4,50

Arance 8,90

Mele 2,30

SQL> SELECT ELEMENTO, PREZZOINGROSSO, PREZZOINGROSSO + 1.50 FROM PREZZO

ELEMENTO PREZZOINGROSSO PREZZOINGROSSO + 1.50

Pomodori 3,40 4,90

Patate 5,10 6,60

Banane 6,70 8,20

Rape 4,50 6,00

Arance 8,90 10,40

Mele 2,30 4,80

La terza colonna (PREZZOINGROSSO + 1,50) non si trova nella tabella originale (in entrambi i casi sono state selezionate con il carattere * tutte le colonne).

SQL consente di creare colonne virtuali o derivate combinando o modificando le colonne esistenti.

OPERATORI ARITMETICI: SOMMA (+)

(36)

E’ possibile assegnare una intestazione più comprensibile alla nuova colonna:

ELEMENTO PREZZOINGROSSO PREZZODETTAGLIO

Pomodori 3,40 4,90

Patate 5,10 6,60

Banane 6,70 8,20

Rape 4,50 6,00

Arance 8,90 10,40

Mele 2,30 3,80

SQL> SELECT ELEMENTO, PREZZOINGROSSO,

(PREZZOINGROSSO + 1.50) PREZZODETTAGLIO FROM PREZZO

OPERATORI ARITMETICI: SOMMA (+)

(37)

L’operatore meno svolge due funzioni, la prima è quella di cambiare segno ad un numero:

SQL> SELECT * FROM MINMAX

REGIONE TEMPMAX TEMPMIN

Piemonte -4 10

Toscana 4 13

Sicilia 10 19

Lombardia -2 9

Friuli -3 8

REGIONE TEMPMAX TEMPMIN

Piemonte 4 -10

Toscana -4 -13

Sicilia -10 -19

SQL> SELECT REGIONE, -TEMPMAX, -TEMPMIN FROM MINMAX

OPERATORI ARITMETICI: SOTTRAZIONE (-)

(38)

OPERATORI ARITMETICI: SOTTRAZIONE (-)

REGIONE MINIME MASSIME DIFFERENZE

Piemonte -4 10 14

Toscana 4 13 9

Sicilia 10 19 9

Lombardia -2 9 11

Friuli -3 8 11

SQL> SELECT REGIONE, TEMPMAX MINIME, TEMPMIN MASSIME,

(TEMPMIN - TEMPMAX) DIFFERENZA FROM MINMAX;

Oltre che aver creato la nuova colonna questa query ha corretto (solo sullo schermo) i nomi di quelle errate.

La seconda (e ovvia) funzione dell’operatore meno è quella di sottrarre i valore di una colonna da quelli di un’altra colonna.

Ad esempio

(39)

L’operatore divisione ha un solo significato, per vedere gli effetti di una vendita a metà prezzo basta digitare la seguente istruzione:

SQL> SELECT ELEMENTO PRODOTTO, PREZZOINGROSSO, (PREZZOINGROSSO/2) PREZZOVENDITA FROM PREZZO

ELEMENTO PREZZOINGROSSO PREZZOVENDITA

Pomodori 3,40 1,70

Patate 5,10 2,55

Banane 6,70 3,35

Rape 4,50 2,25

Arance 8,90 4,45

Mele 2,30 1,15

OPERATORI ARITMETICI: DIVISIONE (/)

(40)

Anche l’’operatore moltiplicazione è semplice da usare, ad esempio questa query visualizza l’effetto di uno sconto del 10% sui prezzi di tutti i prodotti:

SQL> SELECT ELEMENTO PRODOTTO, PREZZOINGROSSO, (PREZZOINGROSSO*0.9) NUOVOPREZZO FROM PREZZO;

ELEMENTO PREZZOINGROSSO NUOVOPREZZO

Pomodori 3.40 3.06

Patate 5.10 4.59

Banane 6.70 6.03

Rape 4.50 4.05

Arance 8.90 8.01

Mele 2.30 2.07

OPERATORI ARITMETICI: MOLTIPLICAZIONE (*)

(41)

L’operatore modulo restituisce il resto intero di una operazione di divisione.

Esempio:

SQL> SELECT * FROM RESTI

NUMERATORE DENOMINATORE

10 5

8 3

23 9

1024 16

E’ possibile creare una nuova colonna, RESTO, dove registrare il resto della divisione tra NUMERATORE e DENOMINATORE

SQL> SELECT NUMERATORE, DENOMINATORE, (NUMERATORE % DENOMINATORE) RESTO

FROM RESTI NUMERATORE DENOMINATORE RESTO

10 5 0

8 3 2

OPERATORI ARITMETICI: MODULO (%)

(42)

Questi operatori confrontano le espressioni e restituiscono uno di questi tre valori: TRUE, FALSE, Unkown. I primi due sono semplici da spiegare, TRUE significa vero e FALSE significa falso, il terzo, Unknow, identifica l’assenza di dati in una colonna, cioè NULL.

Molte implementazioni SQL cambiano Unknown in FALSE e forniscono un operatore speciale, IS NULL, per verificare la condizione NULL (assenza di dati).

SQL> SELECT * FROM PREZZO WHERE PREZZOINGROSSO = NULL;

No row selected

SQL> SELECT * FROM PREZZO WHERE PREZZOINGROSSO IS NULL; ELEMENTO PREZZOINGROSSO

Limoni

Nel database la colonna prezzoingrosso della riga Limoni non contiene dati (non è zero)

OPERATORI DI CONFRONTO

(43)

Nella clausola WHERE il segno uguale è l’operatore di confronto più utilizzato, molto comodo per selezionare un valore tra tanti.

SQL> SELECT * FROM AMICI;

COGNOME NOME CITTA DATA DI NASCITA TELEFONO

ROSSI ALE MILANO 1/1/1970 02 3425678

BIANCHI SABY TORINO 25/5/1985 011 6707221

BROWN JO PISA 12/10/1968 050 880245

NERI ALE BOLOGNA 13/11/1986 051 6711

SQL> SELECT * FROM AMICI WHERE NOME = ‘ALE’;

COGNOME NOME CITTA DATA DI

NASCITA TELEFONO

ROSSI ALE MILANO 1/1/1970 02 3425678

NERI ALE BOLOGNA 13/11/1986 051 6711

SQL> SELECT * FROM AMICI WHERE NOME = ‘Ale’;

no row selected.

OPERATORI DI CONFRONTO: =

(44)

questi operatori operano nel seguente modo modo:

SQL> SELECT * FROM PREZZO;

ELEMENTO PREZZOINGROSSO

Pomodori 3.40

Patate 5.10

Banane 6.70

Rape 4.50

Arance 8.90

Mele 2.30

SQL> SELECT * FROM PREZZO WHERE PREZZOINGROSSO > 4.50;

ELEMENTO PREZZOINGROSSO

Patate 5.10

Banane 6.70

Arance 8.90

SQL> SELECT * FROM PREZZO WHERE PREZZOINGROSSO >= 4.50;

ELEMENTO PREZZOINGROSSO

Patate 5.10

Banane 6.70

Rape 4.50

Arance 8.90

Non si usano apici per racchiudere il numero 4.50

OPERATORI DI CONFRONTO: > , >=

(45)

questi operatori operano in senso inverso al precedente:

COGNOME NOME CITTA DATA DI

NASCITA TELEFONO

ROSSI ALE MILANO 1/1/1970 02 3425678

BIANCHI SABY TORINO 25/5/1985 011 6707221

BROWN JO PISA 12/10/1968 050 880245

NERI ALE BOLOGNA 13/11/1986 051 6711

COGNOME NOME CITTA DATA DI NASCITA TELEFONO

ROSSI ALE MILANO 1/1/1970 02 3425678

BROWN JO PISA 12/10/1968 050 880245

SQL> SELECT * FROM AMICI;

SQL> SELECT * FROM AMICI

WHERE CITTA < ‘MILANO’ ;

OPERATORI DI CONFRONTO: <, <=

(46)

Operatore di disuguaglianza: consente di trovare dati escludendone altri, cioè il simbolo (<>) oppure (!=) si legge “diverso da”.

Per trovare gli amici tranne ALE (cioè con il nome diverso da ALE):

COGNOME NOME CITTA DATA DI NASCITA TELEFONO

BIANCHI SABY TORINO 25/5/1985 011 6707221

BROWN JO PISA 12/10/1968 050 880245

In molte implementazione SQL è indifferente usare la forma (<>) anzichè (!=)

SQL> SELECT * FROM AMICI WHERE NOME <> ‘ALE’;

OPERATORI DI CONFRONTO: <>, !=

(47)

NOME POSIZIONE NUMEROPARTE

FEGATO DESTRA-ADDOME 1

CUORE PETTO 2

FARINGE GOLA 3

VERTEBRE CENTRO-DORSO 4

INCUDINE ORECCHIO 5

RENE DORSO 6

OPERATORI DI CARATTERE

Consentono di manipolare il modo in cui debbono essere rappresentate le stringhe durante la preparazione delle condizioni che selezionano i dati.

Come fare a trovare tutte le parti che si trovano nella zona dorsale del corpo? Osservando la

tabella è possibile individuarne due, ma hanno nomi differenti.

(48)

SQL> SELECT * FROM PARTI WHERE POSIZIONE LIKE ‘%DORSO%’;

NOME POSIZIONE NUMEROPARTE

VERTEBRE CENTRO-DORSO 4

RENE DORSO 6

SQL> SELECT * FROM PARTI WHERE POSIZIONE LIKE ‘DORSO%’;

NOME POSIZIONE NUMEROPARTE

RENE DORSO 6

SQL> SELECT * FROM PARTI WHERE POSIZIONE LIKE ‘%DORSO’;

NOME POSIZIONE NUMEROPARTE

VERTEBRE CENTRO-DORSO 4

OPERATORI DI CARATTERE: LIKE

L’operatore LIKE consente di estrarre dati che somigliano ad un certo schema

(49)

SQL> SELECT * FROM PARTI WHERE NOME LIKE ‘F%’;

NOME POSIZIONE NUMEROPARTE

FEGATO DESTRA-ADDOME 1

FARINGE GOLA 3

SQL> SELECT * FROM PARTI WHERE POSIZIONE LIKE ‘f%’;

no rows selected.

OPERATORI DI CARATTERE: LIKE

Come fare a trovare tutte le parti che iniziano per ‘F’? Osservando la tabella è possibile individuarne due, ma

hanno nomi differenti.

NOME POSIZIONE NUMEROPARTE

FEGATO DESTRA-ADDOME 1

CUORE PETTO 2

FARINGE GOLA 3

VERTEBRE CENTRO-DORSO 4

INCUDINE ORECCHIO 5

RENE DORSO 6

(50)

REGOLE

A LIKE maschera

A NOT LIKE maschera

Controlla che il valore dell’attributo A sia o non sia conforme alla maschera.

maschera è una sequenza qualunque di caratteri che può contenere i caratteri speciali “ - “ e “ % ”

Una parola è conforme alla maschera se

· I caratteri della maschera diversi da – e da % coincidono con quelli della parola.

· Al carattere – nella maschera corrisponde un qualunque carattere della parola

· Al carattere % nella maschera corrisponde una qualunque sequenza, anche vuota, di caratteri nella parola

(51)

ESEMPIO

? CodiceCliente, Cognome e Nome dei Clienti il cui Codice contiene dalla quarta posizione in avanti i caratteri MRC75

SELECT CodiceCliente, Cognome, Nome FROM Clienti

WHERE CodF LIKE ---MRC75%

ad es. BCEMRC7548, 123MRC75, j23MRC75e6732 sono tutte parole conformi alla maschera ---MRC75%

(52)

Il carattere di sottolineatura è un carattere jolly singolo.

E’ possibile utilizzare più di un carattere di sottolineatura e può essere combinato con l’operatore LIKE.

SQL> SELECT * FROM AMICI WHERE PROVINCIA LIKE ‘_O’;

COGNOME NOME CITTA PROVINCIA TELEFONO

ROSSI ALE MILANO MI 02 3425678

BIANCHI SABY TORINO TO 011 6707221

BROWN JO PISA PI 050 880245

NERI ALE BOLOGNA BO 051 6711

COGNOME NOME CITTA PROVINCIA TELEFONO

BIANCHI SABY TORINO TO 011 6707221

NERI ALE BOLOGNA BO 051 6711

L’OPERATORE DI SOTTOLINEATURA

(53)

SQL> SELECT NOME || COGNOME NOMECOMPLETO FROM AMICI;

COGNOME NOME CITTA PROVINCIA TELEFONO

ROSSI ALE MILANO MI 02 3425678

BIANCHI SABY TORINO TO 011 6707221

BROWN JO PISA PI 050 880245

NERI ALE BOLOGNA BO 051 6711

Il simbolo || serve a concatenare due stringhe:

NOMECOMPLETO

ROSSI ALE

BIANCHI SABY

BROWN JO

NERI ALE

L’OPERATORE DI CONCATENAZIONE (||)

(54)

Negli esempi precedenti è stato effettuato sempre un controllo alla volta. Questo metodo va bene per i casi semplici, ma come fareste a trovare tutti quei dipendenti i cui nomi iniziano con la lettera ‘B’ e che hanno più di 50 giorni di ferie?

Gli operatori logici separano due o più condizioni nella clausola WHERE di un’istruzione SQL.

Essi sono:

AND

OR

NOT

OPERATORI LOGICI

(55)

OPERATORI LOGICI: AND

COGNOME NUMDIP ANNI FERIEGODUTE

ABITA 101 2 4

BACCHI 104 5 23

BLESSI 107 8 45

BOLIVAR 233 4 80

BOLDI 210 15 100

COSTALES 211 10 78

L’operatore logico AND indica che entrambe le espressioni che si trovano ai suoi lati devono essere soddisfatte per restituire il valore TRUE (vero). Se una solo delle espressioni non è soddisfatta l’operatore AND restituisce FALSE.

Ad esempio, per sapere quali impiegati hanno lavorato per l’azienda per 5 anni o meno ed hanno utilizzato più di 20 giorni di ferie, si può scrivere:

SQL> SELECT * FROM FERIE

WHERE ANNI <= 5 AND

FERIEGODUTE > 20;

COGNOME NUMDIP ANNI FERIEGODUTE

BACCHI 104 5 23

BOLIVAR 233 4 80

(56)

COGNOME NUMDIP ANNI FERIEGODUTE

ABITA 101 2 4

BACCHI 104 5 23

BLESSI 107 8 45

BOLIVAR 233 4 80

BOLDI 210 15 100

COSTALES 211 10 78

L’operatore logico OR puo’ essere utilizzato per combinare una serie di condizioni. Se una di queste è soddisfatta viene restituito TRUE

SQL> SELECT * FROM FERIE

WHERE COGNOME LIKE ‘BO%’

OR

COGNOME LIKE ‘CO%’;

COGNOME NUMDIP ANNI FERIEGODUTE

BOLDI 210 15 100

BOLIVAR 233 4 80

COSTALES 211 10 78

L’operatore OR richiede che una soltanto delle condizioni sia vera affinchè dati possano

OPERATORI LOGICI: OR

(57)

COGNOME NUMDIP ANNI FERIEGODUTE

ABITA 101 2 4

BACCHI 104 5 23

BLESSI 107 8 45

BOLIVAR 233 4 80

BOLDI 210 15 100

COSTALES 211 10 78

L’operatore logico NOT ha il compito di invertire il significato di una condizione

SQL> SELECT * FROM FERIE

WHERE COGNOME NOT LIKE ‘B%’;

COGNOME NUMDIP ANNI FERIEGODUTE

ABITA 101 2 4

COSTALES 211 10 78

OPERATORI LOGICI: NOT

(58)

L’operatore UNION restituisce il risultato di due query escludendo le righe duplicate.

Esempio: quante persone diverse giocano in entrambe le squadre?

COGNOME

ABITA BRAVO CARLINI DECCA ESTERLE FUNDARI GIANI

COGNOME

ABITA BACCO CARLINI DINI ESTERLE FALCONI GIANI

SQL> SELECT COGNOME FROM CALCETTO UNION

SELECT COGNOME FROM CALCIO;

calcett o

COGNOME

ABITA BACCO BRAVO CARLINI DECCA DINI ESTERLE FALCONI

FUNDARI

A + B - C

A C B

Sono stati esclusi i doppioni

calcio

OPERATORI DI INSIEMI: UNION

(59)

L’operatore UNION ALL restituisce il risultato di due query incluse le righe duplicate.

COGNOME

ABITA BRAVO CARLINI DECCA ESTERLE FUNDARI GIANI

COGNOME

ABITA BACCO CARLINI DINI ESTERLE FALCONI GIANI

SQL> SELECT COGNOME FROM CALCETTO UNION ALL

SELECT COGNOME FROM CALCIO;

calcio calcett

o

COGNOME

ABITA BRAVO CRLINI DECCA ESTERLE FUNDARI GIANI ABITA BACCO CARLINI DINI ESTERLE

Esempio: quante persone giocano al calcetto e quante al calcio?

A + B

A C B

OPERATORI DI INSIEMI: UNION

(60)

L’operatore INTERSECT restituisce soltanto le righe che vengono trovate in entrambe le query

COGNOME

ABITA BRAVO CARLINI DECCA ESTERLE FUNDARI GIANI

COGNOME

ABITA BACCO CARLINI DINI ESTERLE FALCONI GIANI

SQL> SELECT COGNOME FROM CALCETTO INTERSECT

SELECT COGNOME FROM CALCIO;

calcio calcett

o

COGNOME

ABITA CRLINI ESTERLE GIANI

Esempio: quali persone giocano in entrambe le squadre?

C

A C B

OPERATORI DI INSIEMI: INTERSECT

(61)

L’operatore MINUS restituisce le righe della prima query che non sono presenti nella seconda

COGNOME

ABITA BRAVO CARLINI DECCA ESTERLE FUNDARI GIANI

COGNOME

ABITA BACCO CARLINI DINI ESTERLE FALCONI GIANI

SQL> SELECT COGNOME FROM CALCETTO MINUS

SELECT COGNOME FROM CALCIO;

calcio calcett

o

COGNOME

BACCCO DINI FALCONI

Esempio: quali persone giocano solo al calcetto?

A - C

A C B

OPERATORI DI INSIEMI: MINUS

(62)

Interrogazioni su più relazioni

Nella clausola FROM possono essere presenti più relazioni. Ciò è necessario quando le informazioni per eseguire l’interrogazione sono distribuite su relazioni diverse, vale a dire: quando gli attributi presenti nella clausola SELECT o nella clausola WHERE appartengono a relazioni diverse

Si consideri il seguente schema relazionale

Film(CodFilm,Titolo,Regista,Anno) Attori(CodFilm*, Attore)

e supponiamo di volere i titoli dei film in cui recita C. Eastwood. L’attributo

Titolo è nella relazione Film mentre l’attributo Attore è nella relazione Attori.

Occorre pertanto visitare entrambe le relazioni

(63)

ESEMPIO - I

.Supponiamo di avere le seguenti istanze di relazione:

(64)

ESEMPIO - II

Il SGBD esegue la seguente procedura:

Viene costruita una relazione concatenando le ennuple di Film e di Attori che sono in associazione (tali che CodFilm=CodFilm*)

Vengono prese in considerazione solo le ennuple in cui l’attributo Attore ha valore C.Eastwood.

(65)

ESEMPIO - III

Viene prelevato l’attributo Titolo

Questa interrogazione in SQL si scrive:

SELECT Titolo FROM Film, Attori

WHERE Film.CodFilm = Attori.CodFilm and Attore = “C.Eastwood”

dove Film.CodFilm ed Attori.CodFilm rappresentano il valore di CodFilm nella relazione Film e nella relazione Attori rispettivamente.

La condizione Film.CodFilm = Attori.CodFilm serve ad esprimere il

collegamento tra le ennuple di Film e quelle di Attori. Solo in questo modo

(66)

ESEMPIO - IV

Per motivi di chiarezza e per evitare ambiguità, è opportuno specificare, per ogni attributo, la relazione cui appartiene , con la notazione Relazione.Attributo. Pertanto l’interogazione precedente diventa

SELECT Film.Titolo FROM Film, Attori

WHERE Film.CodFilm = Attori.CodFilm and Attori.Attore = “C.Eastwood”

Per motivi di brevità è opportuno assegnare nella clausola FROM un nome abbreviato alle relazioni, da utilizzare nelle altre clausole dell’interrogazione:

SELECT F.Titolo FROM Film F, Attori A

WHERE F.CodFilm = A.CodFilm and A.Attore = “C.Eastwood”

(67)

GIUNZIONE

Sottolineiamo il fatto che fra le due relazioni deve esistere un collegamento (una chiave esterna in una relazione, chiave primaria nell’altra), e che nella clausola WHERE dell’interrogazione deve essere esplicitato tale collegamento. Osserviamo che nella clausola FROM può essere presente un qualunque numero di relazioni, purché queste siano collegate tra di loro, e nella clausola WHERE siano specificati tutti i collegamenti.

L’operazione che associa le ennuple di due relazioni (ad es. le ennuple di Film con quelle di Attori) è detta giunzione, e le condizioni di eguaglianza tra la chiave esterna di una relazione e la chiave primaria di un’altra (ad es Film.CodFilm = Attori.CodFilm) è detto predicato di giunzione.

(68)

ESEMPIO DIFFICILE

Si consideri lo schema relazionale:

FILM(CodiceDVD, Titolo, Regista, Anno) ATTORI(Nome, Nazionalità)

RECITA(CodiceDVD*, Nome*, Personaggio)

DVD(Collocazione, CodiceDVD*, DataNoleg, CodiceCliente*) CLIENTI(CodiceCliente, Cognome, Nome, Indirizzo, Telefono)

e si voglia estrarre Cognome e Nome dei Clienti che hanno noleggiato dvd relative a film in cui recitano attori francesi

(69)

ESEMPIO DIFFICILE

Cognome e Nome sono attributi della relazione Clienti.

Questa è collegata a DVD tramite CodiceCliente,

DVD è collegata a Film tramite CodiceDVD, Film è collegato a Recita tramite

CodiceDVD, ed infine Recita è collegato con Attori tramite Nome; finalmente in Attori troviamo l’attributo Nazionalità, e possiamo quindi verificare la condizione di ricerca.

In SQL tale interrogazione è piuttosto fastidiosa da scrivere:

SELECT Cl.Cognome, Cl.Nome

FROM Clienti Cl, DVD D, Film F, Recita R, Attori A WHERE Cl.CodiceCliente = Ca.CodiceCliente

and D.CodiceDVD = F.CodiceDVD and F.CodiceDVD = R.CodiceDVD

and R.Nome = A.Nome and A.Nazionalità = “francese”

(70)

ESEMPIO DIFFICILE

Può essere utile, per individuare le relazioni da specificare nella clausola FROM, considerare lo schema E-R rappresentato dallo schema relazionale:

da tale schema risulta evidente che per collegare Clienti con Attori occorre attraversare tutte le classi intermedie.

Dvd

(71)

Funzioni di aggregazione

SQL consente di estrarre dalla Base di Dati informazioni che non sono esplicitamente presenti, ma si ottengono da quelle presenti utilizzando opportune funzioni dette funzioni di aggregazione.

Studenti (Matricola, Nome, CorsodiLaurea) Esami (Matricola*, CodiceAF*, Voto)

AttivitàFormativa(CodiceAF, NomeAF, CFU)

Le funzioni di aggregazione consentono di estrarre dalla BD informazioni quali il numero di esami sostenuti da un determinato studente, il numero di studenti che hanno sostenuto un determinato esame, valori medi, massimi, minimi ecc.

(72)

COUNT

? Numero di esami sostenuti dallo studente con Matricola 123 SELECT Count(*)

FROM Esami

WHERE Matricola=123

Count(*) indica un conteggio: vengono contate le ennuple (ricordiamo che * indica l’intera ennupla) di Esami che soddisfano alla condizione Matricola=123. Restituisce il numero di righe che soddisfano la condizione specificata nella clausola WHERE

Al risultato di una funzione di aggregazione può essere dato un nome tramite il costrutto as:

SELECT Count(*) as Numero_Esami_AA252 FROM Esami E

WHERE CodiceMateria=AA252

(73)

SUM

? Numero di crediti acquisiti dallo studente con Matricola 123 SELECT Sum(CFU) as Crediti_di_123

FROM Esami E, AttivitàFormative A WHERE E.CodiceAF = A.CodiceAF and E.Matricola=123

Sum(CFU) indica l’ordinaria somma aritmetica dei valori (che devono essere numerici) dell’attributo CFU. Consideriamo a seguente istanza della BD

(74)

SUM

La giunzione E.CodiceAF = A.CodiceAF da luogo alla seguente relazione

La condizione E.Matricola=123 da luogo alla seguente relazione

(75)

SUM

La funzione Sum esegue la somma dei valori dell’attributo CFU e si ottiene il risultato desiderato

L’uso delle funzioni di aggregazione è limitato al caso in cui il risultato sia costituito da un solo valore; non possono cioè essere presenti allo stesso tempo nella clausola SELECT sia attributi che funzioni di aggregazione. La seguente interrogazione, ad es. è sbagliata (del resto avrebbe poco senso) SELECT Voto, Count(*)

FROM Esami

WHERE Matricola=123

(76)

MAX e MIN

? Il voto più basso dello studente con Matricola 123 SELECT Min(Voto)

FROM Esami

WHERE Matricola=123

Il voto più alto dello studente con Matricola 123 SELECT Max(Voto)

FROM Esami

WHERE Matricola=123

La funzione MAX (MIN) serve a trovare il valore massimo (€minimo) di una colonna.

(77)

Riassumendo

Le funzioni di aggregazione previste da SQL sono:

avg media aritmetica (valori numerici)

count numero di valori

max valore massimo

min valore minimo

sum somma (valori numerici)

Min e Max, quando sono applicati a valori non numerici, danno rispettivamente il primo e l’ultimo valore nell’ordine alfabetico.

(78)

ORDER BY

La clausola ORDER BY, specificata dopo SELECT FROM WHERE fa sì che il risultato sia ordinato; si può scegliere fra ordinamento crescente (se non si specifica nulla), o decrescente (se si specifica desc).

L’ordinamento può essere fatto anche su più attributi.

(79)

NULL

A IS NULL , A IS NOT NULL

controlla che l’ attributo A abbia o non abbia valore nullo

? La collocazione dei dvd non noleggiati SELECT Collocazione

FROM DVD

WHERE CodiceCliente is null

? La collocazione dei dvd noleggiati dopo il 1/1/08 SELECT Collocazione

FROM DVD

WHERE DataNoleg is not null and DataNoleg > 1/1/05

L’uso del predicato is [not] null è l’unico modo per stabilire se una dvd è o non è noleggiat0.

(80)

ESERCIZIO 1

Nell’ esercizio che segue sono dati degli schemi di Basi di Dati

relazionali, e delle richieste di informazioni da estrarre dalle Basi di Dati.

Esprimere tali richieste con interrogazioni SQL.

SCHEMA RELAZIONALE:

ATTORI (CodAttore, Nome, AnnoNascita, Nazionalità);

RECITA (CodAttore*, CodFilm*)

FILM (CodFilm, Titolo, AnnoProduzione, Nazionalità, Regista, Genere)

PROIEZIONI (CodProiezione, CodFilm*, CodSala*, Incasso, DataProiezione) SALE (CodSala, Posti, Nome, Città)

(81)

ESERCIZIO 1

Scrivere le interrogazioni SQL che restituiscono le seguenti informazioni:

1- Il nome di tutte le sale di Verona

2- Il titolo dei film di F. Fellini prodotti dopo il 1960.

3- Il titolo e la durata dei film di fantascienza giapponesi o francesi prodotti dopo il 1990

4- I titolo dei film dello stesso regista di “Casablanca”

5- Il titolo ed il genere dei film proiettati il giorno di Natale 2004 6- Il titolo dei film in cui recita M. Mastroianni oppure S.Loren 7- Il numero di sale di Messina con più di 60 posti

(82)

ESERCIZIO 2

SCHEMA RELAZIONALE:

ROMANZI(CodiceR, Titolo, NomeAut*, Anno) PERSONAGGI(NomeP, CodiceR*, sesso, ruolo)

AUTORI(NomeAut, AnnoN, AnnoM:optional, Nazione)

FILM(CodiceF, Titolo, Regista, Produttore, Anno, CodiceR*)

(83)

ESERCIZIO 2

1- Il titolo dei romanzi del 19° secolo

2- Il titolo, l’autore e l’anno di pubblicazione dei romanzi di autori russi, ordinati per autore e, per

lo stesso autore, ordinati per anno di pubblicazione

3- I personaggi principali (ruolo =”P”) dei romanzi di autori viventi.

4. I romanzi dai quali è stato tratto un film con lo stesso titolo del romanzo

5- Il titolo, il regista e l’anno dei film tratti dal romanzo “Robin Hood”

6- Per ogni autore italiano, l’anno del primo e dell’ultimo romanzo.

Riferimenti

Documenti correlati

Le caratteristiche delle basi di dati sono garantite da un sistema per la gestione di basi di dati (DBMS, Data Base Management System), che ha il controllo dei dati e

ABITA BRAVO CRLINI DECCA ESTERLE FUNDARI GIANI ABITA BACCO CARLINI DINI ESTERLE FALCONI GIANI. Sono incluse tutte

quando si inserisce un’ennupla nella tabella Studenti, o quando si modifica il campo chiave esterna, il valore della chiave esterna deve essere presente

 Data una collezione di documenti e un bisogno informativo dell’utente, obiettivo dell’IR è di recuperare, all’interno di una collezione, tutti e solo i

FILM (CodFilm, Titolo, AnnoProduzione, Nazionalità, Regista, Genere) ATTORI (CodAttore, Nome, AnnoNascita, Nazionalità). RECITA

Il risultato è una tabella che comprende tutte le righe di IMPIEGATO per cui il valore Dipart è uguale ad almeno uno dei valori di Nome in DIPARTIMENTO, limitatamente alle tuple

[r]

Il sistema di risposta allo stress è piu' efficace per affrontare stressors acuti o di breve durata, in quanto gli animali sono in grado di allontanarsi da