class: center, middle # SQL --- ## Cos'è SQL - SQL significa **Structured Query Language** - Linguaggio per gestire **database relazionali** - Permette di **creare, leggere, aggiornare e cancellare dati** - Standard ANSI con variazioni tra DBMS --- ## Creare un Database - Sintassi: `CREATE DATABASE nome_database;` - Necessario avere permessi di amministratore ```sql CREATE DATABASE `scuola`; ``` --- ## Creare una Tabella - Sintassi: `CREATE TABLE nome_tabella (...)` - Definizione dei **tipi di dati** per ogni colonna ```sql CREATE TABLE `studenti` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `nome` VARCHAR(50), `cognome` VARCHAR(50), `eta` INT ); ``` --- ## Inserire Dati - Sintassi: `INSERT INTO nome_tabella (col1, col2) VALUES (val1, val2);` - Si possono inserire più righe in un solo comando ```sql INSERT INTO `studenti` (`nome`, `cognome`, `eta`) VALUES ('Mario', 'Rossi', 18); ``` --- ## Leggere Dati - Sintassi: `SELECT col1, col2 FROM tabella;` - `*` seleziona tutte le colonne - Possibilità di usare **WHERE** per filtri ```sql SELECT `nome`, `cognome` FROM `studenti` WHERE `eta` > 17; ``` --- ## Aggiornare Dati - Sintassi: `UPDATE tabella SET col=val WHERE condizione;` - ATTENZIONE: senza `WHERE` aggiorna tutte le righe ```sql UPDATE `studenti` SET `eta` = 19 WHERE `nome` = 'Mario'; ``` --- ## Cancellare Dati - Sintassi: `DELETE FROM tabella WHERE condizione;` - Senza `WHERE` cancella tutte le righe ```sql DELETE FROM `studenti` WHERE `eta` < 18; ``` --- ## Tipi di Dati Comuni - INT, FLOAT, DOUBLE → numeri - VARCHAR(n) → stringhe di lunghezza n - DATE, DATETIME → date e orari - BOOLEAN → vero/falso ```sql CREATE TABLE `libri` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `titolo` VARCHAR(100), `pubblicato` DATE, `disponibile` BOOLEAN ); ``` --- ## Condizioni e Filtri - `WHERE` per filtrare righe - `AND`, `OR`, `NOT` per combinare condizioni - `LIKE` per pattern matching ```sql SELECT * FROM `studenti` WHERE `nome` LIKE 'M%' AND `eta` > 17; ``` --- ## Ordinare i Risultati - `ORDER BY colonna ASC|DESC` - Possibile ordinare su più colonne ```sql SELECT `nome`, `eta` FROM `studenti` ORDER BY `eta` DESC, `nome` ASC; ``` --- ## Limitare i Risultati - `LIMIT n` restituisce solo n righe - Utile per grandi tabelle ```sql SELECT * FROM `studenti` ORDER BY `eta` ASC LIMIT 5; ``` --- ## Join tra Tabelle - `INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN` - Permette di combinare dati da più tabelle ```sql SELECT s.`nome`, s.`cognome`, c.`corso` FROM `studenti` s INNER JOIN `corsi` c ON s.`id` = c.`studente_id`; ``` --- ## INNER JOIN Approfondimento - Restituisce solo le righe che hanno corrispondenza in entrambe le tabelle - Utile per combinare dati correlati ```sql SELECT s.`nome`, s.`cognome`, c.`corso` FROM `studenti` s INNER JOIN `corsi` c ON s.`id` = c.`studente_id`; ``` - Solo studenti che hanno un corso appariranno nel risultato --- ## LEFT JOIN e RIGHT JOIN - `LEFT JOIN`: prende tutte le righe della tabella di sinistra + corrispondenze della destra - `RIGHT JOIN`: prende tutte le righe della tabella di destra + corrispondenze della sinistra ```sql -- LEFT JOIN SELECT s.`nome`, c.`corso` FROM `studenti` s LEFT JOIN `corsi` c ON s.`id` = c.`studente_id`; -- RIGHT JOIN SELECT s.`nome`, c.`corso` FROM `studenti` s RIGHT JOIN `corsi` c ON s.`id` = c.`studente_id`; ``` - LEFT JOIN mostra **tutti gli studenti**, anche senza corsi - RIGHT JOIN mostra **tutti i corsi**, anche senza studenti --- ## Raggruppamenti e Aggregazioni - `GROUP BY` per raggruppare dati - Funzioni aggregate: `COUNT()`, `SUM()`, `AVG()` ```sql SELECT `eta`, COUNT(*) AS `numero_studenti` FROM `studenti` GROUP BY `eta`; ``` --- ## Conclusione - SQL è stato sviluppato a inizio anni ’70 - SQL è un linguaggio dichiarativo, potente e standardizzato - Serve per **creare, leggere, aggiornare e cancellare dati** - Funzioni avanzate: join, aggregazioni, subquery - Pratica costante per padroneggiare tutte le possibilità