LINGUAGGIO SQL Il linguaggio Sql è un linguaggio di tipo dichiarativo, o meglio non procedurale, che ha il compito di creare, manipolare e interrogare database relazionali. Questo linguaggio, che al tempo si chiamava Sequel, è nato nel 1974 e si basava su due standard particolari, ovvero ANSI e ISO (standard internazionali). In generale, il linguaggio Sql, assolve alle funzioni di: - DDL (Data Definition Language) che contiene le istruzioni per definire la struttura delle relazioni della base di dati. (creazione di tabelle o di vincoli) - DML (Data Manipulation Language) che contiene le istruzioni per manipolare i dati appartenenti alle diverse tabelle. In particolar modo, il DML, permette inserimenti, cancellazioni e modifiche delle righe delle tabelle. - DCL (Data Control Language) che contiene le istruzioni per controllare il modo in cui le operazioni vengono eseguite. In particolar modo, il DCL, consente di gestire il controllo degli accessi per più utenti e i permessi per gli utenti autorizzati. Inoltre, Sql, può essere usato in: - Modalità stand-alone: il linguaggio può essere classificato come un linguaggio di interrogazione interattivo, in cui i comandi vengono inviati al sistema operativo in modo interattivo o batch. Per quanto riguarda il modo interattivo, viene usata un’interfaccia grafica con menù, finestre e icone, per guidare l’utente nella scelta dell’operazione da effettuare sui dati. In modo batch, invece, è possibile creare file di istruzioni pronte per essere eseguite. In entrambe le modalità, per eseguire ogni istruzione, viene invocato l’interprete Sql. - Modalità embedded: vengono utilizzate delle clausole Sql inserite in un linguaggio di programmazione procedurale. In sintesi, è possibile trattare i comandi Sql come linguaggi ospite, che hanno la caratteristica di essere precompilati ovvero subire un primo processo di precompilazione e successivamente, essere compilati. Inoltre, Sql, non è un linguaggio case-sensitive e quindi le istruzioni possono essere scritte utilizzando indifferentemente caratteri maiuscoli o minuscoli. Le istruzioni, vengono generalmente separate dal punto e virgola, mentre gli identificatori, utilizzati per i nomi delle tabelle e degli attributi, devono: - Avere una lunghezza massima di 18 caratteri - Iniziare con una lettera - Contenere come unico carattere speciale l’underscore “_” Per riferirsi ad un attributo di una tabella, bisogna scrivere NomeTabella . NomeAttrib uto . Nella terminologia Sql: - Le relazioni vengono chiamate tabelle - Le tuple vengono chiamate righe o registrazioni - Gli attributi sono le colonne delle tabelle Nelle espressioni, gli operatori che possono essere usati, sono operatori: - Aritmetici, ovvero ,-, /, - Relazionali, ovvero , , (minore o uguale), (maggiore o uguale), (diverso) - Logici, ovvero AND,OR, NOT Infine, nel linguaggio Sql, i tipi di dato maggiormente usati,sono: - CHARN , che indica una stringa di caratteri di lunghezza fissa pari a N - BIT N , che indica una stringa di bit di lunghezza fissa pari a N - INT N , che indica un numero intero con precisione pari a N - REAL o FLOAT , che indicano numeri reali - DATE , che indica la data nel formato " AAAA/MM/GG " - TIME , che indica l’ora nel formato ora,minuti, secondi, millisecon di ISTRUZIONI DEL DDL DI SQL Creare un nuovo database: Per creare un nuovo database, si utilizza la sintassi CREATE DATABASE NomeDatabase AUTHORIZATION Proprietar io ; La clausola AUTHORIZATION può anche essere omessa e specifica solamente il nome dell’utente che possiede i privilegi di accesso al database. Selezionare un nuovo database: Per iniziare ad usa il database, occorre utilizzare la sintassi USE NomeDatabase ; dove NomeDatabase è il nome del database precedentemente creato. Creare una tabella: Per creare una nuova tabella, si utilizza la sintassi CREATE TABLE NomeTabell a ( Attributo1 Tipo1 VincoloAtt ributo1 , AttributoN TipoN VincoloAtt ributoN , VincoloTab ella ); Creare i vincoli per un singolo attributo: possono essere: - NOT NULL : richiede che l’attributo corrispondente debba necessariamente avere un valore - DEFAULT ValoreDiDefault : assegna all’attributo corrispondente il valore di default - CHECK Condizione : specifica una condizione sull’attributo corrispondente La clausola Condizione , può essere espressa con la sintassi: - Attributo IN Valore1 , ValoreN : richiede che il valore dell’attributo sia tra quelli specificati all’interno della parentesi. - Attributo BETWEEN Min AND Max : richiede che il valore dell’attributo sia compreso tra il valore minimo e il valore massimo. - Attributo NOT BETWEEN Min AND Max : richiede che il valore dell’attributo non sia compreso tra il valore minimo e il valore massimo. - Attributo LIKE Espressione : richiede che il valore dell’attributo assuma il formato specificato dall’espressione. - Attributo NOT LIKE Espressione : richiede che il valore dell’attributo non assuma il formato specificato dall’espressione. Creare i vincoli per un gruppo di attributi (vincoli di ennupla): possono essere: - PRIMARY KEY Attributo1 , AttributoN : specifica le colonne che fanno parte della chiave primaria. - UNIQUE Attributo1 , AttributoN : indica che i valori degli attributi specificati devono essere necessariamente distinti all’interno della tabella. Ad esempio, scrivendo UNIQUECognome, Nome, DataAssunzione , si impone che nella tabella, non ci siano due persone che abbiano lo stesso nome e cognome e che siano state assunte lo stesso giorno. - CHECK Condizione : Specifica un qualsiasi vincolo che riguarda il valore di più attributi della tabella, come ad esempio CHECK DataNascita DataAssunzione . Creare i vincoli di integrità referenziale: bisogna utilizzare la sintassi FOREIGN KEY Attributo1 , AttributoN REFERENCES NomeTabella Attr1 , AttrN ON DELETE | ON UPDATE CASCADE | SET NULL | SET DEFAULT | NOACTION Le colonne degli attributi, rappresentano la chiave esterna e corrispondono alle colonne degli attr che formano la chiave primaria della tabella NomeTabella . Politiche di violazione dei vincoli di integrità referenziale al momento della cancellazione: si specificano tramite la clausola ON DELETE con l’aggiunta di: - RESTRICT : l’azione si limita alla riga corrispondente - CASCADE : vengono cancellate le righe corrispondenti in tutte le tabelle correlate - SET NULL : vengono impostate al valore null tutte le righe corrispondenti - SET DEFAULT : vengono impostate al valore di default tutte le righe corrispondenti - NO ACTION : non viene eseguita alcuna azione Politiche di violazione dei vincoli di integrità referenziale al momento della modifica: si specificano tramite la clausola ON UPDATE con l’aggiunta di: - RESTRICT : l’azione si limita alla riga corrispondente - CASCADE : vengono impostate con lo stesso nuovo valore tutte le righe corrispondenti - SET NULL : vengono impostate al valore null tutte le righe corrispondenti - SET DEFAULT : vengono impostate al valore di default tutte le righe corrispondenti - NO ACTION : non viene eseguita alcuna azione Creare l’indice di una tabella: gli indici, sono delle tabelle speciali che contengono le chiavi delle tabelle alle quali sono associati. Per creare un indice per una tabella, si utilizza la sintassi CREATE UNIQUE INDEX NomeIndice ON NomeTabella Attributo1 , AttributoN ; dove la clausola UNIQUE crea un indice su attributi chiave. Se essa, non è specificata, viene creato un indice su attributi non chiave. Aggiungere una nuova colonna in una tabella: si utilizza la sintassi ALTER TABLE NomeTabella ADD NomeColonna1 NomeTipo BEFORE NomeColonna2 ; Con la clausola BEFORE, si può specificare la posizione in cui inserire la colonna nella tabella. Cancellare una colonna in una tabella: si utilizza la sintassi ALTER TABLE NomeTabella DROP COLUMN NomeColonna1 ; Modificare il tipo di una colonna in una tabella: si utilizza la sintassi ALTER TABLE NomeTabella MODIFY NomeColonna , NuovoTipoColonna Eliminare una tabella: si utilizza la sintassi DROP TABLE NomeTabella RESTRICT, CASCADE, SET NULL; La cancellazione di una tabella, può provocare inconsistenze, dovute al fatto che possono esistere tabelle collegate tramite vincoli di integrità. Per far fronte a tali situazioni, si utilizzano le clausole: - RESTRICT : non viene permessa la cancellazione se la tabella da cancellare è legata tramite vincoli ad altre tabelle - CASCADE : vengono cancellate in cascata tutte le tabelle collegate - SET NULL : viene posto il valore null a tutti i valori delle chiavi interessate Eliminare un indice: si utilizza la sintassi DROP INDEX NomeIndice ON NomeTabella ; Eliminare un database: si utilizza la sintassi DROP DATABASE NomeDatabase ; ISTRUZIONI DEL DML DI SQL Inserire i valori in una tabella: si utilizza la sintassi INSERT INTO NomeTabella Attributo1 , AttributoN . VALUES Valore1 , ValoreN ; I valori degli attributi, devono rispettare l’ordine con cui sono stati inseriti all’interno della parentesi e soprattutto si assume che il valore per gli attributi omessi sia Null. Modificare i valori delle righe di una tabella: si utilizza la sintassi UPDATE NomeTabell a SET Attributo1 Espressione1 AttributoN EspressioneN WHERE Condizione ; Con questa sintassi, tutti gli attributi di NomeTabella , vengono aggiornati con i valori delle corrispondenti espressioni in tutte le righe che soddisfano la condizione. DELETE FROM NomeTabella . WHERE Condizione ; Con questa sintassi, si eliminano tutte le righe di NomeTabella che soddisfano la condizione. Cancellare le righe di una tabella: si utilizza la sintassi Comando Select: ha la funzione di estrarre dei dati dal database e quindi effettuare una query o un’interrogazione sulla base di dati. La sintassi del comando Select, è SELECT DISTINCT Attributo1 , AttributoN FROM Tabella1 , TabellaK WHERE Condizione ; In questo caso, se è assente la clausola WHERE, la condizione si assume sempre vera, mentre se è presente l’opzione DISTINCT, il risultato è privo di righe duplicate. Se si vogliono visualizzare tutti gli attributi presenti nelle varie tabelle, è possibile utilizzare il simbolo “*”. Comando As: ha la funzione di assegnare un nome diverso ad ogni colonna che si ottiene dal risultato della Query e quindi dal risultato dell’operazione select. La sua sintassi, è SELECT DISTINCT Attributo1 AS NomeColonna1 , AttributoN AS NomeColonnaN FROM Tabella1 , TabellaK WHERE Condizione ; Comando Null: innanzitutto: - Il valore Null non è una costante e soprattutto fornisce un valore diverso da zero e diverso dalla stringa vuota. - Se un operando ha il valore Null, il risultato di un’espressione aritmetica è sconosciuto (UNKNOWN), così come il confronto tra un valore Null e un qualsiasi altro valore. - Se il risultato del predicato della clausola WHERE è il valore UNKNOWN, la tupla non viene considerata. La sintassi per controllare se il valore di un attributo è presente oppure è uguale a Null, è SELECT DISTINCT Attributo1 AS NomeColonna1 , AttributoN AS NomeColonnaN FROM Tabella1 , TabellaK WHERE AttributoX IS NULL | IS NOT NULL; Funzioni di aggregazione: la sintassi generale per le funzioni di aggregazione, è SELECT FunzioneDiAggregazione DISTINCT Attributo Le principali funzioni di aggregazione, sono: - COUNT: conta il numero di righe della colonna Attributo - COUNT (*): conta il numero totale delle righe della tabella, comprese quelle con il valore Null. In questo caso, la funzione DISTINCT, non può essere usata. - MIN: restituisce il valore minimo della colonna Attributo - MAX: restituisce il valore massimo della colonna Attributo - SUM: restituisce la somma degli elementi della colonna Attributo - AVG: restituisce la media aritmetica degli elementi della colonna Attributo Ordinamento: la sintassi per l’ordinamento delle righe di una tabella, è ORDER BY Attributo1 ASC | DESC , AttributoN ASC | DESC , dove ASC sta per ordine crescente e DESC sta per decrescente. Questa sintassi, si inserisce alla fine del comando SELECT. Raggruppamento: la sintassi, viene inserita alla fine del comando SELECT ed è GROUP BY Attributo1 , AttributoN HAVING CondizioneGruppo . Con questa sintassi: - Viene eseguito il prodotto delle tabelle presenti nella clausola FROM - Su tale prodotto si fa una restrizione in base alla clausola WHERE - La tabella risultante, viene partizionata in gruppi di righe appartenenti agli stessi valori - Tutti i gruppi che non soddisfano la clausola HAVING vengono eliminati. Query e subquery annidate: per eseguire query complesse, è possibile strutturare opportunamente più comandi di SELECT e ciò consente di costruire un’interrogazione al cui interno sono presenti altre interrogazioni, dette sottointerrogazioni o subquery. In generale, possiamo distinguere tra: - Query principale o query esterna, che rappresenta la query individuata dalla prima parola SELECT incontrata. - Query secondaria o subquery o query interna, che rappresenta la query individuata dalla seconda parola SELECT incontrata. La subquery, genera una tabella, detta tabella derivata, che può essere composta da: - Un solo valore, ovvero una tabella formata da una sola riga ed una sola colonna (tabella scalare). - Una sola riga e più colonne - Più righe e più colonne In generale, una subquery, può essere composta da altre query e quindi si può creare una struttura di query annidate. Per eseguire sottointerrogazioni annidate, si deve eseguire prima l’interrogazione più annidata fino a giungere alla query principale. Subquery che producono valori appartenenti a un insieme con predicati ANY, ALL, IN, NOT IN: la sintassi generale, è SELECT DISTINCT Attributo1 , AttributoN FROM Tabella1 , TabellaK WHERE AttributoX OperatoreRelazionale ANY | ALL | IN | NOT IN Sottoquery ; I predicati principali, sono: - ANY: la condizione della clausola WHERE è vera se il valore dell’attributo compare in almeno uno dei valori forniti dalla subquery. - ALL: la condizione della clausola WHERE è vera se il valore dell’attributo compare in tutti i valori forniti dalla subquery. - IN: la condizione della clausola WHERE è vera se il valore dell’attributo appartiene all’insieme dei valori fornito dalla subquery. - NOT IN: la condizione della clausola WHERE è vera se il valore dell’attributo non appartiene all’insieme dei valori fornito dalla subquery. Subquery che producono valori appartenenti a un insieme con predicati EXISTS, NOT EXISTS: SELECT DISTINCT Attributo1 , AttributoN la sintassi generale, è FROM Tabella1 , TabellaK WHERE EXISTS | NOT EXISTS Sottoquery ; I predicati principali, sono: - EXISTS: la condizione della clausola WHERE è vera se la subquery produce una tabella non vuota. - NOT EXISTS: la condizione della clausola WHERE è vera se la subquery produce una tabella vuota.