Cross Join. Sintassi ANSI SQL-92

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Cross Join. Sintassi ANSI SQL-92"

Transcript

1 Capitolo 3 Join In questo capitolo: Cross Join Inner join Altri esempi di join Outer join Conclusioni Esercitazioni Soluzioni La clausola FROM di una query è la prima a essere elaborata in modo logico e, all'interno di essa, gli operatori di tabella agiscono sulle tabelle di input. Microsoft SQL Server 2008 supporta quattro operatori di tabella, JOIN, APPLY, PIVOT e UNPIVOT. L'operatore JOIN è standard, mentre APPLY, PIVOT e UNPIVOT sono estensioni di T-SQL, introdotti con SQL Server Ogni operatore di tabelle agisce sulle tabelle fornite come input, applica un insieme di fasi di elaborazione logica query e restituisce un risultato di tabella. Il presente capitolo si focalizza sull'operatore JOIN. APPLY verrà illustrato nel capitolo 5, mentre PIVOT e UNPIVOT nel capitolo 7. L'operatore di tabella JOIN agisce in due tabelle di input. I tre tipi fondamentali di join sono cross, inner e outer. Essi si differenziano l'uno dall'altro nel modo in cui applicano le fasi di elaborazione logica delle query; ognuno di essi infatti applica un insieme di fasi diverso. Un cross join applica solo una fase, il prodotto cartesiano. Un inner join applica due fasi, prodotto cartesiano e filtro. Un outer join applica tre fasi, prodotto cartesiano, filtro e aggiunta di righe esterne. Questo capitolo illustra nel dettaglio i tipi di join e le fasi previste. L'elaborazione logica di query descrive una serie generica di passaggi logici che produce per ogni query il risultato corretto, mentre l'elaborazione fisica di query è il modo reale in cui viene elaborata una query dal motore dell'rdbms. Alcune fasi di elaborazione logica dei join possono sembrare poco efficaci, tuttavia l'implementazione fisica può essere ottimizzata. È importante sottolineare il termine logica nell'elaborazione logica di query. I passaggi del processo applicano operazioni alle tabelle di input in base all'algebra relazionale. Il motore del database non deve seguire fasi di elaborazione logica query, se è in grado di garantire che il risultato prodotto sia uguale a quello prodotto dall'elaborazione logica. Spesso, il motore relazionale di SQL Server applica molti collegamenti per ottimizzare le operazioni, quando sa di poter produrre il risultato corretto. Anche se l'obiettivo del presente libro è quello di illustrare gli aspetti logici della creazione di query, vale la pena approfondire questo punto per evitare fraintendimenti e confusione. 101

2 102 Microsoft Transact SQL Nozioni di base Cross Join A livello logico, un cross join è il tipo di join più semplice. Esso implementa una sola fase di elaborazione logica query, ovvero un prodotto cartesiano. Questa fase opera in due tabelle fornite come input al join e produce un prodotto cartesiano delle due. Ogni riga di un output viene confrontata con tutte le righe dell'altro. Quindi, se in un tabella ci sono righe m e nell'altra righe n, nel risultato si ottengono righe m n. SQL Server supporta due sintassi standard per i cross join, ANSI SQL-92 e ANSI SQL-89. Si suggerisce di utilizzare la prima per le ragioni che verranno illustrate tra breve. Pertanto, la sintassi ANSI-SQL 92 è la principale utilizzata in tutto il libro. Tuttavia, per motivi di completezza, nella presente sezione vengono descritte entrambe. Sintassi ANSI SQL-92 La query seguente applica un cross join tra le tabelle Customers e Employees (utilizzando la sintassi ANSI SQL-92) nel detabase TSQLFundamentals2008 e restituisce gli attributi custid e empid nel risultato: USE TSQLFundamentals2008; SELECT C.custid, E.empid FROM Sales.Customers AS C CROSS JOIN HR.Employees AS E; Poiché nella tabella Customers ci sono 91 righe, mentre nella tabella Employees 9, questa query produce un risultato di 819 righe, come illustrato di seguito in forma abbreviata: custid empid (Righe interessate: 819)

3 Capitolo 3 Join 103 Utilizzando ANS SQL-92, vengono specificate le parole chiave CROSS JOIN tra le due tabelle coinvolte nel join. Osserva che nella clausola FROM della query precedente, sono stati assegnati gli alias C ed E rispettivamente alle tabelle Customers e Employees. Il risultato prodotto dal cross join è una tabella virtuale con attributi che hanno origine da entrambe le parti del join. Poiché sono stati assegnati degli alias alle tabelle di origine, i nomi delle colonne della tabella virtuale riportano l'alias come prefisso (ad esempio, C.custid, E.empid). Se non si assegnano alias alle tabelle della clausola FROM, i nomi delle colonne della tabella virtuale riportano come prefisso i nomi completi delle tabelle di origine (ad esempio, Customers.custid, Employees.empid). La funzione dei prefissi è quella di consentire l'identificazione delle colonne in modo chiaro, quando lo stesso nome di colonna appare in entrambe le tabelle. Gli alias delle tabelle vengono assegnati per brevità. Ricorda che è necessario utilizzare i prefissi per le colonne, solo quando si fa riferimento a nomi di colonna ripetuti (nomi presenti in più di una tabella); nei casi in cui ciò non si verifica, i professi sono facoltativi. Tuttavia, per chiarezza alcuni ritengono sia una buona abitudine usare sempre prefissi di colonna. Ricorda inoltre che se decidi di assegnare un alias a una tabella, non puoi utilizzare il nome completo della tabella come prefisso; devi necessariamente scegliere l'alias definito. Sintassi ANSI SQL-89 SQL Server supporta anche un tipo di sintassi meno recente per i cross join, introdotta in ANSI SQL-89. In essa, viene semplicemente specificata una virgola tra i nomi di tabella, come segue: SELECT C.custid, E.empid FROM Sales.Customers AS C, HR.Employees AS E; Non esistono differenze di logica o prestazioni tra le due sintassi. Entrambe sono parte integrante dello standard SQL più recente (NASI SQL:2006 al momento della stesura del libro) e sono completamente supportate dall'ultima versione di SQL Server (SQL Server 2008 al momento della stesura del libro). Non risultano in corso progetti per escludere la sintassi meno recente, né esistono ragioni per farlo, dato che costituisce parte integrante dello standard. Tuttavia, si suggerisce di utilizzare ANSI SQL-92 per motivi che risulteranno chiari dopo la spiegazione degli inner join. Self cross join È possibile unire più istanze della stessa tabella. Questa funzionalità è chiamata self-join ed è supportata in tutti i principali tipi di join (cross, inner e outer). Ad esempio, la query seguente esegue un self cross join tra due istanze della tabella Employee: SELECT E1.empid, E1.firstname, E1.lastname, E2.empid, E2.firstname, E2.lastname FROM HR.Employees AS E1 CROSS JOIN HR.Employees AS E2;

4 104 Microsoft Transact SQL Nozioni di base Questa query produce tutte le possibili combinazioni di accoppiamenti di impiegati. Poiché la tabella Employees ha 9 righe, questa query ne restituisce 81, illustrate di seguito in forma abbreviata: empid firstname lastname empid firstname lastname Sara Davis 1 Sara Davis 2 Don Funk 1 Sara Davis 3 Judy Lew 1 Sara Davis 4 Yael Peled 1 Sara Davis 5 Sven Buck 1 Sara Davis 6 Paul Suurs 1 Sara Davis 7 Russell King 1 Sara Davis 8 Maria Cameron 1 Sara Davis 9 Zoya Dolgopyatova 1 Sara Davis 1 Sara Davis 2 Don Funk 2 Don Funk 2 Don Funk 3 Judy Lew 2 Don Funk 4 Yael Peled 2 Don Funk 5 Sven Buck 2 Don Funk 6 Paul Suurs 2 Don Funk 7 Russell King 2 Don Funk 8 Maria Cameron 2 Don Funk 9 Zoya Dolgopyatova 2 Don Funk (Righe interessate: 81) In un self join, creare alias per le tabelle è obbligatorio. Senza alias, tutti i nomi delle colonne nel risultato del join risulterebbero poco chiari. Produzione di tabelle di numeri Una situazione nella quale i cross join possono rivelarsi molto utili si ha quando vengono utilizzati per produrre un insieme di risultati con una sequenza di valori interi (1, 2, 3, ecc.). Tale sequenza di numeri costituisce uno strumento molto efficace da utilizzare per varie funzioni. Con i cross join è possibile produrre una sequenza di valori interi in modo molto efficiente. Si può iniziare creando una tabella chiamata Digits con una colonna definita digit e compilarla con 10 righe contenenti i numeri da 0 a 9. Esegui il codice per creare la tabella Digits nel database tempdb (per eseguire una prova) e compilala con i 10 numeri: USE tempdb; IF OBJECT_ID('dbo.Digits', 'U') IS NOT NULL DROP TABLE dbo.digits; CREATE TABLE dbo.digits(digit INT NOT NULL PRIMARY KEY); INSERT INTO dbo.digits(digit) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); /* Nota: La sintassi INSERT rappresenta una novità di MIcrosoft SQL Server 2008.

5 Capitolo 3 Join 105 Nelle versioni precedenti, utilizza: INSERT INTO dbo.digits(digit) VALUES(0); INSERT INTO dbo.digits(digit) VALUES(1); INSERT INTO dbo.digits(digit) VALUES(2); INSERT INTO dbo.digits(digit) VALUES(3); INSERT INTO dbo.digits(digit) VALUES(4); INSERT INTO dbo.digits(digit) VALUES(5); INSERT INTO dbo.digits(digit) VALUES(6); INSERT INTO dbo.digits(digit) VALUES(7); INSERT INTO dbo.digits(digit) VALUES(8); INSERT INTO dbo.digits(digit) VALUES(9); */ SELECT digit FROM dbo.digits; Questo codice utilizza per la prima volta in questo libro alcuni elementi di sintassi, che è meglio spiegare. Tutto il testo presente all'interno di un blocco che inizia con /* e finisce con */ è gestito come commento del blocco e pertanto ignorato da SQL Server. Questo codice utilizza anche un'istruzione INSERT per compilare la tabella Digits. Se non conosci la sintassi dell'istruzione INSERT, consulta il capitolo 8. Tuttavia, osserva che per l'istruzione INSERT VALUES questo codice utilizza la nuova sintassi introdotta in SQL Server 2008, consentendo a una sola istruzione di inserire più righe. Un commento del blocco incorporato nel codice spiega che nelle versioni precedenti, devi utilizzare un'istruzione INSERT VALUES separata per ogni riga. Il contenuto della tabella DIGITS è illustrato di seguito: digit Supponi di dover scrivere una query che produca una sequenza di valori interi nell'intervallo da 1 a Puoi incrociare le tre istanze della tabella Digits, ognuna rappresentante un multiplo diverso di 10 (1, 10, 100). In questo modo, poiché ogni istanza ha 10 righe, si ottiene un risultato di righe. Per produrre il numero reale, moltiplica il numero di ogni istanza per il multiplo di 10 che rappresenta, somma i risultati e aggiungi 1. Di seguito è riportata la query completa: SELECT D3.digit * D2.digit * 10 + D1.digit + 1 AS n FROM dbo.digits AS D1 CROSS JOIN dbo.digits AS D2 CROSS JOIN dbo.digits AS D3 ORDER BY n;

6 106 Microsoft Transact SQL Nozioni di base Questa query restituisce l'output seguente, illustrato di seguito in forma abbreviata: n (Righe interessate: 1000) Questo è un semplice esempio che produce una sequenza di valori interi. Se ne desideri di più, puoi aggiungere altre istanze della tabella Digits alla query. Ad esempio, se desideri produrre una sequenza di di righe, dovresti unire sei istanze. Inner join Un inner join applica due fasi di elaborazione logica query, un prodotto cartesiano tra due tabelle di input, come avviene con un cross join, e un filtro per le righe in base a un predicato specificato. Come i cross join, gli inner join hanno due sintassi standard: ANSI SQL-92 e ANSI SQL-89. Sintassi ANSI SQL-92 Utilizzando ANSI SQL-92, vengono specificate le parole chiave INNER JOIN tra i nomi delle tabelle. La parola chiave INNER è facoltativa perché l'inner join è il join predefinito, pertanto è sufficiente specificare solo JOIN. Poi, si specifica il predicato utilizzato per filtrare le righe in una clausola definita, chiamata ON. Questo predicato è chiamato anche condizione di join. Ad esempio, la query seguente esegue un inner join tra le tabelle Employees e Orders nel database TSQLFundamentals2008, confrontando impiegati e ordini in base al predicato E.empid = O.empid: USE TSQLFundamentals2008; SELECT E.empid, E.firstname, E.lastname, O.orderid FROM HR.Employees AS E JOIN Sales.Orders AS O ON E.empid = O.empid;

7 Capitolo 3 Join 107 Questa query restituisce il risultato seguente, illustrato in forma abbreviata: empid firstname lastname orderid Sara Davis Sara Davis Sara Davis Sara Davis Sara Davis Don Funk Don Funk Don Funk Don Funk Don Funk (Righe interessate: 830) Per la maggior parte degli utenti il modo più semplice per spiegare un inner join di questo tipo è quello di eseguire un confronto tra ogni riga degli impiegati con tutte le righe degli ordini che presentano lo stesso ID dell'id dell'impiegato in questione. Tuttavia, si tratta di un modo semplificato. Secondo il metodo ufficiale basato sull'algebra relazionale, prima il join esegue un prodotto cartesiano delle due tabelle (9 righe di impiegato x 830 righe di ordini = righe), poi filtra le righe in base al predicato E.empid = O.empid, restituendo alla fine 830 righe. Come menzionato precedentemente, questo rappresenta il modo logico in cui viene elaborato il join; in pratica, l'elaborazione fisica della query da parte del motore di database può essere diversa. Ricorda quanto illustrato nei capitoli precedenti relativamente alla logica dei predicati a tre valori utilizzata da SQL. Come con le clausole WHERE e HAVING, la clausola ON restituisce solo le righe per le quali il predicato indica TRUE, mentre non restituisce le righe per le quali il predicato restituisce FALSE o UNKNOWN. Nel database TSQLFundamentals2008, tutti gli impiegati presentano ordini correlati, pertanto tutti vengono indicati nell'output. Se ci fossero stati impiegati senza ordini, sarebbero stati esclusi dalla fase di filtro. Sintassi ANSI SQL-89 Come per i cross join, anche gli inner join possono essere espressi utilizzando la sintassi ANSI SQL-89. Si inserisce una virgola tra i nomi delle tabelle, come in un cross join, e si specifica la condizione del join nella clausola WHERE della query, nel modo seguente: SELECT E.empid, E.firstname, E.lastname, O.orderid FROM HR.Employees AS E, Sales.Orders AS O WHERE E.empid = O.empid; Ricorda che la sintassi ANSI SQL-89 non ha clausole ON.

8 108 Microsoft Transact SQL Nozioni di base Inoltre, entrambe le sintassi sono standard, sono supportate completamente da SQL Server e interpretate allo stesso modo dal motore, pertanto non dovrebbero esserci differenze di prestazioni tra le due. Tuttavia, una è più sicura, come verrà illustrato nella sezione seguente. Sicurezza dell'inner join Si suggerisce di scegliere sempre la sintassi ANSI SQL-92, perché è più sicura sotto diversi punti di vista. Supponi di voler scrivere una query per un inner join e, per errore, dimentichi di specificare la condizione del join. Con ANSI SQL-92 la query risulta non valida e il parser genera un errore. Prova, ad esempio, a eseguire il codice sottoriportato: SELECT E.empid, E.firstname, E.lastname, O.orderid FROM HR.Employees AS E JOIN Sales.Orders AS O; Verrà visualizzato l'errore seguente: Messaggio 102, livello 15, stato 1; riga 3 Sintassi non corretta in prossimità di ';'. Anche se potrebbe non essere subito evidente che l'errore è dovuto alla mancanza di una condizione del join, potrai verificarlo e correggere l'errore. Invece, se dimenticassi di specificare la condizione del join con ANSI SQL-89, otterresti una query valida che esegue un cross join: SELECT E.empid, E.firstname, E.lastname, O.orderid FROM HR.Employees AS E, Sales.Orders AS O; Poiché la query non evidenzia alcun problema, inizialmente potresti non notare l'errore di logica e gli utenti dell'applicazione finirebbero per utilizzare risultati non corretti. È improbabile che un programmatore dimentichi di specificare la condizione del join in una query così breve e semplice; tuttavia, la maggior parte delle query di produzione sono molto più complesse e contengono più tabelle, filtri e altri elementi. In quei casi, la probabilità di dimenticare una condizione del join aumenta. Se è chiaro il motivo per cui utilizzare ANSI SQL-92 per gli inner join, potresti chiederti perché va usata anche per i cross join. Poiché non sono previste condizioni del join, potresti pensare che in questo caso entrambe le sintassi sono valide. Invece, si suggerisce comunque di scegliere ANSI SQL-92 per varie ragioni, una delle quali è la coerenza. Supponi di utilizzare ANSI SQL-89. Anche se intendevi scrivere un cross join, se altri sviluppatori dovessero rivedere o gestire il codice, come potrebbero sapere se intendevi scrivere un cross join oppure un inner join e ti sei dimenticato di specificare la condizione del join?

9 Capitolo 3 Join 109 Altri esempi di join La presente sezione illustra alcuni esempi di join specifici, chiamati join composti, join non equi e join a più tabelle. Join composti Un join composto è un join semplice basato su un predicato che richiede più di un attributo da ogni parte. Normalmente, un join di questo tipo è necessario per unire due tabelle basate su una relazione di chiave primaria-chiave esterna e la relazione è composta, ovvero è basata su più di un attributo. Ad esempio, supponi di avere una chiave esterna definita in dbo.table2, colonne col1, col2 riferite alle colonne col1 e col2 di dbo.table1 e devi scrivere una query che unisca le due in base alla relazione di chiave primaria-chiave esterna. La clausola FROM della query sarebbe come la seguente: FROM dbo.table1 AS T1 JOIN dbo.table2 AS T2 ON T1.col1 = T2.col1 AND T1.col2 = T2.col2 Per ottenere un esempio più tangibile, supponi di dover controllare gli aggiornamenti ai valori delle colonne rispetto alla tabella OrderDetails del database TSQLFundamentals2008. Crea una tabella di controllo personalizzata chiamata OrderDetailsAudit: USE TSQLFundamentals2008; IF OBJECT_ID('Sales.OrderDetailsAudit', 'U') IS NOT NULL DROP TABLE Sales.OrderDetailsAudit; CREATE TABLE Sales.OrderDetailsAudit ( lsn INT NOT NULL IDENTITY, orderid INT NOT NULL, productid INT NOT NULL, dt DATETIME NOT NULL, loginname sysname NOT NULL, columnname sysname NOT NULL, oldval SQL_VARIANT, newval SQL_VARIANT, CONSTRAINT PK_OrderDetailsAudit PRIMARY KEY(lsn), CONSTRAINT FK_OrderDetailsAudit_OrderDetails FOREIGN KEY(orderid, productid) REFERENCES Sales.OrderDetails(orderid, productid) ); Ogni riga di controllo memorizza un numero seriale di log (lsn, log serial number) la chiave della riga modifica (orderid, productid), il nome della colonna modificata (columnname), il valore precedente (oldval), il nuovo valore (newval), la data della modifica (dt) e l'utente che l'ha apportata (loginname). La tabella ha una chiave esterna definita negli attributi orderid, productid, che fa riferimento alla chiave primaria della tabella OrderDetails, definita negli attributi orderid, productid.

10 110 Microsoft Transact SQL Nozioni di base Supponi che nella tabella OrderDetailsAudit siano già presenti tutti i processi necessari per controllare le modifiche di valore della colonna che hanno luogo nella tabella OrderDetails Devi scrivere una query che restituisca tutte le modifiche dei valori apportate rispetto alla colonna qty, ma che in ogni riga del risultato restituisca il valore corrente dalla tabella OrderDetails e i valori precedente e successivo alla modifica dalla tabella OrderDetailsAudit. Devi unire le due tabelle in base alla relazione chiave primaria-chiave esterna, nel modo seguente: SELECT OD.orderid, OD.productid, OD.qty, ODA.dt, ODA.loginname, ODA.oldval, ODA.newval FROM Sales.OrderDetails AS OD JOIN Sales.OrderDetailsAudit AS ODA ON OD.orderid = ODA.orderid AND OD.productid = ODA.productid WHERE ODA.columnname = N'qty'; Poiché la relazione si basa su più attributi, la condizione del join è composta. Non-equi-join Quando la condizione del join prevede solo un operatore di uguaglianza, il join è definito equi-join. Quando la condizione del join prevede altri operatori oltre a quello di uguaglianza,il join è definito non-equi-join. Come esempio di non-equi-join, la query seguente unisce due istanze della tabella Employees per produrre accoppiamenti univoci di impiegati: SELECT E1.empid, E1.firstname, E1.lastname, E2.empid, E2.firstname, E2.lastname FROM HR.Employees AS E1 JOIN HR.Employees AS E2 ON E1.empid < E2.empid; Osserva il predicato specificato nella clausola ON. L'obiettivo della query è quello di produrre abbinamenti univoci di impiegati. Se avessi utilizzato un cross join, avresti ottenuto degli autoabbinamenti (ad esempio 1 con 1) e abbinamenti di mirroring (ad esempio 1 con 2 e 2 con 1). Utilizzando un inner join con una condizione nella quale è indicato che la chiave nella parte sinistra deve essere inferiore a quella di destra, vengono eliminati questi due casi non applicabili. Gli autoabbinamenti vengono annullati perché entrambe le parti sono uguali. Nel caso degli abbinamenti di mirroring, solo uno dei due casi resta valido, perché su due, solo una presenta la chiave di sinistra inferiore a quella di destra. In questo caso, su 81 possibili accoppiamenti di impiegati che sarebbero stati restituiti da un cross join, la query restituisce solo i 36 riportati di seguito: empid firstname lastname empid firstname lastname Sara Davis 2 Don Funk 1 Sara Davis 3 Judy Lew 2 Don Funk 3 Judy Lew

11 Capitolo 3 Join Sara Davis 4 Yael Peled 2 Don Funk 4 Yael Peled 3 Judy Lew 4 Yael Peled 1 Sara Davis 5 Sven Buck 2 Don Funk 5 Sven Buck 3 Judy Lew 5 Sven Buck 4 Yael Peled 5 Sven Buck 1 Sara Davis 6 Paul Suurs 2 Don Funk 6 Paul Suurs 3 Judy Lew 6 Paul Suurs 4 Yael Peled 6 Paul Suurs 5 Sven Buck 6 Paul Suurs 1 Sara Davis 7 Russell King 2 Don Funk 7 Russell King 3 Judy Lew 7 Russell King 4 Yael Peled 7 Russell King 5 Sven Buck 7 Russell King 6 Paul Suurs 7 Russell King 1 Sara Davis 8 Maria Cameron 2 Don Funk 8 Maria Cameron 3 Judy Lew 8 Maria Cameron 4 Yael Peled 8 Maria Cameron 5 Sven Buck 8 Maria Cameron 6 Paul Suurs 8 Maria Cameron 7 Russell King 8 Maria Cameron 1 Sara Davis 9 Zoya Dolgopyatova 2 Don Funk 9 Zoya Dolgopyatova 3 Judy Lew 9 Zoya Dolgopyatova 4 Yael Peled 9 Zoya Dolgopyatova 5 Sven Buck 9 Zoya Dolgopyatova 6 Paul Suurs 9 Zoya Dolgopyatova 7 Russell King 9 Zoya Dolgopyatova 8 Maria Cameron 9 Zoya Dolgopyatova (Righe interessate: 36) Se il comportamento di questa query non è chiaro, prova a eseguire un passaggio per volta con un gruppo di impiegati più piccolo. Ad esempio, supponi che la tabella Employees contenga solo gli impiegati 1, 2 e 3. Prima di tutto, produci il prodotto cartesiano di due istanze della tabella: E1.empid E2.empid Poi, filtrando le righe in base al predicato E1.empid < E2.empid, restano solo tre righe:

12 112 Microsoft Transact SQL Nozioni di base E1.empid E2.empid Join a più tabelle Un operatore di tabelle di join opera solo in due tabelle, mentre una sola query può avere più join. In linea generale, quando nella clausola FROM è presente più di un operatore di tabelle, secondo la logica gli operatori vengono elaborati da sinistra a destra. Quindi, la tabella dei risultati del primo operatore viene utilizzata come input di sinistra per il secondo operatore; il risultato del secondo operatore viene utilizzato come input di sinistra per il terzo operatore, e così via. Pertanto, se nella clausola FROM ci sono più join, a livello logico il primo agisce in due tabelle di base, mentre tutti gli altri utilizzano il risultato del join precedente come input di sinistra. Con cross join e inner join, il motore di database può riorganizzare (e normalmente lo fa) internamente l'ordinamento dei join al fine di ottimizzare l'operazione, perché ciò non influirà sulla correttezza del risultato della query. Come esempio, la query seguente unisce le tabelle Cutomers e Orders per trovare corrispondenze tra i clienti e i relativi ordini e unisce il risultato del primo join con la tabella OrderDetails per far corrispondere gli ordini con le relative righe: SELECT C.custid, C.companyname, O.orderid, OD.productid, OD.qty FROM Sales.Customers AS C JOIN Sales.Orders AS O ON C.custid = O.custid JOIN Sales.OrderDetails AS OD ON O.orderid = OD.orderid; Questa query restituisce l'output seguente, illustrato in forma abbreviata: custid companyname orderid productid qty Customer ENQZT Customer ENQZT Customer ENQZT Customer FAPSM Customer FAPSM Customer IBVRG Customer IBVRG Customer IBVRG Customer NRCSK Customer NRCSK (Righe interessate: 2155)

13 Capitolo 3 Join 113 Outer join Normalmente, gli outer join sono più difficili da comprendere rispetto agli altri tipi di join. Prima di tutto, ne verranno descritti i concetti fondamentali. Se al termine della sezione "Nozioni fondamentali sugli outer join" ritieni di aver compreso il materiale e ti senti pronto a conoscere contenuti più avanzati, puoi leggere una sezione supplementare che descrive gli aspetti specifici degli outer join. Altrimenti, ignora quella parte e leggila quando avrai compreso bene questo materiale. Nozioni fondamentali sugli outer join Gli outer join sono stati introdotti in ANSI SQL-92 e, a differenza di inner e cross join, prevedono una sola sintassi standard, l'unica nella quale si specifica la parola chiave JOIN tra i nomi delle tabelle e la condizione del join nella clausola ON. Gli outer join applicano le fasi di elaborazione logica applicata dagli inner join (prodotto cartesiano e filtro ON), più una terza fase chiamata aggiunta di righe esterne, unica per questo tipo di join. In un outer join, una tabella viene contrassegnata come "da mantenere" utilizzando le parole chiave LEFT OUTER JOIN, RIGHT OUTER JOIN o FULL OUTER JOIN tra i nomi di tabella. La parola chiave OUTER è facoltativa. La parole chiave LEFT indica che vengono mantenute le righe della tabella di sinistra, RIGHT che vengono mantenute quelle della tabella di destra e FULL che vengono mantenute le righe delle tabelle di destra e sinistra. La terza fase di elaborazione logica query di un outer join identifica le righe della tabella da mantenere che non trovano corrispondenze nell'altra tabella in base al predicato ON. Questa fase aggiunge le righe alla tabella dei risultati prodotta dalle prime due fasi del join e utilizza valori NULL come segnaposto per gli attributi provenienti dalla parte non mantenuta del join in tali righe esterne. Per comprendere gli outer join è meglio utilizzare un esempio. La query seguente unisce le tabelle Customers e Orders in base a una corrispondenza tra l'id del cliente e e l'id del cliente negli ordini per restituire i clienti e i relativi ordini. Il tipo di join è un outer join sinistro; pertanto, la query restituisce nel risultato anche i clienti senza ordini. SELECT C.custid, C.companyname, O.orderid FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.custid = O.custid; Questa query restituisce l'output seguente, illustrato in forma abbreviata: custid companyname orderid Customer NRZBB Customer NRZBB Customer NRZBB Customer NRZBB Customer NRZBB 10952

14 114 Microsoft Transact SQL Nozioni di base 21 Customer KIDPX Customer KIDPX Customer KIDPX Customer KIDPX Customer KIDPX Customer DTDMN NULL 23 Customer WVFAF Customer WVFAF Customer WVFAF Customer WVFAF Customer WVFAF Customer QNIVZ Customer QNIVZ Customer QNIVZ Customer QNIVZ Customer QNIVZ Customer WVAXS NULL 58 Customer AHXHT Customer AHXHT Customer AHXHT Customer AHXHT Customer AHXHT Customer CCFIZ Customer CCFIZ Customer CCFIZ Customer CCFIZ Customer CCFIZ (Righe interessate: 832) Due clienti della tabella Customers non hanno emesso alcun ordine. I relativi ID sono 22 e 57. Osserva che nell'output della query, entrambi i clienti sono restituiti con valori NULL negli attributi dalla tabella Orders. A livello logico, le righe di questi due clienti erano state escluse dalla seconda fase del join (filtro in base al predicato ON), ma la terza fase le ha aggiunte come righe esterne. Se il join fosse stato un inner join, queste due righe non sarebbero state restituite. Esse sono state aggiunte per mantenere tutte le righe della tabella di sinistra. Puoi considerare due tipi di righe nel risultato di un outer join in relazione alla parte da mantenere: righe interne e righe esterne. Le righe interne sono righe che trovano corrispondenze nell'altra parte in base al predicato ON, mentre le righe esterne non ne trovano. Un inner join restituisce solo le righe interne, mentre un outer join sia quelle interne che esterne. Una domanda comune quando si utilizzano join esterni e che dà origine a molta confusione è se bisogna specificare un predicato nelle clausole ON o WHERE di una query. Puoi osservare che, relativamente alle righe della parte da mantenere di un outer join, il filtro basato sul predicato ON non è finale. In altre parole, il predicato ON non determina se la riga verrà restituita nell'output, solo se trova corrispondenza con le righe della parte opposta. Pertanto, se devi necessariamente specificare un predicato non finale, ovvero un predicato che determina quali righe far corrispondere alla parte non mantenuta, definiscilo nella clausola ON. Se hai bisogno di un filtro da applicare dopo la produzione delle righe esterne e desideri

15 Capitolo 3 Join 115 che sia finale, specifica il predicato nella clausola WHERE. La clausola WHERE viene elaborata dopo la clausola FROM, esattamente dopo tutti gli operatori di tabella e (in caso di outer join) dopo che sono state prodotte tutte le righe esterne. Inoltre, la clausola WHERE è finale in relazione alle righe escluse dal filtro, a differenza della clausola ON. Supponi di dover restituire solo i clienti senza ordini, o più tecnicamente parlando, di dover restituire solo le righe esterne. Puoi utilizzare la query precedente come base e aggiungere una clausola WHERE che filtri solo le righe esterne. Ricorda che le righe esterne sono identificate dai valori NULL negli attributi provenienti dalla parte non mantenuta del join. Pertanto, puoi filtrare solo le righe nelle quali uno degli attributi della parte non mantenuta del join è NULL, come di seguito: SELECT C.custid, C.companyname FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.custid = O.custid WHERE O.orderid IS NULL; Questa query restituisce solo due righe, quelle dei clienti 22 e 57: custid companyname Customer DTDMN 57 Customer WVAXS (Righe interessate: 2) Osserva due elementi importanti di questa query. Ricorda quanto affermato nella parte precedente del libro sui valori NULL: quando si cerca un valore NULL, si dovrebbe utilizzare l'operatore IS NULL e non un operatore di uguaglianza, perché quest'ultimo, confrontando qualcosa con NULL, restituisce sempre UNKNOWN, anche confrontando due valori NULL. Inoltre, è importante scegliere quale attributo della parte non mantenuta del join filtrare. Dovresti scegliere un attributo che può avere solo un valore NULL quando la riga è esterna e non altrimenti (ad esempio, un NULL derivato dalla tabella di base). Per questo obiettivo, le scelte considerate sicure sono tre; una colonna di chiave primaria, una colonna di join e una colonna definita come NOT NULL. Una colonna di chiave primaria non può essere NULL, pertanto, un NULL in una colonna di questo tipo indica unicamente che la riga è esterna. Se una riga ha un NULL nella colonna di join, viene esclusa dal filtro nella seconda fase del join, pertanto un NULL in questa colonna indica unicamente che si tratta di una riga esterna. Naturalmente, anche un NULL in una colonna definita come NOT NULL può indicare soltanto che la riga è esterna. Per esercitarti su ciò che hai appreso e comprendere meglio gli outer join, esegui gli esercizi di questo capitolo.

16 116 Microsoft Transact SQL Nozioni di base Nozioni specifiche sugli outer join La presente sezione illustra gli aspetti più avanzati degli outer join. La lettura di questa parte va eseguita solo dopo aver compreso con precisione i concetti fondamentali degli outer join. Inserimento di valori mancanti Puoi utilizzare gli outer join per identificare e inserire valori mancanti, quando invii una query ai dati. Ad esempio, supponi di dover eseguire una query di tutti gli ordini nella tabella Orders del database TSQLFundamentals2008. Devi accertarti di ottenere almeno una riga nell'output per ogni data nell'intervallo tra 1 gennaio 2006 e 31 dicembre Non desideri eseguire alcuna operazione particolare con le date contenute nell'intervallo che presentano ordini. Tuttavia, desideri includere nell'output le date senza ordini, con valori NULL come segnaposto negli attributi dell'ordine. Per risolvere il problema, prima di tutto devi scrivere una query che restituisca una sequenza di tutte le date contenute nell'intervallo richiesto. Dopodiché, puoi eseguire un outer join tra questa sequenza e la tabella Orders. In questo modo, il risultato includerà anche le date mancanti. Per produrre una sequenza di date in un determinato intervallo, normalmente si utilizza una tabella di numeri ausiliaria. Crea un tabella chiamata Nums con una colonna chiamata n e compilala con una sequenza di valori interi (1, 2, 3, e così via). Una tabella di numeri ausiliaria è uno strumento generico estremamente efficace, che consente di risolvere numerosi problemi. Devi crearla nel database una sola volta e compilarla con tutti i numeri che potrebbero essere necessari. Esegui il codice del listato 3-1 per creare la tabella Nums nello schema dbo e compilala con righe: LISTATO 3-1 Codice per creare e compilare la tabella ausiliaria Nums SET NOCOUNT ON; USE TSQLFundamentals2008; IF OBJECT_ID('dbo.Nums', 'U') IS NOT NULL DROP TABLE dbo.nums; CREATE TABLE dbo.nums(n INT NOT NULL PRIMARY KEY); AS INT = 1; /* Nota: La possibilità di dichiarare e inizializzare le variabili in un'istruzione costituisce una novità di Microsoft SQL Server Nelle versioni precedenti, utilizza istruzioni DECLARE e SET separate: AS INT; = 1; */ BEGIN TRAN <= BEGIN INSERT INTO dbo.nums VALUES(@i); + 1; END COMMIT TRAN SET NOCOUNT OFF;

17 Capitolo 3 Join 117 Nota Non preoccuparti se non riesci a comprendere alcune parti del codice, come l'utilizzo di variabili e cicli, perché verranno illustrate nella parte successiva del libro. Per ora, è sufficiente capire la funzione del codice; il modo in cui esegue le varie operazioni non rientra nell'obiettivo di questa parte. Ma, se desideri conoscerlo, puoi trovarne i dettagli nel capitolo 10. Tuttavia, va sottolineato che la dichiarazione e l'inizializzazione delle variabili nella stessa istruzione rappresenta una novità di SQL Server 2008, come spiegato nel commento del blocco di codice. Se stai utilizzando una versione precedente, usa istruzioni DECLARE e SET separate. Come prima operazione di questa soluzione, devi produrre una sequenza di tutte le date contenute nell'intervallo richiesto. Per ottenere questo dati, esegui una query nella tabella Nums e filtra una quantità di numeri uguale ai giorni contenuti nell'intervallo di dati richiesto. Per calcolare questo numero, utilizza la funzione DATEDIFF. Aggiungendo i giorni n - 1 all'inizio dell'intervallo di dati (1 gennaio 2006), ottieni la data reale nella sequenza. Di seguito è riportata la query della soluzione: SELECT DATEADD(day, n-1, ' ') AS orderdate FROM dbo.nums WHERE n <= DATEDIFF(day, ' ', ' ') + 1 ORDER BY orderdate; Questa query restituisce una sequenza di tutte le date contenute nell'intervallo dall'1 gennaio 2006 al 31 dicembre 2008, come illustrato di seguito in forma abbreviata: orderdate :00: :00: :00: :00: :00: :00: :00: :00: :00: :00: (Righe interessate: 1096) Il passaggio successivo consiste nell'estendere la query precedente, aggiungendo un outer join di sinistra tra le tabelle Nums e Orders. La condizione del join confronta la data di ordine prodotta dalla tabella Nums utilizzando l'espressione DATEADD(day, Nums.n - 1, ) e orderdate dalla tabella Orders nel modo seguente: SELECT DATEADD(day, Nums.n - 1, ' ') AS orderdate, O.orderid, O.custid, O.empid FROM dbo.nums LEFT OUTER JOIN Sales.Orders AS O ON DATEADD(day, Nums.n - 1, ' ') = O.orderdate WHERE Nums.n <= DATEDIFF(day, ' ', ' ') + 1 ORDER BY orderdate;

18 118 Microsoft Transact SQL Nozioni di base Questa query restituisce l'output seguente, illustrato in forma abbreviata: orderdate orderid custid empid :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: :00: :00: NULL NULL NULL :00: NULL NULL NULL :00: :00: :00: :00: :00: :00: :00: NULL NULL NULL :00: NULL NULL NULL :00: :00: :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL :00: NULL NULL NULL (Righe interessate: 1446) Le date degli ordini non presenti nella tabella Orders vengono visualizzate nell'output della query con valori NULL negli attributi degli ordini. Filtro di attributi dalla parte non mantenuta di un outer join Se devi rivedere un codice che contiene outer join alla ricerca di bug di logica, uno degli elementi da analizzare è la clausola WHERE. Se il predicato nella clausola WHERE fa riferimento a un attributo proveniente dalla parte non mantenuta del join utilizzando un'espressione nella forma di <attributo> <operatore> <valore>, normalmente si tratta di un'indicazione di bug. Questo perché gli attributi della parte non mantenuta del join sono NULL nelle righe esterne e un'espressione nella forma NULL <operatore> <valore> restituisce UNKNOWN (a meno che non sia l'operatore IS NULL a ricercare esplicitamente valori NULL). Ricorda che una clausola WHERE esclude valori UNKNOWN. Questo tipo di predicato nella clausola WHERE causa un'esclusione di tutte le righe esterne, annullando in pratica l'outer join. In altre parole, è come se il tipo di join diventasse a livello logico un inner join.

19 Capitolo 3 Join 119 Questo significa che il programmatore ha scelto il tipo di join sbagliato, oppure ha commesso un errore nel predicato. Se il concetto non è ancora chiaro, segui l'esempio sottoriportato. Considera la query seguente: SELECT C.custid, C.companyname, O.orderid, O.orderdate FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.custid = O.custid WHERE O.orderdate >= ' '; Essa esegue un outer join di sinistra tra le tabelle Customers e Orders. Prima di applicare il filtro WHERE, l'operatore di join restituisce righe interne per i clienti che hanno emesso ordini e righe esterne per quelli senza ordini, con valori NULL negli attributi degli ordini. Il predicato O.orderdate >= nella clausola WHERE restituisce UNKNOWN per tutte le righe esterne, perché presentano un NULL nell'attributo O.orderdate. Tutte le righe esterne vengono eliminate dal filtro WHERE, come puoi osservare nell'output della query, illustrata di seguito in forma abbreviata: custid companyname orderid orderdate Customer RFNQC :00: Customer NYUHS :00: Customer THHDP :00: Customer THHDP :00: Customer CQRAA :00: Customer AHXHT :00: Customer JMIKW :00: Customer CCKOT :00: Customer RTXGC :00: Customer NYUHS :00: (Righe interessate: 678) Ciò significa che in questo caso l'utilizzo di un outer join era inutile. Il programmatore ha scelto erroneamente un outer join, oppure ha commesso un errore nel predicato WHERE. Utilizzo di outer join in un join a più tabelle Ricorda quanto illustrato per quanto riguarda le operazioni simultanee nel capitolo 2. Il concetto spiega che tutte le espressioni visualizzate nella stessa fase di elaborazione logica di una query vengono valutate nello stesso punto del tempo. Tuttavia, questo principio non è applicabile all'elaborazione di operatori di tabella nella fase FROM. Essi infatti vengono valutati in modo logico da sinistra a destra. Modificare l'ordine nel quale vengono elaborati gli outer join potrebbe produrre un output diverso, pertanto non è possibile riorganizzarli a piacere. Alcuni interessanti bug di logica riguardano l'ordine logico con il quale vengono elaborati gli outer join. Ad esempio, un bug logico comune relativo agli outer join potrebbe essere considerato una variazione del bug della sezione precedente. Supponi di scrivere una query

20 120 Microsoft Transact SQL Nozioni di base per un join a più tabelle con un outer join tra due tabelle, seguito da un inner join con una terza tabella. Se il predicato della clausola ON dell'inner join confronta un attributo della parte non mantenuta dell'outer join con un attributo della terza tabella, tutte le righe esterne verranno escluse dal filtro. Ricorda che le righe esterne presentano NULL negli attributi provenienti dalla parte non mantenuta del join, e confrontando un NULL con qualsiasi altro elemento si ottiene il valore UNKNOWN, escluso dal filtro ON. In altre parole, un predicato di questo tipo annullerebbe l'outer join e a livello logico sarebbe come un inner join. Considera ad esempio la query seguente: SELECT C.custid, O.orderid, OD.productid, OD.qty FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.custid = O.custid JOIN Sales.OrderDetails AS OD ON O.orderid = OD.orderid; Il primo join è un outer join che restituisce i clienti e i relativi ordini e i clienti senza ordini. Le righe esterne che rappresentano i clienti senza ordini presentano valori NULL negli attributi degli ordini. Il secondo join cerca corrispondenze tra le righe degli ordini della tabella OrderDetails e le righe ottenute dal primo join basato sul predicato O.orderid = OD.orderid; tuttavia, nelle righe che rappresentano i clienti senza ordini, l'attributo O.orderid è NULL. Pertanto, il predicato restituisce UNKNOWN e le righe vengono escluse. L'output illustrato di seguito in forma abbreviata non contiene i clienti 22 e 57, ovvero i due senza ordini: custid orderid productid qty (Righe interessate: 2155) Per generalizzare il problema: le righe esterne vengono annullate ogni volta che un tipo di outer join (di destra, sinistra o completo) è seguito da un inner join o da un outer join di destra. Questo naturalmente presupponendo che la condizione del join confronti i valori NULL della parte sinistra con i valori della parte destra.

21 Capitolo 3 Join 121 Esistono molti modi per risolvere il problema, se desideri visualizzare i clienti senza ordini nell'output. Una possibilità è quella di usare un outer join di sinistra anche nel secondo join: SELECT C.custid, O.orderid, OD.productid, OD.qty FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.custid = O.custid LEFT OUTER JOIN Sales.OrderDetails AS OD ON O.orderid = OD.orderid; In questo modo, le righe esterne prodotte dal primo join non vengono escluse, come puoi osservare nell'output illustrato di seguito in forma abbreviata: custid orderid productid qty NULL NULL NULL 57 NULL NULL NULL (Righe interessate: 2157) Una seconda possibilità è quella di unire prima le tabelle Orders e OrderDetails in un inner join e poi di unire il risultato alla tabella Custormers utilizzando un outer join di destra: SELECT C.custid, O.orderid, OD.productid, OD.qty FROM Sales.Orders AS O JOIN Sales.OrderDetails AS OD ON O.orderid = OD.orderid RIGHT OUTER JOIN Sales.Customers AS C ON O.custid = C.custid; In questo modo le righe esterne sono prodotte dall'ultimo join e non vengono escluse. Una terza possibilità consiste nell'utilizzare le parentesi in modo che l'inner join tra Orders e OrderDetails diventi una fase logica indipendente. In questo modo, puoi applicare un outer join di sinistra tra la tabella Customers e il risultato dell'inner join tra Orders e OrderDetails. La query dovrebbe essere uguale alla seguente: SELECT C.custid, O.orderid, OD.productid, OD.qty FROM Sales.Customers AS C LEFT OUTER JOIN

22 122 Microsoft Transact SQL Nozioni di base (Sales.Orders AS O JOIN Sales.OrderDetails AS OD ON O.orderid = OD.orderid) ON C.custid = O.custid; Utilizzo dell'aggregato COUNT con gli outer join Un altro bug di logica comune riguarda l'utilizzo di COUNT con gli outer join. Quando raggruppi il risultato di un outer join e utilizzi l'aggregato COUNT(*), quest'ultimo prende in considerazione sia le righe interne che esterne perché le conta indipendentemente dal contenuto. Normalmente, non si considerano le righe esterne per operazioni di conteggio. Ad esempio, la query seguente dovrebbe restituire il calcolo degli ordini per ogni cliente: SELECT C.custid, COUNT(*) AS numorders FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.custid = O.custid GROUP BY C.custid; Tuttavia, l'aggregato COUNT(*) conta le righe, indipendentemente dal relativo significato o contenuto, e i clienti senza ordini, come il 22 e il 57, ognuno dei quali presenta una riga esterna nel risultato del join. Come puoi osservare nell'output della query illustrata di seguito in forma abbreviata, sia il 22 che il 57 presentano un totale di 1, anche se il numero degli ordini inviati è in realtà 0: custid numorders (Righe interessate: 91) La funzione dell'aggregato COUNT(*) non è in grado di verificare se una riga rappresenta effettivamente un ordine. Per risolvere questo problema, dovresti utilizzare COUNT(<colonna>) invece di COUNT(*) e fornire una colonna dalla parte non mantenuta del join. In questo modo, l'aggregato COUNT() ignora le righe esterne perché presentano un valore NULL in quella colonna. Ricorda di utilizzare una colonna che può solo essere NULL nel caso in cui la riga sia esterna, ad esempio, orderid della colonna di chiave primaria:

23 Capitolo 3 Join 123 SELECT C.custid, COUNT(O.orderid) AS numorders FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.custid = O.custid GROUP BY C.custid; Osserva nell'output illustrato di seguito in forma abbreviata che adesso i clienti 22 e 57 presentano un totale di 0: custid numorders (Righe interessate: 91) Conclusioni Il presente capitolo ha illustrato l'operatore di tabella join. Ha descritto le fasi di elaborazione logica query previste nei tre tipi di join principali: cross, inner e outer. Il capitolo ha riportato anche altri esempi di join,compresi join composti, non-equi-join e join a più tabelle. Infine, si è concluso con una sezione facoltativa nella quale sono stati presentati gli aspetti più avanzati degli outer join. Per eseguire alcune prove su ciò che hai appreso, svolgi le esercitazioni del capitolo. Esercitazioni Questa sezione fornisce alcune esercitazioni per aiutarti a comprendere meglio gli argomenti illustrati nel presente capitolo. Tutti gli esercizi prevedono l'esecuzione di query in oggetti del database TSQLFundamentals2008.

24 124 Microsoft Transact SQL Nozioni di base 1-1 Esegui il codice seguente per creare la tabella ausiliaria dbo.nums nel database TSQLFundamentals2008: SET NOCOUNT ON; USE TSQLFundamentals2008; IF OBJECT_ID('dbo.Nums', 'U') IS NOT NULL DROP TABLE dbo.nums; CREATE TABLE dbo.nums(n INT NOT NULL PRIMARY KEY); AS INT = 1; BEGIN TRAN <= BEGIN INSERT INTO dbo.nums VALUES(@i); + 1; END COMMIT TRAN SET NOCOUNT OFF; 1-2 Obiettivo: scrittura di una query che generi cinque copie di ogni riga di impiegato. Tabelle coinvolte: HR.Employees e dbo.nums tables. Output desiderato: empid firstname lastname n Sara Davis 1 2 Don Funk 1 3 Judy Lew 1 4 Yael Peled 1 5 Sven Buck 1 6 Paul Suurs 1 7 Russell King 1 8 Maria Cameron 1 9 Zoya Dolgopyatova 1 1 Sara Davis 2 2 Don Funk 2 3 Judy Lew 2 4 Yael Peled 2 5 Sven Buck 2 6 Paul Suurs 2 7 Russell King 2 8 Maria Cameron 2 9 Zoya Dolgopyatova 2 1 Sara Davis 3 2 Don Funk 3 3 Judy Lew 3 4 Yael Peled 3 5 Sven Buck 3 6 Paul Suurs 3

Manuale SQL. Manuale SQL - 1 -

Manuale SQL. Manuale SQL - 1 - Manuale SQL - 1 - Istruzioni DDL Creazione di una tabella : CREATE TABLE Il comando CREATE TABLE consente di definire una tabella del database specificandone le colonne, con il tipo di dati ad esse associate,

Dettagli

Esercitazione 6 SQL 3

Esercitazione 6 SQL 3 Esercitazione 6 SQL 3 Basi di dati - prof. Silvio Salza - a.a. 2017-2018 E6-1 Schema della base di dati Customers (CustomerID, ComapnyName, City, Phone) Employees (EmpoyeeID, LastName, FirstName, HireDate,

Dettagli

VARIABILI, ASSEGNAZIONE, DECISIONI

VARIABILI, ASSEGNAZIONE, DECISIONI LEZIONE-TSQL-03 PROGRAMMAZIONE (VER02) PAG. 1 / 6 LEZIONE-TSQL-03 PROGRAMMAZIONE (VER02) T-SQL PROGRAMMAZIONE PARTE TERZA VARIABILI, ASSEGNAZIONE, DECISIONI Tratto da Gregory A. Larsen, http://www.databasejournal.com/features/mssql/article.php/3087431/t-sql-programming-part-1---defining-variables-and-if-logic.htm

Dettagli

SQL - Sottointerrogazioni correlate

SQL - Sottointerrogazioni correlate SQL - Sottointerrogazioni correlate negli esempi visti ogni subquery viene eseguita una volta per tutte ed il valore (o insieme di valori) è usato nella clausola WHERE della query esterna è possibile definire

Dettagli

SQL: le funzioni di aggregazione

SQL: le funzioni di aggregazione SQL: le funzioni di aggregazione funzioni predefinite che agiscono sui valori contenuti in insiemi di righe della tabella: Conteggi Somme Medie Massimi, minimi Funzione Count La funzione COUNT conta il

Dettagli

QL (Query Language) Alice Pavarani

QL (Query Language) Alice Pavarani QL (Query Language) Alice Pavarani QL Query Language Linguaggio di interrogazione dei dati, permette di: Interrogare la base di dati per estrarre informazioni Elaborare i dati Il risultato di un interrogazione

Dettagli

Corso di. Basi di Dati I. 9. Esercitazioni in SQL: Check, asserzioni, viste

Corso di. Basi di Dati I. 9. Esercitazioni in SQL: Check, asserzioni, viste Corso di Basi di Dati 9. Esercitazioni in SQL: Check, asserzioni, viste A.A. 2016 2017 Check Come abbiamo visto, SQL permette di specificare vincoli sugli attributi e le tabelle attraverso il comando check

Dettagli

Select From Where...

Select From Where... Select From Where... SELECT Le colonne che saranno mostrate e in che ordine. Calcoli su colonne FROM La tabella o le tabelle usate dall interrogazione WHERE Condizione che deve essere soddisfatta dalle

Dettagli

SISTEMI INFORMATIVI E TELEMEDICINA INFORMATICA MEDICA. 3. Panoramica su SQL Prof. Mauro Giacomini

SISTEMI INFORMATIVI E TELEMEDICINA INFORMATICA MEDICA. 3. Panoramica su SQL Prof. Mauro Giacomini SISTEMI INFORMATIVI E TELEMEDICINA INFORMATICA MEDICA 3. Panoramica su SQL Prof. Mauro Giacomini Sommario Introduzione Istruzione SELECT Tipi di Join Subquery Comandi DML Creazione delle tabelle Introduzione

Dettagli

PRODOTTO CARTESIANO Caso Generale

PRODOTTO CARTESIANO Caso Generale PRODOTTO CARTESIANO Caso Generale Vincoli di integrità dei dati Un database non deve solamente memorizzare i dati, ma garantire che i dati memorizzati siano corretti; se i dati sono imprecisi o incoerenti,

Dettagli

Basi di dati (4) Docente: Andrea Bulgarelli. Università di Modena e Reggio Emilia. Argomento: select (1.

Basi di dati (4) Docente: Andrea Bulgarelli. Università di Modena e Reggio Emilia. Argomento: select (1. Università di Modena e Reggio Emilia Basi di dati (4) Docente: andrea.bulgarelli@gmail.com Argomento: select (1.0) 1 Panoramica Select Joins Subquery Wildcard Esempi 2 SELECT SELECT [DISTINCT] [TOP n]

Dettagli

Interpretazione delle query nidificate

Interpretazione delle query nidificate Interpretazione delle query nidificate Per analizzare il risultato di una interrogazione nidificata si può supporre di valutare prima il risultato dell interrogazione nidificata (query interna) per poi

Dettagli

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013) SQL quick reference piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013) I tipi dei dati di SQL sono: delimitatori delle costanti: TEXT(n) stringa di caratteri

Dettagli

Tipi di sottoquery SQL

Tipi di sottoquery SQL Tipi di sottoquery SQL È possibile specificare subquery in numerose posizioni: Con le parole chiave IN e NOT IN. Con operatori di confronto. Con le parole chiave ANY, SOME e ALL. Con le parole chiave EXISTS

Dettagli

Database Lezione 2. Sommario. - Progettazione di un database - Join - Valore NULL - Operatori aggregati

Database Lezione 2. Sommario. - Progettazione di un database - Join - Valore NULL - Operatori aggregati Sommario - Progettazione di un database - Join - Valore NULL - Operatori aggregati Progettazione di un database - In un database c'è una marcata distinzione tra i valori in esso contenuti e le operazioni

Dettagli

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto SQL Università degli Studi di Salerno Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto A.A. 2005/2006 Select La forma di select cui siamo arrivati

Dettagli

Structured Query Language

Structured Query Language IL LINGUAGGIO SQL Structured Query Language Contiene sia il DDL sia il DML, quindi consente di: Definire e creare il database Effettuare l inserimento, la cancellazione, l aggiornamento dei record di un

Dettagli

9In questa sezione. Ordinare e filtrare i dati. Dopo aver aggiunto dati ai fogli di lavoro, potresti voler

9In questa sezione. Ordinare e filtrare i dati. Dopo aver aggiunto dati ai fogli di lavoro, potresti voler 9In questa sezione Ordinare e filtrare i dati Ordinare i dati del foglio di lavoro Creare un elenco personalizzato Filtrare rapidamente i dati con Filtro automatico Creare un filtro avanzato Convalidare

Dettagli

Microsoft Access (parte 5) Query. Query. Query. Query. Creare una query

Microsoft Access (parte 5) Query. Query. Query. Query. Creare una query Microsoft Access (parte 5) Anno accademico: 2008-2009 Per estrarre informazioni da un database si utilizzano delle query : procedure di interrogazione Si può creare più query per ogni tabella Occorre avere

Dettagli

SQL - Structured Query Language

SQL - Structured Query Language SQL - Structured Query Language Luca Martini Università di Pisa 16 aprile 2010 Riepilogo sugli operatori aggregati Sintassi SELECT A t t r i b u t o 1, MAX( A t t r i b u t o 2 ),... FROM Tabella1, Tabella2,...

Dettagli

Progettazione di Sistemi Informatici

Progettazione di Sistemi Informatici Progettazione di Sistemi Informatici OUTER JOIN e SUBQUERY Domenico Diacono Corso ADM Gennaio 2008 A che punto siamo Abbiamo visto la sintassi delle principali query SQL e delle istruzioni per l inserimento

Dettagli

Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor

Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor Interrogare una base di dati: algebra relazionale e SQL Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor Contesto didattico Il seguente materiale didattico è

Dettagli

SQL - Structured Query Language

SQL - Structured Query Language SQL - Structured Query Language Lab 05 Alessandro Lori Università di Pisa 27 Aprile 2012 Riepilogo esercitazione precedente Operatori insiemistici (UNION, INTERSECT, EXCEPT) Riepilogo esercitazione precedente

Dettagli

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo. PROBLEMA. Un albergo di una grande città intende gestire in modo automatizzato sia le prenotazioni sia i soggiorni e realizzare un database. Ogni cliente viene individuato, tra l altro, con i dati anagrafici,

Dettagli

Archivi e basi di dati - ing. M. Cossentino. Settore. Traccia 1. Traccia 200. Settore non polarizzato

Archivi e basi di dati - ing. M. Cossentino. Settore. Traccia 1. Traccia 200. Settore non polarizzato Settore Traccia 1 Traccia 200 Settore non polarizzato '! " # $ % & ( ) * + + ' ' ' !"#"$%, & &'(("% '&)'' ''"* - -. / / / 0/!- "-, (0 #- / / / 0/ --- + 1 ' # $ + 2 13 ,, - 4 '. & 56 2 '/!!! "7&% 8, 9 /'"'0'1'&'

Dettagli

Caratteristiche dei linguaggi per Database

Caratteristiche dei linguaggi per Database IL LINGUAGGIO Caratteristiche dei linguaggi per Database I linguaggi per basi di dati relazionali possiedono i comandi per: definizione del data base; manipolazione dei dati; associazione tra tabelle diverse;

Dettagli

<Nome Tabella>.<attributo>

<Nome Tabella>.<attributo> Informatica Generale (AA 07/08) Corso di laurea in Scienze della Comunicazione Facoltà di Lettere e Filosofia Università degli Studi di Salerno : SQL (2) Tabelle mult., variabili, aggreg, group Prof. Alberto

Dettagli

Filtri. Microsoft Access. Filtri. Filtri

Filtri. Microsoft Access. Filtri. Filtri Filtri Microsoft Access Filtri, query Un filtro è una funzione che provoca la visualizzazione dei soli record contenenti dati che rispondono a un certo requisito Per applicare un filtro a una tabella è

Dettagli

IPOTESI con riferimento al testo proposto come simulazione in preparazione all Esame di Stato 2015

IPOTESI con riferimento al testo proposto come simulazione in preparazione all Esame di Stato 2015 IPOTESI con riferimento al testo proposto come simulazione in preparazione all Esame di Stato 2015 Possono essere prodotte forme (invendute) non acquistate da un cliente per giorni di chiusura del caseificio,

Dettagli

SQL [2] Concetti avanzati di SQL. Esempi di interrogazioni

SQL [2] Concetti avanzati di SQL. Esempi di interrogazioni SQL [2] Concetti avanzati di SQL 2 Esempi di interrogazioni 3 Esempi di interrogazioni 4 Esempi di interrogazioni 5 Confronti che coinvolgono NULL NULL può voler dire: valore sconosciuto (esiste ma non

Dettagli

Left Join, Right Join, Full Join

Left Join, Right Join, Full Join Left Join, Right Join, Full Join Consideriamo il solito schema di database dell'ultima verifica. Ipotizziamo inoltre che tra le due relazioni sia impostato un vincolo di Integrità Referenziale. Modello

Dettagli

Microsoft Access. Relazioni e query SQL. Domenico Fabio Savo

Microsoft Access. Relazioni e query SQL. Domenico Fabio Savo Microsoft Access Relazioni e query SQL Domenico Fabio Savo Outline Base di dati di esempio Le relazioni Le query Outline Base di dati di esempio Le relazioni Le query Contratti telefonici (requisiti) Si

Dettagli

Basi di Dati: Corso di laboratorio

Basi di Dati: Corso di laboratorio Basi di Dati: Corso di laboratorio Lezione 4 Raffaella Gentilini 1 / 46 Sommario 1 Join di Tabelle Join Naturale Theta Join Join Esterno 2 3 Funzioni d aggregazione La Clausola GROUP BY La Clausola HAVING

Dettagli

Queries su più tabelle

Queries su più tabelle Informatica Generale (AA 07/08) Corso di laurea in Scienze della Comunicazione Facoltà di Lettere e Filosofia Università degli Studi di Salerno : SQL (2) Tabelle mult., variabili, aggreg, group Prof. Alberto

Dettagli

Corso di. Basi di Dati I. 10. Esercitazioni in SQL: Complementi

Corso di. Basi di Dati I. 10. Esercitazioni in SQL: Complementi Corso di Basi di Dati 10. Esercitazioni in SQL: Complementi A.A. 2016 2017 Funzioni condizionali Vediamo qualche altro comando utile di SQL. Il comando coalesce ammette come argomento una sequenza di espressioni

Dettagli

Basi di Dati: Corso di laboratorio

Basi di Dati: Corso di laboratorio Basi di Dati: Corso di laboratorio Lezione 4 Raffaella Gentilini 1 / 27 Sommario 1 Join di Tabelle 2 3 2 / 27 Lo Statement JOIN Join espliciti di tabelle nella clausola FROM In SQL e possibile scrivere

Dettagli

Scheme: struttura del programma e campo di azione

Scheme: struttura del programma e campo di azione «a2» 2013.11.11 --- Copyright Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net Scheme: struttura del programma e campo di azione Definizione e campo di azione...........................

Dettagli

ESERCITAZIONE: AZIENDA

ESERCITAZIONE: AZIENDA ESERCITAZIONE: AZIENDA Homework 24 ottobre 2002 Emanuel Weitschek emanuel@dia.uniroma3.it Prerequisiti (software) PostgreSQL pgadmin Driver JDBC Ambito Si consideri una base di dati che contiene informazioni

Dettagli

Basi di Dati: Corso di laboratorio

Basi di Dati: Corso di laboratorio Basi di Dati: Corso di laboratorio Lezione 4 Raffaella Gentilini 1 / 48 Sommario 1 Join di Tabelle Join Naturale Theta Join Join Esterno 2 La Clausola HAVING 3 2 / 48 Join Naturale Theta Join Join Esterno

Dettagli

Basi di dati - Laboratorio

Basi di dati - Laboratorio Basi di dati - Laboratorio Corso di Laurea in Bioinformatica Docente: Barbara Oliboni Lezione 4 Contenuto della lezione Interrogazioni SQL Join interni ed esterni Uso di variabili tupla o ALIAS Interrogazioni

Dettagli

SQL per le applicazioni D B M G

SQL per le applicazioni D B M G SQL per le applicazioni Call Level Interface Le richieste sono inviate al DBMS per mezzo di funzioni del linguaggio ospite soluzione basata su interfacce predefinite API, Application Programming Interface

Dettagli

MODULO 5 - USO DELLE BASI DI DATI 2 FINALITÁ

MODULO 5 - USO DELLE BASI DI DATI 2 FINALITÁ PATENTE EUROPEA DEL COMPUTER 5.0 MODULO 5 Database (Microsoft Access 2007) Parte 3 A cura di Mimmo Corrado Gennaio 2012 MODULO 5 - USO DELLE BASI DI DATI 2 FINALITÁ Il Modulo 5, richiede che il candidato

Dettagli

Laboratorio linguaggio SQL

Laboratorio linguaggio SQL Laboratorio linguaggio SQL Prof. Alessandra Lumini Alma Mater Studiorum - Università di Bologna 1 Schema DB 2 1 L istruzione SELECT È l istruzione che permette di eseguire interrogazioni (query) sul DB

Dettagli

SQL per le applicazioni D B M G

SQL per le applicazioni D B M G SQL per le applicazioni Call Level Interface Le richieste sono inviate al DBMS per mezzo di funzioni del linguaggio ospite soluzione basata su interfacce predefinite API, Application Programming Interface

Dettagli

SQL DDL. Create database. Alter database. Drop database

SQL DDL. Create database. Alter database. Drop database SQL In informatica, SQL (Structured Query Language) è un linguaggio standardizzato per database basati sul modello relazionale (RDBMS), progettato per le seguenti operazioni: creare e modificare schemi

Dettagli

2011 Politecnico di Torino 1

2011 Politecnico di Torino 1 SQL per le applicazioni Call Level Interface Le richieste sono inviate al DBMS per mezzo di funzioni del linguaggio ospite soluzione basata su interfacce predefinite API, Application Programming Interface

Dettagli

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati Basi di Dati Matteo Longhi Structured Query Language Introduzione Standard creato nel 1976 da IBM Aggiornato (versione 2 nel 1992 (ANSI X3.135 e ISO 9075 Consente di: DDL: definire la struttura del DB

Dettagli

Come fare il debug di query SQL complicate usando le CTE scrivibili

Come fare il debug di query SQL complicate usando le CTE scrivibili Come fare il debug di query SQL complicate usando le CTE scrivibili 2ndQuadrant Italia PGDay Italiano 2011 Prato, 25 novembre Outline 1 Il problema Descrizione Esempi generici Esempio specifico 2 Soluzione

Dettagli

Inserimento. Cancellazione. Modifica. INSERT INTO Persone VALUES ('Mario',25,52) INSERT INTO Persone(Nome, Eta, Reddito) VALUES('Pino',25,52)

Inserimento. Cancellazione. Modifica. INSERT INTO Persone VALUES ('Mario',25,52) INSERT INTO Persone(Nome, Eta, Reddito) VALUES('Pino',25,52) Inserimento insert into Dipartimento(NomeDip, Città) values('produzione','torino') Si utilizza in genere mediante una maschera (form) per consentire agli utenti di inserire dati. L'ordinamento degli attributi

Dettagli

Cap. 7 -Trigger e loro uso

Cap. 7 -Trigger e loro uso 1 SOMMARIO 2 Introduzione... 3 Definizione standard di trigger... 10 Cap. 7 -Trigger e loro uso Uso dei trigger e integrità referenziale... 18 Comportamento attivo delle BD Si realizza disponendo di un

Dettagli

SQL. SQL: "storia. Sviluppato nella metà degli anni settanta (1974) presso il laboratorio di ricerca IBM di S.Josè. Dal 1983 ca. "standard di fatto"

SQL. SQL: storia. Sviluppato nella metà degli anni settanta (1974) presso il laboratorio di ricerca IBM di S.Josè. Dal 1983 ca. standard di fatto SQL SQL: "storia Sviluppato nella metà degli anni settanta (194) presso il laboratorio di ricerca IBM di S.Josè Dal 1983 ca. "standard di fatto" E il linguaggio di riferimento per l interrogazione di DBMS

Dettagli

2011 Politecnico di Torino 1

2011 Politecnico di Torino 1 SQL per le applicazioni Call Level Interface Le richieste sono inviate al DBMS per mezzo di funzioni del linguaggio ospite soluzione basata su interfacce predefinite API, Application Programming Interface

Dettagli

APPUNTI DELLA LEZIONE DI DATABASE DEL 26/10/2016 Studenti: Marco D'Amato, Adriano Luigi Piscopello Professore: Mario Bochicchio

APPUNTI DELLA LEZIONE DI DATABASE DEL 26/10/2016 Studenti: Marco D'Amato, Adriano Luigi Piscopello Professore: Mario Bochicchio APPUNTI DELLA LEZIONE DI DATABASE DEL 26/10/2016 Studenti: Marco D'Amato, Adriano Luigi Piscopello Professore: Mario Bochicchio INTRODUZIONE L algebra relazionale è l algebra su cui si basa il linguaggio

Dettagli

14Ex-Cap11.qxd :20 Pagina Le macro

14Ex-Cap11.qxd :20 Pagina Le macro 14Ex-Cap11.qxd 21-12-2006 11:20 Pagina 203 11 Le macro Creare le macro Registrare una macro Eseguire una macro Riferimenti assoluti e relativi nelle macro Assegnare un pulsante a una macro Modificare una

Dettagli

La connessione ai database MySQL tramite script PHP versione 5.5

La connessione ai database MySQL tramite script PHP versione 5.5 La connessione ai database MySQL tramite script PHP versione 5.5 Php è un linguaggio di scripting che estende le funzionalità del server Web, mentre MySQL è un programma server che si occupa della gestione

Dettagli

A.A. 2018/2019. Esercitazione 12. Strutturazione di Istruzioni in Linguaggio SQL. [ Possibili Soluzioni ] FONDAMENTI DI INFORMATICA E PROGRAMMAZIONE

A.A. 2018/2019. Esercitazione 12. Strutturazione di Istruzioni in Linguaggio SQL. [ Possibili Soluzioni ] FONDAMENTI DI INFORMATICA E PROGRAMMAZIONE A.A. 2018/2019 Esercitazione 12 Strutturazione di Istruzioni in Linguaggio SQL [ Possibili Soluzioni ] Docente Prof. Raffaele Pizzolante FONDAMENTI DI INFORMATICA E PROGRAMMAZIONE Esercizio 1 Scrivere

Dettagli

IL LINGUAGGIO SQL LE BASI

IL LINGUAGGIO SQL LE BASI IL LINGUAGGIO SQL LE BASI DB DI RIFERIMENTO PER GLI ESEMPI 2 ESPRESSIONI NELLA CLAUSOLA SELECT La SELECT list può contenere non solo attributi, ma anche espressioni: Le espressioni possono comprendere

Dettagli

Operatori aggregati. Operatori aggregati. Interrogazioni con raggruppamento. Interrogazioni con raggruppamento

Operatori aggregati. Operatori aggregati. Interrogazioni con raggruppamento. Interrogazioni con raggruppamento Operatori aggregati In algebra relazionale le espressioni vengono valutate sulle singole tuple in successione. Talvolta però possono essere necessarie informazioni derivabili dall esame di tutte le tuple

Dettagli

Basi di dati attive. Paolo Atzeni Stefano Ceri. Basi di dati attive

Basi di dati attive. Paolo Atzeni Stefano Ceri. Basi di dati attive Basi di dati attive Paolo Atzeni Stefano Ceri Basi di dati attive BD con componente per la gestione di regole Evento- Condizione-Azione (regole di produzione): eventi: normalmente modifiche della base

Dettagli

V. Moriggia Modelli di Base Dati. Modelli di Base Dati. a.a. 2001/

V. Moriggia Modelli di Base Dati. Modelli di Base Dati. a.a. 2001/ Modelli di Base Dati 8 L aggregazione e il raggruppamento in SQL a.a. 2001/2002 8.1 SQL: le funzioni di aggregazione 8.2 funzioni predefinite che agiscono sui valori contenuti in insiemi di righe della

Dettagli

Imparare a utilizzare le formule e le funzioni

Imparare a utilizzare le formule e le funzioni Imparare a utilizzare le formule e le funzioni Eseguire calcoli, di tipo semplice o complesso, può essere un'attività noiosa e che richiede tempo. È possibile semplificare le operazioni di calcolo mediante

Dettagli

4. I moduli in Access 2000/2003

4. I moduli in Access 2000/2003 LIBRERIA WEB 4. I moduli in Access 2000/2003 Il modulo è uno degli oggetti del database di Access e rappresenta un insieme di dichiarazioni e routine scritte con il linguaggio Visual Basic, memorizzate

Dettagli

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema: BASI DI DATI INGEGNERIA INFORMATICA PROVA PRATICA 20 GIUGNO 2014 SOLUZIONI Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema: PAZIENTE(CodFiscale, Cognome,

Dettagli

Laboratorio di Basi di Dati

Laboratorio di Basi di Dati Laboratorio di Basi di Dati Esercitazione PostgreSQL Dopo aver lanciato il client grafico pgadmin III di PostgreSQL svolgere le operazioni descritte nel seguito, tenendo presenti i suggerimenti forniti

Dettagli

Estensioni del linguaggio SQL per interrogazioni OLAP

Estensioni del linguaggio SQL per interrogazioni OLAP Sistemi Informativi Avanzati Anno Accademico 2012/2013 Prof. Domenico Beneventano Estensioni del linguaggio SQL per interrogazioni OLAP Esempio! Esempio delle vendite con scontrino (nella tabella, per

Dettagli

Informatica documentale Laurea in Scienze della Comunicazione Prova scritta del 25 giugno Cognome e nome: Matricola:

Informatica documentale Laurea in Scienze della Comunicazione Prova scritta del 25 giugno Cognome e nome: Matricola: Informatica documentale Laurea in Scienze della Comunicazione Prova scritta del 25 giugno 2012 Cognome e nome: Matricola: Parte prima Domanda 1 Domanda 2 Domanda 3 Totale Istruzioni: È vietato portare

Dettagli

Principi di Progettazione del Software a.a Il linguaggio SQL. Il Linguaggio SQL

Principi di Progettazione del Software a.a Il linguaggio SQL. Il Linguaggio SQL Principi di Progettazione del Software a.a. 2017-2018 Ing. Università del Salento Il Linguaggio SQL Due componenti principali: Ø DDL (Data Definition Language) Contiene i costrutti necessari per la creazione/modifica

Dettagli

MICROSOFT EXCEL FORMULE E FUNZIONI

MICROSOFT EXCEL FORMULE E FUNZIONI MICROSOFT EXCEL FORMULE E FUNZIONI Lezione 1.2 a.a. 2016-2017 Ing. Giulia Fiscon Sommario Introduzione Microsoft Excel Lavorare con i fogli di calcolo Riferimenti di cella Formule e Funzioni Funzioni logiche

Dettagli

ESERCITAZIONI ACCESS

ESERCITAZIONI ACCESS ESERCITAZIONI ACCESS MS Access 2000 Struttura di riferimento: Studente (Matricola, Cognome, Nome) Esame (Matricola, Materia, Voto, Data) CREARE LE TABELLE IN SQL: Create table STUDENTE ( matricola char(6)

Dettagli

Laboratorio di Basi di Dati

Laboratorio di Basi di Dati Laboratorio di Basi di Dati Docente: Alberto Belussi Lezione 2 Vincoli di integrità Proprietà che devono essere soddisfatte da ogni istanza della base di dati. Il soddisfacimento è definito rispetto al

Dettagli

2011 Politecnico di Torino 1

2011 Politecnico di Torino 1 Modalità d uso SQL per le applicazioni Indipendentemente dalla soluzione CLI adottata, esiste una strutturazione comune dell interazione con il DBMS apertura della connessione con il DBMS esecuzione di

Dettagli

(Lezione SQL 3) Barbara Di Camillo Dipartimento di Ingegneria dell Informazione. Università degli Studi di Padova

(Lezione SQL 3) Barbara Di Camillo Dipartimento di Ingegneria dell Informazione. Università degli Studi di Padova Università degli Studi di Padova Corso di Laurea Magistrale in Bioingegneria A.A. 2010-20112011 INFORMATICA SANITARIA (Lezione SQL 3) Barbara Di Camillo Dipartimento di Ingegneria dell Informazione Università

Dettagli

Vincoli, procedure e regole attive in SQL. SQL: vincoli, trigger 1

Vincoli, procedure e regole attive in SQL. SQL: vincoli, trigger 1 Vincoli, procedure e regole attive in SQL SQL: vincoli, trigger 1 Qualità dei dati Qualità dei dati: correttezza, completezza, attualità In molte applicazioni reali i dati sono di scarsa qualità (5% -

Dettagli

Database Modulo 4 RELAZIONI TRA TABELLE

Database Modulo 4 RELAZIONI TRA TABELLE Database Modulo 4 RELAZIONI TRA TABELLE PERCHÉ DEFINIRE LE RELAZIONI Dopo avere definito le tabelle corrispondenti alle entità individuate nel progetto del database, è necessario indicare il modo per ricollegare

Dettagli

Oracle Database 11g: Introduzione a SQL Release 2

Oracle Database 11g: Introduzione a SQL Release 2 Oracle University Contact Us: 800 672 253 Oracle Database 11g: Introduzione a SQL Release 2 Duration: 5 Days What you will learn In questo corso gli studenti apprenderanno i concetti dei database relazionali.

Dettagli

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole. Excel VBA VBA Visual Basic for Application VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole. 2 Prima di iniziare. Che cos è una variabile?

Dettagli

Access 2007 Colonna di ricerca

Access 2007 Colonna di ricerca Pagina 1 di 7 Lezioni on line -> Gestire i dati Access 2007 Colonna di ricerca Quando si riempiono i campi dei record che formano una tabella, può essere utile e comodo poter scegliere, in un elenco dei

Dettagli

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura: Le classi in java Un semplice programma java, formato da una sola classe, assume la seguente struttura: class Domanda static void main(string args[]) System.out.println( Quanti anni hai? ); La classe dichiarata

Dettagli

Gestione di basi di dati relazionali con SQL (parte I) Linguaggi per basi di dati

Gestione di basi di dati relazionali con SQL (parte I) Linguaggi per basi di dati Gestione di basi di dati relazionali con SQL (parte I) Gian Pietro Picco Dipartimento di Elettronica e Informazione Politecnico di, Italy picco@elet.polimi.it http://www.elet.polimi.it/~picco Linguaggi

Dettagli

MS Access: Tutorial Tabelle, Relazioni

MS Access: Tutorial Tabelle, Relazioni Università Magna Graecia di Catanzaro Informatica MS Access: Tutorial Tabelle, Relazioni Docente : Alfredo Cuzzocrea e-mail : cuzzocrea@si.deis.unical.it Tel. : 0984 831730 Microsoft Access Tutorial Tabelle,

Dettagli

SQL QUERY: Le interrogazioni del database

SQL QUERY: Le interrogazioni del database Appunti della lezione di Database del 20 ottobre 2016 (mattina) Studenti: D Amuri Giuseppe, De Luca Federico Professore: Mario Bochicchio SQL QUERY: Le interrogazioni del database Per effettuare un interrogazione

Dettagli

Eprogram ITIS V anno Unità 4 - Il linguaggio SQL

Eprogram ITIS V anno Unità 4 - Il linguaggio SQL Eprogram ITIS V anno Unità 4 - Il linguaggio SQL Compito in classe proposto Date le seguenti tabelle: scrivi in SQL le seguenti richieste (per facilitare query complesse utilizza le viste): 1. elencare

Dettagli

EUROPEAN COMPUTER DRIVING LICENCE SYLLABUS VERSIONE 5.0

EUROPEAN COMPUTER DRIVING LICENCE SYLLABUS VERSIONE 5.0 Pagina I EUROPEAN COMPUTER DRIVING LICENCE SYLLABUS VERSIONE 5.0 Modulo 5 Uso delle basi di dati Il seguente Syllabus è relativo al Modulo 5, Uso delle basi di dati, e fornisce i fondamenti per il test

Dettagli

INFORMATICA GENERALE Prof. Alberto Postiglione Dipartimento Scienze della Comunicazione Università degli Studi di Salerno

INFORMATICA GENERALE Prof. Alberto Postiglione Dipartimento Scienze della Comunicazione Università degli Studi di Salerno : SQL (3) Tabelle multiple, variabili, operatori di aggregazione QUERIES SU PIU TABELLE Queries su più tabelle 17 mar 010 Dia 3 17 mar 010 Dia 4 Per formulare un interrogazione su più tabelle, la clausola

Dettagli

Fondamenti di Informatica A. A / 1 9

Fondamenti di Informatica A. A / 1 9 Fondamenti di Informatica Prof. Marco Lombardi A. A. 2 0 1 8 / 1 9 Concetti Introduttivi 1/2 SQL (Structured Query Language) permette di manipolare i dati, interrogare un database relazionale e modellarne

Dettagli

Sistemi Informativi Avanzati Anno Accademico 2011/2012 Prof. Domenico Beneventano SQL-OLAP. Estensioni OLAP in SQL

Sistemi Informativi Avanzati Anno Accademico 2011/2012 Prof. Domenico Beneventano SQL-OLAP. Estensioni OLAP in SQL Sistemi Informativi Avanzati Anno Accademico 2011/2012 Prof. Domenico Beneventano SQL-OLAP Estensioni OLAP in SQL Estensioni OLAP in SQL SQL99 è stato il primo standard SQL ad offrire soluzioni per l analisi

Dettagli

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema: BASI DI DATI INGEGNERIA INFORMATICA PROVA PRATICA 29 GIUGNO 2015 SOLUZIONI Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema: PAZIENTE(CodFiscale, Cognome,

Dettagli

Laboratorio Basi di Dati Laura Po

Laboratorio Basi di Dati Laura Po Laboratorio Basi di Dati Laura Po Si vuole progettare un database per la gestione delle ferrovie dello stato. I treni gestiti sono identificati da un numero. Su ciascun treno sono specificate le classi

Dettagli

CORSO ACCESS 2000 PARTE VI

CORSO ACCESS 2000 PARTE VI Le Query Le Query selezionano dati, da una o più tabelle in un database, che soddisfano determinati requisiti e visualizzano i risultati in un foglio dati. I dati richiesti vengono visualizzati in un recordset

Dettagli

DDL (Data Definition Language) schemi DML (Data Manipulation Language) DQL (Data Query Language) DCL (Data Control Language)

DDL (Data Definition Language) schemi DML (Data Manipulation Language) DQL (Data Query Language) DCL (Data Control Language) o o o o o DDL (Data Definition Language): consente di creare e modificare schemi di database; DML (Data Manipulation Language): consente di inserire, modificare e gestire i dati memorizzati; DQL (Data

Dettagli

Viene richiesto di MIN CARD(S,E) = 1 UPDATE DELETE MAX CARD(S,E) = 3 INSERT UPDATE

Viene richiesto di MIN CARD(S,E) = 1 UPDATE DELETE MAX CARD(S,E) = 3 INSERT UPDATE Dato il seguente schema E/R E la sua traduzione nel seguente schema relazionale: disponibile in http://www.dbgroup.unimo.it/sire/20110513/20110513.bak Viene richiesto di 1) Risolvere la seguente interrogazione

Dettagli

I.I.S. G. COSSALI - ORZINUOVI DATABASE. Marzo 2017 Prof. Dario Tomasoni 1

I.I.S. G. COSSALI - ORZINUOVI DATABASE. Marzo 2017 Prof. Dario Tomasoni 1 I.I.S. G. COSSALI - ORZINUOVI DATABASE Marzo 2017 Prof. Dario Tomasoni 1 IMPOSTAZIONE 60 min = Database concetti + Esercizi; 10 min = pausa; 30 min = Linguaggio SQL; 30 min = Database prove LibreOffice

Dettagli

Oracle Database 10g: Introduction to SQL - LVC

Oracle Database 10g: Introduction to SQL - LVC Oracle University Chiamaci: 800 672 253 Oracle Database 10g: Introduction to SQL - LVC Duration: 5 Days Description Questo corso è destinato agli utenti di Oracle8i, Oracle9i e Oracle Database 10g.In questo

Dettagli

Prova Scritta di Basi di Dati

Prova Scritta di Basi di Dati Prova Scritta di Basi di Dati 1 Luglio 2008 COGNOME: NOME: MATRICOLA: Si prega di risolvere gli esercizi direttamente sui fogli del testo, negli spazi indicati. Usare il foglio protocollo solo per la brutta

Dettagli

Laboratorio di Informatica I

Laboratorio di Informatica I Struttura della lezione Lezione 3: Istruzioni ed operatori booleani. Vittorio Scarano Corso di Laurea in Informatica Università di Salerno Soluzioni agli esercizi Istruzioni (statement) semplici e di controllo

Dettagli

per immagini guida avanzata Modificare numeri e date Geometra Luigi Amato Guida Avanzata per immagini Excel

per immagini guida avanzata Modificare numeri e date Geometra Luigi Amato Guida Avanzata per immagini Excel Modificare numeri e date Geometra Luigi Amato Guida Avanzata per immagini Excel 2000 1 Questi formati applicano l impostazione predefinita per ciascuno dei formati. È importante notare che, indipendentemente

Dettagli

4.SQL QUERY. Fare una query significa fare delle ricerche sul nostro database.

4.SQL QUERY. Fare una query significa fare delle ricerche sul nostro database. 4.SQL QUERY >definizione A cura di: Celora Luca Fare una query significa fare delle ricerche sul nostro database. >strumenti da usare SELECT //sceglie le colonne da visualizzare FROM //indica da quali

Dettagli

Excel avanzato.

Excel avanzato. Excel avanzato marco.falda@unipd.it I nomi Gli indirizzi e le formule possono essere sostituiti da nomi documentazione astrazione Si creano tramite Inserisci Nome Definisci Vengono raccolti nell area riferimento

Dettagli

Laboratorio di Sistemi Informativi

Laboratorio di Sistemi Informativi Laboratorio di Sistemi Informativi Corso di Laurea in Informatica - A. A. 2006-2007 Modifica degli schemi Inserimento, cancellazione e modifica dei dati Donatella Merlini Dipartimento di Sistemi e Informatica

Dettagli