Esempi pratici di MySql

Ieri, in occasione di una goirnata di formazione con Joe Yates, ho preso un po’ di appunti sull’utilizzo base di MySql che magari possono risultare utili a chi si approccia a questo DB per la prima volta. E’ stato immaginato di dover creare un database di Film. Questo non vuole essere un tutorial; sono dei semplici appunti.

Le prove sono state fatte su una distribuzione live (Knoppix 5.0); in questo caso è stato necessario avviare il demone come utente “sudo -s”:

/usr/sbin/mysqld &

#1 l’elenco dei comandi

help
/h

#2 elenco dei database presenti sulla macchina

show databases

#3 creare un database

create database films;

#4 selezionare il database

use films u films

#5 creare tabelle (nome colonna – tipo di dato)

CREATE [nome tabella] ([nome campo] [tipo], [nome campo] [tipo], primary key([campo]));
CREATE films (titolo text, anno int); CREATE TABLE registi (id int auto_increment, nome text, cognome text, primary key(id));

il tipo di dato serve a definire che tipo di valore il db si aspetta nella query
può essere un campo testuale, o numerico, o binario ecc
auto_increment genera un campo progressvo
primary key(id) è il campo primario che non è duplicabile e viene controllato direttamente dal sistema.

text (si aspetta un testo lungo)
int (si aspetta un numero)

#6 elenco delle tabelle (se il db è stato precedentemente selzionato nel punto 4)

show tables

#7 per inserire un dato nella tabella

INSERT INTO [tabella] VALUES ([valore colonna 1], [valore colonna 2]);
INSERT INTO [tabella] (colonna3, colonna2, colonna1) VALUES ([valore colonna 3], [valore colonna 2], [valore colonna 1]);
INSERT INTO films VALUES ('pupl fiction', '1994');

se si inserisce una riga senza valori es: insert into films values ();
di default vengono inseriti tutti NULL
NULL non è uno zero e non è nemmeno un campo vuoto del tipo ”
NULL è un valore particolare che vale NULL
Questo vale nei sistemi “seri” tipo postgres, oracle ecc. Mysql converte una stringa vuota ” in NULL

# Se è settato una primary key e un autoincrement non è necessario indicare l’id nell’insert

mysql> INSERT INTO registi (nome, cognome) VALUES ('alfred', 'hitchcok');

in questo caso l’id è asseganto dal sistema am devo indicare quali campi corrispondono ai valori.#8 per visualizzare i record inseriti

SELECT * FROM films;

#9 per eliminare una tabella o un db

DROP table films; DROP database films;

#10 per cancellare record

DELETE FROM [tabella] WHERE [campo]=[valore]; DELETE FROM films WHERE anno=1994; DELETE FROM films WHERE anno is NULL;

#11 modificare i record

UPDATE [tabella] SET [campo]='[valore]' WHERE [campo]=[valore]; update regiti set nome='albert' where id=1;

#12 sapere quale è il massimo valore, tipo per l’id

mysql> SELECT max(id) FROM films;
+---------+
| max(id) |
+---------+
|       1 |
+---------+

Questo sistema può creare “atonicità” negli inserimenti. Non c’è garanzia di ribeccare ciò che hai inserito nel caso che due query agiscono in maniera contemporanea. La cosa si risolve in altri sistemi con le “stored procedure”.

# FOREGIN VALUES
——————————————————————————————-
# Abbiamo due tabelle, films e registi

mysql> SELECT * FROM films;
+------+------------+---------+------+
| id   | id_regista | titolo  | anno |
+------+------------+---------+------+
|    1 |          1 | le iene | 2004 |
+------+------------+---------+------+
mysql> SELECT * FROM films;
+------+------------+---------+------+
| id   | id_regista | titolo  | anno |
+------+------------+---------+------+
|    1 |          1 | le iene | 2004 |
+------+------------+---------+------+

# rendiamo collegate due tabelle;

SELECT * FROM [tabella] INNER JOIN [tabella2] ON [tabella1].[colonna]=[tabella2].[valore];

seleziona tutto dalla tabella films fai unione interna a registi in cui film.regista è uguale a registi.id

mysql> select * FROM films INNER JOIN registi ON films.id_regista=registi.id;
+------+------------+---------+------+------+---------+-----------+
| id   | id_regista | titolo  | anno | id   | nome    | cognome   |
+------+------------+---------+------+------+---------+-----------+
|    1 |          1 | le iene | 2004 |    1 | quentin | tarantino |
+------+------------+---------+------+------+---------+-----------+

#per evitare al riondanza di campi e flusso dati

mysql> SELECT films.id, films.id_regista, films.titolo, registi.nome, registi.cognome FROM films INNER JOIN registi ON films.id_regista=registi.id;
+------+------------+---------+---------+-----------+
| id   | id_regista | titolo  | nome    | cognome   |
+------+------------+---------+---------+-----------+
|    1 |          1 | le iene | quentin | tarantino |
+------+------------+---------+---------+-----------+

# oppure, dato che mysql seleziona le colonne se sono univoche tra 2 tabelle

mysql> SELECT films.id, id_regista, titolo, nome, cognome FROM films INNER JOIN registi ON films.id_regista=registi.id;
+------+------------+---------+---------+-----------+
| id   | id_regista | titolo  | nome    | cognome   |
+------+------------+---------+---------+-----------+
|    1 |          1 | le iene | quentin | tarantino |
+------+------------+---------+---------+-----------+

#possiamo fare selezioni con una determinata condizione. In questo caso vogliamo i film dell’anno 2004

mysql> SELECT films.id, id_regista, titolo,anno, nome, cognome FROM films INNER JOIN registi ON films.id_regista=registi.id WHERE anno=2004;
+------+------------+---------+------+--------+-----------+
| id   | id_regista | titolo  | anno | nome   | cognome   |
+------+------------+---------+------+--------+-----------+
|    1 |          1 | le iene | 2004 | albert | tarantino |
+------+------------+---------+------+--------+-----------+
Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • RSS
  • StumbleUpon
  • Twitter
  • Reddit

Post a comment