diff --git a/triennale/Anno 3/Basi di Dati/ComandiSQL.md b/triennale/Anno 3/Basi di Dati/ComandiSQL.md new file mode 100644 index 000000000..69237d3e9 --- /dev/null +++ b/triennale/Anno 3/Basi di Dati/ComandiSQL.md @@ -0,0 +1,1271 @@ +# COMANDI SQL: + +Nella guida faccio riferimento all'uso di `psql (14.3)`. + +Per usare psql: +```bash +sudo su - postgres +psql +``` + +## :pencil: Indice +* [VALORI DI DOMINIO](#valori-di-dominio) + + [Stringhe](#stringhe) + + [Numeri](#numeri) + + [Tempo](#tempo) + + [Booleani:](#booleani) +* [VALORI DI CREAZIONE](#valori-di-creazione) + + [Schema](#schema) + + [Dominio](#dominio) + + [Tabella](#tabella) + + [Chiavi](#chiavi) +* [VALORI DI DISTRUZIONE](#valori-di-distruzione) + + [Schema](#schema-1) + + [Tabella](#tabella-1) + + [Dominio](#dominio-1) +* [VALORI DI MODIFICA](#valori-di-modifica) + + [Tabella](#tabella-2) + - [INSERT INTO](#insert-into) + - [DELETE](#delete) + - [UPDATE](#update) + - [REFERENCES ](#references) + + [Dominio](#dominio-2) +* [SCRIPT](#script) +* [COMANDI PSQL](#comandi-psql) +* [COMANDI SQL](#comandi-sql-1) + + [Modifica](#modifica) + + [Interrogazione](#interrogazione) + - [SELECT](#select) + - [WHERE](#where) + - [LIKE](#like) + - [IN](#in) + + [Operatori di JOIN](#operatori-di-join) + - [NATURAL JOIN](#natural-join) + - [THETA JOIN](#theta-join) + * [INNER JOIN ](#inner-join) + * [CROSS JOIN:](#cross-join) + * [LEFT OUTER JOIN:](#left-outer-join) + * [RIGHT OUTER JOIN:](#right-outer-join) + * [FULL OUTER JOIN:](#full-outer-join) + + [Operatori insiemistici](#operatori-insiemistici) + + [Operatori di raggruppamento:](#operatori-di-raggruppamento) + - [GROUP BY](#group-by) + - [HAVING ](#having) + + [Operatori d'aggregazione](#operatori-daggregazione) + + [Subquery (o Interrogazioni Nidificate)](#subquery-o-interrogazioni-nidificate) + + [Operatori Matematici](#operatori-matematici) + + [Funzioni ed Operatori su Stringhe](#funzioni-ed-operatori-su-stringhe) + + [Funzioni su Data/Ora](#funzioni-su-dataora) + + +## VALORI DI DOMINIO + +### Stringhe + + + + + + + + + + + + + + + + + + + + + +
+ char(n) + + Stringhe di n caratteri (lunghezza fissa). Alle stringhe più corte sono aggiunti spazi in coda +
+ char + + Sinonimo di char(1) +
+ varchar(n) + + Stringhe di al più n caratteri +
+ varchar + + Stringhe di lunghezza arbitraria +
+ text + + Stringhe di lunghezza arbitraria +
+ + + +### Numeri + + + + + + + + + + + + + + + + + + + + + +
+ smallint + + Intero. 2 byte, range [−2^(15), 2^(15) −1] +
+ integer + + Intero. 4 byte, range [−2^(31) ,2^(31) −1] +
+ bigint + + Intero. 8 byte +
+ real + + Numeri in virgola mobile. Tipicamente nel range [10^(−37), 10^(37)], con almeno 6 cifre corrette +
+ float(prec) + + prec specifica la precisione minima accettabile come numero di cifre binarie +
+ + + +### Tempo + + + + + + + + + + + + + + + + + +
+ timestamp + + Data e ora. Esempio:'10-may-2004 14:30:10' +
+ date + + Data. Esempio: (formato raccomandabile 'anno-mese-giorno') '2009-07-22' +
+ time + + Ora. Esempio:'5.50 pm' +
+ interval + + Intervalli di tempo. Esempio: '1 day 12 hours 50 min 10 sec ago' +
+ + +### Booleani: + + + + + +
+ boolean + + Tipo booleano.

+ Esempi di booleani: +
    +
  • TRUE, FALSE
  • +
  • 'true','false'
  • +
  • 't','f'
  • +
  • 'y','n'
  • +
  • 'yes','no'
  • +
  • '1','0'
  • +
+
+ + +## VALORI DI CREAZIONE + +### Schema +CREATE SCHEMA Ditta; + +### Dominio + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ NOT NULL + + Assicura che una colonna non possa avere un valore NULL +
+ UNIQUE + + Crea delle SUPERCHIAVI. Assicura che tutti i valori in una colonna o tupla (insieme di colonne) siano diversi.
+ Per una tupla si scrive per esempio UNIQUE(Nome,Cognome) nell'ultima parte della creazione di una tabella. +
+ PRIMARY KEY + + Una combinazione di NOT NULL e UNIQUE. Identifica in modo univoco ogni riga in una tabella +
+ FOREIGN KEY + + Serve per la definizione di chiavi esterne su più attributi +
+ REFERENCES + + Serve per la definizione di chiavi esterne su un singolo attributo sottoposto a UNIQUE o PRIMARY KEY +
+ CHECK + + Assicura che i valori in una colonna soddisfano una condizione specifica +
+ DEFAULT + + Imposta un valore predefinito per una colonna se nessun valore è specificato +
+ CREATE INDEX + + Utilizzato per creare e recuperare dati dal database molto velocemente +
+ +Se creo un dominio come qua sotto lo posso poi utilizzare dentro una creazione di tabella: +- CREATE DOMAIN Ditta.dom_stipendio AS INTEGER CHECK (VALUE > 900); +- CREATE DOMAIN voto AS INTEGER CHECK (VALUE BETWEEN 18 AND 30); +- CREATE DOMAIN provincia AS CHAR(2) NOT NULL; + + +### Tabella +Creazione sfruttando un dominio creato in precedenza:
+ (Impiegato è il nome della tabella che creo e che appartiene allo schema Ditta) +```sql +CREATE TABLE Ditta.Impiegato( Ditta.dom_stipendio PRIMARY KEY); +``` + +Creazione definendo ora il dominio:
+ (Impiegato è il nome della tabella che creo e che appartiene allo schema Ditta) +```sql +CREATE TABLE Ditta.Impiegato( varchar(40) NOT NULL PRIMARY KEY, stipendio INTEGER); +``` + +### Chiavi + + + + + + + + + + + + + +
+ PRIMARY KEY + + Una combinazione di NOT NULL e UNIQUE. Identifica in modo univoco ogni riga in una tabella +
+ FOREIGN KEY + + Serve per la definizione di chiavi esterne su più attributi +
+ REFERENCES + + Serve per la definizione di chiavi esterne su un singolo attributo sottoposto a UNIQUE o PRIMARY KEY +
+ + +Esempio REFERENCES: +```sql +CREATE TABLE dipartimento( + nome_dip VARCHAR(15) PRIMARY KEY, + sede VARCHAR(20) NOT NULL); +CREATE TABLE impiegato( + matricola CHAR(6) PRIMARY KEY, + nome VARCHAR(20) NOT NULL, + cognome VARCHAR(20) NOT NULL, + nome_dpt VARCHAR(15) REFERENCES dipartimento(nome_dip)); /* <---- GUARDA QUA */ +``` + +Esempio FOREIGN KEY: +```sql +CREATE TABLE anagrafica( + codice fiscale CHAR(11) PRIMARY KEY, + nome VARCHAR(20) NOT NULL, + cognome VARCHAR(20) NOT NULL, + UNIQUE(nome,cognome)); +CREATE TABLE impiegato( + matricola CHAR(6) PRIMARY KEY, + nome VARCHAR(20) NOT NULL, + cognome VARCHAR(20) NOT NULL, + nome dpt VARCHAR(15) REFERENCES dipartimento(nome dip), + FOREIGN KEY(nome,cognome) REFERENCES anagrafica(nome,cognome)); /* <---- GUARDA QUA */ +``` + + +## VALORI DI DISTRUZIONE + +### Schema +```sql +DROP SCHEMA [{CASCADE |RESTRICT}] +``` +Con: +- **RESTRICT**: Gli oggetti che dipendono dalla tabella (vincoli, viste ...) vengono cancellati automaticamente +- **CASCADE**: La tabella non può venire cancellata se esistono oggetti dipendenti nella base di dati (default) + + +### Tabella +```sql +DROP TABLE [{CASCADE |RESTRICT}] +``` +Con: +- **RESTRICT**: Lo schema viene eliminato solo se vuoto (default), ovvero se non contiene alcuna definizione di tabelle, domini o altri oggetti +- **CASCADE**: Vengono cancellati sia i dati che lo schema riferiti + + +### Dominio +```sql +DROP DOMAIN [{CASCADE |RESTRICT}] +``` +Con: +- **RESTRICT**: Il dominio viene eliminato solo se non è utilizzato nella definizione di alcun altro oggetto dello schema logico (default); +- **CASCADE**: Viene eliminato il dominio e vengono modificate le definizioni di ogni colonna che lo utilizzi: + - il tipo della colonna diventa quello espresso dalla definizione del dominio; + - alla colonna viene dato l'eventuale valore di default del dominio; + - i vincoli di integrità del dominio diventano vincoli di colonna; + + +## VALORI DI MODIFICA + +### Tabella +```sql +ALTER TABLE { + ADD [COLUMN] [[...]] | + DROP [COLUMN] [{CASCADE |RESRICT}] | + ALTER [COLUMN] SET DEFAULT | + ALTER [COLUMN] DROP DEFAULT | + ADD CONSTRAINT | + DROP CONSTRAINT [{CASCADE | RESRICT}] } +``` + +#### INSERT INTO +```sql +INSERT INTO [ ([,...]) ] VALUES [ ([,...]) ] +``` +con: +- La lista dei valori `[ ([,...]) ]` deve corrispondere con la lista delle colonne ` [ ([,...]) ]` +- La lista degli attributi si può omettere, nel qual caso vale l'ordine con cui sono stati definiti. Le parole chiave `DEFAULT` e `NULL` possono prendere il posto di `` +- Se la lista non include tutti gli attributi, i restanti assumono valore `NULL` o il valore di default (se specificato) + +Esempio di `INSERT INTO`: +```sql +INSERT INTO prodotto(cod,prezzo,nome) VALUES (123,3.40,'pc'); +INSERT INTO prodotto VALUES (123,'pc',3.40); +``` + +#### DELETE +```sql +DELETE FROM [ WHERE ] +``` + +dove: +- L'istruzione `DELETE` può far uso di una condizione per specificare le tuple da cancellare +- Tutte le tuple per cui il predicato `` ha valore vero vengono cancellate +- In assenza della clausola `WHERE`, vengono eliminate tutte le tuple della tabella a cui si fa riferimento + +Esempio di `DELETE`: +```sql +DELETE FROM frequenza WHERE voto IS NOT NULL AND voto < 10 +``` + +#### UPDATE +```sql +UPDATE SET = {|