Database relazionali (RDBMS)

martedì 4/10/16, rel. Nuje

Aspetti generali

Il database nasce dall'esigenza di ottimizzare l'accesso a un insieme di dati ordinati, prima gestiti con semplici archivi ovvero file testuali.

I Database si differenziano in due famiglie: Relazionali (RDBMS) e “tipo Directory”. I primi usano tabelle indipendenti fra loro e/o legate da relazioni definite a livello di database o a livello del modello software; è progettato per eseguire tante letture quante scritture. Il secondo tipo usa una struttura ad albero ed è studiato per le operazioni di lettura (num.operazioni.lettura » num.op.scrittura).

Elementi di un database

  • Tabelle / Tables
  • Indici / Indices
  • Sequenze / Sequences
  • Viste /
  • Tipi di dati

Questi elementi devono avere, fra loro, nomi UNIVOCI. Quindi non può esistere un Indice con lo stesso nome di una Tabella.

Al loro interno ci sono sottoinsiemi, ad esempio nelle Tabelle ci sono le Colonne o Campi (Fields) i quali devono essere univoci in una tabella ma non necessariamente univoci fra le tabelle (anche se si tende a usarli univoci per evitare di dover esplicitare la tabella a cui appartengono quando si scrive una query).

Linguaggio

Il linguaggio per i database si esprime sottoforma di QUERY composte da uno o più STATEMENTS. La query è inviata al gestore del database il quale poi genera e invia una risposta contenente i dati (presentati in forma tabellare) oppure un codice di errore.

Il linguaggio quasi unico nato con i RDBMS è SQL, di cui esistono parecchie varianti.

In ciascun linguaggio SQL-like, i comandi si dividono nelle famiglie [1]:

  • DDL: Data Definition Language - servono a creare e organizzare la struttura dati (database structure or schema)
  • DML: Data Manipulation Language - servono ad accedere al contenuto dei dati
  • DCL: Data Control Language - servono a impostare ad esempio l'accesso degli utenti
  • TCL: Transaction Control - servono a impostare i comportamenti per quando vengono usati comandi DML

Esempi

CREATE TABLE CLIENTI ( ID INT, NOME VARCHAR, COGNOME VARCHAR );

INSERT INTO CLIENTI VALUES (0, 'pippo', 'pippis');

INSERT INTO CLIENTI (NOME) VALUES ('pippo');

Indice: strumento potente di accesso ai dati. Può essercene più d'uno per tabella.

CREATE UNIQUE INDEX ind1 ON CLIENTI(ID);

In questo caso si crea un indice “unique” (univoco) che si chiama ind1 e va applicato alla colonna ID della tabella CLIENTI.

Per inserire dati e fare in modo che l'ID sia creato automaticamente e in modo univoco, esistono due strade, però l'implementazione dipende dalla variante del linguaggio SQL usata:

  • 1° modo: tipo di dati SERIAL e keyword AUTOINCREMENT: CREATE TABLE ORDINI (ID SERIAL AUTOINCREMENT, CLIENTE INT NOT NULL, DATA DATE DEFAULT TODAY(), ORDINE VARCHAR DEFAULT 'nuovoordine');
  • 2° modo: SEQUENCE

JOIN

Mi interessa l'intersezione fra due insiemi (due tabelle):

SELECT * FROM CLIENTI join ORDINI ON (CLIENTI.ID = ORDINI.CLIENTE);

Una scrittura equivalente ma non standard è : SELECT * FROM CLIENTI, ORDINI WHERE CLIENTI.ID = ORDINI.CLIENTE;

La JOIN restituisce delle righe costituite dai campi di una e dell'altra tabella, ma solo le righe che rispondono alla condizione.

Invece, SELECT * FROM CLIENTI LEFT OUTER JOIN ORDINI ON (CLIENTI.ID = ORDINI.CLIENTE); restituisce tutte le righe della prima tabella e solo le righe della seconda tabella che hanno una relazione con la prima (in base alla condizione data).

Di Outer Join si usa solo la versione LEFT (quella right è deprecated).

Si noti che si possono specificare più tabelle prima e dopo JOIN / OUTER JOIN, e si possono concatenare più JOIN / OUTER JOIN.

Riferimenti

Navigazione

Table of contents

Contact

For any info you can write to:
Per qualunque info potete scrivere a:
info[at]maetech[dot]it

Ads

Stampa/Esporta
QR Code
QR Code talks:rdbms-databases-sql (generated for current page)