840 likes | 1.02k Views
Corso di Basi di Dati. Il Linguaggio SQL Home page del corso : http:// www.cs.unibo.it /~ difelice / dbsi /. Il Linguaggio SQL. SQL ( Structured Query Language ) e’ il linguaggio di riferimento per le basi di dati relazionali . Diverse versioni del linguaggio :
E N D
Corso di Basi di Dati Il Linguaggio SQL Home page del corso: http://www.cs.unibo.it/~difelice/dbsi/
Il Linguaggio SQL • SQL (Structured Query Language) e’ illinguaggio di riferimento per le basi di datirelazionali. • Diverse versioni del linguaggio: • SQL-86 Costrutti base • SQL-89 Integrita’ referenziale • SQL-92 (SQL2) Modellorelazionale, struttura a livelli • SQL:1999 (SQL3) Modello ad oggetti • SQL:2003 (SQL3) Nuoveparti: SQL/JRT, SQL/XML • SQL:2006 (SQL3) Estensione di SQL/XML • SQL:2008 (SQL3) Lieviaggiunte
Il Linguaggio SQL • Due componentiprincipali: • DDL (Data Definition Language) • Contieneicostruttinecessari per la creazione/modificadelloschemadella base di dati. • DML (Data Manipulation Language) • Contieneicostrutti per le interrogazioni e di inserimento/eliminazione/modifica di dati.
Il Linguaggio SQL • Due componentiprincipali: • DDL (Data Definition Language) • Contieneicostruttinecessari per la creazione/modificadelloschemadella base di dati. • DML (Data Manipulation Language) • Contieneicostrutti per le interrogazioni e di inserimento/eliminazione/modifica di dati.
SQL: DML Esempio di interrogazione (query) Recuperarenome e cognomedellostudente con numero di matricolapari a 4678… STUDENTI
SQL: DML Le operazioni di interrogazionevengonoimplementate dal costrutto di select. select Attributo1, … AttributoM from Tabella1, … ,TabellaN where Condizione SEMANTICA: Effettuailprodottocartesianodelle Tabella1, .., TabellaN. Da queste, estrai le righecherispettano la Condizione. Di quest’ultime, preleva solo le colonnecorrispondenti a: Attributo1, …,AttributoM.
SQL: DML Nelcaso di una sola tabella: select Attributoi, Attributoj, … Attributom from Tabella where Condizione STEP1: Si selezionano le ennupledella tabellachesoddisfano la condizione … TABELLA e1 e2 e3 e4
SQL: DML Nelcaso di una sola tabella: select Attributoi, Attributoj, … Attributom from Tabella whereCondizione STEP2: Si selezionano le colonne/attributispecificatidalla SELECT … TABELLA e1 e2 e3 e4
SQL: DML Nelcaso di una sola tabella: select Attributoi, Attributoj, … Attributom from Tabella whereCondizione STEP3: Si costruisce la tabellarisultato … { Numero di colonnedefinitodallaclausolaSELECT { Numero di righe definitodalla clausolaWHERE
SQL: DML Esempio1. Selezionareinomidegliimpiegatichelavoranonell’ufficio A. IMPIEGATI SELECT NOME FROM IMPIEGATI WHERE (UFFICIO=“A”)
SQL: DML Esempio2. Selezionareicodicidegliimpiegaticheguadagnanopiu’ di 20000 euro annui. IMPIEGATI SELECT NOME FROM IMPIEGATI WHERE (STIPENDIO>20000)
SQL: DML Esempio3. Selezionarenomi e cognomidegliimpiegatichelavoranonell’ufficio B e guadagnanopiu’ di 20000 euro annui. IMPIEGATI SELECT NOME,COGNOME FROM IMPIEGATI WHERE ((STIPENDIO>20000) AND (UFFICIO=“B”))
SQL: DML La clausolawherespecificaqualirighedelletabelledevonocomparirenelrisultato finale. La condizionedellaclausolapuo’ contenereun’espressionebooleana, o unacombinazione di espressionimedianteglioperatoriand, or, not. SELECT CODICE FROM IMPIEGATI WHERE NOT((NOME=“Marco”) AND (UFFICIO=“A”))
SQL: DML Nellaclausolawhere, e’ possibilefareconfrontitrastringheusando l’operatorelike e l’utilizzo di wildcard: _ caratterearbitrario % sequenza di caratteriarbitraria. In questomodo, e’ possibiletrovaretutte le stringhecherispettano un certo pattern. Es: selezionareilcodice di tuttigliimpiegatiil cui nomeinizi per ‘M’, abbiauna‘r’ come terzocarattere, e termini per ‘o’. SELECT CODICE FROM IMPIEGATI WHERE (NOME LIKE ‘M_R%O’)
SQL: DML Nellaclausolawhere, l’operatoreinconsente di verificarel’appartenenza ad un certoinsieme di valori. Es. Trovareicodicidegliimpiegatiil cui stipendiosiacompresotrai 24000 edi 34000 euro annui. IMPIEGATI SELECT NOME FROM IMPIEGATI WHERE STIPENDIO IN (24000,34000)
SQL: DML Q. Cosaaccadenellaclausolawherein caso di valori NULL… Vengonoinclusinelrisultato finale? NO! IMPIEGATI SELECT NOME FROM IMPIEGATI WHERE (STIPENDIO > 20000)
SQL: DML In generale, SQL utilizzaunalogica a trevalori: true (T), false (F), unknown (U). EsistonoglioperatoriIS NULLedIS NOT NULL. IMPIEGATI SELECT NOME FROM IMPIEGATI WHERE ((STIPENDIO > 20000) OR (STIPENDIO IS NULL))
SQL: DML La clausolaselectspecificaqualicolonnedellerigheselezionatedevonocomparirenelrisultato finale. L’asterisco (*) indicatutte le colonnedellatabella. SELECT * FROM IMPIEGATI WHERE (NOME=“Marco”) AND (UFFICIO=“A”) IMPIEGATI
SQL: DML E’ possibileridenominare le colonne del risultato di una query attraversoilcostruttoas. SELECT NOME as Name, Cognome as LastName FROM IMPIEGATI WHERE (NOME=“Marco”) IMPIEGATI
SQL: DML E’ possibileusareespressioniaritmetiche (semplici) sui valoridegliattributi di unaSELECT. SELECT NOME as Name, Stipendio/12 as SalaryM FROM IMPIEGATI WHERE (NOME=“Marco”) IMPIEGATI
SQL: DML La clausolafromspecifica la listadelletabelle cui sideveaccedere (nelcaso #tabelle>1, sieffettuailprodottocartesianodellestesse). E’ possibilespecificaredegli alias per inomidelletabelle, medianteilcostruttoas: SELECT CODICE FROM IMPIEGATI AS I WHERE (NOME=“MARCO”)
SQL: DML Vediamo come funziona la SELECTsupiu’ tabelle. Es. Selezionareilnumero di telefonodell’impiegato con codice 145 . … IMPIEGATI SEDI
SQL: DML SELECT TELEFONO AS TEL FROM IMPIEGATI, SEDI WHERE (UFFICIO=UFFNUM) AND (CODICE=145) … COSA FA QUESTA QUERY?? IMPIEGATI SEDI
SQL: DML SELECT TELEFONO AS TEL FROM IMPIEGATI, SEDI WHERE (UFFICIO=UFFNUM) AND (CODICE=145) STEP1. Si effettuailprodottocartesianodelle due tabelle …
SQL: DML SELECT TELEFONO AS TEL FROM IMPIEGATI, SEDI WHERE (UFFICIO=UFFNUM) AND (CODICE=145) STEP2. Si selezionano le righe con valoricomuninelletuetabelle …
SQL: DML SELECT TELEFONO AS TEL FROM IMPIEGATI, SEDI WHERE (UFFICIO=UFFNUM) AND (CODICE=145) STEP3. Si selezionano le righe relative all’impiegato 145 …
SQL: DML SELECT TELEFONO AS TEL FROM IMPIEGATI, SEDI WHERE (UFFICIO=UFFNUM) AND (CODICE=145) STEP4. Si seleziona la colonnadell’attributoTelefono …
SQL: DML SELECT TELEFONO AS TEL FROM IMPIEGATI, SEDI WHERE (UFFICIO=UFFNUM) AND (CODICE=145) STEP5. Si costruisceilrisultato finale …
SQL: DML Q. Cheaccade se le tabelledellaclausolafrom hannoattributi con nomiuguali? SELECT TELEFONO AS TEL FROM IMPIEGATI, SEDI WHERE (UFFICIO=UFFICIO) AND (CODICE=145) ???? ERRORE!!! IMPIEGATI SEDI
SQL: DML In questicasi, sipuo’ utilizzare la notazioneNomeTabella.NomeAttributo per far riferimento ad un attributoin maniera non ambigua. SELECT TELEFONO AS TEL FROM IMPIEGATI, SEDI WHERE (IMPIEGATI.UFFICIO=SEDI.UFFICIO) AND (CODICE=145) SELECT TELEFONO AS TEL FROM IMPIEGATI AS I, SEDI AS S WHERE (I.UFFICIO=S.UFFICIO) AND (CODICE=145)
SQL: DML ATTENZIONE: Il risultato di una query SQL potrebbeavererigheduplicate! SELECT NOME AS NAME FROM IMPIEGATI AS I WHERE (STIPENDIO >20000) IMPIEGATI
SQL: DML Il costruttodistinct (nellaselect) consente di rimuovereiduplicatinelrisultato. Il costruttoall (nellaselect) NON rimuoveiduplicati (comportamento di default). SELECT DISTINCT NOME AS NAME FROM IMPIEGATI AS I WHERE (STIPENDIO >20000)
SQL: DML Nellaclausolawherepossonocomparirepiu’ istanzedellastessatabellamedianteglialias … Es. Selezionareinomideinonni di Matteo Bianchi. GENITORI
SQL: DML SELECT NOME, COGNOME FROM GENITORI, GENITORI WHERE (GENITORI.NOME=GENITORI.NOMEGEN) … ???? ERRORE!!! GENITORI
SQL: DML SELECT G2.NOMEGEN, G2.COGNOMEGEN FROM GENITORI AS G1, GENITORI AS G2 WHERE (G1.NOMEGEN=G2.NOME) AND (G1.COGNOMEGEN=G2.COGNOME) AND (G1.NOME=“MATTEO”) AND (G1.COGNOME=“BIANCHI”) GENITORI
SQL: DML Il costruttoorder byconsente di ordinare le righedel risultato di un’interrogazione in base al valore di un attributospecificato. order by Attributo1 [asc|desc], …, AttributoN[asc|desc] SELECT * FROM IMPIEGATI WHERE (UFFICIO=“A”) ORDER BY STIPENDIO Devecompariresempredopo la clausolawhere!
SQL: DML Supponiamo di volerscrivereunaquery per contareilnumero di Impiegatichelavoranonell’ufficio A. Problema: La SELECT vista fin qui opera a livello di tuple, e non a livello di colonne. .. IMPIEGATI Da questacolonnadovremmo estrarre un solo valore!
SQL: DML Glioperatoriaggregatisiapplicano a gruppi di tuple (e non tupla per tupla), e producono come risultato un solo valore. Vengono in genereinseritinellaselect, e valutatiDOPO la clausolawhere e from. count (* | [distinct|all] ListaAttributi) * siapplicasututtigliattributi, in praticacontailnumero di righe…
SQL: DML Glioperatoriaggregatisiapplicano a gruppi di tuple (e non tupla per tupla), e producono come risultato un solo valore. • sumListaAttributi • avgListaAttributi • minListaAttributi • maxListaAttributi
SQL: DML • SintassiGenerale: • SELECT OP(Attributo) • FROM ListaTabelle • WHERE Condizione sum max min avg count count(*) STEP 0: Si considerano le tabelle indicate nellaclausolaFROM TN T1 T2
SQL: DML • SintassiGenerale: • SELECT OP(Attributo) • FROM ListaTabelle • WHERE Condizione sum max min avg count count(*) STEP 1: Si effettuailprodottocartesianodelletabelle.
SQL: DML • SintassiGenerale: • SELECT OP(Attributo) • FROM ListaTabelle • WHERE Condizione sum max min avg count count(*) STEP 2: Si selezionano le righechesoddisfano la condizione del WHERE.
SQL: DML • SintassiGenerale: • SELECT OP(Attributo) • FROM ListaTabelle • WHERE Condizione sum max min avg count count(*) STEP 3: Si consideral’AttributodellaSELECT e siapplical’operatore aggregatosututtiivaloridellacolonna.
SQL: DML • SintassiGenerale: • SELECT OP(Attributo) • FROM ListaTabelle • WHERE Condizione sum max min avg count count(*) STEP 4: Dallacolonnasicalcolaun solo valore come risultatodella query Se non siusal’operatore AS, la colonnarisultato non ha un nome…
SQL: DML Es. Contareilnumero di strutturatichelavoranonelDipartimento di Fisica. STRUTTURATI
SQL: DML SELECT COUNT(*) AS CONTATORE FROM STRUTTURATI WHERE (DIPARTIMENTO=“FISICA”)
SQL: DML Es. Contare la sommacomplessivadeglistipendideglistrutturatidel dipartimento di Fisica. STRUTTURATI
SQL: DML SELECT SUM(STIPENDIO) AS TOTALE FROM STRUTTURATI WHERE (DIPARTIMENTO=“FISICA”)
SQL: DML Es. Estrarrecodice e stipendio del professoreassociatoche ha lo stipendiopiu’ alto ... ERRORE! SELECT CODICE, MAX(STIPENDIO) FROM STRUTTURATI WHERE (TIPO=“ASSOCIATO) L’operatoreaggregatorestituisceun solo valore, mentre la prima parte della select restituisceun valore per ognituplaselezionata!!! COME FARE? Con interrogazioniannidate(vedidopo …)
SQL: DML • Operatori di query visti fin qui: • SELECT ATTRIBUTI FROM WHERE Valutaivalori di ciascunarigain isolamento. • SELECT OP(ATTRIBUTI) FROM WHERE Valutaivaloridellerighecorrispondentiallecolonnedella SELECT in modoaggregato. • Q. Possibilita’ di combinarei due approcci?