La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Sistemi per il recupero delle informazioni RIASSUNTO: IL LINGUAGGIO SQL.

Copie: 1
Sistemi per il recupero delle informazioni RIASSUNTO.

Presentazioni simili


Presentazione sul tema: "Sistemi per il recupero delle informazioni RIASSUNTO: IL LINGUAGGIO SQL."— Transcript della presentazione:

1 Sistemi per il recupero delle informazioni RIASSUNTO: IL LINGUAGGIO SQL

2 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)

3 CREAZIONE DI TABELLE Per definire una relazione (detta tabella nella terminologia SQL), si usa il comando create table: definisce uno schema di relazione e ne crea unistanza vuota; specifica attributi, domini e vincoli; ad esempio Libri(titolo, autore, codice_isbn)

4 CREATE TABLE, esempio CREATE TABLE Impiegato( Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, Dipart CHAR(15), Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )

5 Domini Domini elementari (predefiniti) Carattere: singoli caratteri o stringhe, anche di lunghezza variabile Bit: singoli booleani (flag) o stringhe di bit Numerici: esatti (es: numeric, decimal) approssimati (es: float) Data, ora, intervalli di tempo – UTC (Universal time coordinate) Introdotti in SQL:1999: Boolean BLOB, CLOB (Binary/Character large object): per grandi immagini e testi Domini definiti dall'utente (semplici, ma riutilizzabili)

6 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 quellattributo non ha assegnato alcun valore not null: i valori inseriti in quel campo devono essere diversi non nulli Es: Cognome CHAR(20) not null unique: il valore può comparire una volta sola primary key: chiave primaria, (una sola, implica NOT NULL)

7 VINCOLI Il valore di un attributo dichiarato NOT NULL va obbligatoriamente specificato quando si aggiunge unennupla alla relazione. Un altro vincolo è leventuale chiave primaria dichiarata con lopzione 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 loperazione non viene eseguita e viene segnalata una condizione di errore

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

9 CHIAVI ESTERNE Quando si dichiara un vincolo di chiave esterna, il sistema fa i seguenti controlli: 1. quando si inserisce unennupla nella tabella Studenti, o quando si modifica il campo chiave esterna, il valore della chiave esterna deve essere presente in unennupla della tabella CDL; 2. quando si elimina unennupla dalla tabella CDL, se il valore della sua chiave primaria è usato come valore di una chiave esterna di unennupla della tabella Studenti, allora sono possibili tre scelte: a. on delete no action: per proibire la cancellazione dellennupla da CDL. Questa opzione vale anche quando si modifica il valore della chiave primaria di CDL; b. on delete cascade, per eliminare sia lennupla da CDL che tutte le ennuple di Studenti che usano il valore della chiave primaria dellennupla che si elimina; c. on delete set null, per eliminare lennupla da CDL e porre a null il valore della chiave esterna di tutte le ennuple di Studenti che usano il valore della chiave primaria dellennupla che si elimina.

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 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

12 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 alloperazione di proiezione dellalgebra relazionale.

13 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 unaltra tabella è sufficiente modificare la clausola FROM

14 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.

15 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

16 Selezione e proiezione Nome e reddito delle persone con meno di trenta anni PROJ Nome, Reddito (SEL Eta<30 (Persone)) SELECT Nome, Reddito FROM Persone WHERE Eta < 30 NomeEtà Persone Reddito Andrea27 Maria55 Anna50 Filippo26 Luigi50 Franco60 Olga30 Sergio85 Luisa75 Aldo

17 NomeEtà Persone Reddito Andrea2721 Maria5542 Anna5035 Filippo2630 Luigi5040 Franco6020 Olga3041 Sergio8535 Luisa7587 Aldo2515 Andrea2721 Aldo2515 Filippo2630 Andrea2721 Aldo2515 Filippo Reddito

18 Selezione, senza proiezione Nome, età e reddito delle persone con meno di trenta anni SEL Eta<30 (Persone) SELECT * FROM Persone WHERE Eta < 30 Proiezione, senza selezione Nome e reddito di tutte le persone PROJ Nome, Reddito (Persone) SELECT Nome, Reddito FROM Persone

19 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

20 ESPRESSIONI La definizione di espressione è semplice: unespressione restituisce un valore Nella seguente istruzione, NOME, INDIRIZZO, TELEFONO E RUBRICA sono espressioni: SELECT NOME, INDIRIZZO, TELEFONO, RUBRICA FROM RUBRICA; NOME è 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.

21 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

22 LA CLAUSOLA WHERE 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

23 ESEMPIO SELECT CasaEd, Anno FROM Catalogo WHERE Titolo = Lamante and Anno = (SELECT max(Anno) FROM Catalogo WHERE Titolo = Lamante ) 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 LAnno 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 dal DB 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

24 E un potente gruppo di strumenti a base della conoscenza del linguaggio SQL Gli operatori sono gli elementi utilizzati allinterno delle espressioni per specificare le condizioni necessarie a caricare i dati. Possono essere divisi nei seguenti gruppi: aritmetici di confronto (, >=, !=) di carattere (es. LIKE %A%) logici (AND, OR, NOT) di insieme GLI OPERATORI

25 Interrogazioni su più relazioni Nella clausola FROM possono essere presenti più relazioni. Ciò è necessario quando le informazioni per eseguire linterrogazione 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. Lattributo Titolo è nella relazione Film mentre lattributo Attore è nella relazione Attori. Occorre pertanto visitare entrambe le relazioni

26 ESEMPIO - I.Supponiamo di avere le seguenti istanze di relazione:

27 ESEMPIO - II Il DBMS 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 lattributo Attore ha valore C.Eastwood.

28 ESEMPIO - III Viene prelevato lattributo 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 C.Eastwood sarà associato ad un film in cui recita.

29 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 linterogazione 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 dellinterrogazione: SELECT F.Titolo FROM Film F, Attori A WHERE F.CodFilm = A.CodFilm and A.Attore = C.Eastwood

30 JOIN Sottolineiamo il fatto che fra le due relazioni deve esistere un collegamento (una chiave esterna in una relazione, chiave primaria nellaltra), e che nella clausola WHERE dellinterrogazione 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. Loperazione che associa le ennuple di due relazioni (ad es. le ennuple di Film con quelle di Attori) è quella di join, e la condizione di eguaglianza tra la chiave esterna di una relazione e la chiave primaria di unaltra (ad es Film.CodFilm = Attori.CodFilm) è detto predicato di join.

31 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 relativi a film in cui recitano attori francesi

32 ESEMPIO DIFFICILE Cognome e Nome sono attributi della relazione Clienti. Clienti è 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 lattributo 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 = D.CodiceCliente and D.CodiceDVD = F.CodiceDVD and F.CodiceDVD = R.CodiceDVD and R.Nome = A.Nome and A.Nazionalità = francese

33 33 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

34 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 dal DB 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.

35 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 lintera 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

36 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 lordinaria somma aritmetica dei valori (che devono essere numerici) dellattributo CFU. Consideriamo la seguente istanza del DB

37 SUM Il join E.CodiceAF = A.CodiceAF da luogo alla seguente relazione La condizione E.Matricola=123 da luogo alla seguente relazione

38 SUM La funzione Sum esegue la somma dei valori dellattributo CFU e si ottiene il risultato desiderato Luso 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

39 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.

40 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 lultimo valore nellordine alfabetico.

41 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). Lordinamento può essere fatto anche su più attributi. Nome e reddito delle persone con meno di trenta anni in ordine alfabetico select nome, reddito from persone where eta < 30 order by nome

42 Persone NomeReddito Andrea21 Aldo15 Filippo30 Persone NomeReddito Andrea21 Aldo15 Filippo30 select nome, reddito from persone where eta < 30 select nome, reddito from persone where eta < 30 order by nome

43 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 Luso del predicato is [not] null è lunico modo per stabilire se una dvd è o non è noleggiat0.

44 Sistemi per il recupero delle informazioni ESERCIZI

45 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à)

46 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 Il titolo e la durata dei film di fantascienza giapponesi o francesi prodotti dopo il I titolo dei film dello stesso regista di Casablanca 5- Il titolo ed il genere dei film proiettati il giorno di Natale Il titolo dei film in cui recita M. Mastroianni oppure S.Loren 7- Il numero di sale di Messina con più di 60 posti

47 ESERCIZIO 1 1- Il nome di tutte le sale di Verona SELECT s.Nome FROM Sale s WHERE s.Città = 'Pisa 2- Il titolo dei film di F. Fellini prodotti dopo il SELECT f.Titolo FROM Film f WHERE f.Regista = Fellini AND f.AnnoProduzione > Il titolo e la durata dei film di fantascienza giapponesi o francesi prodotti dopo il 1990 SELECT f.Titolo, f.Durata FROM Film f WHERE f.Genere=Fantascienza and ((f.Nazionalità=Giapponese or f.Nazionalità=Francese) and f.AnnoProduzione >1990

48 ESERCIZIO 1 4- I titolo dei film dello stesso regista di Casablanca SELECT f.Titolo FROM Film f WHERE f.Regista = (SELECT f.Regista FROM Film f WHERE f.Titolo = Casablanca) 5- Il titolo ed il genere dei film proiettati il giorno di Natale 2004 SELECT DISTINCT f.Titolo, f.Genere FROM Film f, Proiezioni p WHERE p DataProiezione =25/12/04 and f.CodFilm=p.CodFilm 6- Il titolo dei film in cui recita M. Mastroianni oppure S.Loren SELECT DISTINCT f.Titolo FROM Film f, Recita r, Attore a WHERE (a.Nome = M.Mastrianni OR a.Nome = S.Loren) AND f.CodFilm = r.CodFilm AND r.CodAttore = a.CodAttore 7- Il numero di sale di Messina con più di 60 posti SELECT count(*) FROM Sale s WHERE s.Città = Messina and s.Posti > 60

49 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*)

50 ESERCIZIO 2 1- Il titolo dei romanzi del 19° secolo 2- Il titolo, lautore e lanno 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 lanno dei film tratti dal romanzo Robin Hood 6- Per ogni autore italiano, lanno del primo e dellultimo romanzo.

51 ESERCIZIO 3 SCHEMA RELAZIONALE: STUDENTI (Matricola, NomeS, CorsoLaurea*, AnnoN) CORSIDILAUREA (CorsoLaurea, TipoLaurea, Facoltà) FREQUENTA (Matricola*, CodCorso*) CORSI (CodCorso, NomeCorso, CodDocente*) DOCENTI (CodDocente, NomeD, Dipartimento)

52 ESERCIZIO 3 1- Il nome e lanno di nascita degli studenti iscritti a Editoria e Giornalismo, in ordine rispetto al nome 2- Matricola e nome degli studenti di un corso di laurea triennale (tipoLaurea = 'L') che seguono un corso di un docente di nome Anna. 3- Per ogni tipo di laurea, il tipoLaurea e letà media degli studenti 4- Il codice dei corsi frequentati da più di 5 studenti e tenuti da docenti del Dipartimento di Informatica 5- Per ogni studente della Facoltà di Lettere e Filisofia, la matricola ed il numero di corsi seguiti 6- Matricola e nome degli studenti che non frequentano nessun corso 7- Nome e CodDocente dei docenti che insegnano qualche corso seguito da più di 5 studenti

53 Esercizio Provate a creare un DB (potete anche usare la creazione guidata di Access) contenente almeno 2 tabelle query su tabelle singole e su più tabelle maschere report Inviatemi, per favore, a entro il 4 i file.mdb del DB da voi creato un file di testo con le risposte agli esercizi 2 e 3 GRAZIE!!!!!!!!! ^_^ e…buon lavoro!!!


Scaricare ppt "Sistemi per il recupero delle informazioni RIASSUNTO: IL LINGUAGGIO SQL."

Presentazioni simili


Annunci Google