Nota: in generale per implementare un database non è necessario un DBMS general-purpose, tuttavia tali software rappresentano lo stato dell’arte della tecnologia in questo ambito
Nota: le fasi elencate sono da considerarsi intercambiabili, ripetibili e iterabili
Nota: il passaggio da modello concettuale a logico può essere realizzato in forma algoritmica, a patto che il primo sia stato normalizzato
$> apt-get install postgresql
$> sudo -u postgres createuser -s -l -P root
## creazione di un utente PostgreSQL di nome root,
## con caratteristiche superuser (-s) e login (-l)
#psql -U nomeutente -W database
psql -U root -W template1
\? Visualizza tutti i comandi interni
\l Lista i database presenti
\c [db] [user] Si connette al database specificato con le credenziali richieste (opzionale)
\d table Visualizza la struttura tella tabella in argomento
\d{t,i,s,v} Visualizza tabelle, indici, sequenze e viste definite nel database corrente
\df Visualizza le funzioni definite
\h Help on-line SQL
\q Esce
integer (4 bytes) usual choice for integer
real (4 bytes) variable-precision, inexact
numeric (variable) user-specified precision, exact
serial (4 bytes) autoincrementing integer
varchar(n) (n bytes) variable-length text with limit
text (unlimited) variable text with unlimited length
# CREAZIONE:
CREATE DATABASE db_name
[create_specification [, create_specification] ...]
# MODIFICA:
ALTER DATABASE db_name
[DEFAULT] CHARACTER SET charset_name
| [DEFAULT] COLLATE collation_name
# CANCELLAZIONE:
DROP DATABASE nome_db
# Creazione mediante definizione dello schema:
CREATE TABLE nome_tabella(
nome_colonna1 tipo_dato [vincolo (...)],
nome_colonna2 tipo_dato [vincolo (...)],
nome_colonna3 tipo_dato [vincolo (...)],
...
nome_colonnaN tipo_dato constraint (opzionale)
);
# Creazione mediante select:
CREATE TABLE nome_tabella AS
SELECT ...;
ALTER TABLE esame ADD COLUMN voto int not null default 18;
DROP TABLE nome_tabella [CASCADE | RESTRICT]
Nota: Tutte le funzioni di aggregazione sono deterministiche. Ciò significa che restituiscono lo stesso valore ogni volta che vengono invocate sullo stesso set specifico di valori di input
INSERT INTO nome_tabella [(elenco dei campi interessati dall’inserimento)]
VALUES (elenco valori);
UPDATE nome_tabella
SET nome_campo1 = 'valore1_nuovo',
nome_campo2 = 'valore2_nuovo'
[WHERE nome_campo3 = 'valore'];
DELETE FROM nome_tabella
[WHERE nome_campo = 'valore'];
Nota: alcuni DBMS implementano la direttiva TRUNCATE (non standard) per la cancellazione incondizionata, che ottimizza l’operazione agendo direttamente sul file system.
SELECT ... FROM ... WHERE
SELECT *
FROM tabella
WHERE espressione_condizionale
,=,<,<=,>= (operatore di confronto)
SELECT lista_attributi
FROM tabella
SELECT nome, cognome, etÃ
FROM impiegato
WHERE età > 50 and salario > 3000
SELECT *
FROM tabella1, tabella2
SELECT *
FROM tabella1, tabella2
WHERE condizione_di_join
SELECT *
FROM tabella1 JOIN tabella2
USING (condizione_di_join)
Nota: qualora le colonne della condizione di join abbiano nomi differenti, si utilizza la clausola ON (colonna1=colonna2) al posto della USING
SELECT *
FROM tabella1 [LEFT | RIGHT] OUTER JOIN tabella2
[USING (condizione_di_join) | ON (condizione_di_join)]
Nota: le operazioni di outer join (normale, sinistro e destro NON possono essere definite mediante operatori di selezione e proiezione)
SELECT attributi_di_proiezione
FROM nome_tabella
WHERE condizione_di_selezione
ORDER BY colonna1 [ASC | DESC] [, colonna2 [ASC | DESC] ...]