SQL :Structured Query Language: SELECT (II)

Slides:



Advertisements
Presentazioni simili
Interrogazioni Semplici Le operazioni di interrogazione vengono specificate per mezzo dellistruzione select select ListaAttributi from ListaTabelle [where.
Advertisements

Ricorsione in SQL-99.
Structured Query Language
Structured Query Language (SQL) Presentazione 13.1 Informatica Generale (Prof. Luca A. Ludovico)
SQL92 e XQuery1.0 a confronto1 SQL92 E XQUERY1.0 A CONFRONTO Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria - Sede di Modena Corso.
1 Misura Derivata: esempio dei biglietti CostoMedioBiglietto (CMB) calcolato come INCASSO/NUM_BIG. SUM AVG Implementazione in Analysis Services 1. Si definisce.
DML – Data Manipulation Language
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
SQL Structured Query Language Comandi base di DML Rosalba Giugno Rosalba Giugno
Progettazione ER Un database universitario contiene informazioni riguardanti i professori (identificati dal codice fiscale) e informazioni relative ai.
SQL.
SQL Dati i seguenti schemi relazionali:
19/01/2014 Viste. 19/01/2014 Viste Le Viste Logiche o Viste o View possono essere definite come delle tabelle virtuali, i cui dati sono riaggregazioni.
Istruzione SELECT (versione base)
1 Corso di Laurea in Biotecnologie Informatica (Basi di Dati) SQL: Data Manipulation Language (DML) Anno Accademico 2009/2010 Da: Atzeni, Ceri, Paraboschi,
Laboratorio di Basi di Dati Introduzione ad Access 2ª Parte.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999
SQL Esercitazione per il corso “Basi di Dati” Gabriel Kuper
Algoritmo di Query Optimization
Esercitazione.
Algebra Relazionale Linguaggio procedurale, cioè le operazioni vengono descritte attraverso la descrizione della sequenza di azioni da compiere per ottenere.
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.
SELECT STATEMENT Clausola WHERE permette di limitare il numero di record da estrarre SELECT */ [DISTINCT] colonna/ espressione [alias],… FROM table [WHERE.
Viste. Cosè una vista? è possibile creare un subset logico di dati o una combinazione di dati una vista è una tabella logica basata su una tabella o su.
SQL basato su ANSI (American National Standards Institute) – standard SQL SQL – Structured Query Language è un linguaggio dichiarativo e permette di comunicare.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, Capitolo 4:SQL 16/10/2002.
Basi di dati Claudia Raibulet
SQL: Structured Query Language
E. Giunchiglia Basi di dati 1 (trasparenze basate su Atzeni, Ceri, Paraboschi, Torlone: Basi di dati, Capitolo 4) SQL 05/10/2004.
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL OPERATORI INSIEMISTICI IN SQL Siano due tabelle: GiochiSolitari(CodiceGioco, NomeGioco, PrezzoGioco)
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
MODELLO LOGICO DEI DATI
Realizzato da Roberto Savino
SQL.
Basi di dati - Modelli e linguaggi di interrogazione- Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone Copyright © The McGraw-Hill.
DATABASE Introduzione
Sistemi Informativi Insieme di “strutture” in grado di acquisire, elaborare, trasmettere ed archiviare informazioni in genere ad uso di un’organizzazione.
Informatica II – Basi di Dati (07/08) – Parte 2 Gianluca Torta Dipartimento di Informatica dell’Università di Torino
SQL Interrogazioni. 2 Interrogazioni in SQL Non esiste un SQL standard (vari dialetti) Formulazione di interrogazioni (query) è parte del Data Manipulation.
Informatica Introduzione alle basi di dati Lezione 8 Scienze e tecniche psicologiche dello sviluppo e dell'educazione, laurea magistrale Anno accademico:
Microsoft Access (parte 5) Introduzione alle basi di dati Scienze e tecniche psicologiche dello sviluppo e dell'educazione, laurea magistrale Anno accademico:
SEFOC – SETTORE FORMAZIONE CONTINUA DEL PERSONALE CORSO MYSQL AVANZATO ROBERTO PENNOLINO – CARMELO MASSIMO PRIOLO PALERMO – 07 | 06 | 2011.
Microsoft Access Query (II), filtri.
Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (IV) SQL (Slide tratte in parte da da Atzeni, Ceri,
Esercitazione 7.
Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico.
Il Linguaggio SQL. Le interrogazioni in SQL (continua…) La parte di SQL dedicata alla formulazione di interrogazioni fa parte del DML. SQL esprime le.
SQL, esempi 30/10/2014Basi di dati SQL1. 30/10/2014Basi di dati SQL2 CREATE TABLE, esempi CREATE TABLE corsi( codice numeric NOT NULL PRIMARY KEY, titolo.
Algebra relazionale (III). Esempi di Interrogazioni: 3 Trovare matricola e nome dei capi i cui impiegati guadagnano tutti più di Tutti gli impiegati?
Raggruppamento in SQL Esempio di raggruppamento
Microsoft Access Query (III).
Interrogazioni (parte 2)
Interrogazioni Le interrogazioni in SQL sono formulate in modo dichiarativo specificando cioè cosa si vuole ottenere e non come lo si vuole ottenere. L’interrogazione.
Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (III) SQL (Slide tratte in parte da da Atzeni, Ceri,
Query languages per Basi di Dati Relazionali  Algebra Relazionale:  basato sulla teoria degli insiemi  procedurale  usato per l’implementazione di.
Vincoli Interrelazionali Per i vincoli visti l’inserimento di un valore che li viola viene semplicemente impedito. In caso di vincoli di integrità referenziale,
Vincoli interrelazionali
Raggruppamenti e target list scorretta select padre, avg(f.reddito), p.reddito from persone f join paternita on figlio = nome join persone p on padre =
Prof. Lorenzo Vita, Ing. Luigi Testa
Corso integrato di Matematica, Informatica e Statistica Informatica di base Linea 1 Daniela Besozzi Dipartimento di Informatica e Comunicazione Università.
Interrogazioni Le interrogazioni in SQL sono formulate in modo dichiarativo specificando cioè cosa si vuole ottenere e non come lo si vuole ottenere. L’interrogazione.
Funzionalità del DBMS relazionale l Funzioni per –definizione della base di dati –inserimento / rimozione /aggiornamento di informazioni deve soddisfare.
Approfondimenti SQL.
Linguaggio SQL prima parte Linguaggio SQL prima parte A. Lorenzi, E. Cavalli INFORMATICA PER SISTEMI INFORMATIVI AZIENDALI Copyright © Istituto Italiano.
SQL Linguaggio per l’interrogazione di una base dati.
E. Tinelli SQL come linguaggio di manipolazione dei dati 1 DML – Data Manipulation Language.
Il linguaggio SQL (Structured Query Language) è il linguaggio standard per creare, manipolare e interrogare database relazionali. SQL non è case-sensitive:
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Transcript della presentazione:

SQL :Structured Query Language: SELECT (II)

Giugno-Pulvirenti AA 2005-2006 Tabelle Tabelle ::= Tabella [Ide] {, Tabella [Ide]} Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella [USING “(“Attributo{,Attributo}“)”|ON Condizione] Giugno-Pulvirenti AA 2005-2006

Giunzioni ed Operatori Insiemistici Giunzione ::= [CROSS|UNION|NATURAL] [LEFT| RIGHT | FULL] JOIN OpInsiem ::= (UNION | INTERSECT | EXCEPT) [CORRESPONDING [BY “(“ Attributo {,Attributo}”)” ] ] USING e ON solo con JOIN; LEFT, RIGHT,FULL solo con NATURAL JOIN e JOIN Giugno-Pulvirenti AA 2005-2006

Ancora su Join ed Operatori Insiemistici Union,Intersect,Except sono ,,-. CORRESPONDING fa proiettare sugli attributi comuni e poi si applica l’operatore insiemistico. Se c’e’ anche BY si specificano su quali comuni attributi proiettare Cross Join e’ il prodotto cartesiano Union Join e’ l’unione esterna cioe’ si estendono le due tabelle con le colonne dell’altro con valori nulli e si fa l’unione. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Ancora sulle Join Natural Join e’ quella classica Join... Using e’ la natural join sui dati attributi Join…On su quelli che soddisfano una data condizione [LEFT|RIGHT|FULL] usato con Natural Join o Join e’ la giunzione esterna nelle tre modalita’ sinistra,destra o completa. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Esempi Natural Join SELECT Studenti.Nome,Esami.Corso,Esami.Voto FROM Esami NATURAL JOIN Studenti Nome,Corso e Voto degli esami Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Altro Esempio Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione) Clienti(CodiceCliente,Nome,Citta’,Sconto) Ordini(CodiceOrdine,CodiceCliente,CodiceAgente,Articolo,Data,Ammontare) Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Esempio di Join On SELECT Agenti.CodiceAgente,Ordini.Ammontare FROM Agenti JOIN Ordini ON Agenti.Supervisore = Ordini.CodiceAgente Codice agente ed ammontare degli ordini dei supervisori Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Giunzione Esterna SELECT Agenti.CodiceAgente,Ordini.Ammontare FROM Agenti NATURAL LEFT JOIN Ordini Codice agente ed ammontare degli agenti incluso quelli che non hanno effettuato ordini (avranno ammontare NULL) Giugno-Pulvirenti AA 2005-2006

Ottenere dati da più Tabelle EMPNO ENAME ... DEPTNO ------ ----- ... ------ 7839 KING ... 10 7698 BLAKE ... 30 ... 7934 MILLER ... 10 DEPTNO DNAME LOC ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON IMPIEGATI DIPARTIMENTI EMPNO DEPTNO LOC ----- ------- -------- 7839 10 NEW YORK 7698 30 CHICAGO 7782 10 NEW YORK 7566 20 DALLAS 7654 30 CHICAGO 7499 30 CHICAGO ... 14 rows selected. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Cosa è una Join? La join viene usata per effettuare query su più tabelle. La condizione di join va scritta nella clausola WHERE. Mettere come prefisso della colonna il nome della tabella se questa stessa colonna appare in più di una tabella. SELECT tabella1.colonna, tabella2.colonna FROM tabella, tabella2 WHERE tabella1.colonna1 = tabella2.colonna2; Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Nome Età Persone Reddito Madre Maternità Figlio Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Andrea 27 Maria 55 Anna 50 Filippo 26 Luigi Franco 60 Olga 30 Sergio 85 Luisa 75 Aldo 25 21 42 35 40 20 41 87 15 Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Giugno-Pulvirenti AA 2005-2006

Join naturale Padre e madre di ogni persona paternita JOIN maternita SELECT paternita.figlio,padre, madre FROM maternita, paternita WHERE paternita.figlio = maternita.figlio Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Prodotto Cartesiano Il prodotto cartesiano e’ ottenuto quando: Una condizione join e’ omessa Una condizione join e’ non valida Tutte le righe della prima tabella ammettono join con tutte le righe della seconda Per evitare il prodotto cartesiano, includere sempre condizioni join valida nella clausola WHERE . Giugno-Pulvirenti AA 2005-2006

Generare un Prodotto Cartesiano IMPIEGATI (14 righe) DIPARTIMENTI (4 righe) EMPNO ENAME ... DEPTNO ------ ----- ... ------ 7839 KING ... 10 7698 BLAKE ... 30 ... 7934 MILLER ... 10 DEPTNO DNAME LOC ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON ENAME DNAME ------ ---------- KING ACCOUNTING BLAKE ACCOUNTING ... KING RESEARCH BLAKE RESEARCH 56 rows selected. “Prodotto Cartesiano: 14*4=56 rows” Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Cosa è una Natural join? IMPIEGATI DIPARTIMENTI EMPNO ENAME DEPTNO ------ ------- ------- 7839 KING 10 7698 BLAKE 30 7782 CLARK 10 7566 JONES 20 7654 MARTIN 30 7499 ALLEN 30 7844 TURNER 30 7900 JAMES 30 7521 WARD 30 7902 FORD 20 7369 SMITH 20 ... 14 rows selected. DEPTNO DNAME LOC ------- ---------- -------- 10 ACCOUNTING NEW YORK 30 SALES CHICAGO 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO ... 14 rows selected. Chiave esterna Chiave Primaria Giugno-Pulvirenti AA 2005-2006

Estrarre Record con Natural join SQL> SELECT emp.empno, emp.ename, emp.deptno, 2 dept.deptno, dept.loc 3 FROM emp, dept 4 WHERE emp.deptno=dept.deptno; EMPNO ENAME DEPTNO DEPTNO LOC ----- ------ ------ ------ --------- 7839 KING 10 10 NEW YORK 7698 BLAKE 30 30 CHICAGO 7782 CLARK 10 10 NEW YORK 7566 JONES 20 20 DALLAS ... 14 rows selected. Giugno-Pulvirenti AA 2005-2006

Condizioni di Ricerca addizionali Uso dell’operatore AND EMP DEPT EMPNO ENAME DEPTNO ------ ------- ------- 7839 KING 10 7698 BLAKE 30 7782 CLARK 10 7566 JONES 20 7654 MARTIN 30 7499 ALLEN 30 7844 TURNER 30 7900 JAMES 30 7521 WARD 30 7902 FORD 20 7369 SMITH 20 ... 14 rows selected. DEPTNO DNAME LOC ------ --------- -------- 10 ACCOUNTING NEW YORK 30 SALES CHICAGO 20 RESEARCH DALLAS 30 SALES CHICAGO ... 14 rows selected. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Join di piu’ Tabelle CLIENTI CUSTID ORDID ------- ------- 101 610 102 611 104 612 106 601 102 602 106 604 106 605 ... 21 rows selected. ORDINI NAME CUSTID ----------- ------ JOCKSPORTS 100 TKB SPORT SHOP 101 VOLLYRITE 102 JUST TENNIS 103 K+T SPORTS 105 SHAPE UP 106 WOMENS SPORTS 107 ... ... 9 rows selected. ORDID ITEMID ------ ------- 610 3 611 1 612 1 601 1 602 1 ... 64 rows selected. PROD. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Nome Età Persone Reddito Madre Maternità Figlio Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Andrea 27 Maria 55 Anna 50 Filippo 26 Luigi Franco 60 Olga 30 Sergio 85 Luisa 75 Aldo 25 21 42 35 40 20 41 87 15 Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Giugno-Pulvirenti AA 2005-2006

Join esplicito (JOIN-ON) Sintassi: SELECT … FROM Tabella { … JOIN Tabella ON CondDiJoin }, … [ WHERE AltraCondizione ] Esempio: padre e madre di ogni persona (le due versioni): SELECT paternita.figlio,padre, madre FROM maternita, paternita WHERE paternita.figlio = maternita.figlio SELECT madre, paternita.figlio, padre FROM maternita JOIN paternita ON paternita.figlio = maternita.figlio Giugno-Pulvirenti AA 2005-2006

Selezione, proiezione e join I padri di persone che guadagnano più di 20 πPadre(paternita JOIN Figlio=Nome (σReddito>20 (persone))) SELECT distinct padre FROM persone, paternita WHERE figlio = nome AND reddito > 20 Giugno-Pulvirenti AA 2005-2006

Necessita’ di ridenominazione Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre πNome, Reddito, RP (σReddito>RP (δNP,EP,RP  Nome,Eta,Reddito(persone) JOIN NP=Padre (paternita JOINFiglio =Nome persone))) SELECT f.nome, f.reddito, p.reddito FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito Giugno-Pulvirenti AA 2005-2006

SELECT, con ridenominazione del risultato SELECT figlio, f.reddito AS reddito, p.reddito AS redditoPadre FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito O meglio SELECT x.figlio, f.reddito AS reddito, p.reddito AS redditoPadre FROM persone p, paternita x, persone f WHERE p.nome = x.padre AND x.figlio = f.nome AND f.reddito > p.reddito Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre SELECT f.nome, f.reddito, p.reddito FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito SELECT f.nome, f.reddito, p.reddito FROM persone p JOIN paternita ON p.nome = padre JOIN persone f ON figlio = f.nome WHERE f.reddito > p.reddito Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Join esterno Padre e, se nota, madre di ogni persona SELECT paternita.figlio, padre, madre FROM paternita LEFT JOIN maternita ON paternita.figlio = maternita.figlio Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 join esterno SELECT paternita.figlio, padre, madre FROM maternita JOIN paternita ON maternita.figlio = paternita.figlio FROM maternita LEFT JOIN paternita FROM maternita FULL JOIN paternita Giugno-Pulvirenti AA 2005-2006

Aggregazione dati

Giugno-Pulvirenti AA 2005-2006 Operatori aggregati Nelle espressioni della target list possiamo avere anche espressioni che calcolano valori a partire da insiemi di ennuple SQL-2 prevede 5 possibili operatori di aggregamento: conteggio, minimo, massimo, media, somma Gli operatori di aggregamento NON sono rappresentabili in Algebra Relazionale Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Obiettivi Al completamento di questa parte, dovreste essere in grado di: Identificare le funzioni di raggruppamento Descriverne l’uso Raggruppare dati usando GROUP BY Includere ed escludere righe tramite l’uso di HAVING Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Cosa sono? Operano su insiemi di righe per dare un risultato per gruppo. IMPIEGATI DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 “Salario Massimo” MAX(SAL) --------- 5000 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Quali sono AVG COUNT MAX MIN SUM Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Uso SELECT [column,] group_function(column) FROM table [WHERE condition] [GROUP BY column] [ORDER BY column]; Giugno-Pulvirenti AA 2005-2006

Possono essere usati su dati numerici. Uso di AVG e SUM Possono essere usati su dati numerici. SQL> SELECT AVG(sal), MAX(sal), 2 MIN(sal), SUM(sal) 3 FROM emp 4 WHERE job LIKE 'SALES%'; AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) -------- --------- --------- --------- 1400 1600 1250 5600 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Uso di MIN e MAX Possono essere usati su qualsiasi tipo. SQL> SELECT MIN(hiredate), MAX(hiredate) 2 FROM emp; MIN(HIRED MAX(HIRED --------- --------- 17-DEC-80 12-JAN-83 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Uso di COUNT COUNT(*) ritorna il numero di righe di una tabella. SQL> SELECT COUNT(*) 2 FROM emp 3 WHERE deptno = 30; COUNT(*) --------- 6 Giugno-Pulvirenti AA 2005-2006

Operatori aggregati: COUNT COUNT come detto restituisce il numero di righe o il numero di valori distinti di un particolare attributo Esempio: Il numero di figli di Franco: SELECT count(*) as NumFigliDiFranco FROM Paternita WHERE Padre = 'Franco' l’operatore aggregato (count) viene applicato al risultato dell’interrogazione: SELECT * Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Padre Paternità Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Franco Andrea Aldo NumFigliDiFranco 2 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 COUNT e valori nulli Numero di tuple SELECT count(*) FROM persone Numero di volte il campo ‘reddito’ non e’ NULL SELECT count(reddito) FROM persone Numero di valori distinti del campo ‘reddito’ (senza i NULL) SELECT count(distinct reddito) FROM persone Nome Età Persone Reddito Andrea 27 Maria 55 Anna 50 Aldo 25 21 35 NULL Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Se una colonna A contiene solo valori nulli, MAX, MIN, AVG, SUM restituiscono NULL, mentre Count vale zero. Giugno-Pulvirenti AA 2005-2006

Altri operatori aggregati SUM, AVG, MAX, MIN Media dei redditi di coloro che hanno meno di 30 anni: SELECT avg(reddito) FROM persone WHERE eta < 30 Uso del JOIN: media dei redditi dei figli di Franco: FROM persone JOIN paternita ON nome=figlio WHERE padre='Franco‘ Uso di piu’ operatori di aggregamento nella target list: SELECT avg(reddito), min(reddito), max(reddito) Giugno-Pulvirenti AA 2005-2006

Operatori aggregati e valori nulli SELECT avg(reddito) AS redditomedio FROM persone Nome Età Persone Reddito Andrea 27 Maria 55 Anna 50 Aldo 25 30 36 NULL Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Uso di COUNT COUNT(espr) ritorna il numero di righe non nulle. SQL> SELECT COUNT(comm) 2 FROM emp 3 WHERE deptno = 30; COUNT(COMM) ----------- 4 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Valori Null Ignorano I valori nulli nelle colonne. SQL> SELECT AVG(comm) 2 FROM emp; AVG(COMM) --------- 550 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Creare gruppi di dati IMPIEGATI DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 2916.6667 “salario medio in IMPIEGATI per ogni dipartimento” DEPTNO AVG(SAL) ------- --------- 10 2916.6667 20 2175 30 1566.6667 2175 1566.6667 Giugno-Pulvirenti AA 2005-2006

Creare gruppi tramite: GROUP BY SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; Divide le righe di una tabella in gruppi piu’ piccoli. Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Uso di GROUP BY Tutte le colonne della SELECT che non sono in funzioni di gruppo devono essere nella GROUP BY. SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 GROUP BY deptno; DEPTNO AVG(SAL) --------- --------- 10 2916.6667 20 2175 30 1566.6667 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Uso GROUP BY La colonna di GROUP BY non deve essere necessariamente nella SELECT. SQL> SELECT AVG(sal) 2 FROM emp 3 GROUP BY deptno; AVG(SAL) --------- 2916.6667 2175 1566.6667 Giugno-Pulvirenti AA 2005-2006

Raggruppare piu’ di una colonna IMPIEGATI DEPTNO JOB SAL --------- --------- --------- 10 MANAGER 2450 10 PRESIDENT 5000 10 CLERK 1300 20 CLERK 800 20 CLERK 1100 20 ANALYST 3000 20 MANAGER 2975 30 SALESMAN 1600 30 MANAGER 2850 30 SALESMAN 1250 30 CLERK 950 30 SALESMAN 1500 DEPTNO -------- 10 20 30 JOB SUM(SAL) --------- --------- CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 6000 CLERK 1900 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 5600 “sommare I salari in IMPIEGATI per ongi lavoro, Ragruppati per dipartimeno” Giugno-Pulvirenti AA 2005-2006

Uso di GROUP BY su colonne multiple SQL> SELECT deptno, job, sum(sal) 2 FROM emp 3 GROUP BY deptno, job; DEPTNO JOB SUM(SAL) --------- --------- --------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900 ... 9 rows selected. Giugno-Pulvirenti AA 2005-2006

Operatori aggregati e target list un’interrogazione scorretta: SELECT nome, max(reddito) FROM persone di chi sarebbe il nome? La target list deve essere omogenea SELECT min(eta), avg(reddito) Giugno-Pulvirenti AA 2005-2006

Operatori aggregati e raggruppamenti Le funzioni possono essere applicate a partizioni delle relazioni Clausola GROUP BY Syntax: GROUP BY listaAttributi Il numero di figli di ciascun padre SELECT padre, count(*) AS NumFigli FROM paternita GROUP BY Padre Padre paternita Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Padre NumFigli Luigi Sergio 2 Franco 1 Giugno-Pulvirenti AA 2005-2006

Query illegali con funzioni di raggruppamento Ogni colonna o espressione della SELECT che non e’ argomento di funzioni di gruppo deve essere nella GROUP BY. SQL> SELECT deptno, COUNT(ename) 2 FROM emp; SELECT deptno, COUNT(ename) * ERROR at line 1: ORA-00937: not a single-group group function Giugno-Pulvirenti AA 2005-2006

Query illegali con funzioni di raggrup. Non puo’ essere usata la WHERE per restringere I gruppi. Deve essere usata la HAVING. SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 WHERE AVG(sal) > 2000 4 GROUP BY deptno; WHERE AVG(sal) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here Giugno-Pulvirenti AA 2005-2006

Escludere gruppi di ris. IMPIEGATI DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 5000 3000 “salario massimo per dipartmento maggiore di $2900” DEPTNO MAX(SAL) --------- --------- 10 5000 20 3000 2850 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Clausola HAVING Uso di HAVING per restringere gruppi Le righe sono raggruppate. La funzione di raggruppamento e’ applicata. SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column]; Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Uso di HAVING SQL> SELECT deptno, max(sal) 2 FROM emp 3 GROUP BY deptno 4 HAVING max(sal)>2900; DEPTNO MAX(SAL) --------- --------- 10 5000 20 3000 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Uso di HAVING SQL> SELECT job, SUM(sal) PAYROLL 2 FROM emp 3 WHERE job NOT LIKE 'SALES%' 4 GROUP BY job 6 ORDER BY SUM(sal); 5 HAVING SUM(sal)>5000 JOB PAYROLL --------- --------- ANALYST 6000 MANAGER 8275 Giugno-Pulvirenti AA 2005-2006

Funzioni di raggruppamento annidate SQL> SELECT max(avg(sal)) 2 FROM emp 3 GROUP BY deptno; MAX(AVG(SAL)) ------------- 2916.6667 Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Sommario SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column]; Ordine di valutazione delle clausole: WHERE GROUP BY HAVING Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Tabelle Tabelle ::= Tabella [Ide] {, Tabella [Ide]} Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella [USING “(“Attributo{,Attributo}“)”|ON Condizione] Giugno-Pulvirenti AA 2005-2006

Giunzioni ed Operatori Insiemistici OpInsiem ::= (UNION | INTERSECT | EXCEPT) [CORRESPONDING [BY “(“ Attributo {,Attributo}”)” ] ] Union,Intersect,Except sono ,,-. CORRESPONDING fa proiettare sugli attributi comuni e poi si applica l’operatore insiemistico. Se c’e’ anche BY si specificano su quali comuni attributi proiettare Giugno-Pulvirenti AA 2005-2006

Unione, intersezione e differenza La SELECT da sola non permette di fare unioni; serve un costrutto esplicito: SELECT … UNION SELECT ... i duplicati vengono eliminati Giugno-Pulvirenti AA 2005-2006

Notazione posizionale! SELECT padre FROM paternita UNION SELECT madre FROM maternita quali nomi per gli attributi del risultato? nessuno quelli del primo operando … Giugno-Pulvirenti AA 2005-2006

Notazione posizionale, 2 SELECT padre, figlio FROM paternita UNION SELECT figlio, madre FROM maternita SELECT padre, figlio FROM paternita UNION SELECT madre, figlio FROM maternita Giugno-Pulvirenti AA 2005-2006

Notazione posizionale, 3 Anche con le ridenominazioni non cambia niente: SELECT padre as genitore, figlio FROM paternita UNION SELECT figlio, madre as genitore FROM maternita Corretta: SELECT padre as genitore, figlio FROM paternita UNION SELECT madre as genitore, figlio FROM maternita Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Differenza SELECT Nome FROM Impiegato EXCEPT SELECT Cognome as Nome FROM Impiegato vedremo che si può esprimere con SELECT nidificate Giugno-Pulvirenti AA 2005-2006

Giugno-Pulvirenti AA 2005-2006 Intersezione SELECT Nome FROM Impiegato INTERSECT SELECT Cognome as Nome FROM Impiegato equivale a SELECT I.Nome FROM Impiegato I, Impiegato J WHERE I.Nome = J.Cognome Giugno-Pulvirenti AA 2005-2006