DOMANDA Query SQL

Cioscos

Utente Attivo
926
95
CPU
AMD Ryzen 7 7800x3D
Dissipatore
DEEP COOL NEPTWIN White
Scheda Madre
GIGABYTE B650 GAMING X AX
HDD
1-2TB Seagate Barracuda 7200RPM - fanxiang S880 2TB PCIe 4.0 NVMe SSD M.2
RAM
CORSAIR VENGEANCE DDR5 32GB (2x16GB) 6400MHz CL36 CMH32GX5M2B6400C36W
GPU
MSI GeForce RTX 4080 Gaming X TRIO
Monitor
Samsung LS24AG30 1080p 144Hz
PSU
LC-POWER LC850P V3.0 850W 80+ Platinum
Case
NZXT H5 Flow
Periferiche
Logitech G502 (Mouse) - Tastiera Cooler Master SK653
Net
Openfiber 5Gbit/s
OS
Windows 11 Pro - 64bit
Salve! Ho una questione... Devo creare una query che comanda: Matricola e nome degli studenti che seguono solo corsi di docenti del dipartimento di storia.
Ora, lo schema delle relazioni dei database è:
2e301fe380c0195a9462c24bc0ce6561.jpg

Allora dalle soluzioni ufficiali dell'esercizio so dovrebbe fare:
SELECT s.Matricola, s.NomeS
FROM Studenti s
WHERE Not Exists ( SELECT *
FROM Frequenta f, Corsi c, Docenti d
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento = ‘Storia’ )

Detto questo ho due domande;
1) Perché andiamo a mettere il not exist?
2) Perché mette * al select nidificato.

Inviato da SM-G925F tramite App ufficiale di Tom\\\'s Hardware Italia Forum
 

Mistereed

Nuovo Utente
42
6
Ciao, intanto una domanda. Ma questi esercizi li hai trovati su internet o te li ha dati il tuo docente? Ho fatto gli stessi esercizi seguendo un corso di programmazione ahah.

Comunque tornando alla discussione, per risponderti.
1) Mette il NOT EXIST perchè nella query nidificata il risultato sarà una lista degli studenti che frequentano il dipartimento di STORIA dunque, dato che tu devi selezionare solo quelli che NON fanno parte di quel dipartimento, non devono esistere nel risultato di quella query.
2) Mettere l'* è semplicemente per selezionare tutte le informazioni, avrebbe funzionto anche facendo un SELECT s.Matricola, definisce semplicemente cosa si vedrà della lista risultante della query, ma il funzionamento non cambia in questo caso.

EDIT:

Ok modifico, ho riletto bene e quindi non mi torna assolutamente il ragionamento. La query nidificata mi sembra in realtà quella che realmente ti dia il risultato giusto (Aggiungendo al From la tabella Studenti e nel WHERE la JOIN). Perchè lasciata come è scritta ora ti da il risultato che ho spiegato nel primo punto. Dunque non torna con l'esercizio.
 
  • Mi piace
Reazioni: Cioscos

Cioscos

Utente Attivo
926
95
CPU
AMD Ryzen 7 7800x3D
Dissipatore
DEEP COOL NEPTWIN White
Scheda Madre
GIGABYTE B650 GAMING X AX
HDD
1-2TB Seagate Barracuda 7200RPM - fanxiang S880 2TB PCIe 4.0 NVMe SSD M.2
RAM
CORSAIR VENGEANCE DDR5 32GB (2x16GB) 6400MHz CL36 CMH32GX5M2B6400C36W
GPU
MSI GeForce RTX 4080 Gaming X TRIO
Monitor
Samsung LS24AG30 1080p 144Hz
PSU
LC-POWER LC850P V3.0 850W 80+ Platinum
Case
NZXT H5 Flow
Periferiche
Logitech G502 (Mouse) - Tastiera Cooler Master SK653
Net
Openfiber 5Gbit/s
OS
Windows 11 Pro - 64bit
Ciao, intanto una domanda. Ma questi esercizi li hai trovati su internet o te li ha dati il tuo docente? Ho fatto gli stessi esercizi seguendo un corso di programmazione ahah.

Comunque tornando alla discussione, per risponderti.
1) Mette il NOT EXIST perchè nella query nidificata il risultato sarà una lista degli studenti che frequentano il dipartimento di STORIA dunque, dato che tu devi selezionare solo quelli che NON fanno parte di quel dipartimento, non devono esistere nel risultato di quella query.
2) Mettere l'* è semplicemente per selezionare tutte le informazioni, avrebbe funzionto anche facendo un SELECT s.Matricola, definisce semplicemente cosa si vedrà della lista risultante della query, ma il funzionamento non cambia in questo caso.
Grazie per la risposta. Non leggo da nessuna larte che devo prendere quelli che non fanno parte di quel dipartimento. Per quanto riguarda l'* ho capito.
Il professore ha preso l'esercizio da internet

Inviato da SM-G925F tramite App ufficiale di Tom\\\'s Hardware Italia Forum
 

Mistereed

Nuovo Utente
42
6
Grazie per la risposta. Non leggo da nessuna larte che devo prendere quelli che non fanno parte di quel dipartimento. Per quanto riguarda l'* ho capito.
Il professore ha preso l'esercizio da internet

Inviato da SM-G925F tramite App ufficiale di Tom\\\'s Hardware Italia Forum

Si chiedo perdono, ho letto la query e da lì ho tratto le mie conclusioni, rileggi il messaggio modificato.

Comunque secondo me la query giusta sarebbe:

SELECT s.Matricola, s.NomeS
FROM Frequenta f, Corsi c, Docenti d, Studenti s
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento = ‘Storia’
 

Cioscos

Utente Attivo
926
95
CPU
AMD Ryzen 7 7800x3D
Dissipatore
DEEP COOL NEPTWIN White
Scheda Madre
GIGABYTE B650 GAMING X AX
HDD
1-2TB Seagate Barracuda 7200RPM - fanxiang S880 2TB PCIe 4.0 NVMe SSD M.2
RAM
CORSAIR VENGEANCE DDR5 32GB (2x16GB) 6400MHz CL36 CMH32GX5M2B6400C36W
GPU
MSI GeForce RTX 4080 Gaming X TRIO
Monitor
Samsung LS24AG30 1080p 144Hz
PSU
LC-POWER LC850P V3.0 850W 80+ Platinum
Case
NZXT H5 Flow
Periferiche
Logitech G502 (Mouse) - Tastiera Cooler Master SK653
Net
Openfiber 5Gbit/s
OS
Windows 11 Pro - 64bit
Si chiedo perdono, ho letto la query e da lì ho tratto le mie conclusioni, rileggi il messaggio modificato.

Comunque secondo me la query giusta sarebbe:

SELECT s.Matricola, s.NomeS
FROM Frequenta f, Corsi c, Docenti d, Studenti s
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento = ‘Storia’
Ma poi così si, mi escono quelli che frequentano il corso di storia ma volendo possono fare anche informatica. Mentre nel nostro caso vogliamo solo quelli di storia.

Inviato da SM-G925F tramite App ufficiale di Tom\\\'s Hardware Italia Forum
 

Mistereed

Nuovo Utente
42
6
Ok, mi perdo sempre qualcosa. Per quel SOLO puoi ovviare in questo modo.
Riprendi la query originale:

SELECT s.Matricola, s.NomeS
FROM Studenti s
WHERE Not Exists ( SELECT *
FROM Frequenta f, Corsi c, Docenti d
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento = ‘Storia’ )

Invece di mettere d.Dipartimento = 'Storia' metti '<>' cioè diverso (dovrebbe funzionare anche scrivendo != ):

SELECT s.Matricola, s.NomeS
FROM Studenti s
WHERE Not Exists ( SELECT *
FROM Frequenta f, Corsi c, Docenti d
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento <> ‘Storia’ )

Dunque la select nidificata sarebbe l'elenco degli studenti che frequentano corsi diversi da quello di Storia.
Se lo studente non è in quella lista viene selezionato, vuol dire che frequenta solo Storia.
Ma se proprio vogliamo essere precisi, e non sappiamo bene se uno studente potrebbe anche non frequentare alcun corso (Intendo che uno studente non frequenta nè il corso di storia, nè corsi diversi da Storia) uscirà lo stesso nel risultato, dunque basta aggiungere una condizione nella prima WHERE con d.Dipartimento = 'Storia':

SELECT s.Matricola, s.NomeS
FROM Studenti s, Docenti d
WHERE d.Dipartimento = 'Storia' and Not Exists ( SELECT *
FROM Frequenta f, Corsi c
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento <> ‘Storia’ )

In questo modo prima controllerà che lo studente frequenti Storia, e poi vedrà se esiste nella lista degli studenti che frequentano corsi diversi da storia. Nel caso in cui sia nella lista lo scarta, altrimenti lo seleziona.

Se non mi sono spiegato bene, chiedi pure.
 
  • Mi piace
Reazioni: Cioscos

Cioscos

Utente Attivo
926
95
CPU
AMD Ryzen 7 7800x3D
Dissipatore
DEEP COOL NEPTWIN White
Scheda Madre
GIGABYTE B650 GAMING X AX
HDD
1-2TB Seagate Barracuda 7200RPM - fanxiang S880 2TB PCIe 4.0 NVMe SSD M.2
RAM
CORSAIR VENGEANCE DDR5 32GB (2x16GB) 6400MHz CL36 CMH32GX5M2B6400C36W
GPU
MSI GeForce RTX 4080 Gaming X TRIO
Monitor
Samsung LS24AG30 1080p 144Hz
PSU
LC-POWER LC850P V3.0 850W 80+ Platinum
Case
NZXT H5 Flow
Periferiche
Logitech G502 (Mouse) - Tastiera Cooler Master SK653
Net
Openfiber 5Gbit/s
OS
Windows 11 Pro - 64bit
Ok ora quadra.
 

Cioscos

Utente Attivo
926
95
CPU
AMD Ryzen 7 7800x3D
Dissipatore
DEEP COOL NEPTWIN White
Scheda Madre
GIGABYTE B650 GAMING X AX
HDD
1-2TB Seagate Barracuda 7200RPM - fanxiang S880 2TB PCIe 4.0 NVMe SSD M.2
RAM
CORSAIR VENGEANCE DDR5 32GB (2x16GB) 6400MHz CL36 CMH32GX5M2B6400C36W
GPU
MSI GeForce RTX 4080 Gaming X TRIO
Monitor
Samsung LS24AG30 1080p 144Hz
PSU
LC-POWER LC850P V3.0 850W 80+ Platinum
Case
NZXT H5 Flow
Periferiche
Logitech G502 (Mouse) - Tastiera Cooler Master SK653
Net
Openfiber 5Gbit/s
OS
Windows 11 Pro - 64bit
Ok, mi perdo sempre qualcosa. Per quel SOLO puoi ovviare in questo modo.
Riprendi la query originale:

SELECT s.Matricola, s.NomeS
FROM Studenti s
WHERE Not Exists ( SELECT *
FROM Frequenta f, Corsi c, Docenti d
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento = ‘Storia’ )

Invece di mettere d.Dipartimento = 'Storia' metti '<>' cioè diverso (dovrebbe funzionare anche scrivendo != ):

SELECT s.Matricola, s.NomeS
FROM Studenti s
WHERE Not Exists ( SELECT *
FROM Frequenta f, Corsi c, Docenti d
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento <> ‘Storia’ )

Dunque la select nidificata sarebbe l'elenco degli studenti che frequentano corsi diversi da quello di Storia.
Se lo studente non è in quella lista viene selezionato, vuol dire che frequenta solo Storia.
Ma se proprio vogliamo essere precisi, e non sappiamo bene se uno studente potrebbe anche non frequentare alcun corso (Intendo che uno studente non frequenta nè il corso di storia, nè corsi diversi da Storia) uscirà lo stesso nel risultato, dunque basta aggiungere una condizione nella prima WHERE con d.Dipartimento = 'Storia':

SELECT s.Matricola, s.NomeS
FROM Studenti s, Docenti d
WHERE d.Dipartimento = 'Storia' and Not Exists ( SELECT *
FROM Frequenta f, Corsi c
WHERE s.Matricola = f.Matricola
AND f.CodCorso = c.CodCorso AND c.CodDoc = d.CodDoc
AND d.Dipartimento <> ‘Storia’ )

In questo modo prima controllerà che lo studente frequenti Storia, e poi vedrà se esiste nella lista degli studenti che frequentano corsi diversi da storia. Nel caso in cui sia nella lista lo scarta, altrimenti lo seleziona.

Se non mi sono spiegato bene, chiedi pure.
Non si può fare senza not exist e mettere d.Dipartimento="storia" ?
 

Mistereed

Nuovo Utente
42
6
Non si può fare senza not exist e mettere d.Dipartimento="storia" ?

Non ho ben capito dove vorresti metterlo, ma non si ritornerebbe al problema iniziale cioè che può stare anche in altri Dipartimenti?
Il Not Exist viene utilizzato proprio per escluderlo nel caso faccia parte di quelli che frequentano dipartimenti diversi da 'Storia' quindi mi sembra abbastanza corretto utilizzarlo.
 

Cioscos

Utente Attivo
926
95
CPU
AMD Ryzen 7 7800x3D
Dissipatore
DEEP COOL NEPTWIN White
Scheda Madre
GIGABYTE B650 GAMING X AX
HDD
1-2TB Seagate Barracuda 7200RPM - fanxiang S880 2TB PCIe 4.0 NVMe SSD M.2
RAM
CORSAIR VENGEANCE DDR5 32GB (2x16GB) 6400MHz CL36 CMH32GX5M2B6400C36W
GPU
MSI GeForce RTX 4080 Gaming X TRIO
Monitor
Samsung LS24AG30 1080p 144Hz
PSU
LC-POWER LC850P V3.0 850W 80+ Platinum
Case
NZXT H5 Flow
Periferiche
Logitech G502 (Mouse) - Tastiera Cooler Master SK653
Net
Openfiber 5Gbit/s
OS
Windows 11 Pro - 64bit
Non ho ben capito dove vorresti metterlo, ma non si ritornerebbe al problema iniziale cioè che può stare anche in altri Dipartimenti?
Il Not Exist viene utilizzato proprio per escluderlo nel caso faccia parte di quelli che frequentano dipartimenti diversi da 'Storia' quindi mi sembra abbastanza corretto utilizzarlo.
Metterlo nella where della nidificata.

Inviato da SM-G925F tramite App ufficiale di Tom\\\'s Hardware Italia Forum
 

Mistereed

Nuovo Utente
42
6
Levando il Not Exist e mettendo la WHERE nella nidificata non fai altro che ricercare tutti gli studenti che fanno parte del dipartimento di 'Storia' ma non fai alcun controllo per quanto riguarda la loro esistenza in altri dipartimenti. E inoltre l'uso della query nidificata in questo caso sarebbe anche superfluo.
 

Cioscos

Utente Attivo
926
95
CPU
AMD Ryzen 7 7800x3D
Dissipatore
DEEP COOL NEPTWIN White
Scheda Madre
GIGABYTE B650 GAMING X AX
HDD
1-2TB Seagate Barracuda 7200RPM - fanxiang S880 2TB PCIe 4.0 NVMe SSD M.2
RAM
CORSAIR VENGEANCE DDR5 32GB (2x16GB) 6400MHz CL36 CMH32GX5M2B6400C36W
GPU
MSI GeForce RTX 4080 Gaming X TRIO
Monitor
Samsung LS24AG30 1080p 144Hz
PSU
LC-POWER LC850P V3.0 850W 80+ Platinum
Case
NZXT H5 Flow
Periferiche
Logitech G502 (Mouse) - Tastiera Cooler Master SK653
Net
Openfiber 5Gbit/s
OS
Windows 11 Pro - 64bit
Levando il Not Exist e mettendo la WHERE nella nidificata non fai altro che ricercare tutti gli studenti che fanno parte del dipartimento di 'Storia' ma non fai alcun controllo per quanto riguarda la loro esistenza in altri dipartimenti. E inoltre l'uso della query nidificata in questo caso sarebbe anche superfluo.
Okok.

Inviato da SM-G925F tramite App ufficiale di Tom\\\'s Hardware Italia Forum
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!