La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

MySQL ___. Istallare MySQL Dal link è fare il download di diverse versioni di MySQL: Dal link è fare il download.

Presentazioni simili


Presentazione sul tema: "MySQL ___. Istallare MySQL Dal link è fare il download di diverse versioni di MySQL: Dal link è fare il download."— Transcript della presentazione:

1 MySQL ___

2 Istallare MySQL Dal link è fare il download di diverse versioni di MySQL: Dal link è fare il download di diverse versioni di MySQL:http://dev.mysql.com/ Es. MySQL 5.0 per diverse piattaforme tra cui Linux e Windows; Es. MySQL 5.0 per diverse piattaforme tra cui Linux e Windows; Altri tool e driver utili: Altri tool e driver utili: MySQL Administrator; MySQL Administrator; MySQL Query Browser; MySQL Query Browser; MySQL Workbench; MySQL Workbench; MySQL Connector/J (JDBC). MySQL Connector/J (JDBC).

3 Sommario Introduzione a MySQL Introduzione a MySQL Connessione/Disconnessione da un database MySQL Connessione/Disconnessione da un database MySQL Programmi client. Programmi client. Esempi di query: database Menagerie ( ) Esempi di query: database Menagerie ( ) SQL in MySQL DDL e DML. SQL in MySQL DDL e DML. EXPLAIN. EXPLAIN. Funzioni. Funzioni.

4 MySQL AB Società fondata dagli sviluppatori di MySQL; Società fondata dagli sviluppatori di MySQL; MySQL diventa popolare quando viene presentata la versione 3.23; MySQL diventa popolare quando viene presentata la versione 3.23; L’insieme di feature che offre coincide con ciò che la maggior parte degli utenti richiede ad un DBMS. L’insieme di feature che offre coincide con ciò che la maggior parte degli utenti richiede ad un DBMS.

5 MySQL Feature principali: Feature principali: InnoDB; InnoDB; Query Cache; Query Cache; Comando UNION; Comando UNION; Variabili Dinamiche; Variabili Dinamiche; FullText Search; FullText Search; Sub-Queriy e tabelle derivate; Sub-Queriy e tabelle derivate; Prepared Statements; Prepared Statements; Protocollo di trasmissione client/server binario; Protocollo di trasmissione client/server binario; OpenGIS (dati geografici) OpenGIS (dati geografici) Internazionalizzazione, UTF-8. Internazionalizzazione, UTF-8. Stored Procedure Stored Procedure View View Trigger Trigger Pluggable Storage Engine Pluggable Storage Engine

6

7 RDBMSRDBMS Tabelle utente dizionario dizionariodati Server

8 Connessione/disconnessione Per connettersi al server è necessario fornire login e password Per connettersi al server è necessario fornire login e password shell> mysql -h host -u user -p Enter password: ******** host and user rappresentano: host and user rappresentano: l’hostname dove risiede MySQL; l’hostname dove risiede MySQL; lo username di un utente che possiede un account sul server; lo username di un utente che possiede un account sul server; -p specifica al server la richiesta della password all’utente. -p specifica al server la richiesta della password all’utente.

9 C:\>mysql -u alfredo -p Enter password: ******* Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 to server version: nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Per avere l’help: Per avere l’help: C:\>mysql –help Per uscire: Per uscire: mysql> QUIT

10 Login tramite Query browser Nome connessione

11 Schermata principale di Query Browser

12 Comandi SQL Estrazione Dati Data manipulation language (DML) Data definition language (DDL) controllo Transazioni Data control language (DCL) INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE COMMIT ROLLBACK SAVEPOINT GRANT REVOKE SELECT

13 Creazione di un account Tipicamente viene eseguita dall’utente root, mediante l’uso del comando GRANT. Tipicamente viene eseguita dall’utente root, mediante l’uso del comando GRANT. C:\>mysql -u root -p Enter password: ******* mysql> GRANT ALL ON nomeDB.* to -> IDENTIFIED BY -> ‘nome_password’;

14 Connessione da un client Per consentire la connessione da un server specifico. Per consentire la connessione da un server specifico. mysql> GRANT ALL ON nomeDB.* to -> IDENTIFIED BY -> ‘nome_password’;

15 Esempi mysql> SELECT VERSION(), CURRENT_DATE; | VERSION() | CURRENT_DATE | | nt | | row in set (0.06 sec) mysql> SELECT SIN(PI()/4), (4+1)*5; | SIN(PI()/4) | (4+1)*5 | | | 25 |

16 mysql> select user() ->, ->, -> current_date; -> current_date; | user() | current_date | | | | row in set (0.00 sec) mysql>

17 Prompt di MySQL Prompt PromptSignificato mysql> Pronto per ricevere un comando; -> In attesa della successiva linea per un comando multiple-line. '> In attesa della successiva linea per un comando multiple-line, apice di apertura nella riga precedente (`''). "> In attesa della successiva linea per un comando multiple-line, doppio apice di apertura nella riga precedente (`"'). `> In attesa della successiva linea per un comando multiple-line, che fa riferimento ad un identificatore che inizia con backtick (``').

18 Selezione di un database Comandi show - use Comandi show - use mysql> show databases; | Database | | alfredo | | mysql | | test | rows in set (0.00 sec) mysql> use alfredo; Database changed

19 SHOW SHOW ha diverse opzioni e da informazioni riguardo ai database alle tabella, collone, indici, ecc. Da anche informazioni riguardo il server. SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern'] SHOW CREATE DATABASE db_name SHOW CREATE TABLE tbl_name SHOW DATABASES [LIKE 'pattern'] SHOW [STORAGE] ENGINES SHOW ERRORS [LIMIT [offset,] row_count] SHOW GRANTS FOR user SHOW INDEX FROM tbl_name [FROM db_name] SHOW INNODB STATUS SHOW [BDB] LOGS SHOW PRIVILEGES SHOW [FULL] PROCESSLIST SHOW STATUS [LIKE 'pattern'] SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] SHOW [OPEN] TABLES [FROM db_name] [LIKE 'pattern'] SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern'] SHOW WARNINGS [LIMIT [offset,] row_count]

20 Creazione di un database L’amministratore crea il database; L’amministratore crea il database; mysql> CREATE DATABASE menagerie; Successivamente l’utente crea le tabelle che desidera: Successivamente l’utente crea le tabelle che desidera: CREATE TABLE pet ( name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE );

21 Describe mysql> describe pet; | Field | Type | Null | Key | Default | Extra | | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | rows in set (0.02 sec)

22 Query: esempi mysql> SELECT * FROM pet; | name | owner | species | sex | birth | death | | Fluffy | Harold | cat | f | | NULL | | Claws | Gwen | cat | m | | NULL | | Buffy | Harold | dog | f | | NULL | | Fang | Benny | dog | m | | NULL | | Bowser | Diane | dog | m | | | | Chirpy | Gwen | bird | f | | NULL | | Whistler | Gwen | bird | NULL | | NULL | | Slim | Benny | snake | m | | NULL | | Puffball | Diane | hamster | f | | NULL |

23 Query: esempi mysql> SELECT * FROM pet WHERE name = 'Bowser'; | name | owner | species | sex | birth | death | | Bowser | Diane | dog | m | | | mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm') -> OR (species = 'dog' AND sex = 'f'); | name | owner | species | sex | birth | death | | Claws | Gwen | cat | m | | NULL | | Buffy | Harold | dog | f | | NULL |

24 Query: esempi mysql> SELECT name, species, birth FROM pet -> WHERE species = 'dog' OR species = 'cat'; | name | species | birth | | Fluffy | cat | | | Claws | cat | | | Buffy | dog | | | Fang | dog | | | Bowser | dog | |

25 Query: esempi mysql> SELECT name, birth FROM pet ORDER BY birth DESC; | name | birth | | Puffball | | | Chirpy | | | Whistler | | | Slim | | | Claws | | | Fluffy | | | Fang | | | Bowser | | | Buffy | |

26 Query: esempi mysql> SELECT name, species, birth FROM pet -> ORDER BY species, birth DESC; | name | species | birth | | Chirpy | bird | | | Whistler | bird | | | Claws | cat | | | Fluffy | cat | | | Fang | dog | | | Bowser | dog | | | Buffy | dog | | | Puffball | hamster | | | Slim | snake | |

27 Query: esempi mysql> SELECT name, birth, CURDATE(), -> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5) AS age -> FROM pet; | name | birth | CURDATE() | age | | Fluffy | | | 10 | | Claws | | | 9 | | Buffy | | | 14 | | Fang | | | 12 | | Bowser | | | 13 | | Chirpy | | | 4 | | Whistler | | | 5 | | Slim | | | 7 | | Puffball | | | 4 |

28 Query: esempi mysql> SELECT name, birth, death, -> (YEAR(death)-YEAR(birth))-(RIGHT(death,5) AS age -> FROM pet WHERE death IS NOT NULL ORDER BY age; | name | birth | death | age | | Bowser | | | 5 | mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; | name | birth | | Buffy | |

29 Il valore NULL per un campo assume il seguente significato: mancante, sconosciuto ed è trattato diversamente dagli altri valori. Il valore NULL per un campo assume il seguente significato: mancante, sconosciuto ed è trattato diversamente dagli altri valori. Per testare il valore NULL non possono essere usati gli operatori di confronto quali =,. Per testare il valore NULL non possono essere usati gli operatori di confronto quali =,. Esempio: Esempio: mysql> SELECT 1 = NULL, 1 <> NULL, 1 NULL; | 1 = NULL | 1 <> NULL | 1 NULL | | NULL | NULL | NULL | NULL |

30 Con l’uso di IS NULL e IS NOT NULL si ottiene: Con l’uso di IS NULL e IS NOT NULL si ottiene: mysql> SELECT 1 IS NULL, 1 IS NOT NULL; | 1 IS NULL | 1 IS NOT NULL | | 0 | 1 | Quando si usa ORDER BY, i valori NULL sono inseriti all’inizio con ASC ed alla fine con ORDER BY... DESC. Quando si usa ORDER BY, i valori NULL sono inseriti all’inizio con ASC ed alla fine con ORDER BY... DESC.

31 mysql> SELECT * FROM pet WHERE name LIKE 'b%'; | name | owner | species | sex | birth | death | | Buffy | Harold | dog | f | | NULL | | Bowser | Diane | dog | m | | | mysql> SELECT * FROM pet WHERE name LIKE '%fy'; | name | owner | species | sex | birth | death | | Fluffy | Harold | cat | f | | NULL | | Buffy | Harold | dog | f | | NULL |

32 mysql> SELECT * FROM pet WHERE name LIKE '%w%'; | name | owner | species | sex | birth | death | | Claws | Gwen | cat | m | | NULL | | Bowser | Diane | dog | m | | | | Whistler | Gwen | bird | NULL | | NULL | mysql> SELECT * FROM pet WHERE name LIKE '_____'; | name | owner | species | sex | birth | death | | Claws | Gwen | cat | m | | NULL | | Buffy | Harold | dog | f | | NULL |

33 mysql> SELECT * FROM pet WHERE name REGEXP '^b'; | name | owner | species | sex | birth | death | | Buffy | Harold | dog | f | | NULL | | Bowser | Diane | dog | m | | | mysql> SELECT * FROM pet WHERE name REGEXP '^[bB]';

34 mysql> SELECT * FROM pet WHERE name REGEXP 'fy$'; | name | owner | species | sex | birth | death | | Fluffy | Harold | cat | f | | NULL | | Buffy | Harold | dog | f | | NULL | mysql> SELECT * FROM pet WHERE name REGEXP 'w'; | name | owner | species | sex | birth | death | | Claws | Gwen | cat | m | | NULL | | Bowser | Diane | dog | m | | | | Whistler | Gwen | bird | NULL | | NULL |

35 mysql> SELECT * FROM pet WHERE name REGEXP '^.....$'; | name | owner | species | sex | birth | death | | Claws | Gwen | cat | m | | NULL | | Buffy | Harold | dog | f | | NULL | mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$'; | name | owner | species | sex | birth | death | | Claws | Gwen | cat | m | | NULL | | Buffy | Harold | dog | f | | NULL |

36 mysql> SELECT COUNT(*) FROM pet; | COUNT(*) | | 9 | mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; | owner | COUNT(*) | | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 |

37 mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; | species | sex | COUNT(*) | | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | mysql> SELECT species, sex, COUNT(*) FROM pet WHERE species = 'dog' OR species = 'cat' -> GROUP BY species, sex; | species | sex | COUNT(*) | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 |

38 mysql> CREATE TABLE event (name VARCHAR(20), -> date DATE, -> type VARCHAR(15), -> remark VARCHAR(255));

39 mysql> SELECT pet.name, -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5) remark -> FROM pet, event -> WHERE pet.name = event.name AND type = 'litter'; | name | age | remark | | Fluffy | 2 | 4 kittens, 3 female, 1 male | | Buffy | 4 | 5 puppies, 2 female, 3 male | | Buffy | 5 | 3 puppies, 3 female |

40 mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species -> FROM pet AS p1, pet AS p2 -> WHERE p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm'; | name | sex | name | sex | species | | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | | Buffy | f | Bowser | m | dog |

41 Tipi di dati: Numerici (1/2) TipoByte Minimum Value Maximum Value (Signed/Unsigned)(Signed/Unsigned) TINYINT[(M)] SMALLINT [(M)] MEDIUMINT [(M)] INT [(M)] BIGINT [(M)] FLOAT[(M,D)]4+/ E-38+/ E+38 DOUBLE [(M,D)] 8+/ E-308+/ E+308

42 Tipi di dati: Numerici (2/2) INTEGER INTEGER DOUBLE PRECISION DOUBLE PRECISION REAL REAL DECIMAL DECIMAL NUMERIC NUMERIC Per il tipo DECIMAL il range dipende da M e D, occupa M+2 byte. Per il tipo DECIMAL il range dipende da M e D, occupa M+2 byte.

43 Tipi di dati: testo Tipo Max size Byte CHAR [(M)] MM VARCHAR (M) ML+1 TINYBLOB/ TINYTEXT L+1 BLOB/TEXT L+2 MEDIUMBLOB/MEDIUMTEXT L+3 LONGBLOB/LONGTEXT L+4 ENUM(‘value1’,’value2’,…) elementi 1 o 2 byte SET (‘value1’,’value2’,…) 64 elementi1,2,3,4 o 8 byte L rappresenta la lunghezza effettiva del testo

44 Tipi di dati: date e time TipoRangeByte DATE ‘ ’ ‘ ’ 3 DATETIME‘ :00:00’ ‘ :59:59’ 8 TIMESTAMP[(M)] Da ad una data nel TIME‘-838:59:59’ - ‘838:59:59’3 YEAR [(M)] 1901 al 2144 per YEAR(4) 1

45 CREATE DATABASE CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification [, create_specification]...] create_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name CREATE DATABASE crea un database con il nome dato; CREATE DATABASE crea un database con il nome dato; Per poter eseguire il comando bisogna avere il privilegio CREATE per creazione database. Per poter eseguire il comando bisogna avere il privilegio CREATE per creazione database.

46 DROP DATABASE DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

47 CREATE TABLE CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement] CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(] LIKE old_tbl_name [)]; CREATE TABLE crea una tabella nel db; CREATE TABLE crea una tabella nel db; Per poter eseguire il comando bisogna avere il privilegio CREATE per le tabelle. Per poter eseguire il comando bisogna avere il privilegio CREATE per le tabelle.

48 CREATE TABLE (cont.) create_definition: column_definition | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) | KEY [index_name] [index_type] (index_col_name,...) | INDEX [index_name] [index_type] (index_col_name,...) | [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] [index_type] (index_col_name,...) | [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...) | [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] | CHECK (expr) column_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [reference_definition]

49 CREATE TABLE (cont.) type: TINYINT[(length)] [UNSIGNED] [ZEROFILL] | SMALLINT[(length)] [UNSIGNED] [ZEROFILL] | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] | INT[(length)] [UNSIGNED] [ZEROFILL] | INTEGER[(length)] [UNSIGNED] [ZEROFILL] | BIGINT[(length)] [UNSIGNED] [ZEROFILL] | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] | DATE | TIME | TIMESTAMP | DATETIME | CHAR(length) [BINARY | ASCII | UNICODE] | VARCHAR(length) [BINARY] | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT | ENUM(value1,value2,value3,...) | SET(value1,value2,value3,...) | spatial_type

50 index_col_name: col_name [(length)] [ASC | DESC] reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT table_options: table_option [table_option]... table_option: {ENGINE|TYPE} = {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM} | AUTO_INCREMENT = value | AVG_ROW_LENGTH = value | CHECKSUM = {0 | 1} | COMMENT = 'string' | MAX_ROWS = value | MIN_ROWS = value | PACK_KEYS = {0 | 1 | DEFAULT} | PASSWORD = 'string' | DELAY_KEY_WRITE = {0 | 1} | ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED } | RAID_TYPE = { 1 | STRIPED | RAID0 } RAID_CHUNKS = value RAID_CHUNKSIZE = value | UNION = (tbl_name[,tbl_name]...) | INSERT_METHOD = { NO | FIRST | LAST } | DATA DIRECTORY = 'absolute path to directory' | INDEX DIRECTORY = 'absolute path to directory' | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] select_statement: [IGNORE | REPLACE] [AS] SELECT... (Some legal select statement)

51 Nella CREATE TABLE può essere usata la clausola TEMPORARY. Una tabella TEMPORARY è visibile solo nella connessione corrente all’uscita la tabella è rimossa. Nella CREATE TABLE può essere usata la clausola TEMPORARY. Una tabella TEMPORARY è visibile solo nella connessione corrente all’uscita la tabella è rimossa. Bisogna avere il privilegio CREATE TEMPORARY TABLES. Bisogna avere il privilegio CREATE TEMPORARY TABLES. Può essere specificata la parola chiave IF NOT EXISTS per evitare errori se la tabella già esiste. Può essere specificata la parola chiave IF NOT EXISTS per evitare errori se la tabella già esiste. Nota: non viene verificato che la tabella che si sta creando ha la stessa struttura di quella esistente. Nota: non viene verificato che la tabella che si sta creando ha la stessa struttura di quella esistente.

52 MySQL memorizza il formato di ogni tabella come un file ’.frm' nella directory del db. Possono essere creati anche altri file. MySQL memorizza il formato di ogni tabella come un file ’.frm' nella directory del db. Possono essere creati anche altri file. Nel caso di tabelle di tipo MyISAM il sistema crea tre file per una tabella tbl_name: Nel caso di tabelle di tipo MyISAM il sistema crea tre file per una tabella tbl_name: tbl_name.frm File di definizione del formato tbl_name.MYD Data file tbl_name.MYI Index file

53 Se NULL o NOT NULL non sono stati specificati il sistema per default associa il valore NULL. Se NULL o NOT NULL non sono stati specificati il sistema per default associa il valore NULL. Una colonna integer può avere l’attributo addizionale AUTO_INCREMENT. Quando viene inserito un valore NULL (recommended) o 0 in una colonna AUTO_INCREMENT, alla colonna viene automaticamente inserito il successivo valore disponibile. Tipicamente il valore è value+1, dove value è il più grande valore presente nella tabella per quel campo. Una colonna integer può avere l’attributo addizionale AUTO_INCREMENT. Quando viene inserito un valore NULL (recommended) o 0 in una colonna AUTO_INCREMENT, alla colonna viene automaticamente inserito il successivo valore disponibile. Tipicamente il valore è value+1, dove value è il più grande valore presente nella tabella per quel campo. La sequenza AUTO_INCREMENT inizia con 1. La sequenza AUTO_INCREMENT inizia con 1.

54 KEY è sinonimo di INDEX. Gli attributi PRIMARY KEY possono essere specificati con la parola chiave KEY quando vengono definiti. Implementato per compatibilità con altri sistemi DBMS. KEY è sinonimo di INDEX. Gli attributi PRIMARY KEY possono essere specificati con la parola chiave KEY quando vengono definiti. Implementato per compatibilità con altri sistemi DBMS. In MySQL, un indice UNIQUE impone che tutti i valori per in esso siano distinti. Fatta eccezione per i valori NULL se sono ammessi. Questa regola non è valida per le tabelle di tipo BDB. In MySQL, un indice UNIQUE impone che tutti i valori per in esso siano distinti. Fatta eccezione per i valori NULL se sono ammessi. Questa regola non è valida per le tabelle di tipo BDB. Una PRIMARY KEY è una KEY univoca e le colonne sono definite NOT NULL. Una tabella può avere solo una PRIMARY KEY. Se non viene associata nessuna PRIMARY KEY alla tabella ad una applicazione chiede la PRIMARY KEY della tabella in esame MySQL ritorna il primo indice UNIQUE definito che non ha colonne a NULL. Una PRIMARY KEY è una KEY univoca e le colonne sono definite NOT NULL. Una tabella può avere solo una PRIMARY KEY. Se non viene associata nessuna PRIMARY KEY alla tabella ad una applicazione chiede la PRIMARY KEY della tabella in esame MySQL ritorna il primo indice UNIQUE definito che non ha colonne a NULL.

55 CREATE TABLE student ( nameVARCHAR(20) NOT NULL, sexENUM('F','M') NOT NULL, student_idINT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (student_id) );

56 Alcuni storage consentono di specificare il tipo di indice (struttura dati) durante la creazione della tabella. Alcuni storage consentono di specificare il tipo di indice (struttura dati) durante la creazione della tabella. Bisogna usare la parola chiave USING type_name. Bisogna usare la parola chiave USING type_name. MyISAM BTREE InnoDB BTREE MEMORY/HEAP HASH, BTREE Esempio: CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;

57 MyISAM MyISAM è lo storage engine di default dal MySQL E’ basato sullo storage ISAM. MyISAM è lo storage engine di default dal MySQL E’ basato sullo storage ISAM. Ogni tabella MyISAM è memorizzata all’interno del disco con tre file. Ogni tabella MyISAM è memorizzata all’interno del disco con tre file. Per specificare in maniera esplicita la tipoligia di tabella desiderata bisogna usare il comando ENGINE o TYPE. Per specificare in maniera esplicita la tipoligia di tabella desiderata bisogna usare il comando ENGINE o TYPE. CREATE TABLE t (i INT) ENGINE = MYISAM; CREATE TABLE t (i INT) TYPE = MYISAM;

58 Tipi di tabelle Storage Engine Descrizione BDB Tabelle transaction-safe con page locking. HEAP I dati della seguente tabella sono solamente memorizzati nella memoria principale. ISAM Primo storage engine di MySQL InnoDB Tabella transaction-safe con lock di righe e chiavi esterne. MEMORY Un alias di HEAP MERGE Una collezione di tabelle MyISAM usate come una singola tabella. MRG_MyISAM Un alias di MERGE. MyISAM Storage engine binario portabile. Evoluzione di ISAM.

59 CREATE/DROP INDEX CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) index_col_name: col_name [(length)] [ASC | DESC] DROP INDEX index_name ON tbl_name

60 DROP/RENAME TABLE DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name]... [RESTRICT | CASCADE] RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2]... Esempio: CREATE TABLE new_table (...); RENAME TABLE old_table TO backup_table, new_table TO old_table;

61 INSERT INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr,... ] INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name SET col_name={expr | DEFAULT},... [ ON DUPLICATE KEY UPDATE col_name=expr,... ] INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT...

62 Se viene specificata la clausola DELAYED, il server inserisce la riga o le righe in un buffer e il client che ha effettuato l’insert può proseguire il lavoro. Se la tabella è occupata il sistema mantiene le righe. Nel momento in cui la tabella è libera il sistema inizia con l’inserimento di esse, controllando periodicamente se vi sono richieste verso la tabella. Nel momento in cui il sistema verifica una richiesta sospende l’inserimento. Se viene specificata la clausola DELAYED, il server inserisce la riga o le righe in un buffer e il client che ha effettuato l’insert può proseguire il lavoro. Se la tabella è occupata il sistema mantiene le righe. Nel momento in cui la tabella è libera il sistema inizia con l’inserimento di esse, controllando periodicamente se vi sono richieste verso la tabella. Nel momento in cui il sistema verifica una richiesta sospende l’inserimento. Se viene specificata la parola chiave LOW_PRIORITY, l’esecuzione dell’insert viene ritardata fino a quando vi sono dei client che effettuano richieste verso la tabella. Se viene specificata la parola chiave LOW_PRIORITY, l’esecuzione dell’insert viene ritardata fino a quando vi sono dei client che effettuano richieste verso la tabella. Se viene specificata la parola chiave IGNORE tutte le righe che provano a duplicare il contenuto di un campo con indice UNIQUE o PRIMARY KEY vengono ignorate. Se viene specificata la parola chiave IGNORE tutte le righe che provano a duplicare il contenuto di un campo con indice UNIQUE o PRIMARY KEY vengono ignorate. Se viene specificata la clausola ON DUPLICATE KEY nel momento in cui si tenta di inserire una riga duplicata su un indice il sistema effettua l’update specificato per quella riga. Se viene specificata la clausola ON DUPLICATE KEY nel momento in cui si tenta di inserire una riga duplicata su un indice il sistema effettua l’update specificato per quella riga.

63 LOAD DATA LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY '\t'] [[OPTIONALLY] ENCLOSED BY ''] [ESCAPED BY '\\' ] ] [LINES [STARTING BY ''] [TERMINATED BY '\n'] ] [IGNORE number LINES] [(col_name,...)] Il comando LOAD DATA INFILE consente il caricamento di una tabella ad alta velocità leggendo le righe da un file di testo. Il comando LOAD DATA INFILE consente il caricamento di una tabella ad alta velocità leggendo le righe da un file di testo.

64 Caricamento dei dati: Caricamento dei dati: mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet; mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;

65 mysql> LOAD DATA INFILE '/tmp/test.txt' -> INTO TABLE test LINES STARTING BY “yyy"; Quindi un file contenente Quindi un file contenenteyyy"Row",1 blablabla yyy"Row",2 Può essere letto e verrà caricato come (“row”,1), (“row”,2) Può essere letto e verrà caricato come (“row”,1), (“row”,2)

66 SELECT SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr,... [INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name'] [FROM table_references [WHERE where_definition] [GROUP BY {col_name | expr | position} [ASC | DESC],... [WITH ROLLUP]] [HAVING where_definition] [ORDER BY {col_name | expr | position} [ASC | DESC],...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [FOR UPDATE | LOCK IN SHARE MODE]]

67 Esempio mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name -> FROM mytable ORDER BY full_name;

68 La clausola FROM table_references indica le tabelle da dove prelevare le righe. La clausola FROM table_references indica le tabelle da dove prelevare le righe. Per ogni tabella specificata si può specificare un alias: Per ogni tabella specificata si può specificare un alias: tbl_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]] L’uso di USE INDEX, IGNORE INDEX, FORCE INDEX da all’ottimizzatore delle regole su come scegliere gli indici. L’uso di USE INDEX, IGNORE INDEX, FORCE INDEX da all’ottimizzatore delle regole su come scegliere gli indici.

69 JOIN table_reference, table_reference table_reference [INNER | CROSS] JOIN table_reference [join_condition] table_reference STRAIGHT_JOIN table_reference table_reference LEFT [OUTER] JOIN table_reference [join_condition] table_reference NATURAL [LEFT [OUTER]] JOIN table_reference { OJ table_reference LEFT OUTER JOIN table_reference ON conditional_expr } table_reference RIGHT [OUTER] JOIN table_reference [join_condition] table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference table_reference: tbl_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]] join_condition: ON conditional_expr | USING (column_list)

70 Right Outer JoinLeft Outer Join Join Le righe che soddisfano la join Le righe escluse dalla join della tabella a sx Le righe escluse dalla join della tabella a dx Full outer join

71 mysql> SELECT table1.* FROM table1 -> LEFT JOIN table2 ON table1.id=table2.id -> WHERE table2.id IS NULL; Questo esempio trova tutte le righe della table1 che non sono presenti in table2 (ovvero tutte le righe di table1 che non hanno un corrispondente in table2). Questo esempio trova tutte le righe della table1 che non sono presenti in table2 (ovvero tutte le righe di table1 che non hanno un corrispondente in table2).

72 La clausola USING (column_list) elenca una lista di colonne che devono essere presenti in entrambe le tabelle. La clausola USING (column_list) elenca una lista di colonne che devono essere presenti in entrambe le tabelle. Le seguenti clausole sono semanticamente identiche: Le seguenti clausole sono semanticamente identiche: a LEFT JOIN b USING (c1,c2,c3) a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3 NATURAL [LEFT] JOIN di due tabelle è semanticamente equivalente a INNER JOIN o LEFT JOIN con la clausola USING che elenca i campi delle due tabelle. NATURAL [LEFT] JOIN di due tabelle è semanticamente equivalente a INNER JOIN o LEFT JOIN con la clausola USING che elenca i campi delle due tabelle. RIGHT JOIN opera analogamente a LEFT JOIN. Si consiglia di usare LEFT JOIN invece di RIGHT JOIN, per compatibilità con altri sistemi. RIGHT JOIN opera analogamente a LEFT JOIN. Si consiglia di usare LEFT JOIN invece di RIGHT JOIN, per compatibilità con altri sistemi. STRAIGHT_JOIN è identica alla JOIN, ad eccezione che le tabella sinistra è sempre letta prima della tabella destra. Questo può essere utile nei casi in cui l’ottimizzatore posiziona le tabelle nell’ordine sbagliato. STRAIGHT_JOIN è identica alla JOIN, ad eccezione che le tabella sinistra è sempre letta prima della tabella destra. Questo può essere utile nei casi in cui l’ottimizzatore posiziona le tabelle nell’ordine sbagliato.

73 In una query possono essere specificate delle regole (hints) relativamente agli indici da usare durante l’esecuzione di una query. In una query possono essere specificate delle regole (hints) relativamente agli indici da usare durante l’esecuzione di una query. Specificando USE INDEX (key_list), si può dire al MySQL di usare solamente gli indici specificati in key_list per trovare le righe nella tabella. Specificando USE INDEX (key_list), si può dire al MySQL di usare solamente gli indici specificati in key_list per trovare le righe nella tabella. La sintassi alternativa IGNORE INDEX (key_list) può essere usata per dire al MySQL di non usare un particolare indice. La sintassi alternativa IGNORE INDEX (key_list) può essere usata per dire al MySQL di non usare un particolare indice. Queste regole sono utili se il comando EXPLAIN mostra che MySQL usa in maniera non ottimale gli indici. Queste regole sono utili se il comando EXPLAIN mostra che MySQL usa in maniera non ottimale gli indici. Si può usare FORCE INDEX. Opera in modo simile a USE INDEX (key_list) ma in più assume che un full table scan è una operazione molto dispendiosa. Si può usare FORCE INDEX. Opera in modo simile a USE INDEX (key_list) ma in più assume che un full table scan è una operazione molto dispendiosa. USE KEY, IGNORE KEY, e FORCE KEY sono sinonimi di USE INDEX, IGNORE INDEX, and FORCE INDEX. USE KEY, IGNORE KEY, e FORCE KEY sono sinonimi di USE INDEX, IGNORE INDEX, and FORCE INDEX.

74 SottoquerySottoquery “Quali impiegati hanno un salario maggiore del salario di ‘Jones’?” Query Principale ? “Quale e’ il salario di ‘Jones’?” ? Sottoquery

75 SottoquerySottoquery SELECTselect_expr FROMtable_references WHEREexpr operator (SELECTselect_expr FROMtable_references); L’output di una sottoquery viene dato in input alla query principale. L’output di una sottoquery viene dato in input alla query principale.

76 2975 mysql> SELECT ename -> FROM emp -> WHERE sal > -> (SELECT sal -> FROM emp -> WHERE empno=7566); Uso di Sottoquery

77 Tipi di Sottoquery sottoquery su riga singola sottoquery su riga singola Query principale Sottoquery ritorna Singolo valore subquery su riga Multiplasubquery su riga Multipla Un elenco di valori riferiti ad un campo Query principale Sottoquery ritorna Sottoquery su colonna Multipla Elenco di valori Riferiti a diverisi campi Query principale Sottoquery ritorna

78 Sottoquery su righe multiple Restituiscono più di una riga Restituiscono più di una riga Vanno usate con operatori di riga multipla Vanno usate con operatori di riga multipla Operatore IN ANY/SOME ALL Significato Uguale ad un elemento della lista Vero se almeno uno degli elementi soddisfa la condizione Confronta il valore con tutti gli elemeti restituiti dalla sottoquery

79 Sottoquery correlate Una sottoquery correlata è una sottoquery che contiene un riferimento ad una tabella (es. ad un suo campo) che è presente nella query più esterna. Una sottoquery correlata è una sottoquery che contiene un riferimento ad una tabella (es. ad un suo campo) che è presente nella query più esterna. Esempio: Esempio: SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);

80 EXSIST/NOT EXSISITS Se una sottoquery restituisce un valore qualsiasi allora la sottoquery EXISTS è TRUE e la sottoquery NOT EXISTS è FALSE. Se una sottoquery restituisce un valore qualsiasi allora la sottoquery EXISTS è TRUE e la sottoquery NOT EXISTS è FALSE. Per esempio: Per esempio: mysql> SELECT column1 FROM t1 WHERE -> EXISTS (SELECT * FROM t2);

81 City(id,city,country,district,population) City(id,city,country,district,population) Cities_Stores(city,store_type,address) Cities_Stores(city,store_type,address) Stores(store_type,description) Stores(store_type,description)

82 Esempi Che tipi di negozi sono presenti in una o più città? Che tipi di negozi sono presenti in una o più città? SELECT DISTINCT store_type FROM Stores WHERE EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type); Quali tipi di negozi non sono presenti nelle città? Quali tipi di negozi non sono presenti nelle città? SELECT DISTINCT store_type FROM Stores WHERE NOT EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type);

83 Esempi Quali tipi di negozi sono presenti in TUTTE le città? Quali tipi di negozi sono presenti in TUTTE le città? SELECT DISTINCT store_type FROM Stores WHERE NOT EXISTS ( SELECT * FROM Cities WHERE NOT EXISTS ( SELECT * FROM Cities_Stores WHERE Cities_Stores.city = Cities.city AND Cities_Stores.store_type = Stores.store_type)); Doppio NOT EXISTS. Ha una clausola NOT EXISTS dentro una clausola NOT EXISTS. Doppio NOT EXISTS. Ha una clausola NOT EXISTS dentro una clausola NOT EXISTS. Nell’output non esiste una città che non ha un tipo di negozio (store) dei tipi elencati. Nell’output non esiste una città che non ha un tipo di negozio (store) dei tipi elencati.

84 Sottoquery a Colonne multiple Visualizzare: id ordine, id prodotto, e quantità nella tabella item dove id prodotto e quantità coincidono entrambi con id prodotto e quantità di un elemento nell’ordine 605. Visualizzare: id ordine, id prodotto, e quantità nella tabella item dove id prodotto e quantità coincidono entrambi con id prodotto e quantità di un elemento nell’ordine 605. mysql> SELECTordid, prodid, qty -> FROMitem -> WHERE (prodid, qty) IN -> (SELECT prodid, qty -> FROM item -> WHERE ordid = 605) -> ANDordid <> 605;

85 mysql> SELECT a.ename, a.sal, a.deptno, b.salavg -> FROM emp a, (SELECT deptno, avg(sal) salavg -> FROM emp -> GROUP BY deptno) b -> WHERE a.deptno = b.deptno -> AND a.sal > b.salavg; Uso di una sottoquery nella clausola FROM

86 EXPLAIN EXPLAIN tbl_name Oppure EXPLAIN SELECT select_options

87 EXPLAIN Consente di capire le performance di una query e mostra quali indici effettivamente la query sta usando. Consente di capire le performance di una query e mostra quali indici effettivamente la query sta usando.

88 Le colonne indicizzate devono essere stand alone mysql> explain select * from event where year(event.date) < '2003'; | table | type | possible_keys | key | key_len | ref | rows | Extra | | event | ALL | NULL | NULL | NULL | NULL | 6 | Using where | row in set (0.00 sec) mysql> explain select * from event where event.date < ' '; | table | type | possible_keys | key | key_len | ref | rows | Extra | | event | ALL | Index_2 | NULL | NULL | NULL | 6 | Using where | row in set (0.00 sec)

89 Funzioni SQL FunzioniInput arg 1 arg 2 arg n ElaborazioneOutput Valori dei Risultati

90 Due Tipi di Funzioni SQL Funzioni FunzioniSingle-row FunzioniMultiple-row

91 FunzioniFunzioni Conversione Stringhe Numeri Date Generali Funzioni (Single-Row) (Single-Row)

92 Operatori di confronto =, <> !=, =, > (NULL-safe), IS NULL, IS NOT NULL =, <> !=, =, > (NULL-safe), IS NULL, IS NOT NULL expr BETWEEN min AND max expr BETWEEN min AND max expr NOT BETWEEN min AND max expr NOT BETWEEN min AND max Equivalente a NOT (expr BETWEEN min AND max). Equivalente a NOT (expr BETWEEN min AND max). expr IN (value,...) expr IN (value,...) expr NOT IN (value,...) expr NOT IN (value,...) Equivalente a NOT (expr IN (value,...)). Equivalente a NOT (expr IN (value,...)). ISNULL(expr) ISNULL(expr) COALESCE(list) COALESCE(list) Ritorna il primo elemento non-NULL nella lista: Ritorna il primo elemento non-NULL nella lista: mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL INTERVAL(N,N1,N2,N3,...) INTERVAL(N,N1,N2,N3,...) Ritorna 0 se N < N1, 1 se N < N2 ecc.o -1 se N è NULL. N1 < N2 < N3 <... < Nn Ritorna 0 se N < N1, 1 se N < N2 ecc.o -1 se N è NULL. N1 < N2 < N3 <... < Nn mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200); -> 0

93 Controllo di flusso CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result...] [ELSE result] END CASE WHEN [condition] THEN result [WHEN [condition] THEN result...] [ELSE result] END mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END; -> "one" mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END; -> "true" mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END; -> NULL IF(expr1,expr2,expr3) mysql> SELECT IF(1>2,2,3); -> 3 mysql> SELECT IF(1<2,'yes','no'); -> 'yes' mysql> SELECT IF(STRCMP('test','test1'),'no','yes'); -> 'no' Altre funzioni Altre funzioni IFNULL(expr1,expr2) NULLIF(expr1,expr2)

94 Funzioni su Stringhe Funzioni su stringhe LOWERUPPERINITCAPCONCATSUBSTRLENGTHINSTRLPADTRIMRIGHT Funzioni Conversioni Case Funzioni di Manipolazione Stringhe

95 Funzioni di manipolazione stringhe ASCII(str) ASCII(str) BIN(N) BIN(N) BIT_LENGTH(str) BIT_LENGTH(str) CHAR(N,...) CHAR(N,...) CHAR_LENGTH(str) CHAR_LENGTH(str) CHARACTER_LENGTH(str) CHARACTER_LENGTH(str) CHARACTER_LENGTH() sinonimo di CHAR_LENGTH(). CHARACTER_LENGTH() sinonimo di CHAR_LENGTH(). COMPRESS(string_to_compress) COMPRESS(string_to_compress)

96 CONCAT(str1,str2,...) CONCAT(str1,str2,...) Ritorna la stringa risultato della concatenazione delle stringhe contenute come argomento. Restituisce NULL se uno qualisasi degli argomenti è NULL. Ritorna la stringa risultato della concatenazione delle stringhe contenute come argomento. Restituisce NULL se uno qualisasi degli argomenti è NULL. mysql> SELECT CONCAT(‘apulvirenti', ‘dmi.unict.it'); -> mysql> SELECT CONCAT('My', NULL, 'QL'); -> NULL mysql> SELECT CONCAT(14.3); -> '14.3' CONCAT_WS(separator, str1, str2,...) CONCAT_WS(separator, str1, str2,...) CONV(N,from_base,to_base) CONV(N,from_base,to_base) Converte numeri tra due differenti basi. Ritorna NULL se uno dei due argomenti è NULL. Converte numeri tra due differenti basi. Ritorna NULL se uno dei due argomenti è NULL. mysql> SELECT CONV("a",16,2); -> '1010' mysql> SELECT CONV("6E",18,8); -> '172' mysql> SELECT CONV(-17,10,-18); -> '-H' mysql> SELECT CONV(10+"10"+'10'+0xa,10,10); -> '40' ELT(N,str1,str2,str3,...) ELT(N,str1,str2,str3,...) Ritorna str1 se N = 1, str2 if N = 2, ecc. Ritorna NULL se N è minore di 1 o maggiore del numero di argomenti. Ritorna str1 se N = 1, str2 if N = 2, ecc. Ritorna NULL se N è minore di 1 o maggiore del numero di argomenti. mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo'); -> 'ej' mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo'); -> 'foo'

97 FIELD(str,str1,str2,str3,...) FIELD(str,str1,str2,str3,...) Complementare di ELT(). Ritorna l’indice della stringa str in str1, str2,ecc. Ritorna 0 se non viene trovata. Complementare di ELT(). Ritorna l’indice della stringa str in str1, str2,ecc. Ritorna 0 se non viene trovata. mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 2 mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 0 FIND_IN_SET(str,strlist) FIND_IN_SET(str,strlist) HEX(N_or_S) HEX(N_or_S)

98 INSERT(str,pos,len,newstr) INSERT(str,pos,len,newstr) mysql> SELECT INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic' INSTR(str,substr) INSTR(str,substr) mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0 LCASE(str) – UCASE(str) LCASE(str) – UCASE(str) Sinonimo di LOWER() – UPPER(). Sinonimo di LOWER() – UPPER(). LEFT(str,len) LEFT(str,len) mysql> SELECT LEFT('foobarbar', 5); -> 'fooba' LENGTH(str) LENGTH(str) mysql> SELECT LENGTH('text'); -> 4

99 LOCATE(substr,str) LOCATE(substr,str) LOCATE(substr,str,pos) LOCATE(substr,str,pos) LPAD(str,len,padstr) LPAD(str,len,padstr) mysql> SELECT LPAD('hi',4,'??'); -> '??hi' mysql> SELECT LPAD('hi',4,'??'); -> '??hi' LTRIM(str) LTRIM(str) mysql> SELECT LTRIM(' barbar'); -> 'barbar' mysql> SELECT LTRIM(' barbar'); -> 'barbar'

100 POSITION(substr IN str) POSITION(substr IN str) Sinonimo di LOCATE(substr,str). Sinonimo di LOCATE(substr,str). QUOTE(str) QUOTE(str) REPEAT(str,count) REPEAT(str,count) mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL' mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL' REPLACE(str,from_str,to_str) REPLACE(str,from_str,to_str) mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); - > 'WwWwWw.mysql.com' mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); - > 'WwWwWw.mysql.com' REVERSE(str) REVERSE(str) mysql> SELECT REVERSE('abc'); -> 'cba‘. mysql> SELECT REVERSE('abc'); -> 'cba‘.

101 RIGHT(str,len) RIGHT(str,len) mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar‘. RPAD(str,len,padstr) RPAD(str,len,padstr) mysql> SELECT RPAD('hi',5,'?'); -> 'hi???' RTRIM(str) RTRIM(str) mysql> SELECT RTRIM('barbar '); -> 'barbar'

102 Funzioni di confronto tra stringhe STRCMP(expr1,expr2) STRCMP(expr1,expr2) STRCMP() ritorna 0 se le due stringhe coincidono, -1 se il primo argomento è minore del secondo, 1 altrimenti. STRCMP() ritorna 0 se le due stringhe coincidono, -1 se il primo argomento è minore del secondo, 1 altrimenti. mysql> SELECT STRCMP('text', 'text2'); -> -1 -> -1 mysql> SELECT STRCMP('text2', 'text'); mysql> SELECT STRCMP('text2', 'text'); -> 1 -> 1 mysql> SELECT STRCMP('text', 'text'); mysql> SELECT STRCMP('text', 'text'); -> 0 -> 0

103 expr LIKE pat [ESCAPE 'escape-char'] Ritorna 1 (TRUE) o 0 (FALSE). expr LIKE pat [ESCAPE 'escape-char'] Ritorna 1 (TRUE) o 0 (FALSE). mysql> SELECT 'David!' LIKE 'David_'; -> 1 -> 1 mysql> SELECT 'David!' LIKE '%D%v%'; -> 1 -> 1 mysql> SELECT 'David!' LIKE 'David\_'; -> 0 -> 0 mysql> SELECT 'David_' LIKE 'David\_'; -> 1 -> 1 Per specificare un carattere di ESCAPE diverso da \: Per specificare un carattere di ESCAPE diverso da \: mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -> 1 -> 1

104 Funzioni di confronto tra stringhe MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION] ) MATCH... AGAINST() è utilizzata per ricerche full text, ritorna la rilevanza tra il testo che si trova nelle colonne (col1,col2,...) e la query expr. La similarità è un valore positivo in virgola mobile. MATCH... AGAINST() è utilizzata per ricerche full text, ritorna la rilevanza tra il testo che si trova nelle colonne (col1,col2,...) e la query expr. La similarità è un valore positivo in virgola mobile.

105 mysql> CREATE TABLE articles ( -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, -> title VARCHAR(200), -> title VARCHAR(200), -> body TEXT, -> body TEXT, -> FULLTEXT (title,body) -> FULLTEXT (title,body) -> ); -> ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO articles (title,body) VALUES -> ('MySQL Tutorial','DBMS stands for DataBase...'), -> ('MySQL Tutorial','DBMS stands for DataBase...'), -> ('How To Use MySQL Efficiently','After you went through a...'), -> ('How To Use MySQL Efficiently','After you went through a...'), -> ('Optimizing MySQL','In this tutorial we will show...'), -> ('Optimizing MySQL','In this tutorial we will show...'), -> ('1001 MySQL Tricks','1. Never run mysqld as root '), -> ('1001 MySQL Tricks','1. Never run mysqld as root '), -> ('MySQL vs. YourSQL','In the following database comparison...'), -> ('MySQL vs. YourSQL','In the following database comparison...'), -> ('MySQL Security','When configured properly, MySQL...'); -> ('MySQL Security','When configured properly, MySQL...'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0

106 mysql> SELECT * FROM articles -> WHERE MATCH (title,body) AGAINST ('database'); -> WHERE MATCH (title,body) AGAINST ('database'); | id | title | body | | 5 | MySQL vs. YourSQL | In the following database comparison.| | 1 | MySQL Tutorial | DBMS stands for DataBase... | rows in set (0.00 sec)

107 mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial') -> FROM articles; -> FROM articles; | id | MATCH (title,body) AGAINST ('Tutorial') | | 1 | | | 2 | 0 | | 3 | | | 4 | 0 | | 5 | 0 | | 6 | 0 | rows in set (0.00 sec)

108 mysql> SELECT id, body, MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root') AS score -> ('Security implications of running MySQL as root') AS score -> FROM articles WHERE MATCH (title,body) AGAINST -> FROM articles WHERE MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root'); -> ('Security implications of running MySQL as root'); | id | body | score | | 4 | 1. Never run mysqld as root | | | 6 | When configured properly, MySQL... | | rows in set (0.00 sec)

109 mysql> SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); | id | title | body | | 1 | MySQL Tutorial | DBMS stands for DataBase... | | 2 | How To Use MySQL Efficiently | After you went through a... | | 3 | Optimizing MySQL | In this tutorial we will show... | | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root | | 6 | MySQL Security | When configured properly, MySQL... | Questa query restituisce tutte le righe che contengono la parola “MySQL” e non contengono la parola “YourSQL”. Questa query restituisce tutte le righe che contengono la parola “MySQL” e non contengono la parola “YourSQL”.

110 mysql> SELECT * FROM articles -> WHERE MATCH (title,body) AGAINST ('database'); -> WHERE MATCH (title,body) AGAINST ('database'); | id | title | body | | 5 | MySQL vs. YourSQL | In the following database comparison... | | 1 | MySQL Tutorial | DBMS stands for DataBase... | rows in set (0.00 sec) mysql> SELECT * FROM articles -> WHERE MATCH (title,body) -> WHERE MATCH (title,body) -> AGAINST ('database' WITH QUERY EXPANSION); -> AGAINST ('database' WITH QUERY EXPANSION); | id | title | body | | 1 | MySQL Tutorial | DBMS stands for DataBase... | | 5 | MySQL vs. YourSQL | In the following database comparison... | | 3 | Optimizing MySQL | In this tutorial we will show... | rows in set (0.00 sec)

111 Funzioni matematiche ABS(X) ABS(X) FLOOR(X), CEILING(X) FLOOR(X), CEILING(X) SIN(X), COS(X)… SIN(X), COS(X)… LN(X), LOG(X), LOG(B,X) LN(X), LOG(X), LOG(B,X) Ecc. Ecc.

112 Operatori logici NOT (! ) NOT (! ) AND (&& ) AND (&& ) OR (|| ) OR (|| ) XOR XOR

113 View CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

114 Definizione di stored procedure Una stored routine è costituita o da una procedura o da una funzione Una stored routine è costituita o da una procedura o da una funzione Una stored procedure è costituita da un insieme di istruzioni SQL che vengono memorizzate nel server con un nome identificativo, può essere invocata con CALL e torna indietro valori usando le variabili di output Una stored procedure è costituita da un insieme di istruzioni SQL che vengono memorizzate nel server con un nome identificativo, può essere invocata con CALL e torna indietro valori usando le variabili di output Una stored function può essere chiamata mediante il solo nome, e può ritornare un valore scalare Una stored function può essere chiamata mediante il solo nome, e può ritornare un valore scalare Delle stored routines possono chiamare altre stored routines Delle stored routines possono chiamare altre stored routines

115 Proprietà Una stored routine è associata ad un particolare database, e questo vuol dire che: Una stored routine è associata ad un particolare database, e questo vuol dire che: 1. Quando viene invocata, implicitamente viene eseguito USE, non sono ammessi USE all’interno della routine 2. E’ possibile riferirsi ad una routine non presente nel database corrente prefissandola con il nome del suo database 3. Il DROP del db provoca il DROP delle routine associate Se non indicato diversamente le SR sono associate al DB di default Se non indicato diversamente le SR sono associate al DB di default

116 Perché usare una SR? Girano in qualsiasi ambiente. Dato che sono sul server del DB, non dipendono dall’applicativo che le usa e dal linguaggio di programmazione. L’aggiornamento di una SR aggiorna la logica di funzionamento del DB senza la necessità di modificare i client Girano in qualsiasi ambiente. Dato che sono sul server del DB, non dipendono dall’applicativo che le usa e dal linguaggio di programmazione. L’aggiornamento di una SR aggiorna la logica di funzionamento del DB senza la necessità di modificare i client Possono ridurre il traffico di rete, utilizzando dei result set direttamente sul DB senza muoverli verso il client per l’elaborazione. Possono ridurre il traffico di rete, utilizzando dei result set direttamente sul DB senza muoverli verso il client per l’elaborazione.

117 Sintassi CREATE [DEFINER = { user | CURRENT_USER }] [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic...] routine_body [characteristic...] routine_bodyCREATE [DEFINER = { user | CURRENT_USER }] [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) FUNCTION sp_name ([func_parameter[,...]]) RETURNS type RETURNS type [characteristic...] routine_body [characteristic...] routine_body

118 Esempio di procedura DELIMITER // CREATE PROCEDURE simpleproc (OUT param1 int) BEGIN SELECT COUNT(*) INTO param1 FROM imp; END; // DELIMITER ; CALL

119 Osservazioni DELIMITER cambia il “terminatore” di linea da ; a //, in modo che sia possibile usare ; nella definizione della procedura e non venga interpretato da mysql DELIMITER cambia il “terminatore” di linea da ; a //, in modo che sia possibile usare ; nella definizione della procedura e non venga interpretato da mysql La procedura torna un risultato tramite l’unico parametro definito, che è un parametro di uscita. Il parametro viene riempito dalla istruzione CALL, e letto tramite una semplice SELECT La procedura torna un risultato tramite l’unico parametro definito, che è un parametro di uscita. Il parametro viene riempito dalla istruzione CALL, e letto tramite una semplice SELECT E’ possibile avere procedure molto più complesse E’ possibile avere procedure molto più complesse Per ottenere informazioni a proposito delle procedure: Per ottenere informazioni a proposito delle procedure: SHOW PROCEDURE STATUS; SHOW CREATE PROCEDURE ;

120 Procedura complessa DELIMITER // CREATE PROCEDURE procedura1 (param1 INT, param2 CHAR(3), OUT param3 INT) OUT param3 INT)BEGIN DECLARE finito INT default 0; DECLARE finito INT default 0; DECLARE a INT; DECLARE a INT; DECLARE b CHAR(50); DECLARE b CHAR(50); DECLARE cur1 CURSOR FOR SELECT id,nome DECLARE cur1 CURSOR FOR SELECT id,nome FROM clienti WHERE cat = param2; FROM clienti WHERE cat = param2; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET finito = 1; SET finito = 1; OPEN cur1; OPEN cur1; SET param3 = 0; SET param3 = 0; FETCH cur1 INTO a,b; FETCH cur1 INTO a,b; ciclo: WHILE NOT finito DO ciclo: WHILE NOT finito DO IF param3 < param1 THEN IF param3 < param1 THEN SET param3 = param3 + 1; SET param3 = param3 + 1; FETCH cur1 INTO a,b; FETCH cur1 INTO a,b; ELSE ELSE LEAVE ciclo; LEAVE ciclo; END IF; END IF; END WHILE ciclo; END WHILE ciclo; END; // DELIMITER ;

121 Analisi DELIMITER // Dice al server che l’istruzione di CREATE non termina con il ; che invece mi serve all’interno delle Stored Procedure CREATE PROCEDURE procedura1 (param1 INT, param2 CHAR(3), OUT param3 INT) La procedura ha come nome procedura1, e usa tre parametri, i primi due di input e l’ultimo di output BEGINEND Il codice da eseguire deve essere delimitato da BEGIN e END

122 Analisi DECLARE finito INT default 0; DECLARE a INT; DECLARE b CHAR(50); Definiamo tre variabili da usare all’interno della routine, una di queste inizializzata con un default DECLARE cur1 CURSOR FOR SELECT id,nome FROM clienti WHERE cat = param2; FROM clienti WHERE cat = param2; Definiamo un “cursore” DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET finito = 1; SET finito = 1; Definiamo un “handler” che non interrompe l’esecuzione se si verifica la condizione indicata L’ordine delle dichiarazioni è importante, deve essere quello qui illustrato!

123 Analisi OPEN cur1; SET param3 = 0; Questa è la prima vera operazione, l’apertura del cursore. In questo modo viene eseguita la select, che costituisce il corpo del cursore. Inizializziamo il parametro di output e passiamo alla FETCH cur1 INTO a,b; Con questa operazione il cursore legge la prima riga tornata dalla select, e scrive i valori trovati nelle variabili a e b. Fatta questa operazione il “cursore” si sposta sul secondo risultato trovato, che tornerà alla successiva fetch. Notare che la prima fetch è esterna al ciclo, per gestire il caso di tabella senza righe. I cursori sono READ ONLY, e NOT SCROLLABLE

124 Analisi ciclo: WHILE NOT finito DO END WHILE ciclo; Segue un ciclo di elaborazione, che viene eseguito fino a che il valore di “finito” è falso (ossia =0 come inizializzato). Tale valore cambia nel momento in cui il cursore ha fatto la fetch dell’ultima riga tornata dalla select, e non ha righe su cui spostarsi: in quel momento infatti il SQLSTATE ha valore ‘02000’, e l’handler che abbiamo definito cambia il valore della variabile in 1. IF param3 < param1 THEN SET param3 = param3 + 1; FETCH cur1 INTO a,b; FETCH cur1 INTO a,b;ELSE LEAVE ciclo; END IF; Infine all’interno del ciclo si verifica che la variabile param3 abbia raggiunto param1, e in tal caso con LEAVE si abbandona il ciclo stesso. Se non lo ha raggiunto si effettua un’altra FETCH del cursore. Nell’esempio non uso a e b, ma potrei farlo...

125 Analisi Il ciclo quindo termina o quando si è verificata la condizione sui parametri, oppure quando il cursore si è esaurito, e al termine della esecuzione il parametro di output conterrà il numero di righe lette. Riassumendo in una SP si possono trovare le definizioni di : 1. Variabili (declare, in, out) 2. Condizioni (sqlstate) 3. Cursori 4. Handler Si possono usare nel codice: 1. Variabili 2. Cursori 3. Controllo di flusso (if, loop, repeat, while, iterate, leave)

126 Modifica Una procedura può essere eliminata con Una procedura può essere eliminata con DROP PROCEDURE DROP PROCEDURE E’ possibile modificare i suoi permessi con E’ possibile modificare i suoi permessi con ALTER PROCEDURE SQL SECURITY { DEFINER | INVOKER } Nel caso DEFINER è l’utente che ha definito la procedura a dover avere i permessi necessari alla sua esecuzione, nel caso INVOKER è invece l’utente che la esegue. Nel caso DEFINER è l’utente che ha definito la procedura a dover avere i permessi necessari alla sua esecuzione, nel caso INVOKER è invece l’utente che la esegue.

127 Stored Functions Rispetto alla definizione delle procedure si aggiunge la capacità di tornare un valore con la clausola RETURN, e i parametri sono esclusivamente in input. Rispetto alla definizione delle procedure si aggiunge la capacità di tornare un valore con la clausola RETURN, e i parametri sono esclusivamente in input. E’ obbligatorio tornare un valore! E’ obbligatorio tornare un valore! drop function funz2; DELIMITER // CREATE function funz2(codFis char(16)) returns decimal BEGIN DECLARE c INT default 0; select stipendio into c FROM impiegati where cf=codFis; return c + 3*c; END; // DELIMITER ;

128 ESERCIZIO Scrivere una stored procedure che somma tutti gli stipendi degli impiegati. Scrivere una stored procedure che somma tutti gli stipendi degli impiegati. DELIMITER // CREATE PROCEDURE p25 (OUT return_val INT) BEGIN DECLARE a,b INT; DECLARE c INT default 0; DECLARE cur_1 CURSOR FOR SELECT stipendio FROM imp; DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; OPEN cur_1; SET b = 0; REPEAT FETCH cur_1 INTO a; if b = 0 then SET c=c+a; end if; UNTIL b = 1 END REPEAT; CLOSE cur_1; SET return_val = c; END;// DELIMITER ;

129 ESERCIZIO Scrivere una stored procedure che inserisca nella tabella impsede1 tutti i codici degli impiegati della sede 1 Scrivere una stored procedure che inserisca nella tabella impsede1 tutti i codici degli impiegati della sede 1 DELIMITER // CREATE PROCEDURE p26 () BEGIN DECLARE b INT; DECLARE a char(4); DECLARE cur_1 CURSOR FOR SELECT codimp FROM imp WHERE sede='S01'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; OPEN cur_1; FETCH cur_1 INTO a; REPEAT INSERT INTO corsosql.impSede1 VALUES (a); FETCH cur_1 INTO a; UNTIL b = 1 END REPEAT; CLOSE cur_1; END; // DELIMITER ;

130 TRIGGERS Sono oggetti associati a tabelle, che vengono attivati nel momento in cui un determinato evento si verifica in quella tabella. Sono oggetti associati a tabelle, che vengono attivati nel momento in cui un determinato evento si verifica in quella tabella. Nella definizione del trigger stabiliamo per quale evento deve essere attivato, ossia per inserimento di righe, modifiche o cancellazioni, e se deve essere eseguito prima o dopo tale evento Nella definizione del trigger stabiliamo per quale evento deve essere attivato, ossia per inserimento di righe, modifiche o cancellazioni, e se deve essere eseguito prima o dopo tale evento Si hanno dunque i seguenti tipi di trigger: Si hanno dunque i seguenti tipi di trigger: 1. BEFORE INSERT 2. BEFORE UPDATE 3. BEFORE DELETE 4. AFTER INSERT 5. AFTER UPDATE 6. AFTER DELETE

131 Sintassi CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body La clausola DEFINER specifica se come creatore del trigger deve essere considerato l'utente attuale (default) o un altro utente specificato nella forma La clausola DEFINER specifica se come creatore del trigger deve essere considerato l'utente attuale (default) o un altro utente specificato nella forma trigger_time indica il momento di attivazione del trigger. Esso può essere BEFORE o AFTER la modifica di ogni riga della tabella a cui è associato il trigger. trigger_time indica il momento di attivazione del trigger. Esso può essere BEFORE o AFTER la modifica di ogni riga della tabella a cui è associato il trigger. trigger_event è l’evento che scatena l’esecuzione del trigger. Esso può essere INSERT, UPDATE, DELETE trigger_event è l’evento che scatena l’esecuzione del trigger. Esso può essere INSERT, UPDATE, DELETE trigger_body rappresenta il codice che viene eseguito all’attivazione del trigger. Normalmente racchiuso tra BEGIN….END. trigger_body rappresenta il codice che viene eseguito all’attivazione del trigger. Normalmente racchiuso tra BEGIN….END. Anche se associato ad una tabella il trigger deve avere nome univoco all’interno del database. Anche se associato ad una tabella il trigger deve avere nome univoco all’interno del database. Quando si fa riferimento a inserimenti o cancellazioni di righe, non si intende necessariamente una istruzione INSERT o DELETE, ma qualsiasi operazione dalla quale scaturisca l’evento interessato (ad esempio il caricamento dei dati da shell) Quando si fa riferimento a inserimenti o cancellazioni di righe, non si intende necessariamente una istruzione INSERT o DELETE, ma qualsiasi operazione dalla quale scaturisca l’evento interessato (ad esempio il caricamento dei dati da shell)

132 Esempio delimiter // CREATE TRIGGER upd_check BEFORE UPDATE ON account FOR EACH ROW BEGIN IF NEW.amount < 0 THEN IF NEW.amount < 0 THEN SET NEW.amount = 0; SET NEW.amount = 0; ELSEIF NEW.amount > 100 THEN ELSEIF NEW.amount > 100 THEN SET NEW.amount = 100; SET NEW.amount = 100; END IF; END IF; END;// delimiter ; NEW si riferisce alla nuova riga che sta per essere scritta, in questo caso aggiornata, e si può usare in caso di INSERT e UPDATE. E’ disponibile anche OLD, che si riferisce ai valori precedenti la modifica, e si può utilizzare nel caso di UPDATE e DELETE La modifica con SET è possibile solo per i valori NEWe nei trigger di tipo BEFORE Attenti con i trigger BEFORE: se l’inserimento non riesce potrebbero lasciare dati inconsistenti

133 Esempio delimiter // CREATE TRIGGER log_upd AFTER UPDATE ON impiegati CREATE TRIGGER log_upd AFTER UPDATE ON impiegati FOR EACH ROW FOR EACH ROW BEGIN BEGIN DECLARE u varchar(40); DECLARE u varchar(40); select user() into u; select user() into u; insert into TB_LOG values(NULL, NOW(), 'UPDATE', OLD.stipendio, NEW.stipendio, u); insert into TB_LOG values(NULL, NOW(), 'UPDATE', OLD.stipendio, NEW.stipendio, u); END;// END;// delimiter ; delimiter ;

134 Transazioni L'uso delle transazioni permette di "consolidare" le modifiche alla base dati solo in un momento ben preciso: dal momento in cui avviamo una transazione, gli aggiornamenti rimangono sospesi (e invisibili ad altri utenti) fino a quando non li confermiamo (commit); in alternativa alla conferma è possibile annullarli (rollback). L'uso delle transazioni permette di "consolidare" le modifiche alla base dati solo in un momento ben preciso: dal momento in cui avviamo una transazione, gli aggiornamenti rimangono sospesi (e invisibili ad altri utenti) fino a quando non li confermiamo (commit); in alternativa alla conferma è possibile annullarli (rollback). MySQL gira per default in AUTOCOMMIT mode: tutti gli aggiornamenti vengono automaticamente consolidati nel momento in cui sono eseguiti MySQL gira per default in AUTOCOMMIT mode: tutti gli aggiornamenti vengono automaticamente consolidati nel momento in cui sono eseguiti Per iniziare una transazione si deve usare allora START TRANSACTION: da questo punto in poi tutti gli aggiornamenti rimaranno sospesi Per iniziare una transazione si deve usare allora START TRANSACTION: da questo punto in poi tutti gli aggiornamenti rimaranno sospesi

135 Sintassi START TRANSACTION...istruzioni di aggiornamento (1)... SAVEPOINT sp1;...istruzioni di aggiornamento (2)... ROLLBACK TO SAVEPOINT sp1;...istruzioni di aggiornamento (3)... COMMIT COMMIT conferma le modifiche e chiude la transazione, mentre ROLLBACK annulla tutti gli aggiornamenti eseguiti nel corso dell’ultima transazione COMMIT conferma le modifiche e chiude la transazione, mentre ROLLBACK annulla tutti gli aggiornamenti eseguiti nel corso dell’ultima transazione COMMIT AND CHAIN provoca l’immediata apertura di una nuova transazione, COMMIT RELEASE chiude la connessione al server COMMIT AND CHAIN provoca l’immediata apertura di una nuova transazione, COMMIT RELEASE chiude la connessione al server SET AUTOCOMMIT=0 disabilita l’autocommit: tutti gli aggiornamenti rimangono in sospeso fino al commit SET AUTOCOMMIT=0 disabilita l’autocommit: tutti gli aggiornamenti rimangono in sospeso fino al commit I SAVEPOINT sono degli stati intermedi ai quali possiamo tornare con un ROLLBACK I SAVEPOINT sono degli stati intermedi ai quali possiamo tornare con un ROLLBACK

136 Osservazioni Su MySQL il tutto funziona solo se si usa InnoDB Su MySQL il tutto funziona solo se si usa InnoDB NON sono annullabili le operazioni che creano, eliminano o alterano la struttura di tabelle e database: è bene evitare di includere in una transazione tali operazioni, che tra l’altro nella maggior parte dei casi causano una COMMIT implicita NON sono annullabili le operazioni che creano, eliminano o alterano la struttura di tabelle e database: è bene evitare di includere in una transazione tali operazioni, che tra l’altro nella maggior parte dei casi causano una COMMIT implicita

137 SELECT In alcuni casi è utile utilizzare due clausole particolari quando si effettua una select: In alcuni casi è utile utilizzare due clausole particolari quando si effettua una select: SELECT....FOR UPDATE SELECT....LOCK IN SHARE MODE La prima stabilisce un LOCK su tutte le righe lette, che impedirà ad altri utenti di leggerle fino al termine della nostra transazione La prima stabilisce un LOCK su tutte le righe lette, che impedirà ad altri utenti di leggerle fino al termine della nostra transazione La seconda stabilisce un LOCK che impedisce gli aggiornamenti, garantendo che il contenuto rimarrà invariato durante la transazione La seconda stabilisce un LOCK che impedisce gli aggiornamenti, garantendo che il contenuto rimarrà invariato durante la transazione

138 Livello di isolamento Un aspetto importante relativamente alle transazioni è il livello di isolamento al quale vengono effettuate. I livelli possibili sono quattro, e li elenchiamo in ordine crescente: Un aspetto importante relativamente alle transazioni è il livello di isolamento al quale vengono effettuate. I livelli possibili sono quattro, e li elenchiamo in ordine crescente: 1. READ UNCOMMITTED: a questo livello sono visibili gli aggiornamenti effettuati da altri utenti anche se non consolidati: è un comportamento non propriamente transazionale, che può dare seri problemi di consistenza dei dati; va utilizzato solo quando non ci sono preoccupazioni di questo tipo e c’è bisogno di velocizzare le letture 2. READ COMMITTED: a questo livello gli aggiornamenti diventano visibili solo dopo il consolidamento 3. REPETEABLE READ: in questo caso perchè un aggiornamento diventi visibile deve essere non solo consolidato, ma anche la transazione che legge deve essere terminata; in pratica, la stessa lettura ripetuta all'interno di una transazione darà sempre lo stesso risultato; è la modalità di default 4. SERIALIZABLE: come nel caso precedente, ma in più, la semplice lettura di un dato provoca il blocco degli aggiornamenti fino al termine della transazione; in sostanza è come se ogni SELECT venisse effettuata con la clausola LOCK IN SHARE MODE


Scaricare ppt "MySQL ___. Istallare MySQL Dal link è fare il download di diverse versioni di MySQL: Dal link è fare il download."

Presentazioni simili


Annunci Google