🗂️

SQL


SQL (Structured Query Language) è un linguaggio creato per l’accesso a informazioni memorizzate nei database. Più nel dettaglio, SQL è un linguaggio standardizzato per database basati sul modello relazionale (RDBMS), progettato per le seguenti operazioni:


Operatori

Di relazione

In SQL esistono diversi operatori di relazione che risultano utili in molte query nei diversi ambiti del linguaggio (soprattutto DML e DQL):

=Uguale
>Maggiore
<Minore
>=Maggiore uguale
<=Minore uguale
<>Diverso. In alcune versioni di SQL è !=
BETWEENIn un certo intervallo
LIKERicerca un pattern
INSe è presente in una lista di valori

Logici

OperatorDescription
ALLTRUE if all of the subquery values meet the condition
ANDTRUE if all the conditions separated by AND is TRUE
ANYTRUE if any of the subquery values meet the condition
BETWEENTRUE if the operand is within the range of comparisons
EXISTSTRUE if the subquery returns one or more records
INTRUE if the operand is equal to one of a list of expressions
LIKETRUE if the operand matches a pattern
NOTDisplays a record if the condition(s) is NOT TRUE
ORTRUE if any of the conditions separated by OR is TRUE
SOMETRUE if any of the subquery values meet the condition

Di aggregazione


DDL → Data Definition Language

Prerequisito: Vincoli di integritĂ 

Un vincolo di integrità è una caratteristica del modello relazionale per le basi di dati ed è necessario che sia soddisfatta tutta l’intera base di dati.

Esistono diversi tipi di vincolo di integritĂ :

Per entrambi i vincoli il sistema blocca i tentativi di violazione segnalandoli.

Per il vincolo di integritĂ  referenziale permette anche di scegliere una reazione da seguire in caso di cancellazione e/o aggiornamento:

DDL serve a creare e modificare schemi di database. Sono i comandi DDL a definire la struttura del database e quindi dei dati contenuti, ma non fornisce gli strumenti per modificare i dati stessi. I comandi sono: CREATE, ALTER, DROP

Database

# Crea un database
CREATE DATABASE nome;

# Elimina database
DROP DATABASE nome;

Table

La tabella SQL è il criterio di organizzazione dei dati in un database relazionale.

La tabella è composta da un insieme di relazioni dette colonne e righe. Nelle righe sono definite le relazioni tra i dati di diverso tipo / proprietà.

Una tabella può essere creata in un database relazionale mediante il comando CREATE del linguaggio SQL:

Index

Gli indici sono una struttura di dati che contiene puntatori ai contenuti di una tabella disposti in un ordine ascendente, per aiutare il database a ottimizzare le query attraverso una ricerca dicotomica.

Sono simili all’indice di un libro, dove le pagine (righe della tabella) sono indicizzate dal loro numero di pagina. Per creare un indice si utilizza il seguente codice:

Vantaggi

Svantaggi

View

Le viste sono delle query memorizzate con un proprio nome che possono essere considerate simili a tabelle virtuali. Sono una via efficace per mostrare informazioni che arrivano da una o piĂą tabelle.

Le view vengono mantenute per tutta la durata della sessione, poi vengono rimosse. Per creare una vista si utilizza il seguente codice:

Il limite delle view è che non è possibile usare la clausola ORDER BY per specificare un ordinamento. Se proviamo a farlo ci verrà restituito un errore.


DML → Data Manipulation Language

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.

Esempi di comando sono: INSERT, UPDATE, DELETE

INSERT INTO

L’istruzione INSERT INTO dell’SQL DML serve ad inserire nuovi record in una tabella

INSERT INTO nome_tabella (lista_colonne) VALUES [lista_valori]
# Oppure senza specificare le colonne
INSERT INTO nome_tabella VALUES [lista_valori]

I nomi dei campi si inseriscono tra parentesi rotonde e si utilizza la clausola VALUES per valorizzarli.

UPDATE

UPDATE nome_tabella
SET colonna1 = valore1, colonna2 = valore2, ...
WHERE (condizione);

DELETE

DELETE FROM nome_tabella WHERE (condizione);
# Per svuotare una tabella
DELETE FROM nome_tabella;

DQL → Data Query Language

Il DQL serve a interrogare i dati memorizzati.

Per farlo si utilizza il comando SELECT.

SELECT

Una select è una query che permette di ottenere un insieme di tuple con i rispettivi attributi

SELECT [lista_attributi | *] FROM lista_tabelle;

# Prendo solo il cognome
SELECT cognome FROM dipendente;

# Prendo tutte le colonne
SELECT * FROM dipendente;

# Con un alias
SELECT cognome AS cognomi_dipendenti FROM dipendente;
# Senza AS funziona comunque
SELECT cognome cognomi_dipendenti FROM dipendente;

→ WHERE

# Filtro con delle condizioni
SELECT lista_attributi FROM lista_tabelle WHERE condizione;
# Esempio 
SELECT cognome FROM dipartimento WHERE dipartimento = 'marketing' OR dipartimento = 'Produzione';
# Controllo valori nulli
SELECT cognome FROM dipartimento WHERE dipartimento IS NULL;

→ DISTINCT

SELECT DISTINCT(attributo) FROM lista_tabelle;
# Prendo tutti i cognomi senza ripetizioni
SELECT DISTINCT(cognome) FROM dipendenti;

→ GROUP BY

SELECT *
FROM nome_tabella
WHERE condizione
GROUP BY colonne
ORDER BY colonne;

SELECT COUNT(*) AS numero_dipendenti, etĂ 
FROM dipendenti
GROUP BY etĂ ;

GROUP BY support la clausola HAVING che sostituisce WHERE nelle funzioni di aggregazione.

SELECT COUNT(*) AS numero_dipendenti, etĂ 
FROM dipendenti
GROUP BY etĂ 
HAVING COUNT(*) > 1;

→ ORDER BY

SELECT lista_attributi FROM lista_tabelle ORDER BY ordinamento (ASC|DESC);
# Ordino per cognome (ASC di default)
SELECT cognome FROM dipartimento ORDER BY cognome;
# Ordino per cognome in ordine decrescente
SELECT cognome FROM dipartimento ORDER BY cognome DESC;

→ LIKE

SELECT *
FROM Dipendente
WHERE cognome LIKE 'R%i';

Prende tutti i dipendenti con cognome che inizia per R e finisce per i (case sensitive).

SELECT *
FROM Dipendente
WHERE cognome LIKE 'R___i';

Prende tutti i dipendenti con cognome che inizia per R e finisce per i con 3 caratteri nel mezzo, indicati dal numero di underscore _.

→ Select annidate

SELECT lista_attributi FROM lista_tabelle WHERE condizione [operatore relazione] SELECT SQL

→ Select insiemistiche

{Select SQL} [UNION | EXCEPT | INTERSECT]  (ALL) {Select SQL}

Ricapitolando:

Join tra tabelle

SELECT *
FROM Dipendente, Dipartimento
WHERE Dipendente.dipartimento=Dipartimento.nome;

→ Per un singolo valore

SELECT Dipartimento.sede
FROM Dipendente, Dipartimento
WHERE Dipendente.dipartimento=Dipartimento.nome;

→ Rinominando

SELECT d2.sede
FROM Dipendente d1, Dipartimento d2
WHERE d1.dipartimento=d2.nome;

→ Per tutti i valori di una tabella

SELECT d2.*
FROM Dipendente d1, Dipartimento d2
WHERE d1.dipartimento=d2.nome;

Il . non è necessario se l’attributo a cui bisogna fare riferimento compare in una sola tabella

Join avanzato

SELECT attributi FROM tabella1 AS alias [tipo-join] join tabella2 AS alias ON [condizioni];

Il tipo-join può essere:

SELECT *
FROM Dipartimento d INNER JOIN Dipendente di ON d.nome=d.dipartimento

DCL → Data Control Language

Privilegi

Ogni componente dello schema può essere protetto.

Il possessore della risorsa assegna dei privilegi agli altri utenti.

Tipi di privilegi:

  • INSERT
  • UPDATE
  • DELETE
  • SELECT
  • USAGE
  • …

→ Per concedere un privilegio:

GRANT privilegio ON risorse TO utenti (WITH GRANT OPTION)
# WITH GRANT OPTION permette agli utenti di concedere a loro volta privilegi su quella risorsa

→ Per revocare un privilegio:

REVOKE privilegio ON risorse TO utenti
# per revocare la possibilitĂ  di assegnare privilegi
REVOKE GRANT OPTION ON risorse to utenti