Dopo aver visto come inserire record nel database, in questa lezione capiremo in che modo possiamo leggerli, utilizzando l'istruzione SELECT
.
L'uso base di SELECT
prevede l'indicazione dei campi da leggere, e della classe o del cluster sorgenti. Ecco alcuni esempi:
SELECT * FROM Persona
SELECT FROM Persona
SELECT nome FROM Persona
I primi due mostreranno l'intero elenco di record (l'asterisco per la selezione totale è, infatti, facoltativo in OrientDB) mentre il terzo comando mostrerà solo il campo nome di tutti i record.
Per filtrare l'elenco dei record ottenuti con un'istruzione SELECT
, è possibile utilizzare la clausola WHERE
, seguita dall'espressione logica che indicherà quali record devono far parte del risultato:
SELECT * FROM Persona WHERE nome='carlo'
SELECT * FROM Persona WHERE nome='carlo' AND eta>=18
I due esempi recuperano tutti i record in cui il campo nome è uguale alla stringa carlo, ed il secondo restringe il risultato ai soli individui maggiorenni. Questo utilizzo della clausola WHERE
prevede la composizione di regole logiche basate su:
- operatori di confronto semplici:
>
(maggiore),<
(minore),=
(uguale) e le loro composizioni>=
(maggiore o uguale),<=
(minore o uguale) e<>
(diverso); - operatori logici per concatenare più confronti semplici:
AND
(restituisce valore logico vero se entrambe
le espressioni coinvolte sono vere),OR
(vero se almeno una delle due espressioni che unisce è vera),NOT
(inverte il risultato dell'espressione che lo segue); - altri operatori che permettono di esprimere in forma più descrittiva il confronto da operare:
IN
(seguito da un elenco, indica un insieme di valori in cui si deve cercare una corrispondenza),BETWEEN
(indica un range cui il valore deve appartenere),LIKE
(confronta una stringa con un pattern anzichè un valore; nel pattern si può utilizzare il simbolo%
per indicare l'eventuale presenza di qualunque carattere) eIS
(utilizzato specialmente nella formaIS NULL
per verificare se un campo sia nullo).
Ecco alcuni esempi:
#seleziona tutti i record purchè il campo nome contenga una delle tre stringhe indicate SELECT * FROM Persona WHERE nome in ['carlo', 'paolo', 'silvio'] #seleziona tutti i record in cui il campo eta contiene un valore compreso tra 20 e 50, estremi inclusi SELECT * FROM Persona WHERE eta BETWEEN 20 and 50 #seleziona tutti i record in cui il campo nome inizia con la sillaba ca SELECT * FROM Persona WHERE nome LIKE 'ca%' #seleziona tutti i record in cui il campo nome sia nullo SELECT * FROM Persona WHERE nome IS NULL
Ulteriori esempi sul filtro dei record tramite la clausola WHERE
possono essere reperiti sulla documentazione ufficiale.
Funzioni e metodi
Nell'ambito del linguaggio SQL possono essere utilizzate anche funzioni e metodi. Le prime svolgono elaborazioni su uno o più parametri e ne restituiscono il risultato, a sua volta coinvolto nello svolgimento della query; i secondi, nella stessa accezione della programmazione orientata agli oggetti, vengono applicati ad uno specifico valore.
Quelli che seguono sono esempi di utilizzo di funzioni:
#esprime il valore massimo del campo età
SELECT max(eta) FROM Persona
#calcola l'età media degli individui registrati
SELECT avg(eta) FROM Persona
#indica il numero di record appartenenti alla classe
SELECT count(*) FROM Persona
Esistono molte altre funzioni che riguardano i grafi (navigazione tra nodi, analisi e algoritmi), calcoli matematici e statistici
(alcune viste poc'anzi negli esempi) e la gestione di collection di valori.
Tra le funzioni merita una menzione particolare distinct()
, in quanto rappresenta l'implementazione, su OrientDB, della parola chiave DISTINCT
di SQL:
#mostra tutti valori del campo nome senza duplicati
SELECT distinct(nome) FROM Persona
I metodi possono essere considerati delle funzioni da applicare direttamente su un valore. Per lo più, si occupano di conversioni tra
tipi di dato e manipolazione di stringhe e strutture dati. Vediamone alcuni esempi:
#visualizza i primi due caratteri da sinistra dei valori del campo nome convertiti in maiuscolo
select nome.toUpperCase().left(2) from Persona
#stampa per ogni valore nel campo cognome la posizione della prima lettera 'n' che incontra,
# -1 se il carattere non è presente nella stringa
select cognome.indexOf('n') from Persona
La documentazione ufficiale tratta in dettaglio i vari aspetti di
funzioni e metodi.
Raggruppamento e ordinamento
Un'operazione molto utilizzata nel linguaggio SQL dei DBMS relazionali è il raggruppamento. Anche in OrientDB questa funzionalità risulta fondamentale, e si applica tramite la clausola GROUP BY
che introduce il campo o l'elenco dei campi in base ai quali verrà eseguito il raggruppamento. L'esempio seguente mostra una query che conterà quanti cognomi identici sono presenti nella classe Persona:
SELECT cognome, count(cognome) FROM Persona GROUP BY cognome
Altro aspetto molto importante è l'ordinamento dei risultati di una query, che si implementa mediante ORDER BY
. Nell'esempio che segue vengono sottoposti a ordinamento decrescente, in base al risultato del conteggio, i record
raggruppati per cognome:
SELECT cognome, count(cognome) AS conteggio FROM Persona GROUP BY cognome ORDER BY conteggio DESC