Il linguaggio SQL
Structured Query Language

linguaggio di tipo non procedurale
consente di operare sui dati di un database
utilizza parole chiave prese dal linguaggio corrente
consente di inserire un’interrogazione all’interno di un’altra (query innestate)

Istruzioni di SQL standard:
SELECT
DML - Data Manipulation Language
   INSERT
   UPDATE
   DELETE
DDL - Data Definition Language
   CREATE
   ALTER
   DROP
DCL - Data Control Language
   GRANT
   REVOKE
L’istruzione SELECT serve per estrarre informazioni dal database.
              SELECT [ ALL | DISTINCT ] lista_scelte 
              FROM lista_tabelle
              [ WHERE condizioni ]
              [ GROUP BY lista_attributi ]
              [ HAVING condizioni ]
              [ ORDER BY lista_attributi [ ASC | DESC ] ]
Restituisce i valori prescelti delle tabelle che soddisfano ai requisiti indicati.
Ecco il significato di ogni singola clausola:
ALL (default) restituisce tutti i valori risultanti, DISTINCT solo quelli diversi tra loro
lista delle espressioni (separate da virgole) che si desidera ottenere:
  • nomi di colonne (campi)
  • asterisco (*) ovvero tutte le colonne della tabella indicata
  • costanti, funzioni o subquery
FROM indica la/e tabella/e da cui estrarre i valori
WHERE specifica le restrizioni o condizioni che devono essere soddisfatte dai valori risultanti
GROUP BY permette di raggruppare i risultati per omogeneità degli attributi, utile nelle funzioni di aggregazione
HAVING è l’equivalente del WHERE applicata ai gruppi ottenuti dal GROUP BY
ORDER BY ordina i valori risultanti rispetto a uno o più campi in modo ascendente (default) o discendente
Alcune peculiarità in Transact-SQL di SQL Server rispetto all’istruzione classica:
è possibile cambiare il nome di una colonna nel seguente modo:
nome_nuova_colonna = espressione,
[INTO nuovo_nome_tabella] prima di FROM permette di creare una nuova tabella con i valori risultanti dalla SELECT
FROM non è più obbligatoria, SELECT viene usata per attribuire valori a variabili
SELECT @variabile=espressione
lista_tabelle può contenere tabelle e view ed è possibile indicare il nome dell’indice da utilizzare

Esempi

Data Manipulation Language: linguaggio per la manipolazione dei dati

SELECT

INSERT aggiunge nuove righe in una tabella o in una vista
              INSERT INTO {nome_tabella | nome_vista}
              [(lista_colonne)]
              { VALUES (lista_valori) | subquery }

N.B. Se lista_colonne viene omessa i valori indicati vengono inseriti nella tabella nell’ordine in cui sono state definite le colonne durante la creazione della tabella

UPDATE modifica i valori esistenti in una tabella o in una vista
              UPDATE {nome_tabella | nome_vista}
              SET
              nome_colonna = {espressione | subquery}
              [, nome_colonna = {espressione | subquery}]
              [, ...]
              [WHERE condizione]

DELETE cancella righe da una tabella o da una vista
              DELETE FROM {nome_tabella | nome_vista}
              [WHERE condizione]

Queste istruzioni modificano il contenuto del database, pertanto è possibile iniziare una sessione di lavoro (transazione) e decidere alla fine se confermare i cambiamenti apportati o cancellarli
              BEGIN TRANSACTION nome_transazione	apre una transazione
              COMMIT TRANSACTION nome_transazione	conferma le modifiche
              ROLLBACK TRANSACTION nome_transazione	annulla i cambiamenti

Esempi
Data Definition Language: linguaggio per la definizione dei dati

CREATE crea oggetti di un database - tabelle, indici, viste
              CREATE TABLE nome_tabella
              ( 
                 nome_colonna tipo_colonna costrizioni_colonna
                 [, nome_colonna tipo_colonna costrizioni_colonna]
                 [ ... ]
              )
tipo_colonna può essere:
  • binary: binary(n), varbinary(n) (fisso, variabile)
  • character: char(n), varchar(n)
  • datetime (Mon dd yyyy hh:mmAM): datetime, smalldatetime
  • exact numeric: decimal(p,s), numeric(p,s)
  • approximate numeric: float(n), real
  • integer: int, smallint, tinyint
  • monetary: money, smallmoney
  • special: bit (1, 0), timestamp (contatore di sistema), datatype definiti dall'utente
  • text and image: text, image
costrizioni_colonna specificano alcune caratteristiche della colonna considerata:
  • IDENTITY[base, incremento]
        nella colonna viene inserito un valore progressivo calcolato a partire da base e incremento definiti
  • NULL/NOT NULL
        la colonna considerata può/non può assumere valore nullo
  • CONSTRAINT nome_constraint_colonna UNIQUE (nome_colonna)
        i dati della colonna devono essere unici
  • CONSTRAINT nome_primary_key_colonna PRIMARY KEY (nome_colonna)
        nome_colonna è una chiave primaria (not null + unique)
  • CONSTRAINT nome_foreign_key_colonna FOREIGN KEY (nome_colonna) REFERENCES tabella_di_riferimento (elenco campi da collegare)
        nome_colonna è una foreign key.
  • CONSTRAINT nome_constraint_colonna DEFAULT {espressione costante}
        inserisce un valore di default nella colonna.
  • CONSTRAINT nome_constraint_colonna CHECK (espressione)
        controlla il contenuto della colonna con l'espressione fornita.
              CREATE [UNIQUE] INDEX nome_indice
              ON nome_tabella (lista_colonne)
UNIQUE significa che l’indice creato è unico
              CREATE VIEW nome_view
              [ lista_nomi_colonne ]
              AS subquery
le viste sono tabelle logiche

Esempi

ALTER modifica la definizione di una tabella
              ALTER TABLE nome_tabella
              [ ADD nome_colonna tipo_colonna [costrizioni_colonna]
              [, nome_colonna tipo_colonna  [costrizioni_colonna] ] [, ...] ]
              [ DROP clausole_drop]
ADD aggiunge colonne e/o costrizioni su colonne
DROP cancella costrizioni su colonne

Esempi

DROP cancella oggetti esistenti - tabelle, indici, viste
              DROP TABLE nome_tabella
              DROP INDEX nome_indice
              DROP VIEW nome_view
Si può cancellare più di un oggetto alla volta, separandoli da virgole.

Esempi

Data Control Language: linguaggio per il controllo dei dati

GRANT consente al proprietario di un oggetto di accordare privilegi su di esso ad altri utenti
              GRANT {ALL | lista_privilegi}
              ON { nome_tabella [lista_colonne] | nome_vista [lista_colonne] }
              TO {lista_utenti | PUBLIC}
ALL concede tutti i privilegi sull’oggetto all’utente
i privilegi possibili sono:
  • SELECT
  • INSERT
  • DELETE
  • UPDATE
se viene omessa la lista delle colonne il privilegio viene concesso su tutto l’oggetto
PUBLIC concede i privilegi a tutti gli utenti

REVOKE revoca i privilegi concessi in precedenza
              REVOKE {ALL | lista_privilegi}
              ON { nome_tabella [lista_colonne] | nome_vista [lista_colonne] }
              FROM {lista_utenti | PUBLIC}

Esempi