Estratto del documento

Operatori Aggregati

SUM, AVG, MAX, MIN, COUNT sono operatori che si utilizzano nella riga SELECT al posto della sequenza di attributi. Non è possibile utilizzarli contemporaneamente.

L'operatore SUM richiede come argomenti dei numeri, in quanto è un operatore di somma. Quando viene eseguito, il risultato ottenuto è una sola riga.

Per assegnare un nome alla colonna ottenuta nella riga SELECT, è possibile utilizzare l'istruzione AS seguita dal titolo desiderato.

L'operatore SUM somma tutti i valori e non considera i valori NULL. È possibile utilizzare l'operatore aggregato due volte come segue:

L'operatore AVG può essere utilizzato solo su numeri e calcola la media aritmetica della colonna indicata. Anche in questo caso, i valori NULL non vengono considerati. Quindi, se ho 2 valori e uno NULL, sommerò i 2 valori e dividerò per 2, non per 3 come siamo soliti fare, perché i NULL vengono scartati.

Gli operatori MIN e MAX possono essere utilizzati anche su valori non numerici.

numerici.COUNTSi può usare in tre modi diversi

  1. mi restituisce il numero di righe, ossia quanti sono gli impiegati
  2. Distinct mi restituisce il numero di valori differenti, ossia senza ripetizioni, presenti nella colonna mansione. Per esempio 5 è il numero di mansioni differenti
  3. All mi restituisce il numero di righe della relazione “premio P” in cui c’è un valore, ossia esclude le righe contenenti NULL. Mi restituisce il numero di duple che hanno davvero un valore effettivo

Se voglio utilizzare gli operatori aggregati su dati che non coinvolgono solo una tabella, quando coinvolgo più tabelle posso scriverle dividendole con una virgola (così che mi restituisca il prodotto cartesiano), oppure con la relazione JOIN. Count, così come tutti gli altri operatori, viene eseguito per ultimo dopo tutte le altre istruzioni. Mi da le righe che si combinano correttamente, ossia combinazioni corrette tra impiegati e dipartimenti, più le

righe di impiegati che non hanno corrispondenti in dipartimenti

Altro esempio

Altro esempio

Errore!! Non si può mettere un attributo con un operatore nella sezione select

Se due colonne appartenenti a tabelle diverse hanno lo stesso nome

Se combino relazioni con attributi aventi lo stesso nome, prima di indicare la colonna che voglio proiettare devo mettere la tabella da cui lo voglio estrarre, per esempio studenti.nome. se i nomi li volevo estrarre dalla tabella corsi scrivevo corsi.nome

Altro esempio

ORDER BY messa come ultima clausola del costrutto. Dopo del quale metto gli attributi rispetto a cui voglio ordinare le righe che ho. Se per esempio metto solo order by cognome, mi restituisce i dati ordinati in senso crescente rispetto al cognome, se invece li voglio ordinati in senso decrescente uso la parola DESC. Se uso 2 attributi, vuol dire che le duple vengono ordinate secondo il primo attributo, in questo caso il cognome, e a parità di cognome, per esempio 2 persone di cognome rossi,

Vengono ordinati secondo il nome.

Altro esempio:

Se mi interessa un elenco di matricole, contenenti gli studenti che hanno sostenuto almeno un esame, devo scrivere:

Per eliminare i duplicati, ad esempio se mi viene restituito lo stesso studente ripetuto più volte perché ha passato più esami, uso DISTINCT.

Nella clausola FROM indico la relazione e eventualmente come devono essere utilizzate tra di loro con la clausola JOIN.

Osserva se nella clausola SELECT c'è l'utilizzo o meno degli operatori aggregati (SOME, COUNT (numero di righe), MAX (valore massimo), SUM...), che sono indici che mi permettono di ottenere informazioni specifiche della tabella. Infatti, restituiscono una riga con un'informazione specifica.

TERZA MODALITÀ:

Nella clausola FROM si possono mettere più relazioni e si può anche utilizzare la clausola WHERE.

Nella clausola GROUP BY vanno scritti degli attributi, da uno a più. Attributi della relazione "impiegati", ossia attributi che si riferiscono alla...

relazione indicata in from. Non ha senso mettere attributi che sono chiave della relazione. In select in questo caso, metto un operatore aggregato, in questo caso count(*), che mi conta il numero di righe in cui la mansione riportata è di quel tipo, per esempio ingegnere, ma posso (non obbligatoriamente) aggiungere anche gli attributi presenti in group by. Mandando in esecuzione, essendoci un select, il risultato è una tabella (che può non avere righe, ma è pur sempre una tabella). Il numero di colonne è sempre determinato da ciò che indico nella riga select. Le righe che otteniamo nel risultato sono esattamente il numero di mansioni che ci sono nella tabella impiegati. Così non va bene!! Non posso mettere in select "stipendio", perché non è presente nella clausola Group by. Posso invece fare così, ossia non indicare quanto presente nella group by anche in select. Però in questo caso, per esempio, mettere

mansione anche in select può aiutarmi perché mi fa capire che il numero 6 è associato al numero di volte che si ripete una certa mansione, ossia l'ingegnere. Se in select non metto gli operatori aggregati, la funzione group by non serve a nulla. Se voglio ottenere la lista delle mansioni faccio svolgere questa funzione di seguito, non la group by

Altro esempio: Ossia mi conta le relazioni incrociate, per esempio ingegneri nel dipartimento x, dirigenti nel dipartimento x... Se per esempio voglio sapere per ogni esame quanti studenti l'hanno superato, userò un meccanismo di questo tipo. Divido le righe in base al fatto che sia lo stesso esame.

Altro esempio: Siccome impID è la chiave della relazione, ossia non ci sono impiegati con lo stesso impID, non ha senso svolgere questa funzione di raggruppamento, perché tanto mi viene restituita la lista di tutti gli impiegati con il count di 1. La forma più semplice se voglio ottenere la lista

La seguente è la descrizione della clausola GROUP BY e della clausola HAVING nel contesto degli impiegati:

Quando, e solo se, c'è la clausola GROUP BY, posso aggiungere la clausola HAVING, il cui effetto è simile alla clausola WHERE, che è un filtro sulle righe. Infatti, HAVING è un filtro sui gruppi che sono stati formati. Solitamente in HAVING vanno usati gli operatori aggregati.

Sto richiedendo di farmi vedere solo i gruppi in cui il numero di duple è maggiore di 3.

Esempio: SELECT from usato con più relazioni. In questo caso sia impiegati che dipartimenti. Il FROM ci restituisce una tabella con prodotto cartesiano tra impiegati e dipartimenti. Sulla quale tabella viene svolta la GROUP BY.

Se fosse stato anche con la clausola WHERE, come di seguito, prima eseguiva l'indicazione nella FROM, poi applicava la clausola WHERE, poi la GROUP BY.

ESERCIZIO

Apri il file che contiene le istruzioni MySQL, fai SELECT ALL, fai COPY, apri MySQL, crea un nuovo database. Creato, lo metto come database di default. Copio nello schermo.

bianco le istruzioni e mando in esecuzione le informazioni copiate. Ossia significa che non ci possono essere duple con tutti e 3 i parametri uguali

<p>Chiave esterna, ossia CF, significa che serve come collegamento alla relazione cliente, nel senso che accumuna bollette e clienti e i permette di associare i vari dati</p>

<p>Svolgimento istruzione 1</p>

<p>Potrei fermarmi qui, ma anche se non è richiesto posto aggiungere la chiave primaria e quindi ottenere</p>

<p>Mando in esecuzione per vedere se è tutto corretto, quindi mi uscirà un tic verde in basso e verifico che la tabella furniture si sia creata correttamente.</p>

<p>Svolgimento istruzione 2</p>

<p>Devo utilizzare una istruzione di select</p>

<p>La tabella clienti, per svolgere questa istruzione, non mi serve perché il CF è già presente anche nell'altra tabella.</p>

<p>Per ottenere il cliente e a fianco il numero di bollette pagate: From prende l'intera tabella bollette, poi con where gli dico di utilizzare determinate righe, ossia gli</p>

devo dire che DataP non deve essere null.

Per tradurre la terza clausola, scrivo Mandando in esecuzione ottengo:

Su questa tabella devo applicare un raggruppamento, ossia la funzione group by, ossia raggruppo in base al CF.

Il numero di righe con lo stesso CF mi restituisce il numero di bollette pagate.

Svolgimento alternativo:

Non va bene count(*), non devo scriverlo, perché mi restituisce le bollette emesse, non quelle pagate. Invece devo usare l'istruzione count all che conta il numero di valori non nulli in ogni gruppo, e a differenza dello svolgimento sopra, mi dà anche chi ha delle bollette emesse ma non pagate, per esempio il cliente C.

Per verificare che sia tutto corretto, devo fare delle prove modificando i dati del database.

Domanda di teoria: Indica quali delle seguenti stringhe rende vero il seguente predicato SQL: Pescivendolo e beccuccio vanno bene.

Esercizio:

Coinvolge le tabelle "principio attivo" e "ordini". Devo vedere l'ordine in corrispondenza...

del principio attivo ordinato, allora uso la JOIN. Ossia il principio attivo della tabella ordine deve corrispondere con il principio attivo della tabella principio attivo. Affinché non ci siano duplicati, uso SELECT DISTINCT. Mandando in esecuzione otterrò, senza duplicazioni, i vari nomi dei principi attivi ordinati. 1. Voglio sapere quali sono i principi attivi non ordinati. Ottengo così i dati ordinati, ma io voglio sapere i dati non ordinati, ossia faccio una differenza insiemistica tra tutti i nomi dei farmaci, meno il nome dei farmaci ottenuti ordinati. Ottengo l'insieme dei principi attivi totali. Per fare differenza insiemistica uso operatori che relazionano tra di loro due SELECT FROM, ossia in questo caso il NOT IN: Ottengo i seguenti principi non ordinati: Oppure alternativamente alla differenza insiemistica posso fare: Infatti la parte che non ha corrispondenza, in questo caso ottenuta usando il RIGHT JOIN, sono proprio i principi attivi che non sono ordinati.
  1. Per ottenere tutti i dati, uso il tag SELECT *. Alla fine, per ottenere solo il nome del principio attivo, uso il tag SELECT DISTINCT name.

  2. Per ogni principio attivo, voglio sapere quante volte l'ospedale ha inviato un ordine (se non è mai stato ordinato sarà 0). Ottengo questo risultato, ma così mancano i principi attivi non ordinati. Allora l'operazione che dovrei fare è un'union tra i due insiemi: quello dei principi ordinati e quelli non ordinati. Se faccio l'union, devo farla solo se hanno lo stesso numero di colonne. La riga 3 ne ha 2, invece nella riga 1 ne ha solo 1, quindi aggiungo 0 perché non sono mai stati ordinati. Scrivo SELECT DISTINCT principio_attivo perché voglio avere il codice del principio attivo, non il nome. Così ottengo:

  3. Estrarre l'elenco dei farmaci che sono stati ordinati più volte. Per ognuno dei farmaci presenti nella tabella, calcolo quante volte è stato ordinato. Quindi scrivo:

Anteprima
Vedrai una selezione di 18 pagine su 84
Appunti informatica generale, mySQL e python Pag. 1 Appunti informatica generale, mySQL e python Pag. 2
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 6
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 11
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 16
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 21
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 26
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 31
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 36
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 41
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 46
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 51
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 56
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 61
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 66
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 71
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 76
Anteprima di 18 pagg. su 84.
Scarica il documento per vederlo tutto.
Appunti informatica generale, mySQL e python Pag. 81
1 su 84
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Fedecape01 di informazioni apprese con la frequenza delle lezioni di Informatica generale e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Milano - Bicocca o del prof Avellone Alessandro.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community