Linguaggio di interrogazione
# Linguaggio di interrogazione

In informatica un linguaggio di interrogazione (in inglese query language o data query language) è un linguaggio usato per creare query sui database e sui sistemi informativi da parte degli utenti. Serve per rendere possibile l'estrazione di informazioni dal database, attraverso il relativo DBMS, interrogando la base dei dati e interfacciandosi dunque con l'utente e le sue richieste di servizio.

## Esempi

Alcuni esempi di linguaggi di interrogazione sono:

* SQL, un linguaggio molto noto usato per i database relazionali
* MDX, un QL per i database OLAP
* Datalog, per i database deduttivi
* XQuery, per le fonti di dati in XML
* SuprTool, un linguaggio proprietario per SuprTool, un programma per accedere ai database usato per i dati in Image/SQL (TurboIMAGE) e per i database Oracle.

## DQL per SQL standard

IL DQL (data query language – linguaggio di interrogazione dei dati) secondo lo standard SQL comprende i comandi per leggere ed elaborare i dati presenti in un database, strutturato secondo il modello relazionale. Questi dati devono essere stati precedentemente inseriti attraverso il Data Manipulation Language (DML) in strutture o tabelle create con il Data Definition Language (DDL), mentre il Data Control Language (DCL) stabilisce se l'utente può accedervi.

### Select

Col comando select abbiamo la possibilità di estrarre i dati, in modo mirato, dal database.

**Sintassi del comando select**

dove:

* lista_elementi_selezione è l'elenco dei campi da estrarre (separati tra loro con una virgola);
* lista_riferimenti_tabella è l'elenco delle tabelle da cui estrarre i dati;
* espressione_condizionale rappresenta l'elenco delle condizioni, ovvero dei requisiti che un campo deve rispettare per poter essere prelevato dall'interrogazione (le condizioni sono specificate mediante gli operatori di confronto, connettori logici e comparatori come between, in, like, is null); lista_colonne è la colonna o le colonne che devono essere prese come riferimento per l'ordinamento dei dati in uscita.

Di default il comando select agisce con il metodo all, ma specificando distinct è possibile eliminare dai risultati le righe duplicate.

La clausola ORDER BY serve per ordinare i risultati in base a uno o più campi.

Limit (o top, a seconda delle implementazioni) limita il numero delle righe fornite: LIMIT 10 prende le prime 10 righe della mia tabella. È anche possibile scartare un certo numero di righe all'inizio dei risultati aggiungendo un parametro a LIMIT o la clausola OFFSET.

L'SQL standard non prevede alcun ordinamento se non si specifica la clausola ORDER BY, pertanto senza di essa anche LIMIT ha un effetto imprevedibile. Un esempio è il seguente:

Questa query estrae l'elenco di tutti gli utenti maggiorenni ordinando l'output in base al cognome. La definizione di select è comunque molto più ampia, prevede molte altre opzioni ma in linea di massima con queste opzioni si compongono la maggior parte delle interrogazioni.

l'asterisco permette di includere nella selezione tutte le colonne della tabella utenti

Con le select è possibile anche eseguire dei calcoli:

questo produce dati estratti ma anche dati calcolati. La clausola AS serve per dare un nome alla nuova colonna nella nuova tabella che creerà la select.

Molti DBMS supportano la clausola non standard LIMIT, che deve essere posta per ultima e può avere tre forme:

numero_risultati è il numero delle righe da estrarre. pos_primo_risultato è l'indice della prima riga da estrarre. Insieme, possono essere utilizzati per suddividere i risultati in blocchi e leggerli un po' alla volta (per esempio per comodità del DBA, o per la paginazione dei risultati mostrati da una applicazione web).

### Join

Una forma di select composto tra più tabelle con uno o più campi comuni si ottiene attraverso la clausola Join.

### Subquery

Le subquery possono essere inserite ovunque il linguaggio SQL ammetta un'espressione che restituisce un singolo valore e nella clausola FROM. In questo secondo caso, le subquery sono chiamate anche tabelle derivate (derived table).

Le subquery propriamente dette possono restituire un singolo valore, oppure un insieme di risultati, a seconda dei casi. Un esempio piuttosto semplice è quello in cui si vogliono estrarre da una tabella i valori numerici superiori alla media. Una sola Select non può leggere la media e al contempo i valori che la superano. A questo scopo si avrà una select che legge la media:

Questa query verrà inserita nella clausola WHERE della query più esterna; la subquery viene eseguita per prima:

Come si vede, da un punto di vista sintattico è necessario porre le subquery tra parentesi.

**Tabelle derivate**

Le tabelle derivate sono un caso particolare di subquery: una Select interna estrae i dati che verranno poi interrogati dalla Select esterna.

L'esempio seguente viene utilizzato a scopo didattico, ma non rappresenta un approccio ottimale. Si supponga comunque di voler estrarre i record per i quali il campo mail non è vuoto, scegliendoli tra gli utenti la cui registrazione è stata confermata. Ecco come ottenere questo risultato con una tabella derivata:

In realtà le tabelle derivate sono utili laddove non vi sono altri approcci possibili, il che accade quando la query esterna contiene una JOIN.

