Linguaggio SQL

Darèios89
Non ho ben capito l' utilità della funzione GROUP BY e poi la differenza tra COUNT(*) e COUNT(Attributo) e COUNT(Distinct).

Faccio un esempio:

STUDENTE( Matricola, Nome, Cognome, Indirizzo);
ESAMI( Matricola, Id_Corso, Voto);
CORSI(Id_Corso, Nome);


Una query è:

Q4: Elenco degli studenti che hanno sostenuto tutti gli esami, cioè che hanno dato tutti i
corsi disponibili;


E la soluzione:

SELECT Matricola
FROM Esami
GROUP BY Matricola
HAVING COUNT(*)= (SELECT COUNT(*)
FROM Corsi);


Allora GROUP BY è utile perchè al posto di avere le matricole tutte miste le riordino tutte in colonna in base a quanti esami ci sono, ma per esempio perchè abbiamo HAVING COUNT(*) se ci fosse stato HAVING COUNT(Matricola) cosa sarebbe cambiato? E con l' uso del distinct?
Io so che COUNT asteriscato conta le righe di una tabella, ma così se noi le contiamo tutte non includiamo le matricole differenti nel conto degli esami?

Risposte
nessuno.nobody
Allora, GROUP BY ti serve, quando non ti interessano nel dettaglio i record, ma solo i raggruppamenti.
Hai una tabella con 1000000 record, ogni record ha i seguenti campi: nome, cognome, id
Vuoi contare quanti cognomi diversi ci sono? Li raggruppi con una GROUP BY e conti i valori presenti in questa nuova tabella (si, perché group by ti crea una nuova tabella temporanea).

La differenza tra, count(*) e count(`colonna`) è che la seconda è più performante della prima, specialmente se `colonna` è una chiave (e quindi è indicizzata per gli accessi rapidi).

SELECT DISTINCT ecc, serve quando vuoi avere una tabella senza record ripetuti (in toto o in parte).

hamming_burst
"nessuno.nobody":
La differenza tra, count(*) e count(`colonna`) è che la seconda è più performante della prima, specialmente se `colonna` è una chiave (e quindi è indicizzata per gli accessi rapidi).

questa differenza che citi non è quella del linguaggio. Forse è un'ottimizzazione interna di qualche DB in particolare, ma che non conosco.

nel linguaggio SQL l'operatore aggregato COUNT è così formattato: COUNT (*|[DISTINCT|ALL] Attributi)

*: restituisce il numero di tutte le tuple
DISTINCT: restituisce il numero di diversi valori in Attributi
ALL: restituisce il numero di tutte le tuple diverse dal valore nullo in Attributi

se si omette DISTINCT o ALL, si assume ALL come default. Perciò COUNT(`colonna`) sta ad indicare COUNT(ALL `colonna`), dove si enumerano tutte le tuple in "colonna" diverse da null.

Darèios89
Grazie hamming, più o meno ci sono, l' unica cosa che non ho capito è come utilizzarlo nel caso di HAVING.
Cioè se io scrivo:

SELECT Id_classe
FROM Nave
GROUP BY Id_classe
HAVING COUNT(*)=1 ;


Preso da un altro esercizio, io suppongo di avere dei record id_classe raggruppati e per ogni gruppo faccio il conto, cioè per esempio:

id_classe
123
123
565
346
765

Ora la mia interrogazione restituirebbe le ultime tre tuple, poichè si fa il conto sul gruppo e dove io trovo più tuple uguali queste non soddisfano la mia condizione.
Se io al posto di HAVING COUNT(*) usassi HAVING COUNT(id_classe)....... cosa sarebbe cambiato?
E se avessi messo HAVING COUNT(DISTINCT id_classe) ?

hamming_burst
"Darèios89":

id_classe
123
123
565
346
765

Ora la mia interrogazione restituirebbe le ultime tre tuple, poichè si fa il conto sul gruppo

ok.
e dove io trovo più tuple uguali queste non soddisfano la mia condizione.

no attento, la condizione non è soddisfatta se la cardinalità dei sottoinsiemi è >1


Se io al posto di HAVING COUNT(*) usassi HAVING COUNT(id_classe)....... cosa sarebbe cambiato?

in questo caso non c'è differenza, rileggi il post sopra per il perchè.
Se fosse così il risultato della tua interrogazione:

id_classe
123
123
565
346
765
null
null

che cosa pensi accadrebbe?

E se avessi messo HAVING COUNT(DISTINCT id_classe) ?

in questo caso si tiene conto di tuple tutte diverse perciò il risultato sarebbe:

123
565
346
765

Darèios89
Oook ora credo di avere capito....grazie.^^

Mhhh.....hamming_burst......tu una volta eri hum_burst.... :-D

hamming_burst
"Darèios89":
Oook ora credo di avere capito....grazie.^^

ok, se hai domande basterà postare.

Mhhh.....hamming_burst......tu una volta eri hum_burst.... :-D

il fu ham_burst :D
ho fatto un'evoluzione, diciamo che la contrazione "ham" non dava il giusto risalto al vecchio Richard Hamming (premio Turing) tutto qui :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.