Release Manuale 4.90 Tecnico - Operativo QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL Query Builder è uno strumento che consente di creare interrogazioni personalizzate (query o viste), in aggiunta alle funzioni previste di standard dal programma, per ottenere rapidamente qualsiasi tipo di informazione. La caratteristica principale delle viste è la loro semplicità di esecuzione, la velocità di risposta ad un altissimo numero di quesiti, e la possibilità di ottenere una stampa sia su carta sia su file (excel). La creazione di viste personalizzate può interessare qualsiasi dato memorizzato nel Database: ogni query può essere inoltre visualizzata come normale voce di menù, ed eventualmente può essere parametrizzata con i dati presenti in una maschera già attiva. Si possono così creare delle viste sui dati del dataBase della Società che potranno essere legate a una specifica maschera del programma, oppure indipendenti da esse, e che potranno essere rese disponibili come voci di menù alla stregua di qualsiasi altra funzione. Considerando che le potenzialità e l’utilizzo del modulo Query Builder è legato alla conoscenza del Linguaggio SQL, e che il carattere molto tecnico che assume il manuale presuppone determinate conoscenze informatiche, è presente un capitolo dedicato alle istruzioni fondamentali e alle caratteristiche proprie del Linguaggio puro, in modo da rispondere (almeno in parte) ai quesiti e alle curiosità del lettore. 2 – Manuale Tecnico - Operativo Indice degli argomenti 1 QUERY BUILDER................................................................................................................. 3 1.1 Creazione e gestione della vista .................................................................................... 4 1.1.1 1.1.2 1.1.2.1 1.1.2.2 1.1.3 1.1.4 1.1.4.1 1.1.4.2 1.1.4.3 1.1.4.4 1.2 1.3 2 Modifica di una vista già creata..................................................................................... 5 Creazione di una nuova query ...................................................................................... 5 Esecuzione immediata della query ............................................................................... 8 Salvataggio della query ............................................................................................... 10 Proprietà della query ................................................................................................... 11 Altri Parametri per strutturare la query ........................................................................ 12 Unione di due o più tabelle (Join)................................................................................ 12 Applicare una Condizione (operatore Where)............................................................. 15 Raggruppamento e Ordinamento................................................................................ 18 Selezione delle prime N righe ..................................................................................... 21 Personalizzazioni dei Menù e delle Toolbar................................................................. 22 Creazione di una vista interna ad una Maschera ......................................................... 23 IL LINGUAGGIO SQL (CENNI) .......................................................................................... 28 2.1 Definizioni formali ......................................................................................................... 29 2.1.1 2.2 Il modello di base dati relazionale e il concetto di chiave ........................................... 31 COMANDI PER L’ESTRAZIONE DEI DATI ................................................................. 32 2.2.1 2.2.1.1 2.2.1.2 2.2.1.3 2.2.1.4 2.2.2 2.2.3 2.2.4 2.2.5 2.2.5.1 2.2.6 2.2.6.1 L’espressione SELECT ............................................................................................... 32 Rinomina di campi e tabelle con un ALIAS ................................................................. 34 Espressioni e l’uso di Operatori ARITMETICI ............................................................. 35 Operatori di AGGREGAZIONE ................................................................................... 36 Operatore Insiemistico UNION.................................................................................... 39 La Condizione WHERE e l’uso di Operatori RELAZIONALI ....................................... 40 Prelievo da più tabelle: Operatori di JOIN................................................................... 47 Criteri di ordinamento ORDER BY .............................................................................. 50 QUERY DI RAGGRUPPAMENTO: criterio GROUP BY............................................. 51 La clausola HAVING ................................................................................................... 53 QUERY ANNIDATE (Subquery) ................................................................................. 55 Subquery nella clausola WHERE................................................................................ 55 2.2.6.1.1 2.2.6.2 2.3 Query CORRELATE ............................................................................................... 58 Subquery nella clausola FROM .................................................................................. 58 COMANDI PER LA MODIFICA DEI DATI.................................................................... 59 2.3.1 2.3.2 Il comando DELETE.................................................................................................... 59 Il comando UPDATE ................................................................................................... 60 QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 3 1 Query Builder Il modulo Query Builder è stato creato per rendere ancora più flessibile e personalizzabile la procedura: l’obiettivo è quello di creare un interfaccia semplice per la consultazione di tutti i dati inseriti nel sistema, con la possibilità di generare una reportistica sia su carta sia su file (excel). Quotidianamente viene inserita nel gestionale un’ampia gamma di dati, vincolati alla gestione dei processi interni: codificare un’anagrafica clienti, inserire un ordine, evaderlo, contabilizzarne la fattura… frutto di operazioni fondamentali per la normale operatività, nel tempo costituiscono un patrimonio informativo molto ampio e complesso. Le stesse informazioni vengono spesso richieste per risolvere esigenze quotidiane che si differenziano dai flussi standardizzati del sistema ERP, come verificare tutti i clienti che hanno acquistato un prodotto per gestire un malino mirato, estrarre tutti i numeri telefonici facenti capo ad un agente per effettuare un’azione di telemarketing…. Query Builder è studiato per fornire all’utente uno strumento di navigazione e interrogazione dei dati completo e potente, così da risolvere qualsiasi esigenza con la massima efficienza operativa: utilizzato in maniera adeguata, permette infatti agli operatori di velocizzare i flussi di lavoro, ed al management di determinare le scelte strategiche. Il cuore di Query Builder è il linguaggi odi SQL1, che garantisce l’estrema accessibilità ai dati e la possibilità di estrapolarli in modo rapido e preciso; una delle particolarità del modulo è di permettere anche ad utenti che non conoscono il linguaggio SQL di essere guidati nella creazione di query2, grazie ad un’interfaccia di semplice utilizzo. Un altro plus della funzione è trasformare le query elaborate in veri e propri pulsanti da inserire all’interno dei menù (scegliendone l’esatta posizione e l’eventuale icona) in modo da essere richiamabili in qualsiasi momento: in questo modo, con un semplice click, anche un utente poco esperto può ottenere report aggiornati, stampabili oppure esportabili in formati excel. I vantaggi sostanziali del Query Builder sono: ; Potenza del linguaggio SQL, per la realizzazione di query personalizzate ; Massimo sfruttamento delle qualità di flessibilità della base dati SQL, per possibilità di accedere ai dati e alle informazioni codificate nel sistema gestionale in modo completo ; Semplicità di utilizzo, anche da parte di utenti poco esperti grazie alla possibilità di associare le interrogazioni a semplici funzioni utente. ; Possibilità di stampa immediata del risultato della query su cartaceo ; Possibilità di esportazione in formato Excel del risultato della query per poter creare situazioni personalizzate e manipolare i dati con le procedure di Office. 1 Il linguaggio SQL di riferimento è nello standard Microsoft, come l’intero apllicativo Si definisce Query un insieme di istruzioni in linguaggio Sql che permetti di ottenere le informazioni in base ai criteri scelti. Una volta elaborata, i risultati sono gli elementi che compongono i report. 2 4 – Manuale Tecnico - Operativo 1.1 Creazione e gestione della vista Il corpo principale della funzione Query Builder è costituito da una Maschera Iniziale che elenca le viste al momento esistenti, ovvero le query già create. Dopo aver creato la vista, è possibile trasformarla in una funzione da aggiungere a menù (insieme alle voci standard). La creazione di una query può anche essere legata ad una particolare funzione della procedura: in questo modo, è possibile creare delle viste parametrizzate legate ai dati visualizzati a video (grazie alle potenzialità della Personalizzazione on Fly; i dettagli nel paragrafo Personalizzazioni dei Menù e delle Toolbar Si accede alla funzione dal Menù Utilità Æ Query Builder: Nella finestra centrale, vengono elencate le viste già create: al primo accesso, non essendo state salvate delle viste, la finestra apparirà vuota. Premendo il tasto destro del mouse (in un qualsiasi punto della maschera attiva) appare un menù di scelta rapida: • • • • Aggiungi nuova vista per creare una nuova query Modifica vista per modificare le query già create Elimina vista per eliminare le query già create Proprietà vista per visualizzare particolari informazioni relative alla query, quali il nome, il testo della query, ecc… QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 5 1.1.1 Modifica di una vista già creata Per la modifica delle query è sufficiente selezionare il Codice della query da modificare e scegliere dal Menù di scelta rapida la voce Modifica Vista La funzione è del tutto simile alla funzione di creazione (ved. Paragrafo Creazione di una nuova query) 1.1.2 Creazione di una nuova query Per la creazione delle query è stata studiata un’interfaccia che guida l’utente nelle scelte delle informazioni che desidera elaborare. Dal Menù di scelta rapida, selezionando la voce Aggiungi Nuova Vista appare la seguente maschera: La maschera è organizzata in diverse finestre, collegate tra loro, che corrispondono alle seguenti sezioni: • • • Tabelle: visualizza tutte le tabelle contenute nel Database della Società; è possibile selezionare una o più tabelle da cui si desidera visualizzare i dati. Campi disponibili: selezionate le tabelle nella sezione precedente, in automatico vengono proposti tutti i campi contenuti nella tabella appena scelta Campi da mostrare: in funzione dei dati che si vogliono mostrare, è possibile ‘spostare’ i campi desiderati dalla sezione Campi Disponibili a questa sezione. Lo spostamento avviene tramite i campi freccia: 6 – Manuale Tecnico - Operativo (freccia destra) porta il campo nella sezione Campi da Mostrare (freccia sinistra) toglie il campo dalla sezione Campi da Mostrare L’ordine dei campi da mostrare è modificabile utilizzando i pulsanti spostano i campi all’interno della finestra. e che Esempio: si vuole avere un report che indichi il codice articolo, la descrizione e il prezzo in anagrafica Per fare ciò, scegliere (con un click nella finestra) la Tabella degli Articoli: nella lista dei Campi disponibili vengono visualizzati tutti i campi presenti. Da qui, si procede selezionando le voci CodArt, Descrizione e PvendPub (che è il nome del campo che contiene l’informazione del prezzo) e cliccare sul pulsante [Freccia destra] così da determinare quali Campi Mostrare nel report. I 3 campi scelti vengono così visualizzati nella finestra Campi da mostrare. Se non si seleziona alcun campo da mostrare, nella query saranno presi tutti i campi della tabella selezionata, mentre se occorre visualizzare dati da più tabelle si procederà selezionando una tabella alla volta e spostando in Campi da mostrare i rispettivi campi di riferimento. Una volta specificate le istruzioni che definiscono la vista che si vuole creare, contenente tutti i parametri di base e i campi da visualizzare; cliccare sul pulsante: : viene creata automaticamente la frase SQL, utilizzando i parametri precedentemente impostati; il risultato viene visualizzato nel pannello posto nella parte bassa della maschera Statement SQL. Se i parametri vengono modificati (ad esempio, per aggiungere un nuovo campo) è necessario cliccare nuovamente su questo pulsante per rigenerare ed aggiornare la query modificata. La frase SQL è modificabile manualmente: questo consente, ad esempio, di costruire query più articolate permettendo ad utenti più esperti di personalizzare sempre di più l’estrazione dei dati. La modifica manuale della stringa creata avviene direttamente nel campo Statement SQL: le modifiche dovranno essere sempre confermate (cliccando sul pulsante Salva), in quanto un eventuale pressione del pulsante Crea SQL ripristinerebbe le condizioni iniziali (in base ai parametri indicati nei campi precedenti. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 7 A questo punto, l’utente ha a disposizione una serie di strumenti per controllare il risultato della query; in qualsiasi momento può inoltre decidere di confermare l’opzerazione. 8 – Manuale Tecnico - Operativo 1.1.2.1 Esecuzione immediata della query Creata la frase SQL, tramite i seguenti pulsanti è possibile: visualizzare il risultato della vista, mostrandone il risultato in una griglia: Con Stampa viene visualizzata l’anteprima di stampa: La modalità di stampa è attivabile anche mediante la combinazione di tasti Ctrl+S così come avviene per le liste di consultazione del programma. Da qui è possibile procedere alla stampa di una o più pagine. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 9 Con Excel è possibile esportare i dati in formato MsExcel; viene mostrata la maschera di navigazione di windows per scegliere dove salvare il file: Il risultato sul file excel è quindi il seguente: 10 – Manuale Tecnico - Operativo 1.1.2.2 Salvataggio della query Per salvare la vista e le eventuali modifiche apportate, cliccare su: al primo salvataggio sarà necessario attribuire un nome alla vista, mentre ai salvataggi successivi sarà possibile eventualmente modificare il nome già attribuito. I dettagli dei campi richiesti in questa funzione sono descritti nel paragrafo Proprietà della query Cliccando sul tasto Conferma viene salvata la vista e presentata nella maschera iniziale: QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 11 1.1.3 Proprietà della query A ogni vista sono assegnate una serie di proprietà, che vengono visualizzate sia all’atto del salvataggio della vista, sia su specifica richiesta dell’utente, utilizzando la funzione Proprietà vista o Modifica Vista (presenti nel menù di scelta rapida, accessibile dalla maschera iniziale selezionando una query già creata e cliccando il tasto destro del mouse). La finestra di Proprietà vista visualizza le seguenti informazioni, alcune delle quali sono assegnate automaticamente dal sistema, altre definibili dall’utente. • • • • • Codice Identificativo: numero identificativo assegnato dalla procedura (non modificabile). E’ un progressivo che identifica univocamente la vista. Descrizione: nome della vista, che deve essere assegnato dall’utente e può essere modificato in qualsiasi momento. Corrisponde al nome con il quale la vista sarà visualizzata a Menù. Statement SQL: sintassi della query SQL appena creata; anche questo campo è direttamente modificabile. Maschera di Rif: riporta il nome della form di riferimento della query, nel caso di creazione di viste parametrizzate (v. paragrafo Creazione di una vista interna ad una Maschera) ID Funzione: numero di funzione fornito in automatico dalla procedura (non modificabile). E’ il numero della funzione con la quale la vista sarà identificata nella tabella Funzioni del database Comune: tale codice viene creato aggiungendo al numero “3” (che rappresenta il numero riservato alle viste personalizzate nell’elenco delle funzioni Utente) il Codice Identificativo. Da questa funzione è quindi sempre possibile modificare la Descrizione e anche la sintassi sql (Statement SQL). 12 – Manuale Tecnico - Operativo 1.1.4 Altri Parametri per strutturare la query Il linguaggio Sql permette di costruire una serie di query in grado di estrapolare le informazioni in modo mirato in base alle esigenze informative dell’utente, utilizzando delle particolari istruzioni (che nel seguito andiamo a dettagliare) per collegare, ordinare e filtrare i dati. 1.1.4.1 Unione di due o più tabelle (Join) Molti dati sono suddivisi su più tabelle, e spesso è necessario unirli per ottenere un’informazione precisa. Nel linguaggio Sql questa istruzione si chiama Join (collegamento) L’operatore Join permette di legare dati appartenenti a tabelle diverse: con Query Builder è possibile costruire Inner Join, grazie ad una maschera che elenca i campi delle due tabelle che devono essere uniti nella query finale. La condizione di Join può essere dunque impostata solamente se sono state selezionate almeno due tabelle. Premendo il pulsante Imposta Joins appare la seguente maschera: Esempio: si vuole elaborare un report che indichi il codice articolo, la descrizione, il prezzo in anagrafica e anche l’unità di misura alternativa correlata all’articolo: Per richiedere queste informazioni, è necessario impostare il join (correlazione) tra la tabella ArtUm dove risiede l’informazione sulle unità di misura alternative degli articoli e la tabella Articoli. La relazione che collega le due tabelle avviene tramite il CodArt, ovvero il codice articolo, in quanto può esistere un solo codice articolo al quale possono essere associate diverse unità di misura alternativa – legame uno a molti - Premendo il pulsante Imposta Joins appare una maschera, che visualizza (nella prima finestra a sinistra) l’elenco delle tabelle che sono state selezionate per la query. Per costruire la Join (legame di correlazione) procedere così: QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 13 1. selezionare le due tabelle sulla quale effettuare il legame 2. nelle finestre successive vengono visualizzati i rispettivi campi (dell’una e dell’altra tabella) 3. selezionare il campo che rappresenta il legame tra le due tabelle Tabella Articoli Tabella ArtUm 4. cliccare sul pulsante Aggiungi Join alla Query 5. cliccare sul pulsante Chiudi 6. alla chiusura, sarà visualizzata nella maschera principale la condizione di Join appena creata: 7. cliccare sul pulsante Crea SQL per aggiornare il testo della vista: la procedura costruirà la query con la sintassi SQL adeguata. A sinistra sono elencate le tabelle che sono state selezionate per la query; selezionando tali tabelle nella maschera vengono mostrati i campi corrispondenti, che è possibile utilizzare per costruire la Join (legame di correlazione). È sufficiente selezionare i campi che definiscono il criterio di legame tra le tabelle e premere il pulsante Aggiungi Join alla Query per creare la correlazione. Chiudendo la maschera sarà visualizzata, nella maschera principale, la condizione di join appena creata: Per gli utenti più esperti è sempre attiva la possibilità di intervenire manualmente sulla sintassi della query appena generata, apportando anche altre modifiche direttamente nella stringa creata. Esempio – proseguendo l’esempio precedente, una volta creata la correlazione dei campi e selezionato quali informazioni avere nel report, premendo sul pulsante Esegui viene presentata la seguente maschera: 14 – Manuale Tecnico - Operativo Eseguendo la query, sono stati trovati solo due articoli che hanno l’unità alternativa di misura. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 15 1.1.4.2 Applicare una Condizione (operatore Where) La condizione di Where permette di creare delle query restringendo il campo di ricerca, ottenendo per esempio informazioni che riguardano un articolo, un cliente, ecc. La selettività della ricerca rende la stessa più efficace. Le condizioni di WHERE possono essere impostate tramite i campi della maschera posti al di sotto delle liste di tabelle e campi: • • Nome campo (ComboBox) visualizza i campi disponibili, in funzione della tabella scelta in precedenza; Operatore (ComboBox) si può definire quale operazione di confronto deve essere seguito per la ricerca dei dati. Vengono elencati gli usuali operatori aritmetici (=, <>, >, >=, <, <=), oltre all’operatore LIKE, da utilizzare per il confronto di stringhe (insieme di parole). Tale operatore si comporta come un operatore di uguaglianza arricchito dal supporto per la coppia di caratteri speciali “?” e “*”. Il carattere speciale “?” rappresenta un carattere qualsiasi. Il carattere speciale “*” rappresenta una stringa di un numero arbitrario (eventualmente anche zero) di caratteri qualsiasi. I due simboli ? e * possono anche essere utilizzati insieme. Esempi: • M* indica una qualsiasi stringa che inizia con la lettera M (es: Milano, Motore…). • ????A indica una stringa di 5 caratteri di cui l’ultimo è una A (es: ELICA, MARIA…). • *R? indica una qualsiasi stringa il cui penultimo carattere è una R (es; FERRARA, TORO, FIORE…). • BANC? indica una stringa formata da BANC e seguita da un qualsiasi carattere (es: BANCA, BANCO). • BANC* indica una stringa formata da BANC e seguita da una qualsiasi sequenza di caratteri (es: BANCA POPOLARE DI MILANO, BANCO DI DESIO…). • *ST* indica una qualsiasi stringa che contiene la sequenza ST (es: ASTA, CESTA, GESTIONE…). • Valore (ComboBox) per inserire l’espressione con cui si vuole confrontare il valore del campo selezionato: sono accettati tutti i caratteri numerici, alfanumerici e date a seconda del tipo del campo a cui il valore viene associato. Esempio, se la ricerca deve avvenire per prezzo per un importo maggiore di 1.000 Euro allora il campo sarà di tipo numerico. il pulsante Lista possibili valori permette automaticamente di visualizzare in anteprima i valori del campo presenti nel DataBase. 16 – Manuale Tecnico - Operativo Esempio: si vuole elaborare un report che indichi il codice articolo, la descrizione, il prezzo in anagrafica solo per gli articoli che hanno un prezzo superiore ad Euro 1.000. In questo caso la condizione where deve indicare il campo PvendPub > 1.000 Una volta definiti i campi che si vogliono portare nel report occorre definire la condizione nel seguente modo: Scegliere il Nome Campo: Articoli.PvendPub; l’operatore: >; il valore: 1.000. cliccare sul pulsante Aggiungi come And Un utente può creare più condizioni di WHERE in una sola query, aggiungendole e concatenandole tramite i pulsanti e La differenza tra i due pulsanti risiede nel modo con cui i dati saranno filtrati: • Per la condizione AND tutti i criteri di WHERE devono essere soddisfatti affinché il dato venga estratto nella vista • Per la condizione OR basta che solo un parametro all’interno del WHERE sia soddisfatto affinché il dato venga estratto nella vista Esempio: Al report elaborato nell’esempio precedente, si vuole aggiungere un ulteriore filtro per estrarre i soli articoli che hanno la descrizione che inizia per H. In questo caso, nella condizione di WHERE già indicata ( il campo PvendPub > 1.000) va aggiunta la nuova condizione nel seguente modo: scegliere il Nome Campo Articoli.Descrizione; l’operatore: like; il valore: H*. cliccare sul pulsante Aggiungi come And Il criteri appena scelti risulteranno restrittivi nel senso che un articolo deve avere entrambi le caratteristiche per essere scelto. Infatti se viene eseguita la query il risultato sarà mil seguente, in quanto non esistono dati per i parametri selezionati nella ricerca: QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 17 Utilizzando invece il criterio OR la selezione non è restrittiva e quindi: scegliendo il Nome Campo Articoli.Descrizione; l’operatore: like; il valore: H*. cliccare sul pulsante Aggiungi come Or Eseguendo la ricerca il risultato sarà il seguente: Come si può notare nessun articolo ha una descrizione che inizia per H, ma comunque ne esistono quattro che hanno un prezzo superiore a 1.000 euro. 18 – Manuale Tecnico - Operativo 1.1.4.3 Raggruppamento e Ordinamento Una volta determinati quali dati ricercare è possibile definire se raggruppare le informazioni e/o ordinarle. Raggruppato per Consente di definire eventuali condizioni di raggruppamento. Per funzionare correttamente, deve essere eseguito su tutti i campi che sono stati scelti come elementi della ricerca (così come previsto dallo standard del linguaggio SQL). La procedura prevede la possibilità di indicare in Raggruppato per un solo campo: gli altri campi devono essere aggiunti manualmente direttamente nel Statement SQL, dopo che è stata creata la frase SQL, editando la query nella parte inferiore della maschera3. Esempio - Si vuole conoscere quali categorie merceologiche sono presenti negli articoli. Se la ricerca fosse generica la vista elaborata dal Query Builder è: Select Articoli.CodArt, Articoli.Descrizione, Articoli.PVendPub, Articoli.CatMerc From Articoli,ArtUM 3 Lo stesso vale per le funzioni di aggregazione (Count, Min, Max, Sum, Avg), che non possono essere definite in automatico. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 19 Essendo la ricerca generica non è facile sapere quali sono le categorie merceologiche, utilizzando l’operatore di raggruppamento invece si possono individuare in maniere dettaglia. La regola per raggruppare è quella che solo i campi da ricercare possono essere raggruppati. In questo modo selezionando solo la categoria merceologica come elemento di ricerca, la query elaborata dal Query Builder è diventata: Select Articoli.CatMerc From Articoli Group By Articoli.CatMerc La ricerca è stata così limitata alle sole categorie merceologiche, e il risultato è il seguente: Una volta generata la query di estrazione dei dati, è possibile intervenire sempre manualmente sulla stringa, ad esempio, si potrebbe contare quanti articoli fanno parte di una categoria merceologica, aggiungendo la funzione Count (conteggio): Select count(Articoli.CatMerc) as num, articoli.CatMerc From Articoli Group By Articoli.CatMerc 20 – Manuale Tecnico - Operativo Ordinato per Per esporre i dati in un report in maniera chiara e di facile lettura, è spesso necessario definire un criterio di ordinamento: nel campo ComboBox Ordinato per è possibile, a tal proposito, scegliere quali campi devono essere ordinati e in che modo: Asc ascendente Desc discendente Anche in questo caso è possibile selezionare un solo campo per l’ordinamento; se fosse necessario creare altri ordinamenti, si può intervenire manualmente sulla vista utilizzando sempre l’operatore ORDER BY. Esempio - Si vuole elaborare un report che mostra la lista degli articoli ordinata per prezzo, per sapere quale è l’articolo con il prezzo di vendita più alto. Selezionata la tabella Articoli e i campi che si desidera visualizzare nel report come Codice articolo, descrizione, prezzo di vendite, si procede a definire l’ordinamento per il campo PVendPub. Scelti tutti i parametri con il pulsante Crea Sql, il query Builder genera la seguente query : Il risultato è il seguente: QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 21 1.1.4.4 Selezione delle prime N righe Se nella vista si vogliono visualizzare solo un certo numero di record (a partire dal primo), è possibile specificare quanti records estrarre indicandone il numero nel campo Mostra primi N records; Esempio: riprendendo l’esempio precedente, dove venivano estratti tutti gli articoli ordinati per prezzo, se si volesse conoscere solo i primi 5 (ovvero quelli che hanno il prezzo più alto), generando la query sql i dati presentati sarebbero i seguenti: Il Query Builder genera la seguente query: 22 – Manuale Tecnico - Operativo 1.2 Personalizzazioni dei Menù e delle Toolbar Le query create con il Query Builder possono essere aggiunte come vere e proprie funzioni personalizzate nei Menù e nella Toolbar, così da poter essere trovate ed utilizzate in modo rapido e immediato da parte di qualsiasi utente. Una volta creata la vista, è possibile scegliere se assegnargli un’icona e in quale Menù posizionarla. Le modalità di personalizzazioni sono le consuete previste dal sistema gestionale: con il tasto destro sulla Toolbar principale viene mostrato il seguente menù di scelta rapida, dal quale, scegliendo Personalizza, si accede alla maschera di personalizzazione del menù principale: Nella categoria Vista saranno presenti le query create: per renderle visibili (nel menù oppure nella toolbar), sarà sufficiente trascinare la voce nell’area ritenuta idonea. Nel caso di aggiunta della query nella Toolbar, è consigliabile associare alla stessa un’icona personalizzata (utilizzando l’apposita funzione Gestione Toolbar) in modo da rendere maggiormente visibile la query, in una logica di economia di spazi visivi. Con i normali strumenti della procedura si può anche abbinare prima una icona alla query in modo da rendere maggiormente visibile la stessa anche in una logica di economia di spazi visivi. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 23 1.3 Creazione di una vista interna ad una Maschera Molte funzioni presentano una specifica toolbar interna, nella quale è possibile inserire altre sotto-funzioni correlate al task attivo. In queste maschere, è possibile associare query personalizzate sui dati presenti nella maschera stessa. In altre parole, il sistema permette la creazione di viste parametrizzate con i dati presenti nelle maschere attive: è possibile creare una (o più) query che filtra i risultati in base ai valori presenti, al momento del lancio, in un preciso campo della maschera. Per ottenere questo risultato, l’esecuzione della funzione principale e la successiva creazione della query deve avvenire dopo aver aperto la funzione cui si vuole collegare l’interrogazione. E’ necessario effettuare i seguenti passaggi: 1. Aprire la funzione nella quale si vuole aggiungere l’interrogazione 2. Avviare il Query Builder, dal menù Utilità Æ Query Builder 3. Creare la query, utilizzando le modalità descritte nel paragrafo Creazione di una nuova query 4. salvare la nuova query Durante la creazione della query, sarà possibile specificare come Operatore di riferimento delle condizioni di WHERE un campo della form. Dopo aver creato la query, sarà possibile aggiungerla nella toolbar della maschera come funzione personalizzata: 1. dalla stessa funzione nella quale si è creata la query 2. inserire nella toolbar della maschera la vista appena creata La query così creata potrà essere eseguita in fase di inserimento/variazione dei dati: il lancio della funzione produrrà, come risultato, un’interrogazione che terrà conto dei dati inseriti dall’utente in un preciso momento. Ad esempio, ipotizziamo di voler conoscere, durante l’input delle bolle, gli ultimi 5 prezzi applicati al cliente nelle vendite precedenti; dalla form delle bolle, creeremo la seguente istruzione (query di esempio per archivio Access senza form new): Select Top 10 BolleTest.NumDoc, MovMagDett.CodArt, MovMagDett.ImpUni, MovMagDett.Qta, BolFatDett.Importo FROM (BolFatDett INNER JOIN MovMagDett ON MovMagDett.IDdettDoc = BolFatDett.ID) INNER JOIN BolleTest ON BolFatDett.IDTest = BolleTest.ID Where (BolleTest.Cliente = '|txt(2)|' ) And (MovMagDett.CodArt = '|grd(1)|' ) and (MovMagDett.Tipo = 'B') order by BolleTest.NumDoc desc Nelle prossime proponiamo un esempio passo passo per verificare ogni passaggio. 24 – Manuale Tecnico - Operativo Esempio: un esempio può aiutare a comprendere il meccanismo di relazione query/maschera. Ipotizziamo che in anagrafica clienti si desideri visualizzare le fatture emesse per il cliente che si sta visualizzando in quel momento in maschera: innanzitutto, prima di procedere alla creazione della query, è necessario attivare la funzione di query builder per la maschera in questione (clienti) - Fase 1. A tal fine occorre accedere alla funzione dal menù Archivi Æ Anagrafica Clienti Con il tasto destro sulla tollbar posta in alto a destra si inserisce la funzione Query Builder Una volta inserita questa si presenterà nel seguente modo: Una volta attivata la funzionalità si procede alla creazione della query (Fase 2) Quindi dopo aver richiamato un cliente è possibile cliccare sull’icona del Query Builder, e quindi sarà visualizzata la seguente maschera: QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 25 Come si nota nella parte alta della maschera viene mostrata tra parentesi quadre il nome della maschera di riferimento. In questo caso non esistono altre query specifiche per l’anagrafica cliente, l’unica funzione attiva è quella di Aggiungere una nuova vista. Le modalità di inserimento sono uguali a quelle viste in precedenza, l’unica eccezione è nella condizione WHERE dove bisognerà indicare il nome del campo di riferimento, ovvero il parametro da passare alla query. Nell’esempio sarà il nome del cliente. Cliccando sul pulsante Lista Valore Possibili la procedura mostra una serie di valori speciali, ovvero la lista di tutti i campi disponibili nella maschera preceduti da un codice che definisce la natura del campo. Ad esempio Pnl indica un campo pannello, Cbo un valore espresso nella combo, Txt un campo di testo. Quindi se si vuole associare la query al codice cliente basta selezionare la voce TXT(0) Codice Cliente. 26 – Manuale Tecnico - Operativo Una volta scelti i campi da visualizzare come anno della fattura, numero della fattura, data fattura, cliente e importo totale si può creare la query SQL con il pulsante Crea SQL . Come illustrato in precedenza, se è necessario inserire un criterio di ordinamento è sufficiente scegliere per quale campo e in che modo (Asc o Desc) nella sezione Ordinato per. Se la query è corretta si può procedere al suo salvataggio cliccando sul tasto Salva: in questo caso sarà presentata la maschera delle proprietà dove dovrà essere indicato il nome con cui salvare la vista. Nel nostro esempio si è scelto il nome “Lista Fatture” Una volta creata la nuova lista è necessario personalizzare la toolbar dell’anagrafica clienti al fine di avere sempre disponibile la nuova query (Fase 4) QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 27 Solo così si potrà visualizzare immediatamente la lista delle fatture per cliente. Note operative: se nella lista delle viste non dovesse essere presente quella appena creata, conviene uscire dalla procedura e rientrare al fine di permettere un corretto aggiornamento di tutte le modiche apportate. Richiamando il cliente è possibile sapere in tempo reale quali fattura sono state emesse: 28 – Manuale Tecnico - Operativo 2 Il linguaggio SQL (cenni) Questa breve presentazione del linguaggio SQL è nata dall’idea di creare un’appendice utile sia per tutti gli utenti che utilizzano Query Builder sia per gli utenti\installatori che vogliono usare la frasi SQL nei campi personalizzati creati con la personalizzazione On-Fly. Lo scopo è quello di introdurre l’utente alla comprensione del significato delle varie parti in cui si compone un’istruzione SQL e all’acquisizione delle corrette regole di sintassi per la costruzione di interrogazioni di un database. La presentazione teorica è corredata da esempi creati sullo stesso database su cui lavora il programma. Il linguaggio SQL (acronimo di Structured Query Language) è un linguaggio per la definizione e la manipolazione dei dati; è un linguaggio oggi usato in numerosi DBMS4 disponibili come prodotti commerciali. In origine SQL era chiamato SEQUEL (Structured English QUery Language) ed era utilizzato dall’IBM Research come interfaccia per i primi database relazioni chiamati SYSTEM R. Attualmente, sono numerosissimi i database che lo utilizzano, a partire dagli stessi DB2/DB£… di IBM, per terminare con Oracle, SQL Server (Microsoft), Informix, Sybase, CA-Ingres (Computer Associates), MySQL, Postgree, etc… Tuttavia, ogni DBMS ha apportato modiche proprietarie al linguaggio, tanto che uno sforzo non indifferente è stato prodotto negli scorsi anni dagli enti ANSI (American National Standard Institute) e ISO (International Standard Organization) per ottenere una versione unica: SQL 2 (noto anche come SQL-92) e SQL3 (definito nel 1999) sono i risultati. La maggior parte dei sistemi supporta le funzionalità di base dello standard SQL-3 ed offrono estensioni proprietarie. SQL è un linguaggio di interrogazione e manipolazione di database che esprime le interrogazioni e gli aggiornamenti in modo dichiarativo, ovvero specificando l’obiettivo dell’operazione e non il modo in cui ottenerlo. Il linguaggio SQL permette la programmazione a due livelli (normalmente messi disposizione da qualsiasi DBMS): ; DDL – Data Definition Language: comprende un numero di istruzioni necessarie per modificare lo schema della base dati (Data Dictionary), definendo le relazione e i vincoli di interità ; DML – Data Manipulation Language: comprende un numero di istruzioni necessarie per modificare l’istanza della base dati, utilizzando operatori dell’algebra relazionale Query Builder utilizza alcune potenzialità del linguaggio DML (oggetto della trattazione delle prossime pagine): per ovvi motivi, sono state inibite le possibilità di intervenire sui dati in modifica (per evitare un inavvertito danneggiamento dei dati). Notazioni utilizzate nel seguito del manuale - Per descrivere la sintassi dei comandi del linguaggio verrà usata una notazione che fa uso di alcuni simboli che hanno questo significato: [] {} || <> () 4 Le parentesi quadre indicano che il termine all’interno è opzionale, ovvero può comparire o non comparire una sola volta. Le parentesi graffe indicano invece che il termine racchiuso può non comparire o essere ripetuto un numero arbitrario di volte. Le barre verticali indicano che deve essere scelto uno tra i termini separati dalle barre. Le parentesi angolate racchiudono un elenco di termini in alternativa. Le parentesi tonde vanno sempre intese come termini del linguaggio SQL. DBMS - DataBase Management Sistem – sistema software specifico per la gestione di base dati, che opera al di sopra del sistema informativo ed è finalizzato a organizzare e gestire le informazioni contenute nel database di riferimento. E’ compito del DBMS controllare e monitorare le operazioni effettuare dai diversi programmi e dagli utenti informatici sui dati. Contiene diversi strumenti che ne facilitano la programmazione e la gestione delle informazioni. (Access non è un DBMS ma un file). QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 29 2.1 Definizioni formali L’utilizzo di istruzioni SQL prevede la conoscenza di questi concetti di base: Archivio File contenete informazioni. Le informazioni in esso contenute sono distribuite in record logici: ogni record logico contiene una sequenza di byte ed è suddiviso in campi, ogni dei quali contiene un’informazioni. Si definisce coefficiente di riempimento di un file il rapporto tra: numero byte allocati record logici / numero byte blocchi fisici allocati al file Struttura rigida che contiene diversi insiemi di informazioni, memorizzate in modo compatto e organizzate per essere ritrovate efficientemente. Database Il database è una collezione di dati memorizzati in modo permanente su memoria di massa, gestiti da un sistema di gestione di database (il DBMS – ved. definizione) che fornisce meccanismi di accesso ai dati assicurando al contempo la loro affidabilità e privatezza. Le informazioni in esso contenute sono organizzate in tabelle. Tabella (o relazione) Collezione di informazioni strutturate appartenenti ad uno stesso contesto (argomento specifico) organizzate in un numero fisso di colonne e un numero variabile di righe. Ciascuna ‘relazione’ ha un nome univoco. Campo Cella contenete una singola informazione; elemento di una riga Colonne (Attributi) Elenco dei campi che costituiscono una tabella o un istanza, detti anche “attributi”; a ciascuna colonna è associato una tipologia di valori corrispondente (testo, numerico, data…).. Gli attributi di una stessa relazione devono avere nomi diversi tra loro. Il numero di colonne che costituisce una tabella\istanza è detto grado della relazione Riga Unione di informazioni presenti in più colonne (detta anche Tupla o Record) (Tupla, Record) riconducibili ad un informazione comune (legame). Il numero di righe che costituisce una tabella\istanza è detto cardinalità della relazione Esempio: Consideriamo la tabella Clienti Campo Ciascun campo della tabella Clienti contiene lo stesso tipo di informazione per ciascun cliente, ad esempio il codice del cliente. Ogni campo ha un “nome_campo” diverso dagli altri CodCli Denom C0000001 ROSSI Ind Cap Prov Loc Tel 1232131 C01050002 EXPERT CASA NEW Via Cesare Battisti, 76 27100 PV PAVIA C01050003 NEW ELECTRONIC CENTER Viale Manzoni, 73 20052 MI MONZA 039/233322 C01050004 LAMBERTI GIULIANA Viale Piemonte, 35 28100 NO NOVARA 0322/28335 C01050007 GAMMA S.N.C. Via Puccini, 34 20122 MI MILANO 02/44554298 C01050008 RACHENA CORPORATION 3/2 hafeez centre, main bld. 54660 C01050009 POWER INSTRUMENTS LTD 37 brook road rayleigh essex Riga GULBERG LAHORE SS67XJ ENGLAND 0382/2298779 - 0092425645604 0044/26832455 Ciascuna riga della tabella Clienti contiene tutte le informazioni relative ad un cliente: codice, società, denominazione, indirizzo…Ogni riga ha un codice diverso (ID) 30 – Manuale Tecnico - Operativo Schema Struttura delle tabelle che compongono il database (statico). Lo schema di una relazione è composto dal nome della relazione, seguito dal nome dei suoi attributi cui è associato il tipo; lo schema di una base dati relazionale è data dall’elenco delle relazioni in essa presenti. La definizione degli schemi delle tabelle di un database avviene in una fase molto delicata, detta Database design durate la quale il DBA (Database ADministrator) definisce dapprima il tipo di dati e le regole di gestione, quindi la struttura nella quale andranno memorizzati. Nel nostro sistema gestionale, grazie alla funzionalità avanzata di Personalizzazione On Fly! è possibile operare modifiche strutturali al database, creando nuovi schemi (tabelle) e inserendole nel contesto applicativo già attualizzato. Istanza (o Occorrenza) Insieme di tuple presenti in una base dati in un preciso momento\istante (dinamica). Mentre lo schema di una relazione viene fissato in fase di creazione, l’istanza di relazione si modifica in continuazione in seguito alle azioni che vengono effettuate sulla base dai, ovvero alle operazioni di inserimento, modifica e cancellazione delle tuple. L’istanza di una base dati relazione è data dall’insieme delle tuple presenti in un preciso istante. Transazione Esecuzioni di programma su una base dati: le transazioni andate a buon fine modificano le istanze di una base dati. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 31 2.1.1 Il modello di base dati relazionale e il concetto di chiave Il modello di database sul quale utilizzale il linguaggio SQL è il modello relazionale5, basato sul concetto di relazione: un database relazionale è una collezione di relazioni6 (o tabelle). Alla base del modello relazionale vi è il concetto di chiave, la quale rappresenta un identificativo univoco di ogni singolo record: una chiave è formalmente un sottoinsieme di una relazione, composto da tutti i valori inseriti in un attributo che rispondono ai requisiti di unicità (non può esistere nella stessa colonna lo stesso valore ripetuto in più tuple) e minimalità. In uno relazione è possibile creare più chiavi: in questo caso, sarà possibile indicare quale di queste è la chiave primaria, ovvero l’attributo che più di frequente sarà utilizzato per accedere al dato. Nella procedura gestionale, i dati vengono distribuiti nelle diverse tabelle, ognuna delle quali è adibita alla gestione di un particolare gruppo (o sottoinsieme) di informazioni: per ricollegare i dati così distribuiti, facenti capo ad uno stesso insieme, è possibile utilizzare proprio la chiave, che permette di aggregare le informazioni in modo logico. ID CodDoc Tabella OrdCliTest OrdNum OrdDat CodCli Flag Flag Flag CodPag Sconto1 Sconto2 TotQta TotImp Evaso Stampa Conferma 1 ORDCLI O0000001 15/01/2003 C01050005 BB30 5 0 5130 2 No Sì 2 ORDCLI O0000002 20/01/2003 C01050003 RB36 10 0 10 3014,21 2 No Sì 3 ORDCLI O0000003 25/01/2003 C01050007 RB369 20 0 16 5321,78 2 No Sì 4 OFFCLI T0000001 28/01/2003 C01050004 RD36 0 ID ID C01050004 NRiga CodArt0 5 ORDCLI O0000004 31/01/2003 RD36 Testata 6 ORDCLI O0000005 31/01/2003 TR60 20 1 C01050006 1 1 P_BICICLETTA 3 Tabella OrdCliDett 0 5 10845,6 2 No No UM0QtaOrd5 QtaEva 10845,6 Prezzo 0 Sconto No Sconto2SìImporto N. 0 2 C01050008 2 1 H_PCPENTIUM N. 0 7 ORDCLI O0000006 31/01/2003 RB36 10 3 2 2 H_ST_EPSONEPL N. 0 8 OFFCLI T0000002 31/01/2003 C01050002 RB36 10 4 2 3 R_NASTRO PZ 0 9 ORDCLI O0000007 31/01/2003 C01050002 RB36 10 5 2 4 W_MSOFFICE N. 10 ORDCLI O0000008 31/01/2003 C01050006 TR60 20 0 6 3 1 H_PCPENTIUM N. 2 1800 Sì0 2 3184,13 2 1084,56 15 2 23 1597,1 2 345 2 40 40 17,5 2 34 2519,09 3 No0 No0 0Sì1952,21 0 621 No No0 0 No 0 0Sì 63 0 378 Sì 0 3458,18 2 2 3 2 210 422,4 2 3 1440,91 0Sì 5130 7 3 2 H_ST_EPSONEPL N. 4 4 345 0 0 1104 8 3 3 R_NASTRO PZ 6 6 25 7 0 111,6 9 3 4 W_MSOFFICE N. 3 3 300 10 0 648 10 4 1 P_BICICLETTA N. 5 5 2169,12 0 0 10845,6 11 5 1 P_BICICLETTA N. 5 0 2169,12 0 0 10845,6 12 6 1 H_PCPENTIUM N. 2 2 1456,41 5 8 2036,64 13 6 2 H_ST_EPSONEPL N. 2 2 345 5 8 15 7 1 H_PCPENTIUM N. 1 1 1425,42 0 0 1282,88 16 7 2 H_ST_EPSONEPL N. 1 1 0 0 310,5 Esempio: 17 7 3 R_NASTRO PZ 5 5 17,5 0 La tabella OrdCliTest contiene i dati degli ordini N.clienti: la è 0il 18 7 di 4testa W_MSOFFICE 8 chiave 8 primaria 210 campo ID 19 8 1 H_PCPENTIUM N. 1 1 1084,56 0 La tabella OrdCliDett contiene di dettaglio degli 20 invece 8 i dati 2 H_ST_EPSONEPL N. ordini2 clienti:2 anche 345 questa 0 tabella ha la sua chiave primaria, che9 identifica univocamente 21 1 H_PCPENTIUM N. i record 1 della 1tabella, 1084,56 che è 0il campo ID. 22 9 2 H_ST_EPSONEPL N. 2 2 345 0 Dato che ad una testata dell’ordine possono corrispondere più dettagli (= righe di300 articoli12e 23 10 1 W_MSOFFICE N. 2 2 di note) nella tabella OrdCliDett sarà riportato, per ogni riga , il valore della chiave primaria che identifica nella tabella OrdClitest l’ordine di origine nel campo ID Testata. 0 78,75 5 345 482,45 0 1512 0 976,1 0 621 0 976,1 0 621 0 422,4 I principali modelli di base dati dei DBMS sono 4: gerarchico, reticolare, relazionale e a oggetti. Ved. definizioni date in precedenza, anche se da un punto di vista rigoroso e formale, una relazione è definita come un insieme di tuple, dove ciascuna tupla dovrebbe essere differente dalle altre; i DBMS commerciali tuttavia non verificano la condizione di univocità della singola tupla in modo automatico. 6 32 – Manuale Tecnico - Operativo 2.2 COMANDI PER L’ESTRAZIONE DEI DATI 2.2.1 L’espressione SELECT L’espressione SELECT consente di specificare un’operazione di interrogazione in SQL: l’effetto di questa istruzione è quello di estrarre i dati da una o più tabelle in base ai vincoli impostati nell’espressione. Viene formalmente definita come il prodotto cartesiano di relazioni elencate nella clausola From (o proiezione del cartesiano potendo selezionare solo alcuni attributi, non tutti *). STRUTTURA DI UNA SELECT (zona) ISTRUZIONE (1) SELECT ALL oppure DISTINCT oppure TOP N (percent) (2) * oppure {campo [ [ AS] Alias] [, campo [ [AS] Alias] ]} (3) FROM < elenco tabelle > (4) WHERE < condizione di estrazione delle righe > (5) GRUOP BY < criteri di raggruppamento > (6) HAVING < condizioni di estrazione dei gruppi > (7) ORDER BY < criteri di ordinamento > Parola chiave Descrizione 1 Select Comando che specifica l’operazione di interrogazione. 2 Campo Nome di una colonna di una tabella (la tabella è indicata nel From) 3 Tabella Nome di una tabella del database (almeno uno, non ripetibile) 4 Condizione di estrazione criterio in base al quale vengono confrontate ed estratte le righe 5 Criterio di raggruppamento nome di un campo in base al quale effettuare il raggruppamento. 6 Criterio di estrazione dei gruppi legato al criterio di raggruppamento. 7 Criterio di ordinamento nome di un campo in base al quale ordinare le righe L’SQL seleziona, tra le righe che appartengono alla concatenazione delle righe delle tabelle elencate nella clausola From, quelle che soddisfano le condizioni espresse nell’argomento della clausola Where (se la clausola Where è assente si selezionano tutte le righe). Il risultato dell’esecuzione di una interrogazione SQL è una tabella con una riga per ogni riga selezionata e con un insieme di colonne dato dai campi elencati nella Select, dove: il/i campo/i da estrarre deve essere scritto come tabella.campo oppure come campo se nel From è presente 1 tabella o i nomi degli attributi non si ripetono in tabelle diverse (valido anche nel Where) Il carattere * rappresenta la selezione di tutti i campi delle tabelle elencate nel From. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 33 Per evitare duplicati nelle tabelle risultato di una interrogazione, cioè righe con gli stessi valori per tutti gli attributi, è sufficiente specificare la parola chiave DISTINCT immediatamente dopo la parola chiave Select: se non si specifica nulla, viene presa di default la parola chiave ALL e in questo caso il risultato della query SQL può contenere anche righe duplicate. Con la parola chiave TOP N è possibile fermare la ricerca una volta raggiunto un certo numero di record, e con TOP N percent è possibile fermare la ricerca una volta raggiunta una certa percentuale di record estratti. Esempio: Supponiamo che la tabella Articoli contenga questi valori: CodArt H_PCPENTIUM M_BORDOTAPP M_FILOCUCITO M_MOQUETTE M_STOFFATAPP P_AUTOMOBILE S_COMAD_VETRO S_INTERNI S_MANOVEL_VETRO S_PORTA_PANNELLO S_PORTIERE S_RUOTE So Tipo PVendPub 3000000 250 50 45000 3500 18000000 12500 1500000 3000 95000 450000 110000 Descrizione Pentium Pro 200 Mhz Bordo in Stoffa pregiata per Tappetini Filo per cuciture Tappetini Auto Moquette per il Basamento dell'Auto Stoffa per Tappetini Auto Automobile [Distinta Principale] Comandi Elettrici Vetri Anteriori Interni per Autovettura Manovella Vetri Portiera Posteriore Pannello per Portiera Protiere Autovettura Anteriori Post. Ruote Mod. Pirelli P600 165/60 R13 e consideriamo la seguente interrogazione: Select Descrizione From Articoli La sua esecuzione produce la seguente tabella come risultato: Descrizione Pentium Pro 200 Mhz Bordo in Stoffa pregiata per Tappetini Filo per cuciture Tappetini Auto Moquette per il Basamento dell'Auto Stoffa per Tappetini Auto Automobile [Distinta Principale] Comandi Elettrici Vetri Anteriori Interni per Autovettura …… cioè un elenco delle descrizioni di tutti gli articoli della tabella. De Misu N. MT MT MQ MQ N. N. N. N. N. N. N. 34 – Manuale Tecnico - Operativo 2.2.1.1 Rinomina di campi e tabelle con un ALIAS E’ possibile rinominare i campi o le tabelle nella relazione finale con un Alias cioè un altro nome: con questo meccanismo è possibile sia assegnare ai campi dei nomi più significativi, sia far apparire una stessa tabella più volte nel FROM con alias diversi (superando il limite di poter indicare una tabella una unica volta). La query che rinomina le tabelle della clausola FROM con un alias, costruisce il prodotto cartesiano delle tabelle nella clausola FROM e la relazione così ottenuta proietta solo le colonne specificate nella lista in corrispondenza di SELECT rinominando quelle colonne che possiedono un alias. SELECT NomeTabella.Attributo AS [Alias] [,NomeTabella.Attributo AS [Alias]]... FROM NomeTabella [Alias] [,NomeTabella [Alias]]... … WHERE La sintassi è leggermente diversa se si rinomina il campo o la tabella: Campo: l’assegnazione avviene utilizzando la parola chiave AS seguita dal nome da associare come alias. Tale nome va indicato necessariamente tra parentesi quadrate [ ] nel caso in cui contenga spazi o caratteri particolari (*, ?…) Esempio: SELECT Clienti.CodCli as [Codcli 1*], Clienti.Denom, CliFatt1.CodCli as Codcli2 FROM Clienti, Clifatt1 WHERE Clienti.CodCli = CliFatt1.CodCli Codcli 1* Denom Codcli2 C01050001 EXPERT CASA NEW SRL C01050001 C01050002 NEW ELECTRONIC CENTER SPA C01050002 … Tabella: l’assegnazione avviene indicando direttamente il nome tra parentesi quadre [ ]. Assegnando un alias ad una tabella tale nome deve necessariamente sostituire il nome della relazione in tutte le parti della query (sia nel SELECT sia nel WHERE che in eventuali criteri di ordinamento/raggruppamento): nel caso in cui l’alias contenga spazi, le parantesi quadre vanno necessariamente aggiunte anche nelle altre parti della query Esempio: La stessa query dell’esempio precedente può essere scritta così: SELECT Tabella.CodCli as [Codcli 1*], Tabella.Denom, Tabella1.CodCli as Codcli2 FROM Clienti [Tabella], Clifatt1 [Tabella1] WHERE Tabella.CodCli = Tabella1.CodCli QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 35 2.2.1.2 Espressioni e l’uso di Operatori ARITMETICI Mediante il costrutto SELECT è possibile calcolare valori di espressioni aritmetiche a partire dai valori assunti, su uno o più attributi, dalle tuple della relazione costruita nella clausola FROM. Le espressioni sono formulate applicando gli operatori aritmetici +, −, _, / ai valori assunti dalle tuple sugli attributi della relazione: il risultato è ottenere relazioni in cui uno o più attributi sono calcolati a partire dagli attributi presenti nella relazione di partenza. Questi attributi sono nuovi, non presenti in nessuna delle relazioni della clausola FROM. Il risultato è quello di ottenere per proiezione nuove relazioni, risultato di quelle originali. SELECT Espressione [AS Alias] [,Espressione [AS Alias]]..... FROM NomeTabella [AS Alias] [,NomeTabella [AS Alias]]... WHERE … All’interno del costrutto, il termine Espressione [AS Alias] [,Espressione [AS Alias]]... è un elenco separato da virgole in cui Espressione può essere di 2 tipi: NomeTabella.Attributo Espressione Aritmetica NomeTabella.Attributo. in cui gli operandi sono numeri o elementi del tipo Ad ogni espressione va associato un Alias, che individuerà il risultato nella query finale. Una espressione aritmetica usata nella clausola di proiezione di un’interrogazione dà luogo ad una colonna virtuale, non presente nella relazione su cui si effettua l’interrogazione, che non viene fisicamente memorizzate ma solo materializzate come risultato delle interrogazioni. Nel calcolo delle espressioni aritmetiche la presenza del valore nullo rende l’espressione indefinita. Esempio: Supponiamo di voler calcolare l’importo Iva delle righe contenute in BolFattDett: Select BolFatDett.prezzo, BolFatDett.Importo, BolFatDett.codIva, Tabiva.aliquota, (BolFatDett.Importo/100)*Tabiva.Aliquota as [Imponibile Iva] from BolFatDett, Tabiva WHERE BolFatDett.CodIva = Tabiva.Codiva Prezzo 1456,41 345 300 1710,5 414 1494,98 332,89 975,64 217,25 Importo 2036,64 482,45 422,4 1539,45 372,6 1494,98 332,89 975,64 217,25 CodIva Aliquota 20 20 20 20 20 20 20 20 20 20 VIN 0 VIN 0 VIN 0 VIN 0 Imponibile Iva 407,328 96,49 84,48 307,89 74,52 0 0 0 0 In questo esempio abbiamo introdotto una condizione di WHERE (il cui significato sarà trattato più avanti) necessaria per ottenere il campo numerico TabIva.CodIva richiesto dal calcolo. 36 – Manuale Tecnico - Operativo 2.2.1.3 Operatori di AGGREGAZIONE Le funzioni di aggregazione consentono di valutare delle condizioni su insiemi di record; utilizzano i seguenti operatori aggregati: COUNT MIN MAX SUM AVG conta il numero di righe nella tabella risultato dell’interrogazione minimo valore di una espressione massimo valore di una espressione somma media aritmetica Gli operatori aggregati possono essere uniti alle parole chiave DISTINCT elimina i duplicati ALL trascura solo i valori nulli ; L’operatore COUNT conta il numero dei record estratti in una relazione, considerando tutte le condizioni impostate; usa la sintassi: SELECT COUNT ( < * | Camp01 & Campo 2 …> ) costruisce il prodotto cartesiano delle relazioni nella clausola FROM se la clausola WHERE è presente seleziona solo le tuple che ne soddisfano il predicato proietta la colonna specificata in corrispondenza di SELECT restituisce il numero di tuple non NULL che la compongono. E’ equivalente alla seguente query: SELECT COUNT ( ALL <NomeTabella.Attributo> ) Tra parentesi ( ) è possibile indicare (*) restituisce il numero totale di righe (incluse quelle che contengono campi nei valori nulli) un insieme di campi (<Camp01 & Campo 2 …> ) dove i nomi dei campi devono essere separati dal carattere &.: in questo caso, l’operatore count conteggia una riga solo se almeno uno dei campi non è nullo, e se tutti i campi specificati nella ListaDeiCampi sono nulli la riga non viene contata. Utilizzando il count con il comando distinct si ottiene: SELECT COUNT ( DISTINCT <NomeTabella.Attributo> ) costruisce il prodotto cartesiano delle relazioni nella clausola FROM se la clausola WHERE è presente seleziona solo le tuple che ne soddisfano il predicato proietta la colonna specificata in corrispondenza di SELECT restituisce il numero di tuple DISTINTE che la compongono Le tuple NULL non vengono contate. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 37 Esempio: Sulla tabella Clienti, vogliamo determinare il numero di clienti della provincia di Milano. CodCli Societa Denom ind Cap Prov Loc C0000001 ROSSI C01050002 EXPERT CASA NEW Via Cesare Battisti, 76 2710 PV PAVIA C01050003 NEW ELECTRONIC Viale Manzoni, 73 2005 MI MONZA C01050004 LAMBERTI GIULIANA Viale Piemonte, 35 2810 NO NOVARA C01050005 MICHELI GIOVANNI Via Bissolati, 2 2610 CR CREMON C01050006 TOSELLI MARCO Via A. Volta, 77 4610 MN MANTOVA C01050007 GAMMA S.N.C. Via Puccini, 34 2012 MI MILANO C01050008 RACHENA 3/2 HAFEEZ 5466 GULBERG Consideriamo la seguente interrogazione: Select count (*) as NumeroClienti From Clienti Where Prov = “MI”; Prima viene normalmente eseguita l’interrogazione considerando solo le parti From e Where. L’operatore aggregato viene poi applicato alla tabella contenente i risultati dell’interrogazione. Il risultato finale corrisponde al numero di righe nella tabella Clienti che possiedono “Mi” come valore del campo Prov. Questo numero non è una proprietà posseduta da una riga in particolare ma deve essere determinato lavorando su tutte le righe della tabella Clienti. NumeroClienti 2 ; Gli altri operatori hanno tutti la medesima sintassi: MIN e MAX restituiscono rispettivamente il minimo e il massimo valore tra quelli di ciascuna riga, SUM restituisce la somma dei valori posseduti dal campo su tutte le righe della tabella, mentre AVG restituisce la media dei valori dell’argomento. SELECT <operatore> ( [ DISTINCT | ALL ] Campo o Espressione ) As [Alias] <operatore> ( [ DISTINCT | ALL ] Campo o Espressione ) As [Alias] … La clausola SELECT può essere seguita da un numero arbitrario di operatori aggregati. Per MIN e MAX è obbligatorio indicare un Alias (viene comunque aggiunto dal sistema) Le parentesi ( ) ammettono come argomento un campo o un’espressione. La query costruisce il prodotto cartesiano delle relazioni nella clausola FROM, se la clausola WHERE `e presente seleziona solo le tuple che ne soddisfano il predicato, proietta le colonne della relazione che compaiono in “FormulaConAttributi”, per ogni tupla calcola il valore della formula “FormulaConAttributi” e quindi ne esegue il totale considerando solo i valori distinti (se presente il DISTINCT) o tutti (ALL) . 38 – Manuale Tecnico - Operativo Esempio: Operando sulla tabella Articoli, La seguente interrogazione: Select max(PVendPub) as MaxPrezzo From Articoli; produce il risultato: MaxPrezzo 7746,85 Esempio: Operando sulla tabella Ordini, la seguente interrogazione: Select avg (prezzo) as MediaOrd From ordclidett Where ordclidett.flagevaso = 2 evidenzia il valore medio di ogni di ogni ordine ancora da evadere MediaOrd 699,78761905 Esempio: Operando sulla tabella dettaglio Ordini, la seguente interrogazione: Select sum (prezzo * QtaOrd) As [Totale prezzo], avg (prezzo * QtaOrd) as Media, max (prezzo * QtaOrd) as Max, min (prezzo * QtaOrd) as Min From ordclidett Where ordclidett.flagevaso = 2 Applica tutti gli operatori analizzati, sul prezzo moltiplicato per la quantità della singola riga Totale prezzo Media Max Min 37637,31 1792,25285714286 10845,6 70 Per quanto illustrato fino ad ora, la clausola SELECT ha esclusivamente due forme possibili: SELECT Espressione [AS Alias] [,Espressione [AS Alias]]... SELECT OperatoreAggregato [AS Alias] [,OperatoreAggregato [AS Alias]]... È scorretto mischiare le due sintassi: la lista che segue la clausola SELECT deve essere omogenea: • • una lista espressioni una lista di operatori aggregati (in questo caso, l’eventuale espressione può trovarsi solo all’interno dell’argomento dell’operatore aggregato). Per questo, una query tipo “Select sum (prezzo), Importo from BolFatDett” è scorretta: QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 39 2.2.1.4 Operatore Insiemistico UNION Le operazioni insiemistiche di unione, intersezione, differenza possono unire in un'unica relazione il risultato di due (o più) relazioni differenti (realizzate con il comando SELECT) le quali hanno una struttura compatibile, ovvero: Stesso numero degli attributi visualizzati Domini compatibili tra i diversi attributi, nello stesso ordine Nel caso in cui nelle due query vi siano campi con nomi differenti ( a patto che sia mantenuto lo stesso dominio) l’attributo risultante avrà il nome dell’attributo della prima query indicata. ; L’unione di due relazioni è realizzata mediante il costrutto UNION. SelectSQL1 UNION [ALL] SelectSQL2… La query SQL realizza l’unione delle tuple contenute nelle relazioni generate dalle due query che sono argomento di UNION. In automatico, le tuple duplicate sono rimosse a meno che non sia presente ALL. SelectSQL = query SQL realizzata col comando SELECT. Esempio: Supponiamo di voler unire un un'unica relazione il risultato di 2 relazioni differenti sulla tabella clienti SELECT Codcli, Denom, Ind, Prov, Loc From Clienti Where prov = 'MI' UNION SELECT Codcli, Societa, Ind, Prov, Loc From Clienti Where prov = 'TO' … 40 – Manuale Tecnico - Operativo 2.2.2 La Condizione WHERE e l’uso di Operatori RELAZIONALI Grazie alla clausola Where è possibile costruire interrogazioni che restituiscono un insieme di righe che soddisfano la condizione espressa nella clausola stessa o che selezionano una specifica riga (nel caso in cui la condizione Where sia costruita su un campo che non ammette duplicati). Viene formalmente definito l’operatore di selezione: le tuple risultato della query saranno estratte in base a questo parametro. La clausola WHERE ha come argomento un predicato semplice o una espressione booleana costruita combinando predicati semplici con gli operatori AND, OR, NOT. Ciascun predicato semplice confronta tramite gli operatori Gli operatori relazionali =, <, >, <>, <=, >= Gli operatori speciali LIKE, BETWEEN, IN il valore di una campo con un valore costante, o con il valore di una parametro o con il risultato della valutazione di un’altra espressione; ogni operatore può combinarsi con AND, OR e NOT. In sintesi, gli operatori <, >, =,… permettono di costruire predicati che vengono valutati su ciascuna riga delle tabelle coinvolte, indipendentemente da tutte le altre righe. ; L’operatore LIKE è da utilizzare per il confronto di stringhe. Tabella.nomcampo LIKE <stringa> La stringa può contenere (combinandoli): % = diversi caratteri _ = un carattere ? = un carattere L’operatore BETWEEN permette di considerare le tuple che contengono (in un attributo) un valore numerico compreso in un intervallo specificato. Si utilizza in unione con l’operatore AND ed eventualmente con l’operatore NOT (per escludere un range di valori). NOT BETWENN valore1 BETWEEN valore1 Equivale a AND AND valore2 valore2 >= valore1 AND <= valore2 ; L’operatore IN permette di determinare le tuple che contengono (in un attributo) un valore presente in un insieme specificato IN (valore1, valore2, …) Equivale a IN (a=valore1) OR IN (a=valore2)…. NOT IN (insieme di valori) Equivale a NOT IN (a=valore1) AND NOT IN (a=valore2)…. ; Nella clausola WHERE è possibile anche specificare il predicato di JOIN tramite uguaglianza diretta tra due attributi: in particolare, la condizione di JOIN prevede diverse sintassi, pertanto Vi dedichiamo un paragrafo apposito (Prelievo da più tabelle: Operatori di JOIN). QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 41 Esempio 1: Lavorando sulla tabella Clienti: CodCli So Denom C0000001 ROSSI C01050002 EXPERT CASA NEW C01050003 NEW ELECTRONIC C01050004 LAMBERTI GIULIANA C01050005 MICHELI GIOVANNI C01050006 TOSELLI MARCO C01050007 GAMMA S.N.C. C01050008 RACHENA C01050009 POWER INSTRUMENTS C01999999 POWER INSTRUMENTS Ind Cap Prov Loc Via Cesare Battisti, 76 Viale Manzoni, 73 Viale Piemonte, 35 Via Bissolati, 2 Via A. Volta, 77 Via Puccini, 34 3/2 HAFEEZ 37 BROOK ROAD 37 BROOK ROAD 27100 20052 28100 26100 46100 20122 54660 PV MI NO CR MN MI PAVIA MONZA NOVAR CREMO MANTO MILANO GULBE SS67XJ SS67XJ Tel 1232131 0382/229877 039/233322 0322/28335 0372/334557 0376/234276 02/44554298 0092425645 0044/268324 0044/268324 L’interrogazione seguente: Select CodCli, Denom, Ind, Cap, Prov, Loc From Clienti Where CodCli = 'C01050002'; restituisce la seguente riga: CodCli Denom C01050002 EXPERT CASA NEW Ind Via Cesare Battisti, 76 Cap 27100 Prov Loc PV PAVIA Esempio 2: Lavorando sulla tabella Articoli: CodArt So Tipo PVendPub H_PCPENTIUM 3000000 M_BORDOTAPP 250 M_FILOCUCITO 50 M_MOQUETTE 45000 M_STOFFATAPP 3500 P_AUTOMOBILE 18000000 S_COMAD_VETRO 12500 S_INTERNI 1500000 S_MANOVEL_VETRO 3000 S_PORTA_PANNELLO 95000 S_PORTIERE 450000 S_RUOTE 110000 Descrizione Pentium Pro 200 Mhz Bordo in Stoffa pregiata per Tappetini Filo per cuciture Tappetini Auto Moquette per il Basamento dell'Auto Stoffa per Tappetini Auto Automobile [Distinta Principale] Comandi Elettrici Vetri Anteriori Interni per Autovettura Manovella Vetri Portiera Posteriore Pannello per Portiera Protiere Autovettura Anteriori Post. Ruote Mod. Pirelli P600 165/60 R13 De Misu N. MT MT MQ MQ N. N. N. N. N. N. N. l’interrogazione Select PvendPub, Descrizione From Articoli Where CodArt = ‘H_PCPENTIUM’ Fornisce questa tabella risultato: PvendPub Descrizione 3000000 Pentium Pro 200 Mhz cioè restituisce i campi PvendPub e Descrizione della riga della tabella Articoli in cui il campo CodArt risulta essere uguale a H_PCPENTIUM. 42 – Manuale Tecnico - Operativo Esempio 3: Consideriamo la seguente interrogazione sulla stessa tabella Articoli: Select CodArt, PvendPub, Descrizione From Articoli Where PvendPub > 2500000 La sua esecuzione produce il seguente risultato: CodArt PvendPub Descrizione H_PCPENTIUM 3000000 Pentium Pro 200 Mhz P_AUTOMOBILE 18000000 Automobile [Distinta Principale] Per selezionare i termini con valori nulli cioè campi in cui c’è assenza di informazione si utilizza il predicato IS NULL. Il predicato risulta vero solo se il campo ha valore nullo. Il predicato IS NOT NULL è la sua negazione. I predicati possono essere separati dal connettivo logico AND, e in questo caso sono selezionate solo le righe per cui tutti i predicati sono veri, o mediante il connettivo logico OR, e in questo caso sono selezionate solo le righe per cui almeno uno dei predicati risulta vero. L’operatore logico NOT è unario, cioè si applica ad un solo predicato e ha l’effetto di invertire il valore di verità del predicato stesso. Esempio 4: La seguente interrogazione eseguita sulla tabella Articoli: Select CodArt, PvendPub, Descrizione, Misura From Articoli Where Misura = "MQ" AND PvendPub > 5000; fornisce il seguente risultato: CodArt PvendPub M_MOQUETTE 45000 Descrizione Moquette per il Misura Basamento MQ Esempio 5: La seguente interrogazione eseguita sulla tabella Articoli: Select CodArt, PvendPub, Descrizione, Misura From Articoli Where Misura = "MQ" OR PvendPub > 1500000; produce il risultato di questa tabella: CodArt PvendPub H_PCPENTIUM 3000000 M_MOQUETTE 45000 M_STOFFATAPP 3500 P_AUTOMOBILE 18000000 S_TELAIO 2500000 Descrizione Pentium Pro 200 Mhz Moquette per il Stoffa per Tappetini Automobile [Distinta Telaio Atuovettura Misura N. MQ MQ N. N. QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 43 Esempio 6: La seguente interrogazione eseguita sulla tabella Articoli: Select CodArt, PvendPub, Descrizione, Misura From Articoli Where NOT Misura = "N."; produce il risultato di questa tabella: CodArt PvendPub M_BORDOTAPP 250 M_FILOCUCITO 50 M_MOQUETTE 45000 M_STOFFATAPP 3500 Descrizione Bordo in Stoffa Filo per cuciture Moquette per il Stoffa per Tappetini Misura MT MT MQ MQ La sintassi assegna nella valutazione della condizione Where la precedenza all’operatore NOT, ma non definisce una relazione di precedenza tra gli operatori AND e OR. In una interrogazione che richiede l’uso di entrambi gli operatori conviene esplicitare l’ordine di valutazione mediante parentesi. Esempio 7: La seguente interrogazione sulla tabella Articoli: Select CodArt, PvendPub, Descrizione, Misura From Articoli Where (Misura = "MQ" AND PvendPub > 5000) OR (Misura = "MT"); produce questo risultato: CodArt M_BORDOTAPP M_FILOCUCITO M_MOQUETTE PvendPub 250 50 45000 Descrizione Bordo in Stoffa Filo per cuciture Moquette per il Misura MT MT MQ cioè un elenco di articoli che soddisfano la condizione racchiusa dalle prime due parentesi oppure quella racchiusa dal secondo gruppo di parentesi. Una diversa disposizione delle parentesi produce un risultato completamente diverso: Select CodArt, PvendPub, Descrizione, Misura From Articoli Where Misura = "MQ" AND (PvendPub > 5000 OR Misura = "MT"); CodArt M_MOQUETTE PvendPub Descrizione 45000 Moquette per Misura il MQ L’operatore LIKE consente il confronto di stringhe. Si comporta come un operatore di uguaglianza arricchito con il supporto per una coppia di caratteri speciali: ? e * che rappresentano rispettivamente un carattere arbitrario e una sequenza di un numero qualsiasi (anche zero) di caratteri arbitrari. È da notare che le stringhe vanno sempre racchiuse tra apici ‘ ’ oppure tra virgolette ” ”. 44 – Manuale Tecnico - Operativo Esempio 8: La seguente interrogazione: Select Nome From BancheCli Where Nome LIKE '*Commerciale*'; produce il risultato espresso da questa tabella: Nome Credito Commerciale Banca Commerciale Italiana cioè seleziona dalla tabella BancheCli tutte le banche il cui nome contiene la parola “Commerciale”. Esempio 9: Se la tabella BancheCli contiene questi valori: IDBa CodCli Nome 11 C01050001 Credito Italiano 12 C01050002 Banca Popolare di Milano 13 C01050003 Cassa di Risparmio di Torino 14 C01050004 Credito Commerciale 15 C01050005 Banca Agricolo Mantovana 16 C01050006 Banca Commerciale Italiana 17 C01050007 CARIPLO La seguente interrogazione: Indirizzo via Cavour, 11 p.za Garibaldi, 5 via Ricostruzione, 3 p.za XXV Aprile, 2 VIA TORINO Localita TORINO MILANO TORINO MILANO MANTOVA MILANO MILANO Tipo Filiale Sede Filiale Sede Sede Agenzi A Select Nome, Localita, NAge From BancheCli Where Nome LIKE 'Banca*' or NAge > 5; produce il risultato espresso da questa tabella: Nome Localita Banca Popolare di Milano MILANO Credito Commerciale MILANO Banca Agricolo Mantovana MANTOVA Banca Commerciale Italiana MILANO CARIPLO MILANO NAge 2 7 3 14 6 cioè tutte le righe della tabella BancheCli in cui il campo Nome inizia con la stringa Banca seguita da un insieme qualsiasi di caratteri e le righe che contengono nel campo Nage un valore maggiore di 5. NAg 1 2 4 7 3 14 6 QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 45 Esempio 10: La seguente interrogazione: Select Nome, Localita From BancheCli Where Localita LIKE '*N?'; produce questo risultato: Nome Credito Italiano Banca Popolare di Milano Cassa di Risparmio di Credito Commerciale Banca Commerciale Italiana CARIPLO Localita TORINO MILANO TORINO MILANO MILANO MILANO cioè un elenco di banche la cui località contiene la lettera N come penultimo carattere. Esempio 9: La seguente interrogazione: Select Nome, Localita From BancheCli Where Localita LIKE 'M??????'; produce questo risultato: Nome Banca Agricolo Mantovana Localita MANTOVA cioè la selezione delle banche la cui località è una stringa di 7 caratteri di cui il primo corrisponde alla lettera M. 46 – Manuale Tecnico - Operativo Esempio 10 – lavorare con le date: La seguente interrogazione in ACCESS: SELECT Ordclitest.OrdDat, Ordclitest.CodCli, Ordclitest.OrdNum FROM Ordclitest WHERE (((Ordclitest.OrdDat)=#31/12/2007#)); produce questo risultato: orddat codcli ordnum 31/12/2007 C01050011 O0000019 31/12/2007 C01050006 Z0000001 31/12/2007 C01050011 Z0000002 31/12/2007 C01050001 O0000020 cioè la selezione degli ordini clienti con data 31/12/2007 La stessa interrogazione in SQL per funzionare va modificata in: SELECT Ordclitest.OrdDat, Ordclitest.CodCli, Ordclitest.OrdNum FROM Ordclitest Where Orddat = '31/12/2007' produce lo stesso risultato di cui sopra. La stessa interrogazione (sia in ACCESS che in SQL) potrebbe essere cambiata anche così: Select orddat, codcli, ordnum From Ordclitest Where year (Orddat) = 2007 Producendo questo risultato: orddat codcli ordnum 31/12/2007 C01050011 O0000019 31/12/2007 C01050006 Z0000001 31/12/2007 C01050011 Z0000002 31/12/2007 C01050001 O0000020 cioè la selezione degli ordini clienti dell’anno 2007 QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 47 2.2.3 Prelievo da più tabelle: Operatori di JOIN Gli operatori di JOIN consentono di correlale dati provenienti da tabelle diverse, quando tra questi esiste una corrispondenza di valori contenuti nei rispettivi attributi (che devono appartenere allo stesso dominio). Viene formalmente definito prodotto cartesiano di più relazioni. Il JOIN può avere diverse sintassi: la più semplice è l’indicazione del predicato di JOIN nella clausola WHERE, indicando il legame diretto esistente tra due tabelle tramite un uguaglianza: WHERE Tabella1.nomecapo1 = Tabella2.nomecapo2 … Questa sintassi a livello logico è equivalente all’utilizzo dell’operatore INNER JOIN. Gli operatori disponibili sono 3: INNER JOIN LEFT JOIN RIGHT JOIN join interno join esterno join esterno uno a uno molti a uno uno a molti (=) (*=) (=*) Il loro utilizzo è all’interno della condizione FROM ed legato ad una in sintassi particolare: SELECT FROM WHERE Campi… NomeTabella1.1 Inner|Left|Right JOIN NomeTabella2.1 ON NomeTabella1.1 = NomeTabella2.1, NomeTabella1.2 Inner|Left|Right JOIN NomeTabella2.2 ON NomeTabella1.2 = NomeTabella2.2, … … Le righe che vengono coinvolte nel join sono in generale un sottoinsieme delle righe di ciascuna tabella: può infatti capitare che alcune righe non vengano considerate in quanto non esiste una corrispondente riga nell’altra tabella per cui la condizione sia soddisfatta. Il join esterno (rappresentato dagli operatori Left join e Right join) esegue un join tra tabelle mantenendo però tutte le righe che fanno parte di una o dell’altra delle tabelle coinvolte (rispettivamente alla sinistra o alla destra del join): in questo caso, vengono posti degli opportuni valori nulli per rappresentare l’assenza di informazioni provenienti dall’altra tabella. 48 – Manuale Tecnico - Operativo ; L’INNER JOIN è un operatore che correla dati in tabelle diverse sulla base di valori uguali in campi con lo stesso tipo: l’inner join tra due tabelle fa si che vengano selezionate, dalla concatenazione delle tabelle coinvolte, le righe per cui la condizione di join è vera. Esempio: Un join può essere costruito indicando un ugualianza nella clausola WHERE oppure all’interno del FROM la seguente interrogazione: Select BancheCli.CodCli, Denom, Tel, Nome, Localita From BancheCli INNER JOIN Clienti ON BancheCli.CodCli = Clienti.CodCli; Equivale a: Select BancheCli.CodCli, Denom, Tel, Nome, Localita From BancheCli, Clienti Where BancheCli.CodCli = Clienti.CodCli; Supponendo che la tabella BancheCli contenga questi valori: IDBa 11 12 13 14 15 16 17 CodCli C01050001 C01050002 C01050003 C01050004 C01050005 C01050006 C01050007 Nome Credito Italiano Banca Popolare di Milano Cassa di Risparmio di Credito Commerciale Banca Agricolo Mantovana Banca Commerciale Italiana CARIPLO Indirizzo via Cavour, 11 p.za Garibaldi, 5 via Ricostruzione, 3 p.za XXV Aprile, 2 VIA TORINO Localita TORINO MILANO TORINO MILANO MANTOVA MILANO MILANO e la tabella Clienti: CodCli Soc Denom Ind C0000001 ROSSI C01050002 EXPERT CASA NEW Via Cesare Battisti, 76 C01050003 NEW ELECTRONIC Viale Manzoni, 73 C01050004 LAMBERTI GIULIANA Viale Piemonte, 35 C01050005 MICHELI GIOVANNI Via Bissolati, 2 C01050006 TOSELLI MARCO Via A. Volta, 77 C01050007 GAMMA S.N.C. Via Puccini, 34 C01050008 RACHENA 3/2 HAFEEZ C01050009 POWER 37 BROOK ROAD C01999999 POWER 37 BROOK ROAD Cap Prov Loc Tel 1232131 PAVIA 0382/229877 MONZA 039/233322 NOVARA 0322/28335 CREMON 0372/334557 MANTOVA 0376/234276 MILANO 02/44554298 GULBERG 00924256456 SS67XJ 0044/268324 SS67XJ 0044/268324 2710 2005 2810 2610 4610 2012 5466 PV MI NO CR MN MI il risultato dell’interrogazione è la seguente tabella: CodCli C01050002 C01050003 C01050004 C01050005 C01050006 C01050007 Denom EXPERT CASA NEW NEW ELECTRONIC LAMBERTI GIULIANA MICHELI GIOVANNI TOSELLI MARCO GAMMA S.N.C. Tel 0382/2298779 039/233322 0322/28335 0372/334557 0376/2342768 02/44554298 Nome Banca Popolare di Milano Cassa di Risparmio di Torino Credito Commerciale Banca Agricolo Mantovana Banca Commerciale Italiana CARIPLO Localita MILANO TORINO MILANO MANTOVA MILANO MILANO QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 49 ; Il LEFT JOIN fornisce come risultato l’inner join esteso con le righe della tabella che compare a sinistra dell’operatore Left join anche se non esiste una corrispondente riga nella tabella di destra (risultato dell’inner l’inner join + tutti valori della tabella di sinistra). Esempio: Considerando le tabelle BancheCli e Clienti dell’esempio precedente e la seguente interrogazione: Select BancheCli.CodCli, Denom, Tel, Nome, Localita From BancheCli LEFT JOIN Clienti ON BancheCli.CodCli = Clienti.CodCli; si ottiene questo risultato: CodCli C01050001 C01050002 C01050003 C01050004 C01050005 C01050006 C01050007 Denom Tel EXPERT CASA NEW LAMBERTI MICHELI TOSELLI MARCO GAMMA S.N.C. 0382/229877 039/233322 0322/28335 0372/334557 0376/234276 02/44554298 Nome Credito Italiano Banca Popolare di Milano Cassa di Risparmio di Credito Commerciale Banca Agricolo Mantovana Banca Commerciale Italiana CARIPLO Localita TORINO MILANO TORINO MILANO MANTOVA MILANO MILANO ; Il RIGHT JOIN restituisce invece, oltre al risultato dell’inner join, le righe della tabella che compare a destra dell’operatore Right join per le quali l’operazione non trova un corrispondente nella tabella di sinistra (risultato dell’inner l’inner join + tutti valori della tabella di destra). Esempio: Considerando le tabelle BancheCli e Clienti dell’esempio precedente e la seguente interrogazione: Select BancheCli.CodCli, Denom, Tel, Nome, Localita From BancheCli RIGHT JOIN Clienti ON BancheCli.CodCli = Clienti.CodCli; si ottiene questo risultato: CodCli C01050002 C01050003 C01050004 C01050005 C01050006 C01050007 Denom ROSSI EXPERT CASA NEW NEW ELECTRONIC LAMBERTI GIULIANA MICHELI GIOVANNI TOSELLI MARCO GAMMA S.N.C. RACHENA POWER POWER Tel 1232131 0382/229877 039/233322 0322/28335 0372/334557 0376/234276 02/44554298 00924256456 0044/268324 0044/268324 Nome Localita Banca Popolare di Milano Cassa di Risparmio di Credito Commerciale Banca Agricolo Mantovana Banca Commerciale Italiana CARIPLO MILANO TORINO MILANO MANTOVA MILANO MILANO 50 – Manuale Tecnico - Operativo 2.2.4 Criteri di ordinamento ORDER BY La clausola ORDER BY consente di definire il criterio di ordinamento delle tuple estratte dall’interrogazione; chiude l’interrogazione SQL. L’ordine su ciascun campo può essere: ASC DESC : ascendente (default) : discendente Se il qualificatore è omesso si assume un ordinamento ascendente. Omettendo la clausola di order by, l’ordinamento viene definito dal sistema (secondo la strategia usata per creare l’interrogazione) E’ possibile specificare anche più attributi che devono essere usati per l’ordinamento; la sintassi della clausola di ordinamento è la seguente: ORDER BY Tabella.nomcampo [ asc | desc] { , Tabella.nomcampo [ asc | desc ]}… Viene prima valutato il primo campo nell’elenco e si ordinano le righe in base a questo attributo (l’attributo più a sinistra ha più priorità dell’attributo a destra). Per righe che hanno lo stesso valore in questo campo si considerano i valori dei campi di ordinamento successivi, in sequenza. Esempio: L’interrogazione seguente sulla tabella Clienti Select Denom, Tel From Clienti Order by Denom Seleziona l’elenco di clienti ordinato in ordine ascendente in base al valore del campo Denom, visualizzando le colonne Denom e Tel: Denom EXPERT CASA NEW GAMMA S.N.C. LAMBERTI GIULIANA MICHELI GIOVANNI NEW ELECTRONIC POWER POWER RACHENA ROSSI TOSELLI MARCO Tel 0382/229877 02/44554298 0322/28335 0372/334557 039/233322 0044/268324 0044/268324 00924256456 1232131 0376/234276 QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 51 2.2.5 QUERY DI RAGGRUPPAMENTO: criterio GROUP BY Il criterio di raggruppamento GROUP BY consente di suddividere (= raggruppare) le tuple di una relazione in tanti gruppi, e su ciascuno di questi applicare un operatore aggregato (ved. Operatori di AGGREGAZIONE). Questo criterio consente quindi di suddividere le tabelle in sottoinsiemi, raggruppando le righe che possiedono gli stessi valori per un insieme di campi specificato, applicando quindi gli operatori aggregati come se ciascun gruppo di tuple fossero una relazione distinta vera e propria. SELECT NomeTabella.Attributo [,NomeTabella.Attributo]... OperatoreAggregato [AS Alias] [,OperatoreAggregato [AS Alias]]... FROM WHERE GROUP BY NomeTabella [,NomeTabella]... … NomeTabella.Attributo [,NomeTabella.Attributo]... ORDER BY NomeTabella.Attributo [,NomeTabella.Attributo]... La sintassi SQL impone che in una interrogazione che fa uso della clausola GROUP BY possano comparire come argomento della SELECT solamente un sottoinsieme dei campi utilizzato per il raggruppamento delle righe le funzioni aggregate valutate solo sugli altri attributi. Quindi, nella clausola SELECT devono comparire tutti i campi presenti anche nella clausola GROUP BY , eccetto per gli operatori aggregati; viceversa, nella clausola GROUP BY possono apparire anche campi che non sono presenti nella select. La query SQL costruisce il cartesiano delle relazioni nella clausola FROM Se la clausola WHERE è presente, seleziona solo le tuple che ne soddisfano il predicato Le tuple della relazione così ottenuta vengono suddivise in gruppi, dove ogni gruppo contiene quelle tuple che assumono il medesimo valore in corrispondenza degli attributi elencati nella clausola GROUP BY Per ogni gruppo la query SQL proietta sia le colonne NomeTabella.Attributo [,NomeTabella.Attributo]... sia il valore degli operatori aggregati che compaiono nella clausola SELECT, dove gli operatori aggregati vengono calcolati sulle tuple del gruppo Dopo l’esecuzione del raggruppamento, ogni sottoinsieme di righe deve corrispondere a una sola riga nella tabella risultato dell’interrogazione: dopo che le righe sono state raggruppate in sottoinsiemi, l’operatore aggregato viene applicato separatamente su ogni sottoinsieme. Il risultato dell’interrrogazione è costituito quindi da una tabella con righe che contengono il risultato della valutazione dell’operatore aggregato, affiancato al valore del campo che è stato usato per l’aggregazione. La sintassi SQL permette che in una interrogazione che fa uso della clausola GROUP BY possa essere usata la clausola ORDER BY: in questo caso, è necessario che ogni attributo presente nel ORDER BY appaia anche nel GROUP BY 52 – Manuale Tecnico - Operativo Esempio: Supponiamo che la tabella BancheCli contenga queste informazioni (alcuni campi sono stati eliminati): IDBan CodCli Nome Indirizzo Localita Tipo 11 C01050001 Credito Italiano via Cavour, 11 TORINO Filiale 12 C01050002 Banca Popolare di Milano p.za Garibaldi, 5 MILANO Sede 13 C01050003 Cassa di Risparmio di Torino via Ricostruzione, 3 TORINO Filiale 14 C01050004 Credito Commerciale p.za XXV Aprile, 2 MILANO Sede 15 C01050005 Banca Agricolo Mantovana MANTOVA Sede 16 C01050006 Banca Commerciale Italiana MILANO Agenzia 17 C01050007 CARIPLO VIA TORINO MILANO A NAg 1 2 4 7 3 14 6 Consideriamo la seguente interrogazione: Select count(Nome) as NClientiConBancaA, Localita From BancheCli Group by Localita Questa interrogazione ha l’effetto di contare il numero di clienti la cui banca ha sede nella medesima località. Per ciascuna località visualizza il numero di clienti. Nella query in esame è come se venisse eseguita l’interrogazione: Select Nome, Localita From BancheCli La tabella ottenuta viene poi analizzata, dividendo le righe in insiemi caratterizzati dallo stesso valore dei campi che compaiono come argomenti della clausola group by. Nell’esempio le righe vengono raggruppate in base allo stesso valore del campo Località, ottenendo in memoria questo risultato: Banca Agricolo Mantovana MANTOVA Banca Popolare di Milano MILANO Credito Commerciale MILANO Banca Commerciale Italiana MILANO CARIPLO MILANO Credito Italiano TORINO Cassa di Risparmio di Torino TORINO Che viene elaborato nel seguente risultato dell’interrogazione. NClientiConBancaA Localita 1 MANTOVA 4 MILANO 2 TORINO Esempio: La seguente query estrae, legando due tabelle diverse, il totale dei diversi destinatari di ogni cliente: SELECT Clienti.Denom, count(DivDest.Denom) As [N Div Dest*] FROM Clienti,DivDest WHERE Clienti.CodCli=DivDest.Codcli GROUP BY Clienti.Denom QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 53 2.2.5.1 La clausola HAVING La clausola HAVING descrive le condizioni che si devono applicare al termine dell’esecuzione di una query che fa uso della clausola GROUP BY e di criteri di aggregazione: il ruolo della clausola HAVING è di fatto analogo a quello della clausola WHERE, solo che la clausola WHERE agisce su singole tuple mentre HAVING agisce su gruppi di tuple. Quindi, in sintesi, in una interrogazione che fa uso del GRUOP BY è possibile specificare due condizioni di selezione che le tuple dovranno soddisfare per essere estratte: la clausola HAVING può avere come argomento gli operatori aggregati la clausola WHERE potrà avere come argomento gli altri attributi della query NOTA IMPORTANTE: gli operatori aggregati NON possono comparire in Condizione Where; solo la condizione HAVING ammette nel predicato SQL gli operatori aggregati. Applicando la clausola HAVING, il risultato finale della query evidenzia un sottoinsieme di righe costruito dalle tuple della GROUP BY che soddisfano il predicato argomento della HAVING. SELECT NomeTabella.Attributo [,NomeTabella.Attributo]... OperatoreAggregato [AS Alias] [,OperatoreAggregato [AS Alias]]... FROM WHERE GROUP BY HAVING NomeTabella [,NomeTabella]... … NomeTabella.Attributo [,NomeTabella.Attributo]... OperatoreAggregato [AS Alias] ORDER BY NomeTabella.Attributo [,NomeTabella.Attributo]... La query SQL costruisce il cartesiano delle relazioni nella clausola FROM se la clausola WHERE è presente, la query seleziona solo le tuple che ne soddisfano il predicato, le tuple della relazione così ottenuta vengono suddivise in gruppi, dove ogni gruppo contiene quelle tuple che assumono il medesimo valore in corrispondenza degli attributi elencati nella clausola GROUP BY la query elimina quindi i gruppi di tuple che non soddisfano il predicato nella clausola HAVING infine PER OGNI GRUPPO la query SQL proietta sia le colonne NomeTabella.Attributo [,NomeTabella.Attributo]... sia il valore delle espressioni che compaiono nella clausola SELECT, dove le espressioni vengono calcolate sulle tuple del gruppo. 54 – Manuale Tecnico - Operativo Esempio: Ecco Select count(Nome) as NClientiConBancaA, Localita From BancheCli Group by Localita Having count(Nome) > 1 Questa interrogazione produce la seguente tabella come risultato: NClientiConBancaA 4 2 Localita MILANO TORINO Esempio: Ipotizziamo di volere visualizzare gli articoli che sono presenti nell’archivio ordini con prezzi variabili. Per fare ciò, scrivendo la seguente query senza HAVING possiamo ottenere una visualizzazione, raggruppata per ogni articolo, del prezzo minimo e del prezzo massimo di vendita: SELECT CodArt, max(Prezzo) As [Prezzo Max], min(Prezzo) As [Prezzo Min] FROM OrdCliDett GROUP BY CodArt La query da il seguente risultato: CodArt Prezzo Max Prezzo Min H_PCPENTIUM 1456,41 1084,56 H_ST_EPSONEPL 345 345 P_BICICLETTA 2169,12 1800 R_NASTRO 25 17,5 W_MSOFFICE 300 210 Vediamo dal risultato della query che l’unico articolo venduto a prezzo costante è l’articolo H_ST_EPSONEPL: infatti, aggiungendo una apposita clausola HAVING è possibile per estrarre solo le tuple relative ad articoli che presentano una certa variabilità di prezzo, le quali presenta un max diverso dal valore min (in caso di invarianza, i due valori sarebbero uguali). SELECT CodArt, max(Prezzo) As [Prezzo Max], min(Prezzo) As [Prezzo Min] FROM OrdCliDett GROUP BY CodArt HAVING max(Prezzo) <> min (Prezzo) CodArt Prezzo Max Prezzo Min H_PCPENTIUM 1456,41 1084,56 P_BICICLETTA 2169,12 1800 R_NASTRO 25 17,5 W_MSOFFICE 300 210 Con la stessa logica, possono creare una clausola HAVING per estrarre solo quelli che presentano una variabilità tra il valore massimo e minimo maggiore di € 500,00: … HAVING max(Prezzo) - min (Prezzo) > 500,0 QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 55 2.2.6 QUERY ANNIDATE (Subquery) Esistono problemi, rilevanti dal punto di vista pratico, che per essere risolti richiedono di leggere i dati di una relazione più volte: in questo senso, le SUBQUERY (o NESTED QUERY) consentono di trattare queste casistiche. Una SUBQUERY7 è una query SQL che compare all’interno di un’altra query SQL (la quale potrebbe essere subquery di un’altra query e così via); sono delle espressioni SELECT nidificate, che possono essere posizionate: ; nella clausola WHERE ; nella clausola FROM Per comprendere le interrogazioni nidificate le si può interpretare in questo modo: l’interrogazione nidificata viene eseguita per prima e il risultato viene salvato in una variabile temporanea. Il confronto viene poi operato accedendo direttamente a questi risultati temporanei. 2.2.6.1 Subquery nella clausola WHERE Il caso più frequente è trovare le subquery all’interno della clausola WHERE: permette di costruire predicati con strutture complesse, in cui si confronta un valore (ottenuto come risultato di una espressione valutata sulla singola riga) con l’insieme di valori risultato dell’esecuzione di un’altra interrogazione SQL nidificata; la nested query viene eseguita per prima e il risultato viene salvato in una variabile temporanea. Il confronto viene quindi operato accedendo direttamente a questi risultati temporanei, come condizioni di WHERE. WHERE Espressione [Operatore] (Subquery) La Sub Query deve essere compresa tra parentesi tonde ( ). SQL esegue prima la subquery dopo che ne ha calcolato il risultato esegue la query più esterna nella clausola WHERE una subquery ha il ruolo di un operando Una subquery rende un risultato confrontabile, e può restituire più valori (relazioni) o un unico valore: in base a ciò, sarà possibile utilizzare diversi operatori. • Se la subquery restituisce un singolo valore, è lecito usarla come operando di: OPERATORI RELAZIONALI (=,<,>, …) OPERATORI MATEMATICI (+, _, −, . . ) • Se la subquery restituisce più valori (Nb: separati da virgole) può essere un operando di: OPERATORI INSIEMISTICI (ved. pagina seguente). 7 SQL è un linguaggio potente proprio perché consente di avere query all’interno di altre query: in questo modo una query complessa può essere scomposta in una query più semplice.. 56 – Manuale Tecnico - Operativo Poiché il risultato di una interrogazione SQL è generalmente costituito da un insieme di valori e in una Select nidificata questo viene confrontato con il valore di un campo per una singola riga alla volta, i normali operatori di confronto <, >, =,…. sono estesi con le parole chiave ALL e ANY. La sintassi diventa quindi la seguente. ; L’operatore ALL specifica che la riga soddisfa la condizione solo se tutti gli elementi restituiti dall’interrogazione nidificata Subquery rendono vero il confronto; l’operatore ANY specifica che la riga soddisfa la condizione solo se almeno uno degli elementi restituiti dall’interrogazione nidificata Subquery rende vero il confronto. Espressione [Operatori Relazionali] [ALL | ANY] (Subquery) Esempio: Espressione >= ALL (SubQuery) SQL mette a disposizione anche due appositi operatori IN e NOT IN che rappresentano il controllo di appartenenza e di esclusione rispetto ad un insieme. La sintassi è la seguente. ; IN: ha lo stesso significato dell’operatore = ANY. Verifica se l’Espressione (capo o valore) è presente nell’insieme di tutti gli elementi restituiti dall’interrogazione nidificata (Subquery) ; NOT IN ha lo stesso significato dell’operatore <> ALL. Verifica se espressione non è presente nell’insieme di tutti gli elementi restituiti dall’interrogazione nidificata (Subquery). Espressione [IN | NOT IN] (Subquery) Espressione Sx può essere : un singolo valore costante un nome di attributo un’espressione contenente operatori matematici una subquery che restituisce un singolo valore Un altro operatore è l’operatore EXISTS (e la sua negazione). La sintassi è la seguente. ; L’operatore EXIST e NOT EXIST Verifica se esiste o no almeno una riga nell’insieme restituito dall’interrogazione nidificata Subquery Espressione [EXISTS | NOT EXISTS] (Subquery) QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 57 Esempio: Operando sulla tabelle Articoli contenente questi valori: CodArt H_PCPENTIUM M_BORDOTAPP M_FILOCUCITO M_MOQUETTE M_STOFFATAPP P_AUTOMOBILE S_COMAD_VETRO S_INTERNI S_MANOVEL_VETRO S_PORTA_PANNELLO S_PORTIERE S_RUOTE S_SEDILI_A S_SEDILI_P S_TAPPETINI S_TELAIO W_MSOFFICE Societa TipoMag PVendPub 3000000 45000 50 45000 3500 18000000 12500 1500000 3500 95000 450000 110000 550000 400000 45000 2500000 800000 Descrizione Desc Misura Pentium Pro 200 Mhz N. Bordo in Stoffa MT Filo per cuciture MT Moquette per il MQ Stoffa per Tappetini MQ Automobile [Distinta N. Comandi Elettrici Vetri N. Interni per Autovettura N. Manovella Vetri N. Pannello per Portiera N. Protiere Autovettura N. Ruote Mod. Pirelli N. Sedili Anteriori N. Sedili Posteriori N. Tappetini Anteriori e N. Telaio Atuovettura N. Microsoft Office 97 N. La seguente interrogazione: Select Descrizione, PvendPub, Misura From Articoli Where PvendPub = ANY (Select PvendPub From Articoli Where Misura = ‘MQ’); ha l’effetto di selezionare dalla tabella articoli quegli articoli che hanno lo stesso prezzo PvendPub di tutti gli articoli con Misura ‘MQ’; Descrizione Bordo in Stoffa Moquette per il Stoffa per Tappetini Manovella Vetri Tappetini Anteriori e PvendPub 45000 45000 3500 3500 45000 Misura MT MQ MQ N. N. 58 – Manuale Tecnico - Operativo 2.2.6.1.1 Query CORRELATE Ci sono casistiche in cui non è sufficiente che la subquery venga eseguita una sola volta, ma è necessario che l’esecuzione avvenga per ogni tupla nella relazione della query esterna. Quando una subquery deve essere eseguita tante volte quante sono le tuple della relazione esterna ed il suo risultato è di volta in volta funzione della tupla esterna, si parla di QUERY CORRELATE. La sintassi è la seguente: WHERE Espressione (Subquery) [Operatore] Affinché SQL esegua una subquery come query correlata, una o più relazioni nella clausola FROM della query esterna devono avere un Alias: tale alias più essere usato nelle espressioni all’interno della subquery. Esempio: Operando sulla tabella Ordclidett, è possibile elaborare una query per estrarre le righe di ordini che presentano sia un prezzo di vendita maggiore di 1000, sia in assoluto più alto per l’articolo in esame: Select id, codart, prezzo From ordclidett x where (select max(prezzo) from ordclidett where ordclidett.prezzo = x.prezzo) > 1000 2.2.6.2 Subquery nella clausola FROM Dato che una sottoquery restituisce una relazione, può comparire anche nell’elenco di relazioni nella clausola FROM: in questo caso, si richiede che alla sottoquery sia associato un Alias, che all’interno della una query SQL può essere utilizzato come un normale nome di relazione. Esempi: Operando sulla tabella Ordclidett, è possibile elaborare una query (annidata) che effettua una media dei prezzi di vendita associati degli articoli di magazzino, da utilizzare come confronto per verificare quali articoli sono stati venduti ad un prezzo superiore al prezzo medio di vendita: Select ordclidett.codart, ordclidett.prezzo from (Select avg(PvendPub) As PMedio from articoli) X, ordclidett where ordclidett.prezzo > X.Pmedio La query può essere velocemente modificata per verificare quante righe di ordine riportano prezzi superiori al prezzo di vendita dell’articolo: Select ordclidett.codart, ordclidett.prezzo from ordclidett, (Select codart, PvendPub from articoli) X where ordclidett.prezzo > X.PVendPub and ordclidett.codart = x.codart QUERY BUILDER: Gestione delle Viste e il Linguaggio SQL - 59 2.3 COMANDI PER LA MODIFICA DEI DATI [Non utilizzabili da Query Builder] Questi comandi non sono utilizzabili in Query Builder: ne riportiamo la descrizione per completezza espositiva (possono essere di largo utilizzo da parte di personale tecnico). 2.3.1 Il comando DELETE Il comando DELETE consente di cancellare righe da una tabella del database. DELETE FROM WHERE NomeTabella Condizione L’effetto del comando è l’eliminazione dalla tabella NomeTabella di tutte le righe che soddisfano la condizione di Where; se non è specificata la clausola Where l’esecuzione del comando produce la rimozione di tutte le righe della tabella specificata. Esempio: Il comando: Delete From BancheCli Where Nome = ‘CARIPLO’; ha l’effetto di eliminare dalla tabella BancheCli la riga il cui campo Nome contiene il valore ‘CARIPLO’. Dopo la sua esecuzione la tabella si presenta con una riga in meno. IDBan 11 12 13 14 15 16 CodCli C01050001 C01050002 C01050003 C01050004 C01050005 C01050006 Nome Credito Italiano Banca Popolare di Milano Cassa di Risparmio di Credito Commerciale Banca Agricolo Mantovana Banca Commerciale Italiana Indirizzo via Cavour, 11 p.za Garibaldi, 5 via Ricostruzione, 3 p.za XXV Aprile, 2 Localita TORINO MILANO TORINO MILANO MANTOVA MILANO Nella condizione WHERE è possibile indicare anche una NESTED QUERY: in questo caso,verranno applicate le stesse regole per la query di SELECT, e le tuple eliminate saranno quelle che soddisfano la condizione di WHERE. 60 – Manuale Tecnico - Operativo 2.3.2 Il comando UPDATE l comando UPDATE consente di apportare modifiche al contenuto di una tabella. UPDATE SET WHERE NomeTabella Campo = < Espressione | SelectSQL | null > {, Campo = < Espressione | SelectSQL | null | default > } Condizione Con questo comando vengono aggiornati uno o più campi delle righe della tabella NomeTabella che soddisfano l’eventuale condizione argomento della clausola Where; se il comando non contiene la clausola Where la modifica viene effettuata sugli attributi di tutte le righe. Nei campi oggetto di modifica viene posto un valore che può essere il risultato della valutazione di una espressione sui campi della tabella, il risultato di una interrogazione SQL o il valore nullo; questo valore aggiornare deve essere dello stesso dominio (tipo) del valore da aggiornare. Nella clausola SET è possibile indicare anche una NESTED QUERY: in questo caso, la query annidata deve restituire un valore di dominio compatibile con quello del campo che deve aggiornare. Esempio: A partire da questi valori nella tabella BancheCli: IDBan 11 12 13 14 CodCli C01050001 C01050002 C01050003 C01050004 Nome Credito Italiano Banca Popolare di Milano Cassa di Risparmio di Torino Credito Commerciale Indirizzo via Cavour, 11 p.za Garibaldi, 5 via Ricostruzione, 3 p.za XXV Aprile, 2 Localita TORINO MILANO TORINO MILANO Il seguente comando di update: Update BancheCli Set Indirizzo = ‘via Mazzini, 23’ Where Nome = ‘CARIPLO’; ha l’effetto di modificare il campo Indirizzo nella riga contenente il Nome CARIPLO: IDBan 11 12 13 14 CodCli C01050001 C01050002 C01050003 C01050004 Nome Indirizzo Credito Italiano via Cavour, 11 Banca Popolare di Milano p.za Garibaldi, 5 Cassa di Risparmio di via Ricostruzione, 3 Credito Commerciale p.za XXV Aprile, 2 Localita TORINO MILANO TORINO MILANO Un comando di update può anche essere effettuato riprendendo i dati presenti su tabelle differenti: in questo caso, per gestire il join delle tabelle, indicare direttamente nel ‘from’ le tabelle di riferimento e specificare la condizione di join nel ‘where’: Update clienti set clienti.campo1 = tmp.campo2 FROM clienti, tmp where tmp.id = clienti.codcli ha l’effetto di aggiornare il campo1 della tabella clienti con il valore del campo2 della tabella tmp (temporanea) a condizione che sia rispettato il vincolo “tmp.id = clienti.codcli”.