SQL
SQL (che si pronuncia es-chiu-el, non siquel come dicono in molti) è l'acronimo di Structured Query Language. Linguaggio creato per l'accesso a informazioni memorizzate nei database.
L'SQL nasce nel 1974 ad opera di Donald Chamberlin, nei laboratori dell'IBM. Nasce come strumento per lavorare con database che seguano il modello relazionale. A quel tempo però si chiamava SEQUEL (da qui l'errore di pronuncia di cui sopra). Nel 1975 viene sviluppato un prototipo chiamato SEQUEL-XRM; con esso si eseguirono sperimentazioni che portarono, nel 1977, a una nuova versione del linguaggio, che inizialmente avrebbe dovuto chiamarsi SEQUEL/2 ma che poi divenne, per motivi legali, SQL. Su di esso si sviluppò il prototipo System R, che venne utilizzato da IBM per usi interni e per alcuni suoi clienti. Ma dato il suo successo subito anche altre società iniziarono a sviluppare prodotti basati su SQL. Nel 1981 IBM iniziò a vendere alcuni prodotti relazionali e nel 1983 rilasciò DB2, il suo DBMS relazionale diffuso ancor oggi. SQL divenne subito lo standard industriale per i software che utilizzano il modello relazionale.
L'ANSI lo adottò come standard fin dal 1986, senza apportare modifiche sostanziali alla versione inizialmente sviluppata da IBM. Nel 1987 la ISO fece lo stesso. Questa prima versione standard è denominata SQL/86. Negli anni successivi si realizzarono altre versioni, che furono SQL/89, SQL/92 e SQL/2003. Tale processo di standardizzazione mirava alla creazione di un linguaggio che funzionasse su tutti i Dbms relazionali, ma purtroppo questo obiettivo non fu raggiunto. Infatti i vari produttori implementarono il linguaggio con numerose variazioni e, in pratica, adottarono gli standard ad un livello non superiore al minimo, definito dall'Ansi come Entry Level.
La caratteristica principale di SQL è di non richiedere la specifica di sequenze di operazioni, come per gli altri linguaggi di programmazione, ma di permettere di specificare le proprietà logiche delle informazioni ricercate. Esso si divide in tre sottoinsiemi:
- DDL (Data Definition Language) - permette di creare e cancellare database o di modificarne la struttura
- DML (Data Manipulation Language) - permette di inserire, cancellare e modificare i dati
- DCL (Data Control Language) - permette di gestire gli utenti e i permessi
| Indice |
|
|
DDL: Definizione dei dati
DDL serve a creare, modificare o eliminare gli oggetti in un database. Sono i comandi DDL a definire la struttura del database e quindi dei dati ivi contenuti. Ma non fornisce gli strumenti per modificare i dati stessi: per tale scopo di usa il DML. L'utente deve avere i permessi necessari per agire sulla struttura del database e questi permessi vengono assegnati tramite il DCL.
Create database
Il comando create database serve a creare un nuovo database, che potrà contenere tabelle, viste, stored procedure, trigger o altri tipi di oggetti.
Sintassi del comando create database
La sintassi è la seguente:
CREATE DATABASE nome_database
Drop database
Il comando drop database serve a cancellare un database.
Sintassi del comando drop database
La sintassi è la seguente:
DROP DATABASE nome_database
Create table
Il comando create table ha la funzione di creare una nuova tabella (o tavola).
Il nome della tabella può essere scritto indifferentemente in MAIUSCOLO o in minuscolo, in ogni caso, però, è necessario che rispetti le seguenti regole:
- Può essere formato da lettere e numeri, ma il primo carattere deve sempre essere una lettera;
- Non può superare i 30 caratteri di lunghezza;
- Non può avere lo stesso nome di una tabella o vista già esistente sullo stesso utente di database.
La tabella può essere creata vuota (vedi la create table semplice) oppure può essere creata e riempita di dati (vedi la create table mediante select): nel secondo caso la struttura della tabella è definita implicitamente dal numero di colonne (o campi) estratti dalla select, dal tipo di dato di ciascuna colonna e dai nomi delle rispettive colonne estratte dalla select (o dagli alias ad esse applicati).
Nel caso in cui la tabella venga popolata in fase di creazione, la transazione viene automaticamente conclusa da un comando di COMMIT.
Sintassi del comando create table
- Create table semplice:
CREATE TABLE nome_tabella(
nome_colonna1 tipo di dato constraint (opzionale), nome_colonna2 tipo di dato constraint (opzionale), nome_colonna3 tipo di dato constraint (opzionale), ... nome_colonnaN tipo di dato constraint (opzionale) );
- Create table mediante select:
CREATE TABLE nome_tabella
AS
SELECT ...;
Alter table
Il comando alter table ha la funzione di modificare la struttura della tabella.
L'operatore ADD consente di inserire una nuova colonna su una tabella esistente oppure di aggiungere delle constraint alle colonne della tabella.
L'operatore MODIFY consente di cambiare il tipo di dato e/o la constraint propri di ogni colonna di una tabella.
L'operatore DROP consente di eliminare la constraint dalla colonna.
Sintassi del comando alter table
Operatore add
- Inserimento di una nuova colonna:
ALTER TABLE nome_tabella
ADD nome_colonna_nuova tipo di dato constraint;
- Aggiunta di una chiave primaria (primary key):
ALTER TABLE nome_tabella
ADD CONSTRAINT nome_tabella_pk PRIMARY KEY (nome_colonna che funge da chiave primaria);
- Aggiunta di una chiave esterna (foreign key) ereditata da un'altra tabella:
ALTER TABLE nome_tabella_figlia
ADD CONSTRAINT nome_tabella_figlia_fk FOREIGN KEY (nome_colonna che funge da chiave esterna sulla tabella figlia) REFERENCES nome_tabella_padre (nome_colonna che funge da chiave primaria sulla tabella padre);
Operatore modify
- Modifica del tipo di dato di una colonna:
ALTER TABLE nome_tabella
MODIFY nome_colonna tipo di dato nuovo;
- Modifica della constraint di una colonna:
ALTER TABLE nome_tabella
MODIFY nome_colonna constraint nuova;
Operatore drop
- Eliminazione della chiave primaria:
ALTER TABLE nome_tabella
DROP PRIMARY KEY;
- Eliminazione della chiave esterna:
ALTER TABLE nome_tabella_figlia
DROP CONSTRAINT nome_tabella_figlia_fk;
Drop table
Il comando drop table consente di distruggere una tabella, eliminandola fisicamente dal database.
Come tutti i comandi DDL è un'operazione irreversibile, e provoca la perdita di tutti i dati contenuti nella tabellla.
Sintassi del comando alter table
DROP TABLE nome_tabella;
Rename
Il comando rename consente di rinominare una tabella.
Sintassi del comando rename
RENAME nome_tabella TO nuovo_nome_tabella;
DML: manipolazione dei dati
DML fornisce i comandi per inserire, modificare, eliminare o leggere i dati all'interno delle tabelle di un database. La struttura di questi dati deve già essere stata definita tramite il DDL. Inoltre, il permesso di accedere a tali dati deve essere assegnato all'utente tramite il DCL.
Insert
Il comando insert ha la funzione di inserire i dati nelle tabelle.
Le colonne (o campi) di destinazione dei valori possono essere o meno dichiarate nel comando. Se non vengono dichiarate, è necessario passare al comando un valore per ogni colonna della tabella, rispettando rigorosamente l'ordine delle colonne stesse. Se, invece, le colonne di destinazione vengono dichiarate, è possibile indicare le sole colonne per le quali vengono passati dei valori, purchè vengano inseriti comunque i valori per tutte le colonne not null (che non possono essere nulle) della tabella.
Di per sè il comando insert opera inserendo in tabella una sola riga per volta. È possibile, però, inserire più di una riga "in modo automatico" passando all'insert una serie di righe (o tuple) risultanti da un comando di select, purchè tali righe siano compatibili con le colonne della tabella su cui si inseriscono i dati.
Sintassi del comando insert
- Insert semplice:
INSERT INTO nome_tabella
VALUES (elenco valori, tutti, rispettando l'ordine dei campi della tabella);
oppure
INSERT INTO nome_tabella (elenco dei campi interessati dall'inserimento)
VALUES (elenco valori, tutti, rispettando l'ordine dei campi dichiarati sopra);
- Insert mediante select:
INSERT INTO nome_tabella (elenco dei campi interessati dall'inserimento)
SELECT ...;
Update
Il comando update ha la funzione di modificare i dati delle tabelle.
Il nome di ogni campo che deve essere modificato va dichiarato dopo la parola chiave SET e deve essere seguito dal simbolo " = " (uguale) e dal nuovo valore che deve assumere.
È possibile modificare più campi della stessa riga in un unico comando update, separandoli l'uno dall'altro con il simbolo " , " (virgola).
Il comando generico aggiorna tutte le righe della tabella. È possibile restringerne il numero
applicando la parola chiave aggiuntiva WHERE, che permette di effettuare una selezione qualitativa delle righe imponendo delle condizioni sui dati presenti nelle righe prima dell'aggiornamento.
Sintassi del comando update
- Update generico:
UPDATE nome_tavola
SET nome_campo1 = valore1_nuovo,
nome_campo2 = valore2_nuovo,
...;
- Update con condizione:
UPDATE nome_tavola
SET nome_campo1 = valore1_nuovo,
nome_campo2 = valore2_nuovo
WHERE nome_campo3 = valore;
Delete
Il comando delete ha la funzione di cancellare i dati dalle tabelle.
Come il comando update anche delete può operare in modo generico cancellando tutte le righe della tabella oppure può identificare le righe da cancellare mediante la parola chiave aggiuntiva WHERE e la condizione (o le condizioni) ad essa associata.
Sintassi del comando delete
- Delete generico:
DELETE FROM nome_tabella;
- Delete con condizione:
DELETE FROM nome_tabella WHERE nome_campo = valore;
Truncate Table
Come già detto, una Delete priva di clausola Where cancella tutte le righe dalla tabella specificata. Tuttavia, esiste un altro modo per svuotare completamente una tabella: il comando Truncate Table. Alcuni Dbms implementano questo comando in modo più veloce rispetto a una Delete, ad esempio cancellando il file dei dati senza leggerlo e ricreandolo vuoto. Generalmente però questo impedisce che vengano restituite alcune informazioni accessorie, come il numero di righe cancellate.
Sintassi del comando truncate table
TRUNCATE TABLE nome_tabella
La transazione
Le istruzioni di DML Insert, Update, Replace e Delete, se poste all'interno di una transazione, non sono irreversibili e possono essere annullate nel caso ci si renda conto che non sono state applicate in modo corretto.
Una transazione è un blocco di istruzioni che sono strettamente correlate tra loro. Nel caso si verifichi un errore (sia esso nel programma oppure dovuto a un problema esterno, per esempio se il sistema si blocca) non verrà annullata solo l'ultima istruzione, ma l'intera transazione. In tal modo si è certi che l'integregrità dei dati sarà garantita.
Commit
Per confermare la transazione si utilizza il comando COMMIT. Con esso tutte le modifiche effettuate sui dati in precedenza vengono memorizzate.
Sintassi del comando commit
COMMIT;
Rollback
Per annullare la transazione si utilizza il comando ROLLBACK. Con esso tutte le modifiche effettuate sui dati in precedenza (a partire dall'inizio della transazione) vengono cancellate.
Sintassi del comando rollback
ROLLBACK;
DCL: Controllo sui dati
DCL serve a fornire o revocare agli utenti i permessi necessari per poter utilizzare i comandi DML e DDL, oltre agli stessi comandi DCL (che gli servono per poter a sua volta modificare i permessi su alcuni oggetti).
Grant
Il comando Grant fornisce uno o più permessi a un determinato utente (es: il permesso di inserimento in una tabella).
Revoke
Il comando Revoke revoca uno o più permessi a un determinato utente (es: il permesso di cancellazione da una tabella).
Critiche a Sql
Tecnicamente l'Sql è un linguaggio di programmazione pensato per interagire con i database relazionali. I teorici fanno però notare come le caratteristiche originali dell'Sql, ispirate al calcolo delle tuple, in realtà lo violino. Le sue estensioni più recenti supportano pienamente il modello relazionale, ma hanno peggiorato le suddette violazioni.
Inoltre, vi sono molte critiche sull'utilizzo pratico dell'Sql:
- il linguaggio è piuttosto complesso;
- non fornisce un modo standard per suddividere un lungo comando in comandi più brevi a cui ci si possa riferire tramite un nome (sebbene molte implementazioni in realtà forniscano questa funzionalità);
- le diverse implementazioni sono generalmente incompatibili tra loro;
- si fa troppo affidamento sui valori NULL (un metavalore che secondo alcuni accademici dovrebbe indicare l'assenza di un valore, secondo altri dovrebbe indicare un valore sconosciuto, mentre nella pratica finisce per essere usato in entrambi i modi, o in uno solo, ma in modo incoerente).
| Principali linguaggi di programmazione (tutti) | ||
|
Ada | ALGOL | APL | Awk | BASIC | C | C++ | C# | COBOL | Delphi | Eiffel | Fortran | Haskell | IDL | Java | JavaScript | Lisp | LOGO | ML | Objective C | O'Caml| Pascal | Perl | PHP | PL/I | Prolog | Python | Ruby | SAS | Scheme | sh | Simula | Smalltalk | SQL | Visual Basic | ||
Categoria:Linguaggi di programmazione
Categoria:Database
Categoria:Acronimi
