13.07.2015 Views

Il linguaggio SQL - Massimo Paolucci

Il linguaggio SQL - Massimo Paolucci

Il linguaggio SQL - Massimo Paolucci

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

1<strong>Il</strong> <strong>linguaggio</strong> <strong>SQL</strong><strong>Massimo</strong> <strong>Paolucci</strong>(paolucci@dist.unige.it)DIST – Università di Genova<strong>SQL</strong>: Structured Query Language2Generalita’Linguaggio di interrogazione per le basi di dati. Sviluppato presso i laboratori dell’IBM a meta’ degli ’70.Adottato dall’ANSI (American National Standards Institute)come <strong>linguaggio</strong> standard per i Data Base ManagementSystem (DBMS) nel 1986.


<strong>SQL</strong>: Structured Query Language3Generalita’<strong>SQL</strong> è un <strong>linguaggio</strong> “relazionalmente completo”<strong>SQL</strong> permette di definire, manipolare ed interrogare datirelazionali (unifica i linguaggi DDL, DML e QL)<strong>SQL</strong> è un <strong>linguaggio</strong> non procedurale<strong>SQL</strong> è costituito da un insieme di comandi relativamente ridottoC Language ProgramQuery <strong>SQL</strong>4SW- O.S.HWFile SystemRelational Data BaseManagement System (RDBMS)SW- O.S.File SystemHWFile(s)File(s)


5Caratteristiche di <strong>SQL</strong>• Linguaggio non procedurale: si specifica su quali dati si vuoleoperare, non come fare ad operare• Esegue operazioni su insiemi di righe e non su una riga per volta• Contiene primitive per:– Data Definition Language (DDL)creare, distruggere strutture dati– Data Manipulation Language (DML)inserire, cancellare, modificare dati– Query Language (QL)eseguire ricerche (interrogazioni) sui dati (selezioni,proiezioni, unioni)• E’ un <strong>linguaggio</strong> “mapping oriented”una query è la richiesta di una relazione ottenuta definendocome combinare le relazioni disponibili per ottenere larisposta desiderataUn esempio6Due tabelle usate dall’amministrazione di un’aziendaLa relazione PERSONALE descrive le persone che lavorano neidipartimenti dell’aziendaPERSONALEMATR NOME MANSIONE MGR DATA_ASS SALARIO DIPNO7782 ROSSI MANAGER 7839 10/3/90 2450 107839 VERDI PRESIDENTE 1/1/80 5000 107934 BIANCHI IMPIEGATO 7782 31/1/94 1300 107499 VIOLA VENDITORE 7698 15/6/93 1600 307521 BRUNI VENDITORE 7698 7/7/95 1250 307654 GRIGI VENDITORE 7698 5/9/95 1250 307698 GIALLI MANAGER 7839 12/10/89 2850 307844 NERI VENDITORE 7698 28/3/94 1500 307566 SCURI MANAGER 7839 20/4/92 3000 207369 CHIARI IMPIEGATO 7566 6/9/96 1000 207902 BIONDI ANALISTA 7566 12/2/95 1900 20


Un esempio7La relazione DIPARTIMENTI descrive i dipartimenti.DIPARTIMENTIDIPNO DIPNOME CITTA'10 CONTABILITA' GENOVA20 RICERCA BOLOGNA30 VENDITE MILANODDL: Create Table8CREATE [TEMPORARY] TABLE nomeTabella(nomeAttributo dominio [(size)] [valoreDiDefault] [vincoli]{, nomeAttributo dominio [(size)] [valoreDiDefault] [vincoli] }[altri vincoli])CREATE DOMAIN nomeDominio AS tipoDiDato[valoreDiDefault] [vincoli]DEFAULT


Tipi di Dato Elementari9<strong>SQL</strong> fornisce un insieme di tipi di dato (eventualmenteespandibile) per la definizione dei dati nelle colonne: Carattere o testo Bit (anche stringa di bit) Tipi numerici (integer, smallint, real, float…) Data (tempo)Sui tipi e’ possibile definire un valore di default.Tipi di Dato Elementari10CHARACTER [VARYING] [(Lunghezza)][CHARACTER SET NomeFamigliaCaratteri]BIT [VARYING] [(Lunghezza)]NUMERIC [(Precisione [, Scala])],DECIMAL [(Precisione [, Scala])]INTEGER, SMALLINTFLOAT [(Precisione)], REAL, DOUBLE PRECISIONDATE, TIME [(Precisione)], TIMESTAMP [(Precisione)]


Data type Storage size Description11BINARY 1 byte per character Any type of data may be stored in a fieldof this type. No translation of the data(for example, to text) is made. How thedata is input in a binary field dictates howit will appear as output.BIT 1 byte Yes and No values and fields thatcontain only one of two values.TINYINT 1 byte An integer value between 0 and 255.MONEY 8 bytes A scaled integer between– 922,337,203,685,477.5808 and922,337,203,685,477.5807.DATETIME(See DOUBLE)8 bytes A date or time value between the years100 and 9999.UNIQUEIDENTIFIER 128 bits A unique identification number used withremote procedure calls.REAL 4 bytes A single-precision floating-point valuewith a range of – 3.402823E38 to –1.401298E-45 for negative values,1.401298E-45 to 3.402823E38 forpositive values, and 0.Data type Storage size Description12FLOAT 8 bytes A double-precision floating-point value witha range of – 1.79769313486232E308to – 4.94065645841247E-324 fornegative values, 4.94065645841247E-324to 1.79769313486232E308 for positivevalues, and 0.SMALLINT 2 bytes A short integer between – 32,768 and32,767. (See Notes)INTEGER 4 bytes A long integer between – 2,147,483,648and 2,147,483,647. (See Notes)DECIMAL 17 bytes An exact numeric data type that holdsvalues from 1028 - 1 through - 1028 - 1.You can define both precision (1 - 28) andscale (0 - defined precision). The defaultprecision and scale are 18 and 0,respectively.TEXT 2 bytes per character Zero to a maximum of 2.14 gigabytes.IMAGE As required Zero to a maximum of 2.14 gigabytes.Used for OLE objects.CHARACTER 2 bytes per character Zero to 255 characters.


Esempio: Create Table senza vincoli13Esempio: creare la tabella PERSONALECREATE TABLE personale( matr int,dipno smallint,nome char(20),mansione char(20),mgr int,data_ass date,salario numeric);Esempio: Create Table senza vincoli14Esempio: creare la tabella DIPARTIMENTICREATE TABLE dipartimenti(dipno smallint,dipnome char(20),citta char(20));


Constraint: Vincoli nella Create Table15Single-field constraint:CONSTRAINT name{REFERENCES foreigntable[(foreignfield1, foreignfield2)][ON ]}I piu’ diffusi sono i vincoli di integrita’ referenziale (vincoli diriferimento). Per la loro definizione <strong>SQL</strong> mette a disposizione ilvincolo di foreign key (chiave esterna).Constraint: Vincoli nella Create Table16 NOT NULL (indica che il valore nullo non e’ ammesso). UNIQUE (indica che il valore corrispondente sia unico, cioe’ righedifferenti non possono possedere gli stessi valori). PRIMARY KEY (chiave primaria - puo’ essere specificato una solavolta per ogni tabella. La definizione di PK non ammette il valorenullo!).


Constraint: Vincoli nella Create Table17Multiple-field constraint:CONSTRAINT nome {PRIMARY KEY (primary1[, primary2 [, ...]]) |UNIQUE (unique1[, unique2 [, ...]]) |NOT NULL (notnull1[, notnull2 [, ...]]) |FOREIGN KEY [NO INDEX] (ref1[, ref2 [, ...]])REFERENCES foreigntable[(foreignfield1 [, foreignfield2 [, ...]])][ON UPDATE CASCADE | SET NULL][ON DELETE CASCADE | SET NULL]}Esempio: Create Table con vincoli18Esempio: creare la tabella DIPARTIMENTICREATE TABLE dipartimenti(dipno smallint constraint pk1 primary key,dipnome char(20),citta char(20));


Esempio: Create Table con vincoli19Esempio: creare la tabella PERSONALECREATE TABLE personale( matr int constraint pluto primary key,dipno smallintconstraint fk1 foreign key (dipno)references dipartimenti (dipno),nome char(20),mansione char(20),mgr int constraint fk2 references personale (matr),data_ass date,salario numeric);DDL: Drop Table20DROP TABLE tabella [RESTRICT | CASCADE];Esempio: distruggere la tabella PERSONALEDROP TABLE personale


DDL: Alter Table21ALTER TABLE table {ADD { COLUMN defAttributo |CONSTRAINT defVincolo] } |ALTER { COLUMN nomeAttributo< SET DEFAULT default | DROP DEFAULT>} |DROP { COLUMN nomeAttributo |CONSTRAINT nomeVincolo }}DDL: Alter Table22Esempio: alterare la struttura della tabella PERSONALEALTER TABLE personale drop constraint fk1ALTER TABLE personale add column stato_civile char(20)ALTER TABLE personale drop column stato_civileEsempio: alterare la struttura della tabella DIPARTIMENTIALTER TABLE dipartimenti alter column dipno char(20) notnull


DML: Modificare il contenuto delletabelle<strong>SQL</strong> fornisce dei comandi per la modifica dei dati nelle tabelle:inserimento o cancellazione di righe, cancellazione di una tabella,cancellazione di una colonna.23Multiple-record append query:INSERT INTO target [(field1[, field2[, ...]])] [INexternaldatabase]SELECT [source.]field1[, field2[, ...]FROM tableexpressionDML: Modificare il contenuto delletabelleSingle-record append query:24INSERT INTO target [(field1[, field2[, ...]])]VALUES (value1[, value2[, ...])UPDATE tableSET field = newvalueWHERE criteriaDELETE FROM tableWHERE criteria


DML: Esempi25INSERT INTO personaleVALUES (‘7782’, ‘ROSSI’, ‘MANAGER’, ‘7839’, 2450,‘10’)UPDATE personaleSET salario = salario * 1,2DELETE FROM personaleQL: Select26SELECT [predicate]{ * | table.* | [table.]field1 [AS alias1][, [table.]field2 [AS alias2] [, ...]]}FROM tableexpression [, ...] [IN externaldatabase][WHERE... ][GROUP BY... ][HAVING... ][ORDER BY... ]


QL: I predicati di Select27SELECT [ ALL |DISTINCT |[TOP n [PERCENT]]]FROM tableQL: La clausola Where di SelectPermette di definire condizioni logiche• AND congiunzione• OR disgiunzione• NOT negazione• (...) parentesi28attraverso l’uso di operatori quali= uguaglianza>= maggiore o uguale


QL: La clausola Where - Esempi29• Visualizzare il contenuto di una tabellaSELECT * FROM PERSONALE;• Proiettare campi di una tabellaSELECT DIPNO, MANSIONE FROM PERSONALE;SELECT DISTINCT DIPNO, MANSIONE FROMPERSONALE; (vera PROJECT)• Selezionare le righe di una tabella in base ad una condizionesemplice (SELECT)SELECT * FROM DIPARTIMENTI WHERE DIPNO=‘20’;SELECT * FROM PERSONALE WHEREMANSIONE=‘VENDITORE’;QL: La clausola Where - Esempi• Selezionare le righe di una tabella in base ad una condizionecomplessa (AND)SELECT * FROM PERSONALEWHERE MANSIONE=‘VENDITORE’AND SALARIO >= 1300;30• Selezionare le righe di una tabella in base ad una condizionecomplessa (OR)SELECT * FROM PERSONALEWHERE MANSIONE=‘VENDITORE’OR SALARIO >= 1300;


QL: La clausola Where - Esempi• Alcuni esempi31SELECT * FROM PERSONALE WHERE DIPNO ‘20’;SELECT * FROM PERSONALEWHERE MANSIONE IN (‘VENDITORE’, ‘IMPIEGATO’);SELECT * FROM PERSONALEWHERE MANSIONE NOT IN (‘VENDITORE’,‘IMPIEGATO’);SELECT * FROM PERSONALEWHERE SALARIO BETWEEN 2500 AND 4000;SELECT NOME, SALARIO FROM PERSONALEWHERE NOME LIKE ‘G%’;QL: La clausola Where - Esempi32• Selezionare le righe con un campo per cui non è specificato unvalore (NULL)SELECT NOME FROM PERSONALE WHERE MGR ISNULL;viceversaSELECT NOME FROM PERSONALE WHERE MGR IS NOTNULL;


QL: La clausola Where - Esempi33• Selezionare le righe di una tabella secondo un ordine specificato(ORDER BY)SELECT NOME FROM PERSONALE WHERE DIPNO=‘20’ORDER BY NOME;SELECT NOME, SALARIO FROM PERSONALEORDER BY SALARIO DESC;SELECT NOME, SALARIO FROM PERSONALEORDER BY SALARIO,NOME;QL: La clausola Where - Esempi34• Ridefinire il nome delle colonne con etichette (AS)SELECT NOME AS DIPENDENTE FROM PERSONALE;• Calcolare espressioni in un querySELECT NOME, SALARIO*12 AS REDDITO_ANNUOFROM PERSONALE ORDER BY NOME;


QL: La clausola Where - Esempi35• Alcune funzioni che si applicano su insiemi di record (groupfunction):COUNT(*) conta il numero di recordMAX(...), MIN(...) trova il massimo, minimo in una colonnaAVG(...) calcola la media dei valori in una colonnaSUM(...) somma i valori di una colonnaSELECT SUM(SALARIO) FROM PERSONALE WHEREDIPNO=‘10’;QL: Le Join• La JOIN senza condizioni: il prodotto cartesiano delle tabelleSELECT * FROM PERSONALE, DIPARTIMENTI;NOTA: il nome di un campo è univocamente identificato comeTabella.campo36• La JOIN naturaleSELECT * FROM PERSONALE, DIPARTIMENTIWHERE PERSONALE.DIPNO = DIPARTIMENTI.DIPNO;• Eseguire una SELECT, JOIN e PROJECT relazionale con una solaSELECT <strong>SQL</strong>SELECT NOME, DIPNOME FROM PERSONALE,DIPARTIMENTIWHERE SALARIO>1500AND PERSONALE.DIPNO = DIPARTIMENTI.DIPNO;


QL: Le Join37• Definire etichette (alias) per i nomi delle tabelleSELECT NOME, DIPNOME FROM PERSONALE P,DIPARTIMENTI DWHERE P.DIPNO = D.DIPNO;• La SELF-JOIN (unire la tabella con se stessa).Esempio: trovare il nome dei superiori di ciascun dipendenteSELECT A.NOME AS Dipendente, B.NOME AS SuperioreFROM PERSONALE A, PERSONALE BWHERE A.MGR = B.MATR;QL: Le Join38• La TETA-JOIN: JOIN definita con condizioni generaliEsempio: trovare chi guadagna più di RossiSELECT A.NOME, A.SALARIO FROM PERSONALE A,PERSONALE BWHERE A.SALARIO>B.SALARIOAND B.NOME = ‘ROSSI’;


QL: Outer e Inner JoinLe Join effettuano un confronto fra una o piu’ colonne di unatabella e una o piu’ colonne in una o piu’ tabelle.39I tipi di join sono:• INNER JOIN: vengono selezionate solo le righe del prodottocartesiano per cui la condizione risulta vera.• OUTER JOIN: ha il compito di mantenere tutte le righe che fannoparte di una o di entrambe le tabelle coinvolte (anche quandonon ci sono corrispondenze).• LEFT: esegue una INNER JOIN esteso con le righe dellarelazione che compare a sinistra nel join per le quali non esisteuna corrispondente riga nella tabella di destra.• RIGHT: esegue una INNER JOIN restituendo anche le righeescluse della relazione di destra.• FULL: esegue una INNER JOIN restituendo anche le righeescluse di entrambe le relazioni.QL: Outer e Inner Join40SELECT nome_cliente, vendite.codice_cliente, quantitàFROM clienti INNER JOIN venditeON clienti.codice_cliente=vendite.codice_clienteTabella ClientiNome Cliente Codice_ClienteAdam Barr 1Sean Chai 2Eva Corets 3Erin O’Melia 4Tabella VenditeCodice_Cliente Codice_Prodotto Quantità1 2 151 3 54 1 373 5 114 2 1003Tabella RisultatiNome_Cliente Codice_Cliente QuantitàAdam Barr 1 15Adam Barr 1 5Erin O’Melia 4 37Eva Corets 3 11Erin O’Melia 4 1003


QL: Outer e Inner Join41SELECT nome_cliente, vendite.codice_cliente, quantitàFROM clienti LEFT JOIN venditeON clienti.codice_cliente = vendite.codice_clienteTabella ClientiNome Cliente Codice_ClienteAdam Barr 1Sean Chai 2Eva Corets 3Erin O’Melia 4Tabella VenditeCodice_Cliente Codice_prodotto Quantità1 2 151 3 54 1 373 5 114 2 1003Tabella RisultatiNome_Cliente Codice_Cliente QuantitàAdam Barr 1 15Adam Barr 1 5Erin O’Melia 4 37Eva Corets 3 11Erin O’Melia 4 1003Sean Chai NULL NULLQL: Outer e Inner JoinFROM table1 [ LEFT | RIGHT ] JOIN table2ON table1.field1 compopr table2.field242• La OUTER-JOIN: unisce anche i record che non hannocorrispondenzeEsempio: listare il nome di tutti i dipendenti con il nomedell’eventuale superioreSELECT a.nome AS Dipendente, b.nome AS CapoFROM personale aLEFT JOIN personale b ON a.mgr=b.matr;• LEFT (RIGHT) JOIN: i record della tabella di sinistra (destra)della condizione vengono uniti anche senza un corrispondentenella tabella di destra (sinistra).


QL: Le sub-query43Una sub-query è una query che contiene un’altra query.Le sub-query si distinguono in:• sub-query che ritornano un sola rigaesempio: trovare chi guadagna più di RossiSELECT NOME FROM PERSONALE WHERESALARIO > (SELECT SALARIO FROM PERSONALEWHERE NOME = ‘ROSSI’);QL: Le sub-query44• sub-query che ritornano più righeesempio: trovare chi guadagna più di tutti quelli deldipartimento 20SELECT NOME FROM PERSONALE WHERESALARIO > ALL(SELECT SALARIO FROM PERSONALEWHERE DEPNO = ‘20’);(ALL = tutti gli elementi; ANY = almeno un elemento)


QL: Le sub-query45• sub-query il cui risultato dipende dalla query principaleesempio: trovare chi guadagna più della media del propriodipartimentoSELECT NOME FROM PERSONALE AWHERE SALARIO >(SELECT AVG(SALARIO) FROM PERSONALE BWHERE B.DIPNO = A.DIPNO);• è possibile inserire più sub-query in AND o OR tra loro• è possibile inserire sub-query dentro altre sub-queryQL: La clausola Group By46• La clausola GROUP BY permette l’indicazione di sottinsiemi direcord della tabella su cui possono essere eseguite funzioni digruppo.Esempi:- La somma di tutti gli stipendiSELECT SUM(SALARIO) FROM PERSONALE;- La somma degli stipendi per ciascun dipartimentoSELECT DIPNO, SUM(SALARIO)FROM PERSONALEGROUP BY DIPNO;- La somma degli stipendi per ciascun dipartimento con più di4 dipendentiSELECT DIPNO, SUM(SALARIO) FROM PERSONALEGROUP BY DIPNO HAVING COUNT(*)>4;


QL: La clausola Group By47• la clausola WHERE agisce sui record prima della formazione deigruppi• la clausola HAVING agisce sui record dopo la formazione deigruppi• i gruppi si possono formare anche sulla base di più campi; adesempioSELECT DIPNO, MANSIONE, COUNT(*) FROM PERSONALEGROUP BY DIPNO, MANSIONE;QL: Gli operatori d’insieme48• L’operatore UNION permette di unire il risultato ottenuto daquery distinte• L’operatore INTERSECT permette di intersecare il risultatoottenuto da query distinte• L’operatore EXCEPT permette di sottrarre il risultato ottenuto daquery distinte

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!