elaborazione automatica dei dati - · pdf fileelaborazione automatica dei dati mysql enrico...
TRANSCRIPT
Elaborazione Automatica dei Dati
MySQL
Enrico Cavalli
Anno Accademico 2012-2013
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 2
MySQL(1)
• MySQL è un DBMS Open Source prodotto da MySQL AB acquistato ora da Oracle. http://www.mysql.com
• MySQL è realizzato in architettura Client/Server
DB
Client
MySQL�Server
MySQL
Il client dialoga con l’utente, ne accetta i comandi che invia al
server per l’esecuzione e visualizza i risultati
Il server è responsabile della gestione dei dati. Interagisce con il DB e invia i risultati al client
che li visualizza
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 3
MySQL(2)
Esistono diverse versioni di MySQL : • 5.5. è, al momento, la versione in uso
Versione 5: caratteristiche aggiuntive rispetto alla versione 4
– Viste Logiche, Trigger, Stored Procedure, Stored Func tion
• La scelta dei progettisti di MySQL è stata di ottimizzarne la velocità anche rinunciando ad alcune caratteristiche possedute da altri SQL
• Il server supporta diversi client sia da linea comandi che grafici, per esempio:– MySQL Workbench, MySQL Query Browser, MySQL Administrator– phpMyAdmin– MySQL-Front
Manuali e documentazione:
http://dev.mysql.com/doc/refman/5.5/en/index.html
http://dev.mysql.com/doc/refman/5.5/en/tutorial.htm l
http://dev.mysql.com/doc/refman/5.5/en/sql-syntax.h tml
http://dev.mysql.com/doc/refman/5.5/en/functions.ht mlhttp://php.html.it/guide/ ���� fra le guide scegliere phpMyAdminb
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 4
MySQL(3)
• Esecuzione di MySQL dalla linea comandi:
C:\>mysql –u rootWelcome to the MySQL monitor. Commands end with ; o r \g.Your MySQL connection id is 1 to server version: 5.5 .10-log ..Type 'help;' or '\h' for help. Type '\c' to clear t he buffer.
mysql>
mysql> HELPFor the complete MySQL Manual online, visit:
http://www.mysql.com/documentation. . . For server side help, type 'help contents‘
mysql>
. . . l’elenco dei comandi lato client è riportato
nella prossima diapositiva
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 5
MySQL(4)
• Comandi MySQL lato client
? (\?) Synonym for `help'.clear (\c) Clear command.connect (\r) Reconnect to the server. delimiter (\d) Set query delimiter.ego (\G) Send command to the server, result s hown vertically.exit (\q) Exit mysql. Same as quit.go (\g) Send command to mysql server.help (\h) Display this help.notee (\t) Don't write into outfile.print (\p) Print current command.prompt (\R) Change your mysql prompt.quit (\q) Quit mysql.rehash (\#) Rebuild completion hash.source (\.) Execute a SQL script file. File name as argument.status (\s) Get status information from the serv er.tee (\T) Set outfile. Append everything into given outfile.use (\u) Use another database. Database name as argument.
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 6
MySQL(5)
• Guida in linea per i principali comandi:
mysql> HELP CONTENTSYou asked for help about help category: "Contents"For more information, type 'help <item>', where <it em> is one of the following categories:
AdministrationColumn TypesData DefinitionData ManipulationFunctionsGeographic featuresTransactions
mysql> help dateName: 'DATE'Description:A date. The supported range is '1000-01-01' to '99 99-12-31'.MySQL displays DATE values in 'YYYY-MM-DD' format, . . .
Attraverso successive richieste si
identifica il comando per il quale si vogliono
informazioni
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 7
MySQL(6)
mysql> /******************************************* ************ mysql> * Questo è un commento su più righemysql> ******************************************* ************/mysql> mysql> -- Questo è un commento su una sola rigamysql> mysql> SELECT 3*4; -- SELECT usato come Print+-----+| 3*4 |+-----+| 12 |+-----+
mysql> SELECT VERSION(); -- Versione di MySQLmysql> SELECT CURDATE(); -- Data attualemysql> SELECT NOW(); -- Data e ora attualimysql> SELECT USER(); -- Utente connesso al serv er
mysql> SELECT (5+8) -- Un comando può essere s critto su -> *12 -- più righe e deve terminare c on-> ; -- il carattere ;. Calcola: (5 +8)*12
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 8
MySQL(7)
mysql> SHOW DATABASES; -- Elenca i database sul serve r+------------------------+| Database |+------------------------+| mysql || test |+------------------------+2 rows in set (0.00 sec)
mysql> USE TEST; -- Test diventa db di defaultDatabase changed
mysql> SHOW TABLES; -- Elenca tabelle/vist e in TestEmpty set (0.00 sec) -- SHOW [FULL] TABLES;
mysql> QUIT; -- oppure EXIT: fine s essione
Mysql e Test sono sempre presenti
Test db per prove
In Test non ci sono tabelle
Identificatori e Files fisici in MySQL
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 10
Identificatori in MySQL
Per ogni database MySQL crea una directory con quel nome. Ogni tabella del db è rappresentata con un insieme di file che hanno per nome il nomedella tabella e estensione: MYD (per i dati), MYI (per gli indici), FRM (per la struttura). Le viste logiche sono rappresentate con un solo file di estensione FRM. I trigger danno origine a un solo file con estensione TRG. Procedure e funzioni sono salvate nella tabella Proc del database Mysql.
Tipo di identificatore
Lunghezza-max
Caratteri ammessi
Database 64I caratteri ammessi dal S.O. per i nomi delle directory ad eccezione di \, / e .
Tabella 64I caratteri ammessi dal S.O. per i nomi dei file ad eccezione di / e .
Colonna 64 Tutti
Indice 64 Tutti
Alias 255 Tutti
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 11
Tabelle, Viste, Routine, Trigger (1)
Nel database StudFac ci sono le due tabelle Facolta e Studenti (di tipo MyIsam), le viste logiche Disponibilita, .. , VistaDiProva e un certo numero di stored routine: FunQB, .. , e un trigger.
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 12
Tabelle, Viste, Routine, Trigger (2)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 13
Tabelle, Viste, Routine, Trigger (3)
Nel database CollezioneMusicaleci sono tabelle di tipo InnoDB, oltre a viste procedure e trigger. Dati e indici di tabelle InnoDB sono salvati nel (default) file: Ibdata1 di: C:\ . . . \MySQL\Data
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 14
Tabelle, Viste, Routine, Trigger (4)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 15
Tabelle, Viste, Routine, Trigger (5)
Tipi di dati di MySQL
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 17
Interi in MySQL (1)
C’è anche un tipo MEDIUMINT che usa 3 byte e quindi . . .I valori logici True e False possono essere manipolati algebricamente.MySQL dispone di un’ampia libreria di funzioni: DIV, MOD, ABS, POW, SQRT, ...
Tipi interi Limiti Note
TINYINT(M) -128 +127 Interi con 1 byte (0..255) se UNSIGNED
BOOLEAN Sinonimo di TINYINT. 0 ���� Falso. Ogni altro valore Vero
SMALLINT(M) -31768 +32767 Interi con 2 byte (0..66535) se UNSIGNED
INT(M)INTEGER(M)
-231 +(231-1)Interi con 4 byte (0.. 232-1) se UNSIGNED
BIGINT(M) -263 +(263-1)Interi con 8 byte (0.. 264-1) se UNSIGNED
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 18
Interi in MySQL (2)
mysql> SELECT TRUE, FALSE, TRUE*2.5, FALSE-2;+------+-------+----------+---------+| TRUE | FALSE | TRUE*2.5 | FALSE-2 |+------+-------+----------+---------+| 1 | 0 | 2.5 | -2 |+------+-------+----------+---------+
mysql> SELECT 5/2, 5 div 2, 5 % 2; +------+---------+-------+| 5/2 | 5 div 2 | 5 % 2 |+------+---------+-------+| 2.50 | 2 | 1 |+------+---------+-------+
mysql> SELECT Floor(2.6),Ceiling(2.6),Round(2.6),Tr uncate(2.6,0);+------------+--------------+------------+--------- --------+| Floor(2.6) | Ceiling(2.6) | Round(2.6) | Truncate (2.6,0) |+------------+--------------+------------+--------- --------+| 2 | 3 | 3 | 2 |+------------+--------------+------------+--------- --------+
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 19
Reali in MySQL
Tipi realiLimiti in valore
assolutoNote
FLOAT(M,D)1.175494351E-38 .. 3.402823466E+38
Rappresentazione in virgola mobile con 4 byte. Permette di rappresentare i valori reali con precisione massima di 7 cifre decimali (M <=7)
DOUBLE PRECISION(M,D)
1.7976931348623157E+308 .. 2.2250738585072014E-308
Rappresentazione in virgola mobile con 8 byte. Permette di rappresentare i valori reali con la precisione massima di 15 cifre decimali (M <=15)
DECIMAL(M,D)NUMERIC(M,D)
Dipende da M e D
Rappresentazione in virgola fissa con M cifre decimali di cui D per la parte frazionaria. Rappresentazione esatta. Memorizza i dati occupando M+2 byte
DECIMALDECIMAL(M)
Equivale a DECIMAL(10,0)Equivale a DECIMAL(M,0)
Con le seguenti limitazioni: D <= M-2, D <= 30. Nel caso delle rappresentazioni in virgola fissa deve valere anche M <= 64
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 20
Date in MySQL(1)
Tipi data/oraLimiti della rappresentazione
Note
DATE ‘1000-01-01’.. ’9999-12-31’Data nella forma ‘aaaa-mm-gg’memorizzata in 3 byte
TIME ‘-838:59:59’ .. ‘838:59:59’Ora nella forma ‘hh:mm:ss’memorizzata in 3 byte
DATETIME‘1000-01-01 00:00:00’‘9999-12-31 23:59:59’
Data ed ora memorizzati in 8 byte
YEARYEAR(2)YEAR(4)
1901 .. 215570 .. 69 (1970 .. 2069)
1901 .. 2155
Anno memorizzato in 1 byte. Rappresentabile come valore numerico o come stringa.
TIMESTAMP‘1970-01-01 00:00:00’
sino al 2037
I campi di tipo TIMESTAMP sono utili per memorizzare data ed ora dell’inserimento o dell’aggiornamento di un record. Memorizzato in 4 byte
Rappresentazioni equivalenti a: '2006-12-25 14:05:25''2006/12/25 14;05;25‘ '20061225140525‘ '061225140525‘Come valore numerico: 20061225140525 061225140525
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 21
Date in MySQL(2)
mysql> SELECT CURDATE(); ���� ‘2006-12-15'mysql> SELECT CURDATE() + 0; ���� 20061215
mysql> SELECT CURTIME(); ���� '23:50:26'mysql> SELECT CURTIME() + 0; ���� 235026
mysql> SELECT Dayofyear('2006-11-21'); ���� 325
mysql> SELECT Day('2006-11-21') as Giorno,-> Monthname('2006-11-21') as Mese,-> Year('2006-11-21') as Anno;
mysql> SELECT LAST_DAY('2003-02-05'); ���� '2003-02-28' mysql> SELECT LAST_DAY('2004-02-05'); ���� '2004-02-29'mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); ���� '2004-01-31'
SELECT Datediff('2006-01-04', '2005-11-21'); ���� 44SELECT Date_Add('2005-10-05', Interval 3 month); ���� 2006-01-05
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 22
Date in MySQL(3)
mysql> SELECT MAKEDATE(2001,32); ���� '2001-02-01'mysql> SELECT MAKEDATE(2001,365); ���� '2001-12-31' mysql> SELECT MAKETIME(12,15,30); ���� '12:15:30'
mysql> SELECT NOW(); ���� ‘2006-12-15 23:50:26' mysql> SELECT NOW() + 0; ���� 20061215235026
mysql> SELECT DAY(NOW()), MONTH(NOW()),YEAR(NOW()); mysql> SELECT HOUR(NOW()), MINUTE(NOW()),SECOND(NOW ()); mysql> SELECT DAYNAME(NOW()); mysql> SELECT NOW(), DATE(NOW()), TIME(NOW()), WEEK (NOW());
-- Confronto di datemysql> SELECT TRUE,FALSE,'12-17'>'12-05','10-05'>'1 1-21';+------+-------+-----------------+----------------- +| TRUE | FALSE | '12-17'>'12-05' | '10-05'>'11-21' |+------+-------+-----------------+----------------- +| 1 | 0 | 1 | 0 |+------+-------+-----------------+----------------- +
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 23
Date in MySQL(4)
Altre funzioni utili:
DATE_FORMAT(data,formato) vedi manuale
FROM_DAYS(intero) restituisce una data TO_DAYS(data); restituisce un intero
intero rappresenta il numero di giorni trascorsi a partire dall’anno 0 (ma significativo solo a partir e dal 1582, avvento del calendario gregoriano)
mysql> SELECT TO_DAYS('1582-01-01'), 1582*365+1582/ 4;+-----------------------+-----------------+| TO_DAYS('1582-01-01') | 1582*365+1582/4 |+-----------------------+-----------------+| 577814 | 577825.50000 |+-----------------------+-----------------+1 row in set (0.00 sec)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 24
Stringhe in MySQL(1)
Tipo Stringa Limiti Note
CHAR ( M )CHARATCTER ( M )
M = 0 .. 255Stringhe a lunghezza fissa, non case sensitive, riempite con spazi. M byte
VARCHAR ( M )M = 0 .. 65535
M = 0 .. 255 ver. 4Stringhe a lunghezza variabile, non case sensitive Occupano M + 1 byte
BINARY ( M )VARBINARY ( M )
M = 0 .. 255M = 0 .. 65535
Stringhe di tipo CHAR(M), VARCHAR(M) case sensitive
TEXT Fino a 65535 caratteriCoincide con VARCHAR ( 65535 )Occupa M+2 Byte
BLOB Fino a 65535 byte E’ un TEXT case sensitive
ENUM ( ‘V1’, .. ,’ Vn’ ) Fino a 65535 valoriUn dato di tipo ENUM assume un solo valore tra quelli elencati; occupa fino a 2 bytes
SET ( ‘V1’, .. ,’ Vn’ ) Fino a 64 valoriUn dato di tipo SET è un qualsiasi insieme di valori tra quelli elencati; occupa fino a 8 byt es
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 25
Stringhe in MySQL(2)
\0 Il carattere vuoto (Ascii 0)
\' L’apice.
\“ Il doppio apice.
\b Ritorna di un carattere (backspace)
\n Nuova riga (linefeed)
\r Ritorno del carrello
\t Tabulazione (tab)
\Z (Control Z)
\\ Il carattere ‘\’ (backslash)
\% Il carattere percentuale
\_ Il carattere di sottolineatura.
Sequenze di ESCAPE riconosciute da MySQL nelle
stringhe di caratteri per rappresentare caratteri
speciali
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 26
Stringhe in MySQL(3)
Il tipo ENUM ammette un insiemedi valori ammissibili massimo di 65535 valori
ENUM('one', 'two', 'three')
In assenza della dichiarazione NOT NULL, il valore NULL èammesso; se c’è la dichiarazione NOT NULL il valore di default è 'one '.
Il tipo SET ammette insiemi formatida 0 fino a 64 valori
SET ( 'a', 'b', 'c ', 'd')
Valore Indice
NULL NULL
'' 0
'one' 1
'two' 2
'three' 3
Elemento Valore Binario
'a' 1 0001
'b' 2 0010
'c' 4 0100
'd' 8 1000
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 27
Stringhe in MySQL(4)
mysql> CREATE TABLE TabellaDiInsiemi (-> Colonna SET('a','b','c','d') );
mysql> INSERT INTO TabellaDiInsiemi VALUES-> ('a,b,c'),-> ('b,c'),-> ('b,b,c'),-> ('a,d'),-> ('d,a'),-> ('d,d,a'),-> (''),-> (\N),-> ('d,c');
mysql> SELECT Colonna, Colonna+0 -> FROM TabellaDiInsiemi;
+---------+-----------+| Colonna | Colonna+0 |+---------+-----------+| a,b,c | 7 || b,c | 6 || b,c | 6 || a,d | 9 || a,d | 9 || a,d | 9 || | 0 || NULL | NULL || c,d | 12 |+---------+-----------+
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 28
Stringhe in MySQL(5)
mysql> SELECT ASCII('A'); ���� 65mysql> SELECT CHAR(65,65,77,77.3,'76'); ���� 'AAMML'
mysql> SELECT CONCAT('Pippo', ' ', 'Pluto'); ���� 'Pippo Pluto'mysql> SELECT CONCAT_WS(‘-', ‘AA‘,‘BB‘); ���� ‘AA-BB'
mysql> SELECT LEFT(‘stringa di car’,3) ���� ‘str’mysql> SELECT RIGHT(‘stringa di car’,5) ���� ‘i car’mysql> SELECT MID(‘Stringa di car’,5,3); ���� ‘nga’mysql> SELECT SUBSTRING(‘Stringa di’,2,3); ���� ‘tri’mysql> SELECT REVERSE(‘Stringa’); ���� ‘agnirtS’
mysql> SELECT LOWER(‘Enrico’); ���� ‘enrico’mysql> SELECT UPPER(‘Cavalli’); ���� ‘CAVALLI’mysql> SELECT TRIM(‘ Enrico ’); ���� ‘Enrico’mysql> SELECT REPEAT(‘W’,3); ���� ‘WWW’
mysql> SELECT LENGTH(‘Stringa di’); ���� 10mysql> SELECT LOCATE(‘a’, ‘la mamma’, 3); ���� 5
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 29
Esempio con stringhe e date (1)
-- ------------------------------------------------- ------ Prima soluzione approssimata, spesso imprecisa-- ------------------------------------------------- ----SELECT Year('2000-10-12') - Year('1982-11-21');
-- ------------------------------------------------- ------ Espressione che considera il mese e il giorno-- restituisce 1 prima del 21 novembre e -- restituisce 0 dopo il 21 novembre-- ------------------------------------------------- ----mysql> SELECT Right('2000-10-12',5) < Right('1982-1 1-21',5);+-----------------------------------------------+| Right('2000-10-12',5) < Right('1982-11-21',5) |+-----------------------------------------------+| 1 |+-----------------------------------------------+
Erica è nata il 21 novembre 1982. Quanti anni aveva il 12 ottobre 2000?
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 30
Esempio con stringhe e date (2)
-- ------------------------------------------------- ------ Soluzione esatta-- ------------------------------------------------- ----mysql> SELECT Year('2000-10-12') - Year('1982-11-21' ) -
-> ( Right('2000-10-12',5) < Right('1982-11-21',5) ) -> AS ‘Età di Erica’;
+--------------+| Età di Erica |+--------------+| 17 |+--------------+
-- ------------------------------------------------- ------ Età di Erica oggi-- ------------------------------------------------- ----mysql> SELECT Year(Curdate()) - Year('1982-11-21') -
-> ( Right(Curdate(),5) < Right('1982-11-21' ,5) ) -> AS ‘Età di Erica’;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 31
Esercizi (1)
Si consideri il database dei conoscenti: Rubrica(Nome,Cognome,Nascita,Indirizzo,Telefono)
1. Elencare i conoscenti che compiono gli anni il prossimo mese
2. Elencare i conoscenti che compiono gli anni la prossima settimana
3. Elencare i conoscenti che compiono gli anni nei prossimi tre giorni
4. Elencare i conoscenti maggiorenni
5. Elencare i bambini con meno di 10 anni
6. Individuare i conoscenti che, nell’anno corrente, compiono gli anni di domenica
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 32
Esercizi (2)
7. Elencare i conoscenti che non hanno ancora compiuto gli anni e il numero di giorni che mancano al rispettivo genetliaco
8. Elencare i conoscenti con Nome, Cognome, Prefisso, NumTelefono
9. Elencare i conoscenti con NomeCompleto e indirizzo
10. Elencare i conoscenti con NomeCompleto, ViaNumero, Città
11. Elencare i conoscenti che risiedono a Bergamo
12. Elencare i conoscenti che risiedono in provincia di Torino
13. Elencare i conoscenti con CAP del tipo 203XX
14. Elencare i conoscenti con le informazioni su ViaNumero, CodicePostale, Città, Provincia in colonne separate
15. Preparare un elenco con le informazioni necessarie per le spedizioni (NomeCompleto, ViaNumero, CodicePostale, Citta)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 33
Esercizi (3)
• Esercizio di discreta utilità pratica è quello di costruire funzioni per visualizzare
le date con formati italiani:
• Giorno ( Data ) � Nome giorno in italiano• Mese (Data) � Nome mese in italiano• ItalData ( Data ) � Lunedì, 4 ottobre 1492
• ItalData (Data, Par) � Lunedì, 4 ottobre 14924 ottobre 14924 - 10 - 1492
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 34
SQL come DDL in MySQL
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 35
Artisti ( IDArtista, Nome, Genere, Note )
Registrazioni ( IDRegistrazione, TitoloAlbum, EtichettaAlbum, TipoAlbum, DurataMassima, Capacità, DataAggiornamento, Note )
Brani ( IDBrano, TitoloBrano, Genere, DurataBrano, Dimensione, Posizione, Osservazioni, IDArtista, IDRegistrazione )
Creazione di un database con MySQL (1)
Database per gestire una collezione di dischi e cassette musicali
Artista
IDArtista {PK}NomeGenereNote
Brano
IDBrano {PK}TitoloBranoGenereDurataBranoDimensionePosizioneOsservazioni
1 1N N
Registrazione
IDRegistrazione {PK}TitoloAlbumEtichettaAlbumTipoAlbumDurataMassimaCapacitaDataAggiornamentoNote
Eseguire Contenere
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 36
Creazione di un database con MySQL (2)
mysql> CREATE DATABASE CollezioneMusicale;mysql> USE CollezioneMusicale;
mysql> CREATE TABLE Artisti (-> IDArtista INT UNSIGNED NOT NULL AUTO_INCREMENT -> PRIMARY KEY,-> Nome VARCHAR(50) NOT NULL,-> Genere VARCHAR(10),-> Noter VARCHAR(255) );
mysql> CREATE TABLE Registrazioni (-> IDRegistrazione INT UNSIGNED NOT NULL
AUTO_INCREMENT,-> TitoloAlbum VARCHAR(50) NOT NULL,-> EtichettaAlbum VARCHAR(20),-> TipoAlbum VARCHAR(10),-> DurataMassima INT UNSIGNED DEFAULT 1,-> Capacita INT UNSIGNED DEFAULT 1,-> DataAggiornamento DATE,-> Note VARCHAR(255),-> PRIMARY KEY (IDRegistrazione) );
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 37
Creazione di un database con MySQL (3)
mysql> CREATE TABLE Brani (-> IDBrano INT UNSIGNED NOT NULL AUTO_INCREMENT,-> TitoloBrano VARCHAR(50) NOT NULL,-> Genere VARCHAR(10),-> DurataBrano FLOAT(5,2) UNSIGNED DEFAULT 4,-> Dimensione INT UNSIGNED,-> Posizione SMALLINT UNSIGNED,-> Osservazioni VARCHAR(255),-> IDArtista INT UNSIGNED, -> IDRegistrazione INT UNSIGNED,-> PRIMARY KEY (IDBrano)-> );
mysql> DESCRIBE Artisti;+-----------+------------------+------+-----+------ ---+----------------+| Field | Type | Null | Key | Default | Extra |+-----------+------------------+------+-----+------ ---+----------------+| IDArtista | int(10) unsigned | | PRI | NULL | auto_increment || Nome | varchar(50) | | | | || Genere | varchar(10) | YES | | NULL | || Noter | varchar(255) | YES | | NULL | |+-----------+------------------+------+-----+------ ---+----------------+
AUTO_INCREMENT: intero progressivo automatico
PRIMARY KEY ( Col1, Col2 )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 38
Creazione di un database con MySQL (4)
mysql> CREATE TEMPORARY TABLE Tabella ( DefinizioneColonne );
mysql> DROP DATABASE NomeDataBase;mysql> DROP TABLE NomeTabella;mysql> ALTER TABLE NomeTabella
DROPNomeColonnaADD NomeColonna DefizioneColonnaCHANGEVecchioNome NuovoNome Definizione;
-- ------------------------------------------------- --------- Cambiamento di nome alla colonna Noter-- La colonna Genere passa da 10 a 20 caratteri-- ------------------------------------------------- -------mysql> ALTER TABLE Artisti CHANGE Noter Note VARCHAR (255),
-> CHANGE Genere Genere VARCHAR( 20);-- ------------------------------------------------- --------- Definizione di indici-- ------------------------------------------------- -------mysql> CREATE [ UNIQUE ] INDEX NomeIndice
ON NomeTabella ( Colonna [,Colonna] );
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 39
Creazione di un database con MySQL (5)
-- ------------------------------------------------- ------ Costruzione di un indice su Genere di Brani-- ------------------------------------------------- ----mysql> CREATE INDEX ind_genere ON Brani (Genere);mysql> DESCRIBE Brani Genere;+--------+-------------+------+-----+---------+---- ---+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+---- ---+| Genere | varchar(10) | YES | MUL | NULL | |+--------+-------------+------+-----+---------+---- ---+
-- ------------------------------------------------- ------ Indice senza duplicati su CodiceFiscale di Studenti-- ------------------------------------------------- ----mysql> CREATE UNIQUE INDEX ind_codfis ON Studenti(Cod iceFiscale); mysql> DESCRIBE Studenti CodiceFiscale;+---------------+-------------+------+-----+------- --+-------+| Field | Type | Null | Key | Default | Extra |+---------------+-------------+------+-----+------- --+-------+| CodiceFiscale | varchar(16) | | UNI | | |+---------------+-------------+------+-----+------- --+-------+
UNIQUE indice con le
caratteristichedi una chiave
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 40
Creazione di un database con MySQL (6)
-- ------------------------------------------------- ------ Genere di Artisti campo di tipo ENUM-- ------------------------------------------------- ----mysql> ALTER TABLE Artisti CHANGE Genere Genere
-> ENUM('Pop','Rock','Rap','Opera','Country','Jazz' );
-- ------------------------------------------------- ------ INSERT per inserire dati in una tabella-- ------------------------------------------------- ----mysql> INSERT INTO NomeTabella [ ElencoCampi ] VALUES
-> ( ElencoValori) [, .... , ( ElencoValori )];
-- ------------------------------------------------- ------ Inserimento dati nella tabella Artisti-- ------------------------------------------------- ----mysql> INSERT INTO Artisti VALUES
-> (null, 'Pierre Borg', 'Pop', ''),-> (null, 'Anatolia', 'Rock', ''); -> (3,'The Bees', 'Rap', ''),-> (\N,'Golden Eagles', 'Pop', '');
I campi di tipo data e le stringhe di caratterivanno delimitati con
apici o doppi apici
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 41
Creazione di un database con MySQL (7)
-- ------------------------------------------------- ------ Un artista di genere non previsto in ENUM-- ------------------------------------------------- ----mysql> INSERT INTO Artisti (Nome, Genere, Note) VAL UES
-> ('Nuovo Artista1', 'Dance','Artista genere Dance '),-> ('Nuovo Artista2', 'pop','Artista pop');
Query OK, 2 rows affected, 1 warning (0.00 sec)
mysql> SELECT * FROM Artisti;+-----------+----------------+---------+----------- -----------+| IDArtista | Nome | Genere | Note |+-----------+----------------+---------+----------- -----------+| 1 | Pierre Borg | Pop | || 2 | Anatolia | Rock | || 3 | The Bees | Rap | || 4 | Golden Eagles | Pop | || . . . . || 9 | Nuovo Artista1 | | Artista gene re Dance || 10 | Nuovo Artista2 | Pop | Artista pop |+-----------+----------------+---------+----------- -----------+
Al posto di Dance viene immessa la
stringa nulla. Al posto di pop
compare Pop
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 42
Creazione di un database con MySQL (8)
La definizione del database e delle tabelle si effettua anche MySQL Query Browser o con
PHPMyAdmin. Entrambi i sistemi eseguono le operazioni
e visualizzano il codice SQL eseguito
Nel libro: MySQL e database in rete• MySQL Query Browser: da pagina 123• PHPMyAdmin da pagina 203
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 43
Esercizi
Si consideri il database CollezioneMusicale. Dopo ogni eserciziocontrollare l’effetto dei comandi eseguiti con il comando DESCRIBE.
1. Creare il database CollezioneMusicale e le tabelle Artisti, Registrazioni e Brani, definendo le chiavi primarie per le tre tabelle
2. Modificare le precedenti definizioni per dichiarare che i campi Genere delle tabelle Artisti e Brani sono di tipo Enum
3. Creare indici sul campo Nome di Artisti, TitoloBrano di Brani e TitoloAlbum di Registrazioni
4. Rinominare il campo TitoloBrano di Brani in Titolo e TitoloAlbum di Registrazioni in NomeAlbum
5. Eliminare i campi Osservazioni e Note dalle tabelle Brani e, rispettivamente, Registrazioni. Ricreare le colonne eliminate nelle due tabelle
6. Usando il comando INSERT popolate ogni tabella con cinque righe
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 44
SQL come DML in MySQL
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 45
Manipolazione di tabelle (1)
• INSERT: inserisce righe in una tabella
– INSERT INTO TabellaEsistente VALUES ( Valori ), . . , ( Valori );
– INSERT INTO TabellaEsistente SELECT . . .;
– CREATE TABLE Tabella SELECT . . .;
• UPDATE: modifica uno o più campi in una tabella
– UPDATE Tabella SETColonna1 = Espressione1, ... WHERE Condizione;
• DELETE: elimina righe da una tabella
– DELETE FROM TabellaWHERE Condizione;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 46
Manipolazione di tabelle (2)
+-----------+-----------------+---------+---------- --+| IDArtista | Nome | Genere | Note |+-----------+-----------------+---------+---------- --+| 1 | Pierre Borg | Pop | || 2 | Anatolia | Rock | || 3 | The Bees | Rap | || 4 | Golden Eagles | Pop | || .. | . . . | | || 9 | Nuovo Artista 1 | | Artista .. || 10 | Nuovo Artista 2 | Pop | Artista . . | +-----------+-----------------+---------+---------- --+
mysql> UPDATE Artisti -> SET Nome = TRIM(Nome);
Query OK, 2 row affected (0.40 sec)Rows riconosciute: 6 Cambiate: 2 Warnings: 0
mysql> UPDATE Artisti-> SET Genere = 'Country' -> WHERE IDArtista = 7;
mysql> DELETE FROM Artisti-> WHERE Note <> '';
mysql> DELETE FROM Artisti -- Comando equivalente-> WHERE IDArtista >= 9; -- al precedente
TRIM elimina gli spazi iniziali e finali di una
stringa
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 47
Manipolazione di tabelle (3)
mysql> DELETE -> FROM Artisti; -- svuota la tabella Artisti
mysql> TRUNCATE Artisti; -- equivalente al prec edente
-- ------------------------------------------------- ------------- Dati contenuti nel file: D:\PhpMySqlDati\Registra zioni.txt-- Si notino: separatori, delimitatori, a capo -- le date senza delimitatori, i valori nulli-- ------------------------------------------------- -----------mysql> LOAD DATA INFILE 'D:\\PhpMySqlDati\\Registraz ioni.txt'
-> INTO TABLE Registrazioni-> FIELDS TERMINATED BY';'-> ENCLOSED BY '"'-> LINES TERMINATED BY '\r\n';
\N;"Oxford road";"Orange";"LP";48;1;2001-9-27;\N\N;"Mixed songs: raccolta";\N;"Nastro";120;1;2005-10 -15;\N\N;"Don't hurt her";"Blue disc";"CD-ROM";70;1;2003-2- 15;\N\N;"Best of winter";\N;"CD-RW";1;665600;2005-12-18;\ N
LOAD DATA INFILEper caricare dati da
un file testo
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 48
Manipolazione di tabelle (4)
• LOAD DATA INFILE è utile per trasferire dati da un database ad un altro. Esempi:– Esportare dati da Access in un file di testo e poi importarli in MySQL con il
comando LOAD DATA INFILE
– Esportare dati da una tabella di un certa versione di MySQL e poi importarla in un altro database con una differente versione di MySQL
– Trasferire dati tra tabelle MySQL in differenti installazioni
• Per esportare dati da una tabella MySQL in un file di testo c’è un programma di utilità di nome mysqldump ( Si veda il manuale in linea al paragrafo 8.13 )8.13 mysqldump A Database Backup Program===========================================The `mysqldump' client can be used to dump a databa se or a collectionof databases for backup or for transferring the dat a to another SQLserver (not necessarily a MySQL server).
Meglio usare MySQL Query Browser (vedi pagina 140) o PhpMyAdmin (vedi pagina 218) per esportare i dati in un file di testo
8.13 mysqldump A Database Backup Program===========================================The `mysqldump' client can be used to dump a databa se or a collectionof databases for backup or for transferring the dat a to another SQLserver (not necessarily a MySQL server).
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 49
Manipolazione di tabelle (5)
mysql> CREATE TABLE ArtistiPreferiti-> SELECT * FROM Artisti-> WHERE Genere = 'Pop' or Genere = 'Rock';
-- ------------------------------------------------- ------------- ArtistiPreferiti con CREATE TABLE e INSERT INTO TA BLE-- ------------------------------------------------- -----------mysql> CREATE TABLE ArtistiPreferiti
-> SELECT * FROM Artisti-> WHERE Genere = 'Pop';
mysql> INSERT INTO ArtistiPreferiti-> SELECT * FROM Artisti-> WHERE Genere = 'Rock';
+-----------+---------------+---------+------+| IDArtista | Nome | Genere | Note |+-----------+---------------+---------+------+| 1 | Pierre Borg | Pop | || 2 | Anatolia | Rock | || 3 | The Bees | Rap | || 4 | Golden Eagles | Pop | || 5 | Argolide | Rock | || 6 | Heavy Stones | Opera | || 7 | Steve Martin | Country | |+-----------+---------------+---------+------+
ArtistiPreferititabella con artisti di genere Rock o Pop
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 50
Esercizi
Si suppone che il database CollezioneMusicale contenga almeno 5 righe per ogni tabella che lo compone. Provvedete a inserirle con il comando INSERT. Dopo ogni esercizio controllare l’effetto dei comandi eseguiti.
1. Usate il comando DELETE per eliminare tutte le righe introdotte nella tabella Brani
2. Usate il comando DELETE per cancellare le righe con ID = 1 e 2 nella tabella Registrazioni
3. Usate il comando TRUNCATE per cancellare tutte le righe dalle tabelle Registrazioni e Artisti
4. Usate il comando LOAD DATA INFILE per popolare le tabelle del database con i dati contenuti nei file Artisti.txt, Registrazioni.txt, Brani.txt che troverete nello spazio riservato al corso
5. Usate il comando UPDATE per eliminare gli spazi inutili dai nomi dei brani
6. Inserite una riga per Artisti con il campo Genere contenente un valore non previsto per il tipo del campo
7. Create una tabella temporanea con i brani di genere Pop oppure Rock
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 51
SELECT Colonna1, Colonna2, . . .
FROM Tabella1, Tabella2, . . .
WHERE CondizioniSulleRighe
GROUP BY Colonna-e
HAVING CondizioniSuiRaggruppamenti
ORDER BY Col1 [ASC, DESC] , Col2 [ASC, DESC], .. | Rand()
LIMIT NumeroRighe ;
Il comando SELECT (1)
FROM R CROSS JOIN SFROM R JOIN S ON CondizioneFROM R JOIN S USING ( Colonna) FROM R NATURAL JOIN S FROM R LEFT JOIN S ON .. FROM R RIGHT JOIN S ON ..
LIMIT 5 -- mostra solo 5 righeLIMIT 1,3 –- mostra le righe 2,3,4
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 52
Il comando SELECT (2)
Congiunzione tra Artisti e Brani sul campo IDArtist a
mysql> SELECT Nome, TitoloBrano, B.Genere-> FROM Artisti A, Brani B-> WHERE A.IDArtista = B.IDArtista;
mysql> SELECT Nome, TitoloBrano, B.Genere-> FROM Artisti A JOIN Brani B ON A.IDArtista = B.ID Artista;
mysql> SELECT Nome, TitoloBrano, B.Genere-> FROM Artisti JOIN Brani B USING(IDArtista);
mysql> SELECT Nome, TitoloBrano, B.Genere-> FROM Artisti NATURAL JOIN Brani B;
-- ------------------------------------------------- -------------- Il JOIN precedente equivale a: -- ------------------------------------------------- ------------mysql> SELECT Nome, TitoloBrano, B.Genere
-> FROM Artisti JOIN Brani B USING(IDArtista, Gener e);
Attenzione !
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 53
Il comando SELECT (3)
-- ------------------------------------------------- -------------- Le registrazioni senza brani-- ------------------------------------------------- ------------mysql> SELECT TitoloAlbum
-> FROM Registrazioni LEFT JOIN Brani USING (IDRegi strazione)-> WHERE TitoloBrano IS NULL;
-- ------------------------------------------------- -------------- I brani che non sono inseriti in alcuna registrazione-- ------------------------------------------------- ------------mysql> SELECT TitoloBrano
-> FROM Registrazioni RIGHT JOIN Brani USING (IDReg istrazione)-> WHERE TitoloAlbum IS NULL;
-- ------------------------------------------------- -------------- Il FULL JOIN tra Registrazioni e Brani: -- ------------------------------------------------- ------------mysql> ( SELECT R.IDRegistrazione, TitoloAlbum, Tit oloBrano
-> FROM Registrazioni R LEFT JOIN Brani B USING(. .) )-> UNION -- UNION Equivale a UNION DISTINCT-> ( SELECT R.IDRegistrazione, TitoloAlbum, TitoloB rano-> FROM Registrazioni R RIGHT JOIN Brani B USING( ..) );
UNION UNION ALL
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 54
Il comando SELECT (4)
mysql> SELECT * FROM Artisti-> WHERE Nome LIKE 'a%';
+-----------+----------+--------+------+| IDArtista | Nome | Genere | Note |+-----------+----------+--------+------+| 2 | Anatolia | Rock | || 5 | Argolide | Rock | |+-----------+----------+--------+------+
mysql> SELECT * FROM Artisti-> WHERE Nome LIKE BINARY 'a%';
Empty set (0.39 sec)
mysql> SELECT * FROM Artisti WHERE Nome = 'anatolia' ;+-----------+----------+--------+------+| IDArtista | Nome | Genere | Note |+-----------+----------+--------+------+| 2 | Anatolia | Rock | |+-----------+----------+--------+------+mysql> SELECT * FROM Artisti WHERE Nome = BINARY 'ana tolia';
BINARYper confrontare
stringhe in modalitàcase sensitive
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 55
Il comando SELECT (5)
mysql> SELECT TitoloBrano, ROUND(DurataBrano*60)-> FROM Brani-> LIMIT 4;
+------------------------+-----------------------+| TitoloBrano | ROUND(DurataBrano*60) |+------------------------+-----------------------+| A little more | 285 || A few minutes later | 210 || Beside the bed | 270 || Suspected of hjiacking | 315 |+------------------------+-----------------------+
mysql> SELECT TitoloBrano, ROUND(DurataBrano*60)-> FROM Brani-> LIMIT 1,2;
+------------------------+-----------------------+| TitoloBrano | ROUND(DurataBrano*60) |+------------------------+-----------------------+| A few minutes later | 210 || Beside the bed | 270 |+------------------------+-----------------------+
LIMIT 4
Equivale a:
LIMIT 0, 4
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 56
Esempi di query (1)
+-----------+-----------+-------------------------- ---+-------------+------------+| Nome | Cognome | Indirizzo | Telefono | Nascita |+-----------+-----------+-------------------------- ---+-------------+------------+| Giuseppe | Piccinini | Via Garibaldi, 37 - Catani a | 095-723651 | 1990-12-04 || Francesco | Rossi | Via Mazzini, 12 - Roma | 06-4589236 | 1986-10-20 || Gianni | Bassi | Via Verdi, 8 - Milano | 02-8825321 | 1988-01-15 || Bruno | Bianchi | Viale Cavour, 55 - Napoli | 081-3712453 | 1987-05-16 |+-----------+-----------+-------------------------- ---+-------------+------------+
Rubrica( Nome, Cognome, Indirizzo, Telefono, Nascit a )
Tabella Rubrica
Da Rubrica si vogliono estrarre i seguenti elenchi:
• Nome e Cognome compattati in un’ unica stringa
• Nome, Cognome e città di residenza delle persone
• Nome, Cognome e prefisso telefonico
• Elenco delle persone il cui compleanno cade nel prossimo mese
• Nome, Cognome e data di nascita visualizzata nel modo abituale: gg-mm-aaaa
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 57
Esempi di query (2)
Rubrica( Nome, Cognome, Indirizzo, Telefono, Nascit a )
-- ------------------------------------------------- --------------- Nome e Cognome compattati -- ------------------------------------------------- -------------mysql> SELECT CONCAT(Nome,' ',Cognome)
-> FROM Rubrica;
-- ------------------------------------------------- --------------- Nome, Cognome e città di residenza -- Nome, Cognome e prefisso telefonico-- ------------------------------------------------- -------------mysql> SELECT Nome, Cognome,
-> SUBSTRING(Indirizzo, LOCATE('-',Indirizzo)+2) AS 'Citta\''-> FROM Rubrica;
mysql> SELECT Nome, Cognome,-> LEFT(Telefono, LOCATE('-',Telefono)-1) AS Prefis so-> FROM Rubrica;
CONCAT
LOCATESUBSTRING
LEFT
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 58
Esempi di query (3)
-- ------------------------------------------------- --------------- Elenco delle persone che compiono gli anni il pro ssimo mese -- ------------------------------------------------- -------------mysql> SELECT Nome, Cognome
-> FROM Rubrica-> WHERE MONTH(Nascita) =
MONTH(ADDDATE(CURDATE(), INTERVAL 1 MONTH));
-- ------------------------------------------------- --------------- Nome, Cognome e data nascita formattata come: gg- mm-aaaa-- ------------------------------------------------- -------------SELECT Nome, Cognome,
CONCAT(DAY(Nascita),'-',MONTH(Nascita),'-',YEAR(Nas cita)) AS CONCAT(DAY(Nascita),'-',MONTHNAME(Nascita),'-',YEAR (Nascita))AS
FROM RubricaLIMIT 1;+-----------+-----------+------------+------------- ----+| Nome | Cognome | gg-mm-aaaa | DataNascita |+-----------+-----------+------------+------------- ----+| Giuseppe | Piccinini | 4-12-1990 | 4-December-1 990 |+-----------+-----------+------------+------------- ----+
CURDATE
ADDDATE, DAY
MONTH, YEAR
MONTHNAME
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 59
Variabili utente e raggruppamenti
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 60
Variabili utente (1)
• Variabili alle quali si può attribuire un valore e utilizzare in un comando SQL
– SET @NomeVariabile = Espressione;
– @NomeVariabile è case sensitive sino alla versione 4
– mysql> SET @Numero=(SELECT COUNT(*) FROM Brani);
– mysql> SELECT @Numero := COUNT(*)FROM Brani;
mysql> SET @NumBrani = (SELECT COUNT(*) FROM Brani);
mysql> SELECT @NumBrani, @brani;+-----------+--------+| @NumBrani | @brani |+-----------+--------+| 20 | NULL |+-----------+--------+
Una variabile alla quale non sia stato
attribuito alcun valore vale NULL
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 61
Variabili utente (2)
mysql> SELECT MAX(DurataBrano)-> FROM Brani;
+------------------+| MAX(DurataBrano) |+------------------+| 15.00 |+------------------+
mysql> SET @durataMassima = (SELECT MAX(DurataBrano) F ROM Brani);mysql> SELECT TitoloBrano, Genere, DurataBrano AS Du rata
-> FROM Brani-> WHERE DurataBrano = @durataMassima;
+---------------------------+--------+--------+| TitoloBrano | Genere | Durata |+---------------------------+--------+--------+| I' ve got a man into Rome | Opera | 15.00 |+---------------------------+--------+--------+
Identificare il brano di durata massima
MAX genera il valore massimo ma non dà
informazioni sulla riga da cui proviene
tale valore
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 62
Variabili utente (3)
-- ------------------------------------------------- -------------- Naturalmente si possono usare query annidate-- ------------------------------------------------- ------------mysql> SELECT TitoloBrano, Genere, DurataBrano AS Du rata
-> FROM Brani-> WHERE DurataBrano = ( SELECT MAX(DurataBrano)
FROM Brani );
-- ------------------------------------------------- -------------- La clausola LIMIT suggerisce una strategia alternativ a-- ------------------------------------------------- ------------mysql> SELECT TitoloBrano, Genere, DurataBrano AS Du rata
-> FROM Brani-> ORDER BY Durata DESC-> LIMIT 1; Le due query
generano il medesimo elenco?
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 63
• GROUP BY Colonna WITH ROLLUP è utile per la produzione di informazioni di sintesi e nell’analisi dei dati a scopo direzionale
Raggruppamenti (1)
-- ------------------------------------------------- ------- Brani per registrazione e numero totale di brani-- ------------------------------------------------- -----mysql> SELECT IDRegistrazione, COUNT(*)
-> FROM Brani-> GROUP BY IDRegistrazione WITH ROLLUP;
+-----------------+----------+| IDRegistrazione | COUNT(*) |+-----------------+----------+| 1 | 4 || 2 | 5 || 3 | 1 || 6 | 6 || 10 | 4 || NULL | 20 |+-----------------+----------+
WITH ROLLUP:La funzione di
aggregazione viene valutata sui singoli
raggruppamenti e sul totale
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 64
Raggruppamenti (2)
/*------------------------------------------------- -------------Totali per artista e generali oltre ai singoli ragg ruppamenti
--------------------------------------------------- ----------*/
mysql> SELECT IDArtista, IDRegistrazione, COUNT(*)-> FROM Brani-> GROUP BY IDArtista, IDRegistrazione WITH ROLLUP;
+-----------+-----------------+----------+| IDArtista | IDRegistrazione | COUNT(*) |+-----------+-----------------+----------+| 1 | 1 | 4 || 1 | 10 | 2 || 1 | NULL | 6 | Brani dell’ artista 1| 2 | 6 | 3 || 2 | NULL | 3 | Brani dell’ artista 2| 3 | 6 | 1 || 3 | NULL | 1 | Brani dell’ artista 3| . . | . . | . . || NULL | NULL | 20 | Totale Brani+-----------+-----------------+----------+
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 65
Controllo del flusso(1)
• Come modificare tutti quei NULL causati dalle aggregazioni con rollup?
• Funzioni per il controllo del flusso: CASE, IF, IFNULL
• CASE valore WHEN val THEN res WHEN val THEN res ... ELSE res END
• CASE WHEN test THEN res WHEN test THEN res ... ELSE res END
• IF( expr1, expr2, expr3)
mysql> SET @dato = 2;mysql> SELECT CASE @dato
-> WHEN 1 THEN 'uno‘ WHEN 2 THEN 'due' -> WHEN 3 THEN 'tre‘ ELSE 'maggiore di tre ' -> END AS 'Valore';
+--------+| Valore |+--------+| due |+--------+
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 66
Controllo del flusso(2)
• IF( Test, ExprVera, ExprFalsa ) equivale a:
CASE WHEN Test THEN ExprVera ELSE ExprFalsa
• IFNULL( expr1, expr2 ) equivale a: IF( expr1 IS NOT NULL , expr1, expr2 )
mysql> set @voto=26;mysql> SELECT CASE WHEN @voto<18 THEN 'Insufficient e'
-> WHEN @voto between 18 AND 23 THEN 'Suffic iente'-> WHEN @voto between 24 AND 27 THEN 'Buono'-> ELSE 'Ottimo' -> END AS Risulato;
+----------+| Risulato |+----------+| Buono |+----------+
Riscrivere la query di diap 63 per modificare il contenuto dei campi NULL
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 67
Esercizi (1)
1. Elenco di tutti i brani con il titolo, il genere musicale e il nome dell’artista che esegue il brano
2. Elenco dei brani (con titolo, genere e nome dell’artista) eseguiti da artisti che praticano lo stesso genere del brano eseguito
3. Ricercare gli artisti che non eseguono alcun brano
4. Ricercare gli artisti che eseguono più di tre brani
5. Numero e durata complessiva dei pezzi pop contenuti in Brani
6. Durata massima, minima e media dei brani catalogati in Brani
7. Numero dei generi musicali dei brani catalogati in Brani
8. Elencare i cinque brani più lunghi in archivio
9. Elencare i brani (TitoloBrano e Genere) che contengono “you” nel titolo. Elencare i brani che contengono esattamente “You” nel titolo
10. Elencare le registrazioni di capacità massima e con il maggior valore di durata massima
11. Elencare i brani contenuti nella registrazione il cui nome è contenuto nella variabile utente @titolo
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 68
Esercizi (2)
12. Elencare i brani eseguiti da un artista di nome precisato nella variabile utente @artista
13. Elencare gli artisti che hanno eseguito brani di genere precisato nella variabile utente @genere
14. Elencare i brani di durata superiore a quella precisata nella variabile utente @durata
15. Elencare le registrazioni che contengono più di 4 brani
16. Elencare i brani di genere musicale differente da quello abitualmente praticato dall’artista che lo esegue
17. Indicare il numero di brani contenuti in ogni registrazione
18. Creare una nuova tabella che contiene nome dell’album e numero dei brani in essa contenuti
19. Individuare la registrazione con il maggior numero di brani
20. Individuare l’artista che esegue il maggior numero di brani (usare una tabellatemporanea creata ad hoc per risolvere il problema)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 69
Chiavi Esterne, Interrogazioni Nidificate, Viste Logiche
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 70
Chiavi esterne e integrità referenziale (1)
Le chiavi esterne e i conseguenti vincoli di integrità referenziale sono implementati in MySQL solamente se tutte le tabelle interessate sono di tipo INNODB
• MySQL ammette diversi tipi di tabelle; un database può essere composto da tabelle di tipo differente
Storage Engine Description
MyISAMMyISAMMyISAMMyISAM The binary portable storage engine that is the improved replacement for ISAMISAMISAMISAM.
InnoDBInnoDBInnoDBInnoDB Transaction-safe tables with row locking and foreign keys.
MEMORYMEMORYMEMORYMEMORY An alias for HEAPHEAPHEAPHEAP. (Actually, as of MySQL 4.1, MEMORYMEMORYMEMORYMEMORY is the preferred term.)
BDBBDBBDBBDB Transaction-safe tables with page locking. Alias diBerkeleyDB
HEAPHEAPHEAPHEAP The data for this table is stored only in memory.
ISAMISAMISAMISAM The original MySQL storage engine.
MERGEMERGEMERGEMERGE A collection of MyISAMMyISAMMyISAMMyISAM tables used as one table.
Attenzione al tipo delle
tabelle !
Tipo di default:
InnoDb – ver. 5.5MyISAM – prima
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 71
CREATE TABLE NomeTabella ( ... ) TYPE = NomeTipo;
ALTER TABLE NomeTabella TYPE = NomeTipo;
FOREIGN KEY (Colonne) REFERENCES Tabella(Colonne)ON DELETE { NO ACTION | CASCADE | SET NULL } ON UPDATE { NO ACTION | CASCADE | SET NULL }
-- ------------------------------------------------- ------ Tutte le tabelle implicate devono essere InnoDB-- ------------------------------------------------- ----mysql> ALTER TABLE Brani TYPE InnoDB;mysql> ALTER TABLE Artisti TYPE InnoDB;
mysql> ALTER TABLE Brani-> ADD FOREIGN KEY (IDArtista) -> REFERENCES Artisti(IDArtista);
Chiavi esterne e integrità referenziale (2)
Se le tabelle non sono tutte
InnoDB il sistema accetta il comando ma
non fa nulla
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 72
mysql> ALTER TABLE Registrazioni TYPE InnoDB;mysql> ALTER TABLE Brani ADD
-> FOREIGN KEY (IDRegistrazione) -> REFERENCES Registrazioni(IDRegistrazione);
mysql> DESCRIBE Brani;+-----------------+----------------------+------+-- ---+---------+| Field | Type | Null | K ey | Default | +-----------------+----------------------+------+-- ---+---------+| IDBrano | int(10) unsigned | NO | PRI | NULL | | TitoloBrano | varchar(50) | NO | | | | Genere | varchar(10) | YES | | NULL | | DurataBrano | float(5,2) unsigned | YES | | 4.00 | | Dimensione | int(10) unsigned | YES | | NULL | | Posizione | smallint(5) unsigned | YES | | NULL | | Note | varchar(255) | YES | | NULL | | IDArtista | int(10) unsigned | YES | MUL | NULL | | IDRegistrazione | int(10) unsigned | YES | MU L | NULL | +-----------------+----------------------+------+-- ---+---------+
Chiavi esterne e integrità referenziale (3)
Per ogni chiave esterna viene creato
un indice
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 73
-- ------------------------------------------------- ------ Valgono i vincoli di integrita referenziale-- ------------------------------------------------- ----
mysql> INSERT INTO Brani (IDBrano, TitoloBrano, -> Genere, IDArtista, IDRegistrazione) VALUES-> ( \N,'La mia canzone disperata', 'Pop', 25, 1);
ERROR 1216 (23000): Cannot add or update a child ro w: a foreign key constraint fails
mysql> DELETE FROM Registrazioni-> WHERE IDRegistrazione = 2;
ERROR 1217 (23000): Cannot delete or update a paren t row: a foreign key constraint fails
Chiavi esterne e integrità referenziale (4)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 74
Esercizi
1. Definire le chiavi esterne nella tabella Brani del database CollezioneMusicale dopo avere creato tabelle di tipo MyISAM. Inserire in Brani una o più righe che violano i vincoli di integrità referenziale e osservare cosa succede.
2. Dopo avere eseguito l’esercizio 1, modificare il tipo delle tre tabelle facendole diventare di tipo InnoDB. Osservare cosa succede.
3. Dopo avere modificato il tipo delle tabelle e definito chiavi eterne e imposto vincoli di integrità referenziale provate a inserire in Brani righe che non rispettano i vincoli e a cancellare dalla tabella Artisti righe di artisti che sono referenziati nella tabella Brani.
4. Dopo avere creato le tabelle Anagrafica e Dipartimenti secondo lo schema sopra specificato definite chiavi esterne e vincoli di integrità referenziale fra Anagrafica e Dipartimenti, imponendo l’aggiornamento a catena di record correlati.
Anagrafica( Nome , Cognome , Dipart, Ufficio, Stipendio, Città)
Dipartimenti( Dipart , Indirizzo, Città)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 75
• MySQL permette di costruire interrogazioni nidificate con una sottoquery nella clausola FROM
• Elenco con spazio libero e numero di registrazione per i CD-R e CD-RW:
Interrogazioni Nidificate (1)
-- ------------------------------------------------- ------------- Il comando SELECT che produce lo spazio occupato-- ------------------------------------------------- -----------mysql> SELECT B.IDRegistrazione AS Album,
Sum(Dimensione) AS Occupato-> FROM Brani B JOIN Registrazioni R USING (IDRegistr azione)-> WHERE R.TipoAlbum = 'CD-R' OR R.TipoAlbum = 'CD-RW '-> GROUP BY B.IDRegistrazione;
+-------+----------+| Album | Occupato |+-------+----------+| 6 | 37085 || 10 | 21435 |+-------+----------+
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 76
-- ------------------------------------------------- ------ Il comando SELECT che produce lo spazio libero-- ------------------------------------------------- ----
mysql> SELECT V.Album, (Capacita - Occupato) AS Spazi oLibero-> FROM Registrazioni AS T, -> (SELECT B.IDRegistrazione AS Album,-> SUM(Dimensione) AS Occupato-> FROM Brani B JOIN Registrazioni R USING-> (IDRegistrazione)-> WHERE R.TipoAlbum = 'CD-R' OR R.TipoAlbum = 'CD-RW'-> GROUP BY B.IDRegistrazione) AS V-> WHERE V.Album = T.IDRegistrazione;
+-------+--------------+| Album | SpazioLibero |+-------+--------------+| 6 | 679715 || 10 | 644165 |+-------+--------------+
Interrogazioni Nidificate (2)
Attenzione : la tabella nella
query annidata deve essere rinominata
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 77
Viste Logiche (1)
• Il problema precedente affrontato con una vista logica
-- ------------------------------------------------- ---------- La vista logica che registra lo spazio occupato-- ------------------------------------------------- --------mysql> CREATE VIEW OccupazioneCD AS
-> SELECT B.IDRegistrazione, -> Sum(Dimensione) AS SpazioOccupato-> FROM Brani B JOIN Registrazioni R USING (IDRegistr azione)-> WHERE R.TipoAlbum IN ('CD-R', 'CD-RW')-> GROUP BY B.IDRegistrazione;
-- ------------------------------------------------- --------- Query per determinare lo spazio libero su CD-- ------------------------------------------------- -------mysql> SELECT R.IDRegistrazione, ( Capacita – SpazioO ccupato )
-> AS SpazioLibero-> FROM Registrazioni R JOIN OccupazioneCD USING-> (IDRegistrazione);
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 78
Viste Logiche (2)
• Il “vero” codice che ha creato la vista logica ...
mysql> SHOW CREATE VIEW OccupazioneCD;
CREATE ALGORITHM=UNDEFINED VIEW`collezionemusicale`.`occupazionecd` AS select . . .
The optional ALGORITHM clause is a MySQL extension to standard SQL.ALGORITHM takes three values: MERGE, TEMPTABLE, or UNDEFINED. The default algorithm is UNDEFINED if no ALGORITHM clau se is present. The algorithm affects how MySQL processes the view.
For MERGE, the text of a statement that refers to t he view and the viewdefinition are merged such that parts of the view d efinition replacecorresponding parts of the statement.
For TEMPTABLE, the results from the view are retrie ved into a temporary table, which then is used to execute the statement.
For UNDEFINED, MySQL chooses which algorithm to use. It prefers MERGE over TEMPTABLE if possible, because MERGE is usuall y more efficient and because a view cannot be updatable if a temporary t able is used.
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 79
Viste Logiche (3)
• La clausola WITH CHECK OPTION permette di controllare i dati immessi con una vista logica
• Utile per ovviare alla mancanza della clausola CHECK nel comando CREATE TABLE di MySQL (la clausola è ammessa ma non fa nulla)
-- The WITH CHECK OPTION clause can be given for an u pdatable -- view to prevent inserts or updates to rows except those for -- which the WHERE clause in the select_statement is true.
-- ------------------------------------------------- ------------ Durata brani compresa tra 15 secondi e 60 minuti-- ------------------------------------------------- ----------mysql-> CREATE VIEW BraniControllati AS
-> SELECT * -> FROM Brani-> WHERE DurataBrano BETWEEN 0.25 AND 60.0-> WITH CHECK OPTION;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 80
Viste Logiche (4)
• L’inserimento nella tabella Brani avviene senza controlli .. • L’inserimento nella vista logica BraniControllati è controllato . . .
-- ------------------------------------------------- ---------- Inserimento di un brano con valori non ammessi in Bran i-- ------------------------------------------------- --------mysql> INSERT INTO Brani VALUES
-> (100,‘Titolo Brano','Pop', 85, \N, \N, \N, 1, 1) ;Query OK, 1 row affected (0.08 sec)
mysql> DELETE FROM Brani-> WHERE IDBrano = 100;
Query OK, 1 row affected (0.07 sec)-- ------------------------------------------------- ------------ Un brano con valori scorretti inserito in BraniContro llati-- ------------------------------------------------- ----------mysql> INSERT INTO BraniControllati VALUES
-> (\N,‘Titolo Brano','Pop', 85, \N, \N, \N, 1, 1);ERROR 1369 (HY000): CHECK OPTION failed . . .
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 81
Esercizi (1)
• Calcolare il “vero” spazio libero su CD. (La soluzione proposta nelle precedenti diapositive non tiene conto di eventuali registrazioni vuote)
• Definire la vista logica BraniRock:
mysql> SELECT * FROM branirock;+----------------------------+--------+----------+- ----------------------+-----------+| Titolo | Durata | Artista | Album | Posizione |+----------------------------+--------+----------+- ----------------------+-----------+| The other side of the road | 4.50 | Anatolia | My favourites | 1 || Colonel Rostov | 6.00 | Argolide | My favourites | 3 || She Smiled | 4.75 | Anatolia | My favourites | 6 || It was all wrong | 3.75 | Anatolia | My f avourites | 4 || You are a liar | 4.25 | Argolide | Mixed songs: rac colta | 5 |+----------------------------+--------+----------+- ----------------------+-----------+
• Interrogare la vista logica BraniRock per produrre la tabella:+----------------------------+--------+----------+- ---------------------------------+| Titolo | Durata | Artista | Posizione e Titolo Album |+----------------------------+--------+----------+- ---------------------------------+| The other side of the road | 4.50 | Anatolia | Po sto 1 in My favourites || Colonel Rostov | 6.00 | Argolide | Po sto 3 in My favourites || She Smiled | 4.75 | Anatolia | Posto 6 in My favou rites || It was all wrong | 3.75 | Anatolia | Pos to 4 in My favourites || You are a liar | 4.25 | Argolide | Posto 5 in Mixe d songs: raccolta |+----------------------------+--------+----------+- ---------------------------------+
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 82
Esercizi (2)
• Interrogare la vista logica BraniRock per produrre la tabella:+----------------------------------------+--------- -------------------+--------+| Pezzo e Artista | Album e Posizione | Durata |+----------------------------------------+--------- -------------------+--------+| The other side of the road -- Anatolia | My favourite s -- 1 | 4.50 || Colonel Rostov -- Argolide | My favourites -- 3 | 6.00 || She Smiled -- Anatolia | My favourite s -- 6 | 4.75 || It was all wrong -- Anatolia | My favourites -- 4 | 3.75 || You are a liar -- Argolide | Mixed songs: raccolta -- 5 | 4.25 |+----------------------------------------+--------- -------------------+--------+
• Identificare la registrazione che contiene il maggior numero di Brani interrogando una opportuna vista logica
• Identificare la registrazione di maggior durata (in base al totale della durata dei brani contenuti) interrogando una opportuna vista logica
• Identificare il dipartimento che ha la media degli stipendi più elevata
Anagrafica( Nome , Cognome , Dipart, Ufficio, Stipendio, Città)
Dipartimenti( Dipart , Indirizzo, Città)
Stored Procedure e Stored Function
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 84
Vantaggi : • Migliorano la sicurezza• Semplificano lo sviluppo delle applicazioni: concentrando il codice sul server e
creando componenti riutilizzabili in diversi ambienti e con diversi linguaggi• Riducono il traffico sulla rete• Migliorano la portabilità del software
Svantaggi :
• Le Stored Routine appesantiscono il server
Stored Routine (1)
• Le Stored Procedure e le Stored Function sono procedure memorizzate nel database che svolgono compiti di norma demandati a programmi applicativi che risiedono sui client
• Le Stored Procedure, sono attivate con il comando CALL ; ricevono e restituiscono valori normalmente tramite parametri
• Le Stored Function svolgono funzioni analoghe a quelle delle funzioni di libreria (Concat( ), Sqrt( ), .. ) e sono utilizzate in modo analogo
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 85
Stored Routine (2)
-- ------------------------------------------------- ----- Calcolare i secondi della parte frazionaria di un a-- durata espressa in minuti e frazioni di minuto-- ------------------------------------------------- ---
DELIMITER //CREATE FUNCTION GetSec( Tempo Float ) RETURNS Int DETERMINISTICBEGIN
DECLARE Minuti, Secondi Int;SET Minuti = Floor(Tempo);SET Secondi = (Tempo - Minuti) * 60;RETURN Secondi;
END //DELIMITER ;
CREATE FUNCTION NomeFunction ( ElencoParametri )RETURNS TipoValoreRitornatoCorpoDellaFunction;
Vedi manuale 12.1.15.
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 86
Stored Routine (3)-- ------------------------------------------------- ----- Esempi con GETSEC-- ------------------------------------------------- ---mysql> SELECT GetSec(3.5), GetSec(4.25), GetSec(0.2 );+-------------+--------------+-------------+| GetSec(3.5) | GetSec(4.25) | GetSec(0.2) |+-------------+--------------+-------------+| 30 | 15 | 12 |+-------------+--------------+-------------+
mysql> SELECT 12.75 AS Durata,-> Concat(Floor(12.75),":",GetSec(12.75)) AS 'MM:SS ';
+--------+-------+| Durata | MM:SS |+--------+-------+| 12.75 | 12:45 |+--------+-------+
Mysql> CREATE FUNCTION MinutiSecondi (Tempo Float) -> RETURNS Varchar(5) DETERMINISTIC-> RETURN Concat( Floor(Tempo), ”:”, GetSec(Tempo) );
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 87
• Nelle Stored Routine possono comparire strutture di controllo: vedi manuale 12.7.6
– IF THEN ELSE ; IF THEN ELSE IF THEN .. ELSE – WHILE – REPEAT
Stored Routine (4)
CREATE FUNCTION TestIF (A Int)RETURNS Int DETERMINISTIC
BeginDeclare X Int;IF A < 3 THEN
Set X = 1;ELSE
Set X = 2;END IF;Return X;
End //-- ---------------------------------------------- TestIF(0) Restituisce 1-- TestIF(5) Restituisce 2-- --------------------------------------------
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 88
Stored Routine (5)
CREATE FUNCTION TestIF2 (A Int) RETURNS Int DETERMINISTIC
BeginDeclare X Int;IF A < 0 THEN
Set X = -1;ELSE IF A = 0 THEN
Set X = 0;ELSE
Set X = 1;END IF;Return X;
End //
-- --------------------------------------------- TestIF2(-5) Restituisce -1-- TestIF2(0) Restituisce 0-- TestIF2(8) Restituisce 1-- -------------------------------------------
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 89
Stored Routine (6)CREATE FUNCTION TestWhile(X Int) RETURNS Int DETERMIN ISTICBegin
WHILE X < 10 DOSET X = X + 1;
END WHILE;Return X;
End // -- ---------------------------------------------- TestWhile(12) Restituisce 12-- TestWhile(0) Restituisce 10-- --------------------------------------------CREATE FUNCTION TestRepeat(X Int) RETURNS IntDETERMINISTICBegin
REPEAT Set X = X + 1;
UNTIL X > 0 END REPEAT;Return X;
End // -- ---------------------------------------------- TestRepeat(10) Restituisce 11-- TestRepeat(-5) Restituisce 1
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 90
Stored Routine (7)
STORED PROCEDURE VS STORED FUNCTION
• Sono richiamate con: CALL NomeProcedura( ElencoParametri )
• Ricevono e restituiscono valori tramite parametri
• Nelle procedure si possono usare tutte le istruzioni ammesse nelle FUNCTION ad eccezione di RETURN
• Una procedura può richiamare altre procedure o funzioni
• Una funzione può richiamare solo funzioni
• Una procedura può fare uso di qualsiasi comando SQL ad eccezione di quelli che permettono di gestire Procedure, Funzioni e Trigger
• Una procedura può restituire una intera tabella, al di fuori dei parametri, per effetto di un comando SELECT.
• In una Function non possono comparire comandi SQL (5.0) mentre è possibile dalla versione 5.1 di mysql
• CREATE PROCEDURE NomeProcedura ( ElencoParametri)CorpoDellaProcedura;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 91
Stored Routine (8)
-- ------------------------------------------------- ----- Esempio di procedura che restituisce una tabella-- ------------------------------------------------- ---mysql> CREATE PROCEDURE BraniOpera()
-> SELECT TitoloBrano, DurataBrano-> FROM Brani-> WHERE Genere = "Opera";
mysql> CALL BraniOpera();+---------------------------+-------------+| TitoloBrano | DurataBrano |+---------------------------+-------------+| The way we live | 12.50 || I' ve got a man into Rome | 15.00 || If I get a better one | 13.00 |+---------------------------+-------------+
Mysql> CALL ElencoBrani(”Rock”); Mysql> CALL ElencoBrani(”Pop”);
Creare una procedura per interrogare un database
con semplici comandi
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 92
Stored Routine (9)
-- ------------------------------------------------- ----- La precedente procedura generalizzata-- ------------------------------------------------- ---mysql> CREATE PROCEDURE ElencoBrani(IN Tipo VARCHAR(1 0))
-> SELECT TitoloBrano, DurataBrano-> FROM Brani-> WHERE Genere = Tipo;
-- ------------------------------------------------- ----- Uso della procedura ElencoBrani-- ------------------------------------------------- ---mysql> CALL ElencoBrani(‘Pop’);
mysql> SET @genere = ‘Opera’;mysql> CALL ElencoBrani(@genere);
In una procedura può essere usato qualsiasi
comando SQL. Costruiamo una procedura
per inserire un nuovoartista
IN, OUTINOUT
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 93
Stored Routine (10)
-- ------------------------------------------------- ----- Comandi DELIMITER omessi -- ------------------------------------------------- ---mysql> CREATE PROCEDURE NuovoArtista
-> ( IN Nom Varchar(50), IN Tipo Varchar(10), -> IN Comm Varchar(255), OUT Codice Int, -> OUT NumArtisti Int )-> BEGIN-> INSERT INTO Artisti VALUES(\N, Nom, Tipo, Comm );-> SELECT Count(*) INTO NumArtisti-> FROM Artisti-> WHERE Genere = Tipo;-> SELECT last_insert_id() INTO Codice;-> END //
-- ------------------------------------------------- ----- Uso della procedura -- ------------------------------------------------- ---mysql> CALL NuovoArtista(‘NomeArtista’,‘Pop’,‘’, @c od, @numero );mysql> SELECT @cod AS CodiceArtista,
-> @numero AS NumeroArtisti;
last_insert_id( )recupera l’ultimo valore
auto_increment
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 94
Stored Routine (11)
-- ------------------------------------------------- --------------- Uso di una procedure per controllare i dati -- ------------------------------------------------- -------------
mysql> CREATE PROCEDURE NuovoBrano-> ( Titolo Varchar(50), Tipo Varchar(10), Dur Float(5,2),-> Dim Int, Pos Int, Comm Varchar(255), Artista Int,-> Registrazione Int, -> OUT Codice Int, OUT Msg Varchar(30) )-> BEGIN-> IF Dur >= 0.25 AND Dur <= 60.0 THEN-> INSERT INTO Brani VALUES (-> \N,Titolo,Tipo,Dur,Dim,Pos,Comm,Artista,R egistrazione-> );-> SELECT last_insert_id() INTO Codice;-> SET Msg = CONCAT(“Artista num. “,Codice,” in serito”);-> ELSE-> SET Msg = “Durata brano non ammessa”;-> ENDIF;-> END //
I parametri possono essere:
IN, OUT, INOUT
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 95
Stored Routine (12)-- ------------------------------------------------- ---------------- row_count() restituisce: -- il numero di righe influenzate da INSERT, UPDATE o DELETE-- -1 in caso di errore -- ------------------------------------------------- --------------mysql> INSERT INTO Artisti VALUES (1,'nome', 'pop', \N);ERROR 1062 (23000): Duplicate entry '1' for key 1mysql> SELECT row_count();+-------------+| row_count() |+-------------+| -1 |+-------------+
mysql> UPDATE Artisti -> SET Note = '********' -> WHERE IDArtista = 1000;
mysql> SELECT row_count(); +-------------+| row_count() |+-------------+| 0 |+-------------+
found_rows() numero di righe recuperate da
SELECT
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 96
-- ------------------------------------------------- ---------------- Una versione complessa di InserisciBrano-- ------------------------------------------------- --------------mysql> create procedure InserisciBrano
-> (IN titolo varchar(50), IN genere varchar( 10),-> IN durata float, IN dimensione int, IN no te-> varchar(255), IN IDArt int, IN IDReg int,-> OUT numBrani int, OUT artista varchar(50),-> OUT registrazione varchar(50), OUT msg var char(30) )-> begin-> declare ID, numRighe int;-> -> select count(*) into numBrani from Brani-> where IDRegistrazione=IDReg;-> -> set numBrani = numBrani + 1;-> insert into Brani values-> ( \N, titolo, genere, durata, dimensione , numBrani,-> note, IDArt, IDReg);-> -> select row_count() into numRighe;
Stored Routine (13)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 97
Stored Routine (14)
-> if numRighe > 0 then-> select last_insert_id() into ID;-> update Registrazioni -> set DataAggiornamento = CURDATE()-> where IDregistrazione = IDReg;-> select Nome into artista -> from Artisti -> where IDArtista = IDArt;-> select TitoloAlbum into registrazione-> from Registrazioni -> where IDRegistrazione = IDReg;-> set msg = Concat('Inserito brano con codice ', ID,-> ', data registrazione agg iornata');-> else-> set numBrani = 0;-> set artista = '';-> set registrazione = '';-> set msg = 'Errore nei dati forniti';-> end if;-> end //
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 98
Stored Routine (15)
Comandi per la gestione delle stored routine:
• CREATE PROCEDURE | FUNCTION . . .
– CALL
– DECLARE
– SET
– SELECT ... INTO
– RETURN
• SHOW CREATE PROCEDURE | FUNCTION
• DROP PROCEDURE | FUNCTION
Dai precedenti esempi:
• Le Function generalizzano il concetto di operazione
• Le Procedure generalizzano il concetto di istruzione
• Vedi manuale: 12.4.4 SET Syntax
12.4.5 SHOW Syntax
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 99
Esercizi (1)Si consideri il database dei conoscenti:
Rubrica(Nome,Cognome,Nascita,Indirizzo,Telefono)
1. Realizzare una funzione che permette di riconoscere se un conoscente compie gli anni il prossimo mese
2. Realizzare la funzione GETCAP ( ) che restituisce il codice postale
3. Realizzare la funzione GETCITTA ( ) che restituisce il nome della città
4. Realizzare la funzione GETPROVINCIA ( ) che restituisce la sigla della provincia, oppure “XX” se ci sono errori
5. Realizzare la funzione GETINDIRIZZO( ) che restituisce la prima parte dell’indirizzo o “Errore nei dati” se l’indirizzo è mal formattato
6. Realizzare la funzione GETPREFISSO ( ) che restituisce il prefisso telefonico
7. Realizzare una procedura che inserisce una nuova riga in rubrica, controllando che l’indirizzo sia correttamente formattato
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 100
Esercizi (2)
8. Realizzare una procedura che impedisce l’inserimento di una riga in caso di omonimie
9. Realizzare una procedura che inserisce una riga in rubrica e restituisce il numero di righe presenti nella tabella dopo l’inserimento
10. Realizzare una funzione che riceve una data e restituisce il nome del mese in lingua italiana
11. Realizzare una procedura che inserisce una riga in Rubrica controllando la correttezza della data di nascita e restituisce la data immessa nel formato gg-nomeMese-aaaa se la data è corretta oppure un messaggio di errore in caso di data scorretta
12. Realizzare una procedura che inserisce una nuova riga in rubrica, controllando che l’indirizzo sia correttamente formattato
13. Realizzare una procedura che inserisce una riga in Brani controllando che siano rispettati i vincoli di integrità referenziale
Esercizi (3)
• Migliorare la procedura InserisciBrano per controllare che IDArtista e IDRegistrazione siano corretti.
• Nella procedura InserisciBrano controllare anche che il tipo del brano rientri fra quelli previsti e la sua durata rientri nei limiti stabiliti.
• Creare una procedura che restituisce il nome dell’artista con il maggior numero di brani in archivio
• Creare una procedura che restituisce la registrazione con il maggior numero di brani
• Creare una procedura che, dato il nome di un artista, restituisce: il numero di brani di quell’artista presenti in archivio, e l’elenco delle registrazioni dove essi sono collocati
• …
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 101
Trigger
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 103
Trigger (1)
• Un TRIGGER (grilletto) è un componente del database, abbinato a una tabella, che viene attivato da un evento sulla tabella
• Indicato anche come regola Evento-Condizione-Azione : un evento fa scattare un controllo su una condizione che, se verificata, causa l’esecuzione dell’azione descritta
• Usati per:
– aggiornare file di log
– implementare meccanismi di validazione complessi: uno stipendio non deve essere diminuito, gli iscritti a un corso non possono essere più di 25, ..
– attuare meccanismi di allerta guidati da eventi: inviare un e-mail a tutti gli iscritti se cambia la data di un esame, ..
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 104
Trigger (2)
TRIGGER versus STORED ROUTINE
• Un Trigger è invisibile al programmatore
• Una Stored Routine deve essere chiamata esplicitamente in una query o in un batch di comandi e quindi non è invisibile al programmatore
• Un Trigger è abbinato a una specifica tabella di un DB
• Una Stored Function è abbinata a un database ed è attivabile anche da altri database
• Una Stored Procedure è abbinata a un database ed è utilizzabile anche in altri contesti
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 105
Trigger (3)
• NomeTabella.NomeTrigger deve essere unico
• Momento: BEFOREoppure AFTER
• Evento: INSERT, UPDATEoppure DELETE
• Tabella: deve essere una tabella reale e permanente
• Comando da eseguire: tutte le istruzioni ammesse per le funzioni ad eccezione del comando RETURN
• Un trigger può accedere ai dati della tabella alla quale è abbinato tramite i nomi: OLD.Colonna, NEW.Colonna, con certe ovvie limitazioni (OLD.Colonna non può essere usato con INSERT, mentre NEW.Colonna con DELETE)
• Per ogni tabella ci può essere un solo trigger per un dato evento e un certo momento
• Comandi: CREATE TRIGGER xxxxx, DROP TRIGGER xxxx, SHOW TRIGGERS, SHOW CREATE TRIGGER xxxx, SHOW WARNINGS
• Vedi Manuale in 12.1 e 12.4.5
CREATE TRIGGER NomeTrigger Momento Evento
ON NomeTabella
FOR EACH ROW ComandoDaEseguire;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 106
Trigger (4)
• Nello standard SQL sono possibili Trigger come il seguente che ha lo scopo di impedire l’inserimento di un nuovo assunto in un dipartimento, se si superano i 100 dipendenti assegnati al dipartimento
Trigger impossibile da costruire con la versione 5.1 di MySQL. In questa versione è possibile usare comandi SQL, ma non per accedere alla tabella associata al trigger
CREATE TRIGGER NuovoAssunto AFTER INSERT ON Personal eREFERENCING NEW AS NWHEN ( 100 < ( SELECT COUNT(*)
FROM PersonaleWHERE Dipartimento=N.Dipartimento )
)FOR EACH ROWBEGIN
DELETE FROM PersonaleWHERE ID = N.ID;
END;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 107
Trigger (5)
-- ------------------------------------------------- --------- Meccanismo di conteggio sul genere dei brani inse riti -- ------------------------------------------------- -------mysql> CREATE TRIGGER ContaGenere AFTER INSERT ON Br ani
-> FOR EACH ROW-> BEGIN-> IF NEW.Genere = ‘Pop' THEN-> SET @pop = @pop + 1;-> ELSEIF NEW.Genere = ‘Rock' THEN-> SET @rock = @rock + 1;-> ELSEIF NEW.Genere = ‘Rap' THEN-> SET @rap = @rap + 1;-> ELSE-> SET @altri = @altri + 1;-> END IF;-> END //
Mysql> SET @pop=0, @rock=0, @rap=0, @altri=0;MySQL> ...
Dopo avere inserto righe in Brani è
possibile sapere il numero di brani
inseriti suddivisi per tipo . . .
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 108
-- ------------------------------------------------- ------ Trigger per costruire valori di default per la -- durata di un brano: [0.25,60.0]-- ------------------------------------------------- ----
mysql> CREATE TRIGGER InsBrano BEFORE INSERT ON Bran i-> FOR EACH ROW-> BEGIN-> IF NEW.DurataBrano < 0.25 THEN-> SET NEW.DurataBrano = 0.25;-> SET @msg = ‘Durata modificata in 0.25’;-> ELSEIF NEW.DurataBrano > 60.0 THEN-> SET NEW.DurataBrano = 60.0;-> SET @msg = ‘Durata modificata in 60’;-> ELSE-> SET @msg = ‘Durata brano corretta’;-> END IF;-> END//
Trigger (6)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 109
Trigger (7)
-- ------------------------------------------------- ------ Trigger per impedire l’inserimento di un brano di -- durata fuori dai limiti [0.25,60.0]-- ------------------------------------------------- ----mysql> CREATE TRIGGER CheckDurata BEFORE INSERT ON B rani
-> FOR EACH ROW-> BEGIN-> IF DurataBrano < 0.25 OR DurataBrano > 60.0 THE N-> SET NEW.IDBrano = ‘999999';-> SET @msg = ‘Durata fuori dai limiti';-> ELSE-> SET @msg = ‘Durata corretta';-> END IF;-> END //
-- ------------------------------------------------- ----------- Poiché 999999 c’è già il tentativo di immettere un a ltro -- brano con la stessa chiave è impedito dal sistema -- ------------------------------------------------- ---------
999999 è un brano fittizio giàimmesso nella
tabella
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 110
Esercizi
1. Definire un trigger per controllare e fornire valori di default per l’attributo aColori
2. Definire un trigger per controllare e fornire valori di default per Lunghezza
3. Definire un trigger per contare i film inseriti in una sessione di lavoro, suddivisi per decennio, tra il 1980 e il 2006
4. Definire un trigger per impedire l’immissione di un film con data anteriore al 1950
5. Definire un trigger per impedire l’immissione di un film se la sua durata è inferiore a 15 o superiore a 180 minuti
6. Definire un trigger per impedire l’aggiornamento delle durata di un film se essa èminore a 15 o superiore a 180 minuti
7. Definire un trigger per impedire la cancellazione dei film della Paramount ?
Film ( Titolo , Anno , Lunghezza, aColori, NomeStudio )
Comandi batch
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 112
Uno o più comandi SQL sono inseriti in un file che v iene sottoposto al sistema per l’esecuzione con la direttiva SOURCE. Il file con i comandi è uno SCRIPT
• Ad esempio: nel database CollezioneMusicale vogliamo ottenere l’elenco dei brani di un certo genere, in modo parametrizzato, utilizzando lo script ElencoBrani.sql
• ElencoBrani.sql contiene:
• Per eseguire lo SCRIPT ElencoBrani.sql:
Comandi batch(1)
USE CollezioneMusicale;SELECT * FROM Brani WHERE GenereBrano = @genere; Situazione
simile a quella vista in LOAD DATA INFILE
mysql> SET @genere = ‘Pop’;mysql> SOURCE ElencoBrani.sql;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 113
Comandi batch(2)
La preparazione di comandi all’interno di script è particolarmente utile nei seguenti casi:
• Necessità di eseguire spesso lo stesso comando
• Realizzazione di query parametriche
• Sviluppo di una serie di comandi con esecuzione di query, avvio diprocedure, inizializzazioni e impiego di variabili utente per larealizzazione di query parametriche e per passare dati da un comando ad un altro
• Esecuzione sistematica di un comando complesso, o di una serie dicomandi complessi che realizzano azioni procedurali
• Le utility di MySQL Administrator e PhpMyAdmin effettuano i salvataggi delle tabelle e del database costruendo script con l’elenco dei comandi che ricreano la tabella e i dati
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 114
Comandi batch(3)
Eseguendo il salvataggio ( dump ) della tabella Artisti• PhPMyAdmin (pagina 228), MySQL Administrator (pagina 141)viene generato il file Artisti.sql, per cui il dump di Artisti si concretizza in un comando CREATE TABLE seguito da una serie di comandi INSERT
-- ------------------------------------------------- ------------ Struttura della tabella `artisti`-- ------------------------------------------------- ----------CREATE TABLE `artisti` (
`IDArtista` int(10) unsigned NOT NULL auto_increment ,`Nome` varchar(50) NOT NULL default '',`Genere` enum('Pop','Rock','Rap','Opera','Country', 'Jazz') default NULL,`Note` varchar(255) default NULL,PRIMARY KEY (`IDArtista`),UNIQUE KEY `ind_nome` (`Nome`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMEN T=8 ;. . .
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 115
Comandi batch(4)
-- ------------------------------------------------- ------------ Dump dei dati per la tabella `artisti`-- ------------------------------------------------- ----------
INSERT INTO `artisti` VALUES (1,'Pierre Borg', 'Pop ', '');INSERT INTO `artisti` VALUES (2,'Anatolia', 'Rock', '');INSERT INTO `artisti` VALUES (3,'The Bees', 'Rap', '');INSERT INTO `artisti` VALUES (4,'Golden Eagles','Po p', '');INSERT INTO `artisti` VALUES (5,'Argolide', 'Rock', '');INSERT INTO `artisti` VALUES (6,'Heavy Stones','Oper a', '');INSERT INTO `artisti` VALUES (7,'Steve Martin','Cou ntry', '');
mysql> USE CollezioneMusicale;mysql> DROP Table Artisti;mysql> SOURCE Artisti.sql;
• Per creare la tabella Artisti in un db si esegue lo script Artisti.sql :
Integritàreferenziale ?
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 116
Esercizi
Risolvere i seguenti problemi preparando i comandi necessari in script da eseguire con il comando SOURCE
1. Identificare l’artista che esegue il maggior numero di brani (creando una vista logica e interrogandola, o creando una tabella temporanea e interrogandola)
2. Identificare la registrazione che contiene il maggior numero di brani (creando una vista logica e interrogandola, o creando una tabella temporanea e interrogandola)
3. Identificare la registrazione di maggior durata ( ... )
4. Trovare l’artista che esegue il brano più lungo
5. Elencare i corsi per i quali nessuno studente ha sostenuto esami
6. Preparare lo script per creare il database CollezioneMusicale e popolarlo con dati contenuti in file di testo mediante il comando LOAD DATA INFILE