mercoledì 24 marzo 2021

SQL giocando con MySQL 8 e NetBeans 12 - Post 3 - SELECT LIMIT e ORDER

Ora che sono stati mossi i primi passi nell'interrogazione della base dati con SELECT, occorre porsi il problema di cosa accade se in una grande base dati il risultato è troppo vasto per poter essere gestito agevolmente ed ordinare i dati secondo le proprie necessità. In questi casi viene in aiuto la clausola LIMIT ed  del comando SELECT.

Un primo esempio ce lo dà subito NetBeans quando cerchiamo di visualizzare i dati di una tabella.


Con il View Data... NetBeans esegue il comando

SELECT * FROM city LIMIT 100;

Ossia seleziona tutti i campi dalla tabella city limitatamente ai primi 100 record. Ovviamente il 100 può essere cambiato con qualunque numero si voglia. Se la tabella risultante ha un numero di record maggiore a quanto indicato allora viene troncata alla quantità richiesta, se è minore del numero richiesto il risultato è mostrato per intero.

Insieme alla clausola LIMIT, opera la clausola OFFSET permettendo di sfogliare la tabella risultante pagina dopo pagina.

Per esempio inserendo i 3 comandi SQL seguenti otterremo tre schede:

SELECT * FROM city LIMIT 10 OFFSET 0;

SELECT * FROM city LIMIT 10 OFFSET 10;

SELECT * FROM city LIMIT 10 OFFSET 20;

Ogni scheda conterrà 10 record ma la prima avrà i record da 1 a 10, la seconda da 11 a 20 e la terza da 21 a 30. Questo sistema permette la paginazione dei risultati, semplicemente sommando al valore dell'OFFSET la quantità di record ad visualizzare di volta in volta. Volendo tradurre la terza select in italiano potremmo leggere seleziona tutti i campi dalla tabella city limitatamente ai primi 10 record saltati i primi 20, quindi visualizzerà i record dal 21° al 30° estremi inclusi (osservare i valori del campo - la colonna - ID).


Esiste un modo alternativo di scrivere le stesse query risparmiando un po' di caratteri ma perdendo in chiarezza. E' possibile inserire l'offset direttamente in LIMIT separandolo dal valore di quantità di record con una virgola.

SELECT * FROM city LIMIT 0,10;

SELECT * FROM city LIMIT 10,10;

SELECT * FROM city LIMIT 20,10;


Il risultato sarà esattamente identico alle precedenti 3 query che utilizzano la clausola OFFSET. I due metodi sono esattamente equivalenti.

Ora sono stati estratti gruppi di record da una tabella, selezionando i campi desiderati, si potrebbe volere che la tabella sia ordinata in un modo diverso piuttosto che rispetto alla chiave primaria. La chiave primaria è un campo il cui valore è unico all'interno di tutta la tabella. Solitamente è un valore numerico di auto incremento generato automaticamente dal data base server all'atto della creazione del record o riga. Da un punto di vista della teoria delle basi dati, in una tabella correttamente formata la chiave primaria è data dall'unione di tutti i campi che compongono il record. NetBeans evidenzia le chiavi primarie con un rettangolino rosso nell'icona del campo. LA chiave primaria è un campo indicizzato dal server di data base, il che rende molto veloci le operazioni di ricerca e ordinamento sul questo campo.

Per ordinare la tabella risultante su un campo di propria scelta è possibile utilizzare la clausola ORDER BY seguita dal nome dei campi secondo cui ordinare e il metodo di ordinamento se ASC o DESC per ascendente o discendente ossia dal più.

SELECT * FROM city ORDER BY population ASC LIMIT 20,10;


Questa SELECT chiede al server di selezionare tutti i campi dalla tabella city, ordinati su popolazione in modo ascendente (dal più piccolo al più grande) limitatamente a 10 record saltando i primi 20 del risultato. Ovviamente l'ordinamento avviene prima della limitazione della tabella risultante.

Vediamo ora una SELECT più completa.

SELECT * FROM city ORDER BY countrycode ASC, population DESC LIMIT 0,100;


Nell'immagine l'istruzione è divisa su più righe per aumentarne la leggibilità, ma può essere scritta su una riga sola perchè, come già detto, gli spazi sono ignorati e l'istruzione termina con il punto e virgola.

In questo caso l'istruzione SELECT seleziona tutti i campi dalla tabella city ordinati sul campo countrycode ascedente e a parità di country code sul campo population discendente limitatamente ai primi 100 record. In parole più semplici avremo i primi 100 record delle città ordinate alfabeticamente sulla nazione e nell'ambito della stessa nazione saranno visualizzate prima le città con popolazione maggiore. Nel prossimo post vedremo come limitare i record della tabella risultante per mezzo di condizioni tramite la clausola WHERE.