9 order by , join (cross ed equi)

Negli esempi precedenti non ci siamo preoccupati dell’ordine dei dati.

order by

Possiamo effettuare l’ordine aggiungendo la clausola order by, essa va aggiunta sempre in fondo al comando SQL.

select cognome from atleti order by cognome;

dopo ordina per metteremo il nome della colonna da ordinare.

L’ordine che viene applicato di default sui campi di tipo stringa è alfabetico.

Se chiedo una select senza order by su un campo indicizzato, esso viene già ordinato, ai fini pratici, comunque, se usiamo order by, i risultati sono corretti.

Nel caso di omonimia sul cognome specifico altri campi e applicare il criterio di ordinamento anche su altri campi,

select cognome, eta from atleti order by cognome, eta;

La priorità di ordinamento viene presa dal primo criterio (cognome).

Senza specificare nulla l’ordine viene fatto dal più piccolo al più grande, se volessimo invertirlo basta usare l’attributo desc (abbreviazione di discendente)

select cognome, eta from atleti order by cognome desc, eta;

Posso ance applicarlo sul secondo campo

select cognome, eta from atleti order by cognome desc, eta desc;

Posso specificare quanti criteri voglio con le priorità gestita dall’ordine in cui li scrivo

JOIN

Fino ad adesso abbiamo usato la select per estrarre i dati da una sola tabella, ma la potenza dell’SQL sta nel congiungere più tabelle tra loro.

Per fare questo le tabelle devono essere associate tra loro magari tramite gli ID .

Per esempio vogliamo associare la tabella atleti con la tabella nazioni, iniziamo con la select che estrae i campi interessati

select nomeNazione, cognome, nome

ora specifico da quali tabelle mi interessa estrarre i dati, rispettando l’ordine della select precedente :

from nazioni, atleti;

unisco

select nomeNazione, cognome, nome from nazioni, atleti;

In questo caso vengono estratti tutti i dati con tutte le possibili combinazioni tra le righe con tutte le tabelle. Questa operazione si chiama prodotto cartesiano che nella terminologia SQL prende il nome di CROSS JOIN e magari in alcuni casi potrebbe essere proprio quello che ci serve.

Nel caso invece voglio solo i nominativi degli atleti con le loro rispettive nazionalità, dobbiamo applicare un criteria che istruisca MySQL che le 2 tabelle (atleti e nazioni) sono associate tra loro, il cosiddetto JOIN (congiunzione). In pratica devo far capire che il codice inserito nel campo nazione della tabella atleti corrisponde al codice idNazione della tabella nazioni. Il principio del join è metti insieme le righe delle due tabelle solo quando i codici dei 2 campi (nazione e idNazione) .

select nomeNazione, cognome, nome from nazioni, atleti where idNazione=nazione;

ordiniamo

select nomeNazione, cognome, nome from nazioni, atleti where idNazione=nazione order by nomeNazione;

La regola d’oro da seguire è:

ogni volta che, nella sezione from,  includo 2 tabelle tra loro correlate da una chiave esterna (chiave primaria idNazione – chiave secondaria nazione) devo eguagliare (simbolo uguale =) le 2 chiavi per associare le tabelle dopo il where

 where idNazione=nazione

notare che le chiavi uguagliate non devono per forza comparire nella select, dal momento che includo le tabelle col FROM i campi di quelle tabelle sono a disposizione.