Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

2

Share

Download to read offline

Guida SQL: le basi per iniziare a programmare i database

Download to read offline

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 .

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Guida SQL: le basi per iniziare a programmare i database

  1. 1. TREYresearch Programmatore: Barbieri Andrea Cell: 3296664935 Email: btftraduzioniseoweb@gmail.com Pagina Linkedin https://www.linkedin.com/in/andrea-barbieri/ Sito web: https://btftraduzioniseoweb.altervista.org Programmatore, web designer, traduttore. 1
  2. 2. GuidaSQL:lebasi
  3. 3. TREYresearch Lanostramissione Imparare le basi del linguaggio SQL 3 QuestafotodiAutoresconosciutoè concessoinlicenzadaCCBY-NC-ND
  4. 4. TREYresearch Checos’è SQL?
  5. 5. TREYresearch 5 SQL appartiene alla famiglia dei linguaggi di gestione dei database. Ed è il linguaggio più utilizzato e diffuso nel mondo.
  6. 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. 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. 8. TREYresearch 8 Conosciamo meglio SQL SQL, la cui pronuncia è Sequel, rappresenta l’acronimo Structured Query Language. SQL è un linguaggio di programmazione per database.
  9. 9. TREYresearch AbbiamodettocheSQLèun linguaggiodi programmazione. Ma cos’è un linguaggio di programmazione ? 9 Questa foto di Autore sconosciuto è concesso in licenza da CC BY
  10. 10. TREYresearch 10 Un linguaggio di programmazione è composto da un serie di istruzioni che restituiscono un output all’utente.
  11. 11. TREYresearch 11 SQL è un linguaggio usato per creare: • trasformare e recuperare informazioni in un RDBMS (Relational Database Management System). Più semplicemente definito come Sistema per la Gestione dei Database Relazionali.
  12. 12. TREYresearch 12 Esempio di una Tabella in RDBMS
  13. 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. 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.
  15. 15. TREYresearch Cosasipuòfarecon questolinguaggiodi programmazione? 1 5
  16. 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. 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. 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. 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. 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. 21. TREYresearch SQL:lastoria4 In circa 30 anni di vita, SQL ha avuto molti aggiornamenti e migliorie. Che gli hanno consentito di rimanere sempre al passo con le nuove tecnologie. 21
  22. 22. TREYresearch SQL:RBDSM1 RDBSM è l’acronimo Relational Database Management System. E per comprendere ogni aspetto di SQL è necessario capire cosa sono. 22
  23. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 48. TREYresearch 48 Introduzione alle query: Prime elementari regole 8 Con l’espressione: SELECT Nome, Cognome FROM DOCENTI; Si ottiene questa tabella: DOCENTI Nome Cognome Lara Bianco Mario Guidi Anna Rossi
  49. 49. TREYresearch Espressionieoperatori condizionali Condizioni Tutte le volte che si vuole trovare un particolare elemento o gruppo di elementi in un database, occorre specificare una o più condizioni. Le condizioni sono introdotte dalla clausola WHERE. 49
  50. 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. 51. TREYresearch 51 Prendiamo in esame questa tabella: Studenti Nome Cognome Anno Classe Sezione Mario Bianchi 1976 1 A Anna Bianco 1973 2 B Marta Carli 1976 3 A Gianni Rossi 1972 4 A Giulio Mancini 1972 5 A Max Zunini 1976 6 B SELECT * FROM Studenti WHERE Classe = 5 AND Sezione = 'A';
  52. 52. TREYresearch OperatoriAritmetici Condizioni Sono gli operatori aritmetici: + (somma), - (sottrazione), / (divisione), * (moltiplicazione). 52
  53. 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. 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. 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. 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. 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. 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. 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. 60. TREYresearch 60 Prendiamo in esame questa tabella: operatore divisione / Prezzo L’algoritmo che risolve il problema è: (PrezzoIngrosso/2) Elementi PrezzoIngrosso PrezzoVendita Pomodori 340 170 Patate 510 255 Banane 670 335 Rape 450 225 Arance 890 445 Mele 230 115
  61. 61. TREYresearch Operatoridiconfronto Condizioni L’operatori di confronto = confrontano di dati di una tabella alla ricerca dell’informazione desiderata dall’utente. 61
  62. 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. 63. TREYresearch 63 L'operatore (=): dalla seguente tabella vogliamo estrapolare tutti i dati dell'amico Mario Amici Nome Cognome Telefono Mario Rossi 02 435591 SELECT * FROM AMICI WHERE NOME = 'Mario';
  64. 64. TREYresearch Operatorirelazionali Condizioni Gli operatori: maggiore (>) , maggiore o uguale (>=), minore (<), minore o uguale (<=), diverso (<>). 64
  65. 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. 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. 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. 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. 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. 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. 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. 72. TREYresearch 72 E si ottiene: Anangrafica Nome Cognome Eta Esmeralda Carli SELECT * FROM ANAGRAFICA WHERE Eta IS NULL; Versione equivalente del operatore IS: L'operatore IS funziona con la clausola NULL, ma possiamo sostituirlo anche con l'operatore (=): WHERE Eta = NULL;
  73. 73. TREYresearch Operatoridicaratteri Condizioni Gli operatori di caratteri possono essere utilizzati per manipolare il modo in cui le stringhe devo essere ricercate. 73
  74. 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. 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. 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. 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. 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. 79. TREYresearch 79 E si ottiene: Nominativi Nome Posizione Nome Cognome Provincia Giovanni Bruni CO Mario Rossi CT SELECT * FROM Nominativi WHERE Provincia LIKE 'C_'; Il carattere di sottolineatura (_) è un carattere che sostituisce un singolo carattere e non il carattere spazio. Il suo corrispettivo implementato da Access è '?'. Access implementa anche il segno '#' che sostituisce qualsiasi singola cifra (0, 1, 2, 3, ecc,).
  80. 80. TREYresearch Operatoridiconcatenazione Condizioni Il simbolo || serve a concatenare due stringhe. Il corrispettivo operatore che si usa con Access è '&'. 80
  81. 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. 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. 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. 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. 85. TREYresearch 85 Ecco un'altra applicazione dell'operatore di concatenazione: Amico Rossi, Alessandra Verdi, Alessandra Merilli, Titti Banfi, Barbi Persiani, Maria Mazza, Jo Bordoni, Chiara SELECT Cognome || ', ' || NOME Amico FROM Amici;
  86. 86. TREYresearch Operatorilogici Condizioni I comandi e le istruzioni derivanti dall’Algebra di Boole. 86
  87. 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. 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. 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. 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. 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. 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. 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. 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
  95. 95. TREYresearch 95 Nome Marini Bacco Rossi Dini Marroni Falcone Giannini Marini Bravo Rossi Verdi Marroni Gialli Giannini SELECT Nome FROM CALCETTO UNION ALL SELECT NOME FROM CALCIO;
  96. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 122. TREYresearch Aggiungere un piè di pagina 122 Siadatalaseguentetabella: Inseriamo i dati nella tabella con la seguente istruzione:
  123. 123. TREYresearch Siottienequestatabellagiàcompilataconledate: Aggiungere un piè di pagina 123
  124. 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).
  125. 125. TREYresearch DATE_DIFF: restituisce il tempotra duedate Aggiungere un piè di pagina 125
  126. 126. TREYresearch CURRENT TIME_STAMP: questafunzione restituisceladatae oradelsistema. Aggiungere un piè di pagina 126
  127. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  138. 138. TREYresearch ClausoleSQL:WHERE Aggiungere un piè di pagina 138
  139. 139. TREYresearch ClausoleSQL:WHERE Aggiungere un piè di pagina 139 SELECT * FROM ASSEGNI WHERE IMPORTO < 150;
  140. 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. 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. 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. 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. 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. 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. 146. TREYresearch ClausoleSQL: GroupBY Aggiungere un piè di pagina 146 Questa clausola è usata molto spesso per applicare le funzioni di gruppo non a tutte le righe indistintamente, ma a sottoinsiemi di esse. Vediamo un esempio. Vogliamo sapere quanto è stato elargito, in totale, per ogni beneficiario: SELECT BENEFICIARIO, SUM(IMPORTO) FROM ASSEGNI GROUP BY BENEFICIARIO;; In questa query viene applicata la funzione di gruppo SUM per ogni sottoinsieme di BENEFICIARIO.
  147. 147. TREYresearch ClausoleSQL: GroupBY 147 Alla tabella ASSEGNI sono aggiunti altri quattro record. Questa è la tabella aggiornata:
  148. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 161. TREYresearch Cosaabbiamoimparato?3 161 1. ORDER BY è necessario che venga posta dopo la clausola GROUP BY e dopo la clausola HAVING. Riassumendo vediamo come può essere la forma sintetica di una query che fa uso delle clausole viste in questo capitolo: select lista attributi o espressioni from lista tabelle [where condizioni semplici] [group by lista attributi di raggruppamento] [having condizioni aggregate]: MIN() , MAX(), SUM(), AVG(), STDEV() , VARIANCE(), COUNT() [order by lista attributi di ordinamento]
  162. 162. SQLJOIN– Combinazioneditabelle 16 2 Aggiungere un piè di pagina Questa foto di Autore sconosciuto è concesso in licenza da CC BY-SA
  163. 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. 164. TREYresearch 164 CrossJoin Per comprendere a pieno l'operazione CROSS JOIN (unione incrociata)bisogna aver ben chiaro il concetto di prodotto cartesiano: ........................................................... Prodotto cartesiano........................................................... Dati due insiemi D1 e D2 si chiama prodotto cartesiano di D1 e D2, l'insieme delle coppie ordinate (v1, v2), tali che v1 è un elemento di D1 e v2 un elemento di D2. Vediamo cosa significa quanto affermato con un esempio:
  165. 165. TREYresearch 165 CrossJoin Il prodotto cartesiano dell’insieme A e B è: A x B = {(2, r), (2, s), (2, d), (2, 4), (f, r), (f, s), (f, d), (f, 4), (r, r), (r, s), (r, d), (r,4)}
  166. 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. 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. 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. 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. 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. 171. TREYresearch 171 NaturalJoin Nel caso le due tabelle originarie avessero avuto i campi interessati al join (PATENTE e PROPRIETARIO) con lo stesso nome in entrambe, avremmo dovuto specificare dopo la WHERE prima del nome del campo il nome della tabella a cui facevamo riferimento. Facciamo un esempio considerando le tabelle PERSONE e AUTO così modificate. Tabella AUTO Tabella PERSONE
  172. 172. TREYresearch 172 NaturalJoin E si ottiene con questo codice: SELECT * FROM PERSONE, AUTO WHERE PERSONE.NUM_PATENTE = AUTO.NUM_PATENTE;
  173. 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. 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. 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. 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. 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
  178. 178. TREYresearch OUTERJOIN Aggiungere un piè di pagina 178
  179. 179. TREYresearch OUTERJOIN Aggiungere un piè di pagina 179
  180. 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. 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. 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. 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. 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. 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. 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. 187. TREYresearch Aggiungere un piè di pagina 187 JOIN su più di due tabelle 3 I restanti tipi di join non presentano particolari sintassi o eccezioni ad essere applicati su più di due tabelle. Vediamo ora un caso di join che si presenta frequentemente tra tre tabelle: chi conosce bene il modello relazionale sa che non è possibile 'correlare' due tabelle usando una relazione di tipo molti a molti. In questo caso si utilizza una terza tabella che contiene come chiavi esterne la chiave primaria della prima tabella e la chiave primaria della seconda tabella. Nell'esempio seguente abbiamo la tabella PERSONE correlata con la tabella CONTICORRENTI; il tipo di relazione è di tipo molti a molti. Infatti una persona può avere più conti correnti e un conto corrente può appartenere a più persone.
  188. 188. TREYresearch JOIN su più di due tabelle 4 Aggiungere un piè di pagina 188
  189. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 202. TREYresearch Aggiungere un piè di pagina 202 Funzionisullepotenze,logaritmieradici5:POWER Sembrerebbe che non sia possibile (matematicamente) elevare un valore negativo ad un indice frazionario, ma non è così, il problema dunque sussiste forse solamente per SQL implementato da Oracle. SELECT A, B, POWER(B, A) FROM NUMERI;
  203. 203. SQL:Subquery Un nuovo strumento Aggiungere un piè di pagina 203 Questa foto di Autore sconosciuto è concesso in licenza da CC BY-SA-NC
  204. 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. 205. TREYresearch Aggiungere un piè di pagina 205 Subquerychecirestituisconounsolovalore Prendiamo ancora come esempio la tabella dipendenti:
  206. 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. 207. TREYresearch Aggiungere un piè di pagina 207 Subquerychecirestiuisconounsolovalore Ecco il messaggio di errore. Perché accade questo ?
  208. 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. 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. 210. TREYresearch Aggiungere un piè di pagina 210 Subquerychecirestiuisconounsolovalore Anche in questo caso si ha un messaggio di errore. Perché?
  211. 211. TREYresearch Aggiungere un piè di pagina 211 Subquerychecirestiuisconounsolovalore • Non è possibile usare la clausola HAVING in espressioni dove non compare la clausola GROUP BY. • Inoltre, non è possibile, nella nostra interrogazione, eseguire raggruppamenti. Per risolvere il problema è necessario inserire dopo clausola WHERE una subquery: SELECT NOME FROM DIPENDENTI WHERE FERIE_GODUTE > (SELECT AVG(FERIE_GODUTE) FROM DIPENDENTI);
  212. 212. TREYresearch 212 Subquerychecirestiuisconounsolovalore Questo è il risultato del codice proposto inserendo una subquery dopo la clausola WHERE.
  213. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 226. TREYresearch Aggiungere un piè di pagina 226 Subqueryannidate:programmazionemodulare4 Considerando il modo in cui abbiamo costruito questa interrogazione, possiamo renderci conto che la maniera migliore per effettuare la lettura e comprensione di una query di questo tipo, è iniziare ad analizzare le subquery più interne e man mano passare a quelle più esterne. Questa considerazione è importante ed è valida anche per la scrittura della query. In quest'ultimo caso però, decidere quale sarà la subquery più interna è difficile, comunque sia dobbiamo affidarci non tanto a delle eventuali regole assiomatiche, ma alla nostra logica che se utilizzata con rigore non può tradirci.
  227. 227. TREYresearch Aggiungere un piè di pagina 227 Subquery:EXISTS Sempre dalla tabella DIPENDENTI:
  228. 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.
  • MarcoGuerrera

    Jul. 19, 2019
  • ANDREABARBIERI8

    Jan. 4, 2019

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 .

Views

Total views

1,713

On Slideshare

0

From embeds

0

Number of embeds

283

Actions

Downloads

28

Shares

0

Comments

0

Likes

2

×