Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-01-2009, 10:33   #1
luxorl
Senior Member
 
L'Avatar di luxorl
 
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:
IMP(Nimp, Nome, Ndipart, Lavoro, Diret, Stip)
DIPART(Ndipart, NomeDipart, Luogo)
USO(Ndipart, Parte)
Fornitura(Fornitore, Parte)
E la seguente richiesta:

Quote:
Elencare i nomi e i codici dei dipartimenti dove lo stipendio medio degli impiegati è < 1000
Che ne pensate della seguente soluzione? E' corretta?

Codice:
Select distinct Ndipart, NomeDipart
from dipart
where Ndipart in 
               (Select distinct Ndipart
                 from imp
                 group by Ndipart
                 having avg(Stip) > 1000 )
In particolare vorrei sapere:

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.
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 11:20   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da luxorl Guarda i messaggi
Ciao a tutti, se ho la seguente Basi di Dati:


E la seguente richiesta:



Che ne pensate della seguente soluzione? E' corretta?

Codice:
Select distinct Ndipart, NomeDipart
from dipart
where Ndipart in 
               (Select distinct Ndipart
                 from imp
                 group by Ndipart
                 having avg(Stip) > 1000 )
E' corretta, ma entrambe le DISTINCT sono superflue.
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:
In particolare vorrei sapere:

1)Se è possibile mettere nella Select il solo attributo del group by tralasciando quello usato nella having.
Se ho capito bene la domanda, in generale si puo' mettere anche solo la clausola GROUP BY (e' il caso piu' frequente), ma in questa situazione non risolveresti il tuo problema

Quote:
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
Si', anche perche' non avrebbe senso e non servirebbe SELECTionare altri campi, perche' la INNER query serve solo ed esclusivamente per cercare i valori da soddisfare per la clausola di appartenenza IN.

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 questo caso utile, p.es. se i codici di dipartimento sono univoci solo all'interno di una nazione.

In SQL-Standard si sarebbe dovuto scrivere storture simili a
Codice:
... WHERE (IDNazione*100000+IDDipart) IN (SELECT IDNazione*100000+IDDipart FROM ...)
in cui si puo' intuire chiaramente che l'ottimizzatore non puo' usare gli eventuali indici presenti sulle tabelle.
__________________
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 11:39   #3
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Grazie delle risposte, gentilissimo. Tutto chiaro.
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 12:16   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Bene.

Quote:
Originariamente inviato da luxorl Guarda i messaggi
1)Se è possibile mettere nella Select il solo attributo del group by tralasciando quello usato nella having.
Ho capito ora la domanda.
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2009, 10:02   #5
luxorl
Senior Member
 
L'Avatar di luxorl
 
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?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2009, 10:41   #6
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da luxorl Guarda i messaggi
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?
Certo, verra' eliminato.
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2009, 10:57   #7
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Certo, verra' eliminato.
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.
Noooooooooo... non mi dire così che mi sono appena fatto il bip per montare la BD dell'esame su MySql
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2009, 11:00   #8
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Ma esiste qualche programma che riempie in modo random ma coerente un DB?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2009, 11:02   #9
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da luxorl Guarda i messaggi
Noooooooooo... non mi dire così che mi sono appena fatto il bip per montare la BD dell'esame su MySql
Ecco, peccato.
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2009, 10:30   #10
luxorl
Senior Member
 
L'Avatar di luxorl
 
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
Secondo me sbaglio qualcosa voi che dite?
__________________

Ultima modifica di luxorl : 26-01-2009 alle 10:33.
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2009, 10:42   #11
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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
e poi di condire aggiungendo qualche clausola per filtrare via i restanti intrusi...
__________________
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2009, 11:09   #12
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
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
e poi di condire aggiungendo qualche clausola per filtrare via i restanti intrusi...
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
Che riscrivendo il join in modo più visibile potrei fare come:

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
Se è corretta provo ad arricchirla con le altre condizioni
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2009, 11:54   #13
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Grazie a GLIMPSE-17775 il telescopio spa...
Samsung Galaxy A27 5G è ufficiale...
TCL aggiorna la sua gamma di monitor per...
Anche OPPO avrà uno smartphone co...
La Radeon RX 9070 XT appare su Steam e m...
L'America si ribella ai datacenter: bloc...
'Artificial General Engineer': l'IA di J...
Il drone NASA Dragonfly, che voler&agrav...
Stop immediato a Fable 5 e Mythos 5: il ...
"Prime Day Amazon il 23-26 giugno": sì e...
Oggi 2 super MacBook Pro M5 e M5 Pro, 24...
Tineco Floor One Station S9 Artist: il s...
Raggiunte nuove altitudine e velocit&agr...
Apple Watch Series 11 GPS a 339€ su Amaz...
Come un MacBook, ma con la RTX 5070: MSI...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v