SQL parte 2
Ricapitolando
SQL (Structured Query Language)
è il linguaggio di interrogazione più diffuso tra quelli usati per l’interazione con i principali Database Management Systems (DBMS)

Ricapitolando
Chiave primaria
è un insieme di attributi che permette di individuare univocamente un record o tupla in una tabella o relazione.
Indice
è un insieme di attributi che permettono di ricercare più velocemente i dati all'interno di una tabella
Chiave esterna
è un insieme di attributi che permettono di relazionare una o più tabelle tra di loro
Relazioni tra tabelle



Tabella
sono rappresentazioni delle entità concrete
Sintassi SQL
Selezione
(le colonne della tabella)
Provenienza
Filtri
(le condizioni e la logica per estrrre ciò che ci serve)
Raggruppamento
(per raggruppare i dati e avere risultati aggregati)
Filtri su raggruppamenti

Sintassi SQL: la proiezione

Nella prima parte della query si specificano i dati che vogliamo vengano visualizzati nel nostro risultato.
La dicitura "as" identifica come si deve chiamare la colonna nel risultato
I dati possono anche essere combinazioni di:
- dati semplici (attirbuti contenuti nel database)
- aggregati (somme, medie, conteggi)
- condizioni (if-then)
- complessi (sotto query, funzioni)
Sintassi SQL: provenienza e join

Qui si identificano le tabelle da dove si dovranno prendere i dati o fare i filtri
LE JOIN
Servono per creare le relazioni tra le tabelle: sono quei collegamenti che le relazionano tra di loro.
Le join possono essere esplicite o implicite.
In un DB relazionale, se si usano join esplicite con indici definiti migliori le performance
TIPI di JOIN:
INNER, LEFT, RIGHT
[INNER|LEFT|RIGHT] JOIN <tabella> ON <condizione di aggregazione>
Sintassi SQL: filtri e raggruppamenti

Tutti i filtri e la logica per estrarre i dati avviene principalmente qui.
Si usano:
- condizioni di AND, OR, NOT
- operazioni matematiche di =, ≠, >, < , ≤, ≥
- operatori complessi LIKE, IN, NOT IN
Operatori di raggruppamento ed ordinamento
Sono operatori che svolgono azioni sui dati filtrati.
- Group by: raggruppa secondo alcuni attributi che si elencano
- Having: filtra i dati secondo la logica di raggruppamento
- Order by: ordina i dati secondo alcuni attributi che si elencano
Sintassi SQL: Join

Esercizi
Il titolo dei film in cui recita Mastroianni

SELECT F.Titolo
FROM Film as F
JOIN Recita as R ON F.CodFilm = R.CodFilm
JOIN Attore as A ON A.CodAttore = R.CodAttore
WHERE R.Nome = 'Mastroianni'
Union & Except
UNION viene utilizzato per combinare il risultato di due o più istruzioni SELECT.
EXCEPT (o INTERSECT) viene utilizzato per combinare il risultato di due o più istruzioni SELECT prendendo le tuple della query di sinistra non generate dalla query di destra.
Si noti che ogni istruzione SELECT deve avere lo stesso numero di colonne. Le colonne devono anche avere tipi di dati simili e devono essere nello stesso ordine.
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2 ;
SELECT column_name(s) FROM table1
EXCEPT
SELECT column_name(s) FROM table2 ;
Union & Except
SELECT
TO_DATE(D."U_data") "date",
M."DocEntry" "id_appointment",
M."U_codBP" "id_patient",
OCPR."LastName" "cognome",
OCPR."FirstName" "nome"
FROM "@SAINS_PRENOTAZIONI" M
INNER JOIN "@SAINS_PRESTAZIONI_P" D ON M."DocEntry" = D."DocEntry"
INNER JOIN "OCRD" P ON M."U_codBP" = P."CardCode"
LEFT JOIN OCPR ON OCPR."CardCode" = P."CardCode"
INNER JOIN "NNM1" T1 ON T1."Series" = M."Series"
INNER JOIN "OUBR" S ON S."Code" = T1."BPLId"
WHERE M."U_tipo" != 'M' AND (M."U_codConv" = 'A-65'OR D."U_listino" = '60')
UNION
SELECT
TO_DATE(D."U_data") "date",
M."DocEntry" "id_appointment",
M."U_codBP" "id_patient",
OCPR."LastName" "cognome",
OCPR."FirstName" "nome"
FROM "@SAINS_PRENOTAZIONI" M
INNER JOIN "@SAINS_PRESTAZIONI_P" D ON M."DocEntry" = D."DocEntry"
INNER JOIN "OCRD" P ON M."U_codBP" = P."CardCode"
LEFT JOIN OCPR ON OCPR."CardCode" = P."CardCode"
INNER JOIN "NNM1" T1 ON T1."Series" = M."Series"
INNER JOIN "OUBR" S ON S."Code" = T1."BPLId"
WHERE M."U_tipo" != 'M' AND D."U_codArt" IN ('controllo15', 'controllo30', 'controllo45', 'controllo60')
Altre tipologie di query
CREATE
INSERT
UPDATE
ALERT
Per creare tabelle all'interno del DB
ALTRE ...
Ci sono altre tipologie che servono per gestire ed amministrare un DB
Per modificare la struttura di una tabella e le sue relazioni
Per popolare i dati in un DB
Per modificare i dati all'interno di una tabella
DELETE
Per cancellare i dati all'interno di una tabella
DROP
Per cancellare un'intera tabella
TRUNCATE
Per ripulire dai dati la tabella (svuotamento)
Insert
INSERT INTO Customers (CustomerName, City, Country)
VALUES ('Cardinal', 'Stavanger', 'Norway');
Customers : tabella in cui voglio inserire i dati
(CustomerName, City, Country) : sono le colonne che andrò a popolare
('Cardinal', 'Stavanger', 'Norway') : sono i valori che voglio inserire
Update
UPDATE Customers
SET City = 'Milan'
WHERE CustomerName = 'Mario'
Customers : tabella in cui voglio modificare i dati
City : è il campo con il valore che voglio modificare
WHERE : regole di filtraggio per fare update mirati
Delete
DELETE FROM Customers
WHERE CustomerName = 'Mario'
Customers : tabella in cui vogliamo cancellare delle righe
WHERE : regole di filtraggio per fare update mirati
ESERCIZI
MUSEI (NomeM, Città)
ARTISTI (NomeA, Nazionalità)
OPERE (Codice, Titolo, NomeM*, NomeA*)
PERSONAGGI (Personaggio, Codice*)
- Il codice ed il titolo delle opere di Tiziano conservate alla “National Gallery”
- Per ciascun museo di Londra, il numero di opere di artisti italiani ivi conservate
- I musei che conservano almeno 20 opere di artisti italiani
- Il nome dei musei di Londra che non conservano opere di artisti italiani, eccettuato Tiziano
- Per ogni museo, il numero di opere divise per la nazionalità dell’artista

ESERCIZI

Il codice ed il titolo delle opere di Tiziano conservate alla “National Gallery”
SELECT O.Codice, O.Titolo
FROM Opere O
WHERE O.NomeA = “Tiziano”
AND O.NomeM = “National Gallery”
ESERCIZI

Per ciascun museo di Londra, il numero di opere di artisti italiani ivi conservate
SELECT M.NomeM. Count(*) AS NumOpereItaliane
FROM O.Opere, M.Musei, A.Artisti
WHERE M.Città = “Londra”
AND A.Nazionalità = “Italia”
AND M.NomeM = O.NomeM
AND O.NomeA = A.NomeA
GROUP BY M.NomeM
SELECT M.NomeM. Count(*) AS NumOpereItaliane
FROM Opere O
JOIN Musei M ON M.Nome_M = O.Nome_M
JOIN Artisti A ON O.Nome_A = A.Nome_A
WHERE M.Città = “Londra”
AND A.Nazionalità = “Italia”
GROUP BY M.NomeM
ESERCIZI

I musei che conservano almeno 20 opere di artisti italiani
SELECT O.NomeM, Count (*) as conteggio
FROM Opere O
JOIN Artisti A ON O.NomeA = A.NomeA
WHERE A.Nazionalita = "Italia"
GROUP BY O.NomeM
HAVING conteggio >=20
ESERCIZI

Il nome dei musei di Londra che non conservano opere di artisti italiani, eccettuato Tiziano
SELECT M.NomeM
FROM Musei M
WHERE M.Citta = "Londra”
AND M.Nome_A IN
(
SELECT O.Nome_A
FROM Opere O, Artisti A
JOIN Artisti A ON M.Nome_A = O.Nome
WHERE A.NomeA <> “Tiziano ”
AND A.Nazionalità=”Italia”
AND M.Nome_M = O.Nome_M
)
ESERCIZI

Per ogni museo, il numero di opere divise per la nazionalità dell’artista
SELECT O.NomeM, A.Nazionalita, Count(*)
FROM Opere O
JOIN Artisti A ON M.Nome_A = O.Nome
WHERE O.NomeA = A.NomeA
GROUP BY O.NomeM, A.Nazionalita
ESERCIZI
AUTO (Targa, Marca, Cilindrata, Potenza, CodF*, CodAss*)
PROPRIETARI (CodF, Nome, Residenza)
ASSICURAZIONI (CodAss, Nome, Sede)
SINISTRO (CodS, Località, Data)
AUTOCOINVOLTE (CodS*, Targa*, ImportoDelDanno)
- Targa e Marca delle Auto di cilindrata superiore a 2000 cc o di potenza superiore a 120 CV
- Per ciascuna Assicurazione, il nome, la sede ed il numero di auto assicurate
- La targa delle auto che non sono state coinvolte in sinistri dopo il 20/01/01
- CodF e Nome di coloro che possiedono più di un’auto

ESERCIZI
Targa e Marca delle Auto di cilindrata superiore a 2000 cc o di potenza superiore a 120 CV

SELECT A.Targa, A.Marca
FROM Auto A
WHERE A.Cilindrata > 2000
OR A.Potenza > 120
ESERCIZI
Per ciascuna Assicurazione, il nome, la sede ed il numero di auto assicurate

SELECT As.Nome, As.Sede, count(*) as NumAuto
FROM Assicurazioni As
JOIN Auto Au ON As.Cod_ass = Au.Cod_ass
GROUP BY As.CodAss, As.Nome, As.Sede
ESERCIZI
La targa delle auto che non sono state coinvolte in sinistri dopo il 20/01/01

SELECT A.Targa
FROM Auto A
WHERE A.Targa Not In (
SELECT AC.Targa
FROM AutoCoinvolte AC, Sinistri S
WHERE AC.CodS=S.CodS and S.Data>20/01/01
)
ESERCIZI
CodF e Nome di coloro che possiedono più di un’auto

SELECT P.CodF, P.Nome
FROM Proprietari P
JOIN Auto A ON A.Cod_F = P.Cod_F
GROUP BY P.CodF, P.Nome
HAVING count(*) >1
SELECT P.CodF, P.Nome
FROM Proprietari P
WHERE 1 < (
SELECT *
FROM Auto A
WHERE P.CodF = A.CodF
)
Sql conosciamolo part.2
By Saverio M.
Sql conosciamolo part.2
- 101