Linguaggio di interrogazione

Da Wikipedia, l'enciclopedia libera.

Un linguaggio di interrogazione (o in inglese query language o data query language DQL) è 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[modifica | modifica wikitesto]

Alcuni esempi di linguaggi di interrogazione sono:

DQL per SQL standard[modifica | modifica wikitesto]

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[modifica | modifica wikitesto]

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

Sintassi del comando select[modifica | modifica wikitesto]

SELECT [ ALL | DISTINCT |     TOP ] lista_elementi_selezione
FROM lista_riferimenti_tabella
[ WHERE espressione_condizionale ]
[ GROUP BY lista_colonne [HAVING Condizione] ]
[ ORDER BY lista_colonne ];

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:

 SELECT DISTINCT cognome, nome, citta_residenza
 FROM utenti
 WHERE anni > = 18
 ORDER BY cognome

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.


 SELECT DISTINCT *
 FROM utenti

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

Con le select è possibile anche eseguire dei calcoli:

SELECT DISTINCT cod_art, prezzo_unit*giacenza AS Totale, giacenza*ingombro AS TotIngombro;
 FROM articoli

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:

 LIMIT <numero_risultati>
 LIMIT <pos_primo_risultato>, <numero_risultati>
 LIMIT <numero_risultati> [OFFSET <pos_primo_risultato>]

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[modifica | modifica wikitesto]

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

Subquery[modifica | modifica wikitesto]

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:

SELECT AVG(campo1) FROM mia_tabella;

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

SELECT * FROM mia_tabella WHERE campo1 > (SELECT AVG(campo1) FROM mia_tabella);

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

Tabelle derivate[modifica | modifica wikitesto]

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:

SELECT email FROM (SELECT email FROM utenti WHERE conferma = TRUE);

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