PDA

View Full Version : [SQL] Query


piumone
24-06-2007, 10:00
L'ultima volta che ho fatto questo esame ho trovato difficoltà nel sviluppare queste query.. Dato che non ho la soluzione dell'esame perchè non me la mettono se c'è qualche anima pia che ha voglia di risolvere questo esercizio la ringrazio in anticipo..

Si consideri il seguente schema relazionale che descrive completamente un ipotetico campionato di calcio.

STADIO (Nome, Citta, Capienza)
SQUADRA (Nome, Citta, Punteggio)
PARTITA (Nomestadio, Data, Squadra1, Squadra2, Retifatte, Retisubite)

Nella relazione STADIO, l’attributo Nome è la chiave primaria. Nella relazione SQUADRA l’attributo Punteggio si riferisce al punteggio della squadra nel proprio girone e l’attributo Nome è la chiave primaria. Nella relazione PARTITA gli attributi Retifatte e Retisubite si riferiscono alla Squadra1 (squadra che gioca in casa), gli attributi Nomestadio e Data formano la chiave primaria e gli attributi Nomestadio, Squadra1 e Squadra2 sono chiavi esterne per le relazioni STADIO e SQUADRA.

· Scrivere una query SQL che visualizzi il punteggio delle squadre che giocano con la lazio.
· Scrivere una query SQL che per ogni squadra fornisca il numero di partite giocate in casa.
· Scrivere una query SQL che visualizzi il Nome delle squadre che non hanno giocato partite in casa.

anonimizzato
24-06-2007, 10:51
La normalizzazione è discutibile, tuttavia:


Scrivere una query SQL che visualizzi il punteggio delle squadre che giocano con la lazio.


SELECT squadra1, squadra2, retifatte, retisubite
FROM partita
WHERE squadra1 = 'lazio'
OR squadra2 = 'lazio'


Scrivere una query SQL che per ogni squadra fornisca il numero di partite giocate in casa.


SELECT count(*) AS partite_casa, squadra1
FROM partita
GROUP BY squdra1


Scrivere una query SQL che visualizzi il Nome delle squadre che non hanno giocato partite in casa.

SELECT nome
FROM squadra
LEFT JOIN partita ON nome = squadra1
WHERE squadra1 IS NULL

piumone
24-06-2007, 11:17
[/QUOTE]
SELECT nome
FROM squadra
LEFT JOIN partita ON nome = squadra1
WHERE squadra1 IS NULL[/QUOTE]

cosa fa questo "LEFT JOIN"?? scusa ma non faccio informatica e sopratutto non facciamo molto sql. Grazie..

anonimizzato
24-06-2007, 12:21
Serve per ricavare tutti i record di una relazione (tabella) anche in mancanza di incrocio con la seconda tabella.

In parole povere viene spesso (come in questo caso) utilizzata per trovare proprio quei record che non hanno una corrispondenza nella seconda tabella, sfruttando l'operatore IS NULL.

http://www.morpheusweb.it/html/manuali/sql/sql_join.asp

P.S.
Ma che facoltà fai?

Ciao

piumone
24-06-2007, 13:25
Economia.. Il nostro esame comprende principalmente il linguaggio C poi qualcosina di sql, algebra booleana e parti teoriche generali.. Grazie ciao!

piumone
24-06-2007, 13:39
Serve per ricavare tutti i record di una relazione (tabella) anche in mancanza di incrocio con la seconda tabella.

In parole povere viene spesso (come in questo caso) utilizzata per trovare proprio quei record che non hanno una corrispondenza nella seconda tabella, sfruttando l'operatore IS NULL.

http://www.morpheusweb.it/html/manuali/sql/sql_join.asp

P.S.
Ma che facoltà fai?

Ciao

Da ora userò questi comandi allora.. Ti spiego negli appunti che ho le join le facciamo nel WHERE eguagliando le chiavi. Ma nell'ultimo esercizio questo non era possibile (se non ho capito male) questo left join mi permette di collegare cmq le tabelle giusto?

anonimizzato
24-06-2007, 16:02
Economia.. Il nostro esame comprende principalmente il linguaggio C poi qualcosina di sql, algebra booleana e parti teoriche generali.. Grazie ciao!

Azz... io ho fatto 2 anni di economia molti anni fa ma non ricordavo ci fossero anche esami del genere. :D

anonimizzato
24-06-2007, 16:02
Da ora userò questi comandi allora.. Ti spiego negli appunti che ho le join le facciamo nel WHERE eguagliando le chiavi. Ma nell'ultimo esercizio questo non era possibile (se non ho capito male) questo left join mi permette di collegare cmq le tabelle giusto?

Esatto, ti permette di recuperare tutti i record della prima tabella anche in caso di mancanza di corrispondenza nella seconda.
Solitamente l'utilità è proprio quella di trovare i record della prima tabella che NON hanno una corrispondenza nella seconda.
;)

piumone
25-06-2007, 10:26
La normalizzazione è discutibile, tuttavia:



SELECT squadra1, squadra2, retifatte, retisubite
FROM partita
WHERE squadra1 = 'lazio'
OR squadra2 = 'lazio'





QUesta non è sbagliata? Mi chiede il punteggio delle squadre che giocano con la lazio che è in un'altra tabella.. Uso la left join???

anonimizzato
25-06-2007, 19:33
Ah no scusami io per punteggio credevo si riferisse a quello delle singole partite.

Ho risolto con una SUBQUERY

SELECT nome, punteggio
FROM squadra
WHERE nome
IN (
SELECT a.nome
FROM squadra a, partita b
WHERE b.squadra1 = "lazio"
OR b.squadra2 = "lazio"
AND a.nome
IN (squadra1, squadra2)
AND a.nome != "lazio"
GROUP BY a.nome
)

Tuttavia non sono esperto nemmeno io in SQL quindi potrebbe esserci una QUERY molto più semplice di questa, ma è quello che mi è venuto in mente al volo.

Ciao.