|
|
|
![]() |
|
Strumenti |
![]() |
#1 | ||
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
[SQL] Preparando l'esame di Basi di Dati... aiuti e consigli..
Ciao a tutti, se ho la seguente Basi di Dati:
Quote:
Quote:
Codice:
Select distinct Ndipart, NomeDipart from dipart where Ndipart in (Select distinct Ndipart from imp group by Ndipart having avg(Stip) > 1000 ) 1)Se è possibile mettere nella Select il solo attributo del group by tralasciando quello usato nella having. 2)Quando uso nella where la strategia "attributo in ( nuova query )" il risultato della query interna deve dare solo il singolo attributo di confronto della query esterna? Cioè nella Select interna deve esserci solo e soltanto l'attributo di confronto? Come sempre grazie ![]()
__________________
![]() Ultima modifica di luxorl : 22-01-2009 alle 09:58. |
||
![]() |
![]() |
![]() |
#2 | |||
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
La prima perche' per forza non potrai che avere dipartimenti distinti, essendo la chiave della tabella dipart contenuta nella clausola SELECT La seconda perche' la DISTINCT e' implicita nella clausola IN (subselect) Quote:
Quote:
Da SQL-Standard e' possibile avere un solo parametro di confronto di gruppo. Alcune estensioni dell'SQL (Oracle) prevedono l'uso anche di T-uple per questa condizione, es Codice:
... WHERE (IDDipart, IDNazione) IN (SELECT IDDipart,IDNazione FROM ...) In SQL-Standard si sarebbe dovuto scrivere storture simili a Codice:
... WHERE (IDNazione*100000+IDDipart) IN (SELECT IDNazione*100000+IDDipart FROM ...)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|||
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Grazie delle risposte, gentilissimo. Tutto chiaro.
![]()
__________________
![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Bene.
Quote:
Puoi mettere zero o piu' elmenti della GROUP BY zero o piu' costanti zero o piu' funzioni di gruppo ciascuna delle quali dipendenti da zero o piu' elementi della GROUP BY zero o piu' funzioni normali che accettino zero o piu' dei qualsiasi dei valori precedenti (fatto salvo che almeno un elemento occorre selezionarlo) Quindi, puoi anche evitare di mettere la funzione di gruppo scelta per l'eventuale HAVING, oppure ne puoi anche mettere un'altra ES: Codice:
SELECT ID1, COUNT(ID3), ID2, 4, 5, 7, SUM(ID1)+SUM(ID2), AVG(ID1+ID2), Funzione(ID3, AVG(ID18), ID1*ID1+AVG(ID2+ID1) ) FROM... GROUP BY ID1, ID3, ID2, ID18 HAVING COV(ID3+ID2) > 10
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 16-01-2009 alle 12:24. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Ho dubbi sul Group By.
Come funziona quando si raggruppa su più attributi? Per esempio se ho una tabella formata da attributi x, y, z, k e faccio group by x, y, z in uscita cosa ottengo? k viene eliminato?
__________________
![]() |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Al termine avrai tanti record quante sono tutte le differenti T-Uple x,y,z PS: Non usare MySql per fare le prove o per studiare, in quanto non si comporta in modo standard a fronte della Group By.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Quote:
![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Ma esiste qualche programma che riempie in modo random ma coerente un DB?
![]()
__________________
![]() |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Davvero, non so se c'e' un parametro di compatibilita' per forzare MySql a comportarsi in modo standard a fronte delle GroupBy PostgresSql andrebbe meglio. E pure SqlServerExpress, che si installa con 2 click... Ma ancora meglio Oracle Express (che e' gratuito e si installa con 3 click) http://www.oracle.com/technology/pro.../xe/index.html Per un dB pronto per le prove, SqlServer se non sbaglio ti chiede se vuoi anche installare l'istanza chiamata Northwind o qualcosa di simile, con fatture, clienti, fornitori, etc. Per Oracle non mi risulta ci sia, e effettuare il restore di un database occorre imparare qualcosa in piu'.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Passiamo alle query toste d'esame
![]() Dato il seguente schema Università(u/nome, u/strada, u/città, a/a, num/fac) Comprende(u/nome, u/città, a/a, nome/laurea) CorsodiLaurea(nome/laurea, a/a, facoltà, durata) Organizza(nome/laurea, i/nome, u/nome, u/città, a/a, n/ore/lez, n/ore/es, nome/prof, annocorso, f/c) Appello(i/nome, nome/laurea, u/nome, u/città, n/ordine, a/a, data, ore, aula) Esame(i/nome, nome/laurea, u/nome, u/città, n/ordine, a/a, s/nome, risultato) Studente(s/nome, s/città, s/prov, matr, anno/nascita, nome/laurea, u/nome, u/città, a/a, annocorso) Piano(s/nome, a/a, i/nome, nome/laurea, annocorso) Orario(nome/laurea, i/nome, u/nome, u/città, a/a, giorno, ora, aula, capienza) Scrivere una richiesta SQL per conoscere quest'anno, università per università, quanti professori svolgono il corso di Analisi I in Facoltà di Ingegneria che abbiano attivato almeno 5 corsi di laurea ed abbiamo almeno 500 iscritti al primo anno. Mia soluzione Codice:
Select distinct o.u/nome, count(distinct o.nome/prof) From Organizza as o Where o.i/nome='Analisi I' and o.a/a='2008/09' and 4 < (Select count(distinct c.nome/laurea) From Corsodilaurea as c Where c.nome/laurea=o.nome/laurea and c.facoltà='Ingegneria' and 499 < (Select count(distinct s.s/nome) From Studente as s Where s.nome/laurea=c.nome/laurea and s.annocorso=1)) Group by o.u/nome ![]()
__________________
![]() Ultima modifica di luxorl : 26-01-2009 alle 10:33. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Si', c'e' qualcosa che non va.
La Distinct insieme alla GROUP BY non ha molto senso, essendo che per definizione il risultato della GROUP BY saranno tanti record quante le possibili combinazioni esistenti degli elementi messi in GROUP BY. Nel tuo caso e' gia' quello che vuoi ottenere (un record per ciascun nome di universita'), pertanto la DISTINCT e' superflua. Poi c'e' qualche casino. ti propongo di iniziare a risolvere la seguente: Codice:
Scrivere una richiesta SQL per conoscere quest'anno, università per università, quanti professori svolgono il corso di Analisi I in Facoltà di Ingegneria
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Quote:
Codice:
Select o.u/nome, count(distinct o.nome/prof) From Organizza as o, CorsodiLaurea as c Where o.i/nome='Analisi I' and o.a/a='2008/09' and c.facoltà='Ingegneria' and c.nome/laurea=o.nome/laurea and c.a/a=o.a/a Group By o.u/nome Codice:
Select o.u/nome, count(distinct o.nome/prof) From Organizza as o Where o.i/nome='Analisi I' and o.a/a='2008/09' and o.nome/laurea in (Select c.nome/laurea From CorsodiLaurea as c Where c.a/a='2008/09' and c.facoltà='Ingegneria') Group By o.u/nome
__________________
![]() |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Direi che e' giusta, pero', giusto perche' stai preparando l'esame, ti proporrei di usare la sintassi corretta che prevede la divisione netta tra le clausole di JOIN e quelle di WHERE
A me personalmente piace di piu' la prima delle 2 query, quindi scriverei qualcosa tipo Codice:
Select o.u/nome, count(distinct o.nome/prof) From Organizza as o JOIN CorsodiLaurea as c ON (o.nome/laurea = c.nome/laurea AND c.a/a=o.a/a) Where o.i/nome='Analisi I' and o.a/a='2008/09' and c.facoltà='Ingegneria' Group By o.u/nome
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:56.