picoSQL - Manuale di riferimento


SELECT


Sintassi:

Formato 1:

SELECT [ ALL | DISTINCT ] lista-di-espressioni
FROM { nome-tabella [[AS] alias][, nome-tabella [[AS] alias]] ...|clausola-join }
[ WHERE condizione-di-ricerca ]
[ GROUP BY nome-colonna[, nome-colonna] ...]
[ HAVING condizione-ricerca ]
[ UNION comando-select ]
[ ORDER BY {numero-intero[ASC|DESC]|espressione[ASC|DESC]}
       [, {numero-intero[ASC|DESC]|espressione[ASC|DESC]}]...]
[ LIMIT numero-intero ]
[ OFFSET numero-intero ]

Formato 2:

SELECT lista-di-espressioni
FROM nome-tabella
[ WHERE condizione-di-ricerca ]
FOR UPDATE

Formato 3:

SELECT SERIAL


Scopo:

Permette di interrogare il database e di ottenerne informazioni sulla base di condizioni logiche di ricerca.


Vedi anche:

CREATE VIEW, UNION


Descrizione:


Questo comando è il più complesso di tutto il linguaggio poiché fornisce i mezzi necessari per interrogare il database e individuare un insieme di dati.

Per l'uso del formato 3, vedere INSERT
Il formato 2 è un sottoinsieme del formato 1, con in più solo la clausola FOR UPDATE, e viene usato nei programmi per fare in modo che la riga che si sta leggendo non sia modificabile da un altro utente. La riga torna disponibile quando si legge la riga successiva o quando viene chiuso il cursore.

Vediamo quindi tutte le clausole del formato 1.


ALL | DISTINCT

Se viene specificata la clausola DISTINCT non vengono visualizzate le righe duplicate. Questa è chiamata 'proiezione' del risultato del comando. Va comunque notato che per poter eliminare le righe duplicate, picoSQL esegue un ordinamento dei risultati, il che può portare a un incremento dei tempi di risposta, specialmente se il numero di righe selezionate è molto ampio.

La clausola ALL viceversa lascia tutte le righe e rappresenta il comportamento di default quando non viene specificato alcunché.


lista-di-espressioni

La lista-di-espressioni indica quali sono i dati da visualizzare ogni volta che viene trovata una riga con le caratteristiche richieste; la forma di lista-di-espressioni è la seguente:


{ * | espressione [[ AS ] alias] [, espressione [[ AS ] alias]]... }


Se viene specificato un asterisco (*), esso rappresenta tutte le colonne di tutte le tabelle che vengono menzionate nella successiva clausola FROM. È permesso usare funzioni aggreganti come espressioni.

Alle espressioni possono essere assegnati dei nomi alias. Tali nomi vengono visualizzati normalmente in testa alle colonne dei risultati nei programmi d'interrogazione interattivi, ma possono servire anche per distinguere, nelle clausole successive come ORDER BY e GROUP BY, colonne con nomi uguali ma appartenenti a tabelle diverse.


FROM

Permette di specificare la lista delle tabelle da cui si vuole estrarre i dati. Nel caso in cui l'estrazione avvenga da più di una tabella, normalmente è necessario indicare una o più condizioni di join, altrimenti si ottiene come risultato la combinazione di ciascuna riga di ciascuna tabella con tutte le altre (prodotto cartesiano). Una join è una condizione che lega una colonna di una tabella a una condizione di un'altra tabella. In picoSQL si possono specificare join in due modi:



Usando il primo modo, la clausola FROM si riduce a una semplice lista di nomi di tabella. Si possono specificare dei nomi alias delle tabelle in modo da rendere possibili le 'self-join', cioè join di una tabella con se stessa.


Il secondo modo è apparentemente più complesso ma ha il vantaggio di separare le condizioni di join dalle condizioni di ricerca e di poter impostare le join esterne (outer join). La sintassi della clausola-join è la seguente:


nome-tabella [[AS] alias] {INNER | LEFT OUTER| RIGHT OUTER}

JOIN {nome-tabella [[AS] alias] | clausola-join}

ON condizione-di-join


Come si vede è possibile impostare un numero qualsiasi di join, anche di tipo diverso tra loro, annidando più clausole-join.

Mettere la condizione di join nella WHERE o usare la clausola INNER JOIN fa ottenere gli stessi risultati ma può influenzare le performance: nel primo caso infatti è picoSQL che sceglie l'ordine ottimale di scansione delle tabelle in modo da minimizzare le letture mentre nel secondo caso l'ordine di scansione è fissato nell'ordine con cui sono riportate le tabelle. Questo può risultare svantaggioso quando si debbano fare delle query dinamiche nelle quali non si conosce a priori su quale colonna di quale tabella verrà fatta la ricerca.


WHERE

Permette di specificare una condizione-di-ricerca che limita il numero delle righe ottenute. Anche le condizioni di join possono essere messe dopo questa clausola. Vedi anche "Condizioni di ricerca".


GROUP BY

Permette di raggruppare più righe dal risultato della ricerca sul database. Quando si usa questa clausola, in lista-di-espressioni possono essere messe solo funzioni aggreganti o nomi di colonna riportate anche in GROUP BY. Il risultato ottenuto contiene una riga per ciascun valore distinto delle colonne elencate, che viene definita 'gruppo'. Eventuali funzioni aggreganti specificate vengono applicate a ciascun gruppo.


HAVING

Questa clausola può essere specificata solo dopo una GROUP BY e serve per limitare il numero di gruppi selezionati. Essa infatti permette di definire una condizione-di-ricerca nella quale possono comparire anche le funzioni aggreganti definite nella lista-di-espressioni.


ORDER BY

Ordina il risultato dell'interrogazione. Ciascun elemento nella lista specificata dopo ORDER BY può avere la clausola ASC, che indica che è richiesto l'ordinamento ascendente, oppure la clausola DESC che indica che è richiesto l'ordinamento discendente. Nel caso che nessuna di queste due clausole venga specificata, viene sottinteso l'ordinamento ascendente. Se la lista contiene un numero intero N, l'ordinamento viene fatto sull'elemento N-esimo della lista-di-espressioni.

LIMIT

Limita il numero di righe restituite al numero specificato come argomento. Se il numero totale di righe selezionate inferiore al numero specificato come argomento, la clausola non ha alcun effetto.

OFFSET

Restituisce le righe selezionate saltandone un numero pari al numero specificato come argomento. Se il numero totale di righe selezionate inferiore al numero specificato come argomento, restituisce un messaggio di dati non trovati.


Indice Precedente Successivo