• Non ci sono risultati.

Corso base MYSQL. Copyright (c) 2011 Antonio Gallo

N/A
N/A
Protected

Academic year: 2022

Condividi "Corso base MYSQL. Copyright (c) 2011 Antonio Gallo"

Copied!
24
0
0

Testo completo

(1)

Corso base MYSQL

Copyright (c)  2011  Antonio Gallo  (antoniog.web@gmail.com)      Il seguente documento è rilasciato sotto licenza Creative 

Commons 2.5 – Attribution – Share 

alike. Per leggere una copia della licenza visita il sito  http://creativecommons.org/licenses/by­sa/2.5/it/

  

(2)

Indice generale

 1 Introduzione...3

 2 Creiamo la tabella articoli in MySQL...3

 2.1 Altri tipi di dato...6

 2.1.1 Dati numerici...6

 2.1.2 Stringhe...6

 3 Modificare un database esistente...6

 3.1 Cancellare un database esistente:...7

 3.2 Cancellare una tabella esistente...7

 3.3 Cancellare un campo da una tabella esistente...7

 3.4 Aggiungere un campo ad una tabella esistente...8

 3.5 Modificare il tipo di un campo di una tabella esistente...9

 3.6 Rinominare un campo di una tabella esistente...9

 4 Il valore NOT NULL...10

 5 l'istruzione INSERT: inserire dati in una tabella...10

 5.1 Nel caso si inseriscano valori in un campo numerico...12

 5.2 Nel caso si inserisca il valore '...12

 6 L'istruzione SELECT: estrarre dati da una tabella...12

 6.1 Indicare anche la tabella di appartenenza di un campo...14

 6.2 Usare degli alias...14

 6.3 Affinare la selezione con la clausola WHERE...14

 6.3.1 Esempio 1...15

 6.3.2 Esempio 2...15

 6.3.3 Esempio 3...15

 6.4 SUM, AVG, MIN, MAX, COUNT...16

 6.5 GROUP BY: raggruppare i risultati...16

 6.6 ORDER BY: ordinare i risultati...18

 6.6.1 Esempio 1...18

 6.6.2 Esempio 2...18

 6.6.3 Esempio 3...19

 6.7 Limitare il numero di record estratti tramite la clausa LIMIT...19

 6.7.1 Esempio 1...20

 6.7.2 Esempio 2...20

 6.8 Mescolare la clausole WHERE, GROUP BY, ORDER BY, LIMIT...20

 7 L'istruzione DELETE: cancellare record da una tabella...21

 7.1 Esempio 1...21

 8 L'istruzione UPDATE: modificare dei record esistenti...22

 8.1 Esempio 1...22

 8.2 Esempio 2...22

 9 Appendice...23

 9.1 Appendice 1: cambiare la password al database...23

(3)

 1  Introduzione

Un database MySQL è formato da tabelle ognuna contenente dei dati.

Ogni tabella è formata da righe e colonne. Le colonne vengono chiamate campi e sono leetichette ai  dati inseriti. Le righe vengono chiamate record e rappresentano i dati inseriti. Quindi in MySQL (e  in generale in tutti i database relazionali) le tabelle sono formate da campi (colonne) e da record  (righe). Ogni tabella ha un nome che viene usato per richiamare, inserire, cancellare dati.

La tabella seguente, che chiameremo articoli,  ha 4 campi e 3 record.

I campi sono i seguenti: 

• id: un identificativo numerico, univoco e incrementale (consigliato per ogni tabella)

• titolo: contiene il titolo dell'articolo

• categoria: contiene la categoria dell'articolo

• autore: contiene l'autore dell'articolo

• testo: contiene il testo dell'articolo tabella articoli:

id titolo categoria autore testo

1 MySQL è facile informatica Antonio Etc etc

2 MySQL for 

dummies informatica Alberto Etc etc

3 Lo sport è salutare sport Luigi Etc etc

Tabella 1: 

Come si vede i campi servono a dire a che tipo di dato ci stiamo riferendo (al titolo dell'articolo, alla  categoria, all'autore, etc) mentre i record rappresentano gli articoli veri e propri.

 2  Creiamo la tabella articoli in MySQL

In generale quando si opera con MySQL è necessario prima creare un database che conterrà tutte le  nostre tabelle. Immaginiamo di voler creare un database chiamato giornale, il quale deve contenere  tutti i contenuti di un magazine online. La sintassi MySQL è la seguente.

NB: le comunicazioni che si eseguono con il database sono chiamate query CREATE DATABASE giornale;

NB: MySQL è insensibile alle maiuscole o alle minuscole nelle istruzioni, si poteva anche  scrivere: 

(4)

create table giornale;

Dopo aver creato il database giornale è necessario dire a MySQL che vogliamo usarlo:

USE giornale;

Ora possiamo creare la nostra tabella chiamata articoli. Ecco la sintassi MySQL:

CREATE TABLE articoli (

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, titolo CHAR(200) NOT NULL,

categoria VARCHAR(200) NOT NULL, autore VARCHAR(200) NOT NULL, testo TEXT NOT NULL

);

E' possibile richiedere a MySQL informazioni sulla tabella appena creata nel seguente modo:

DESC articoli;

Il risultato è il seguente.

+­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| Field     | Type       | Null | Key | Default | Extra      |  +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 

| titolo    | char(200)        | NO   |     | NULL    |      | 

| categoria | varchar(200)     | NO   |     | NULL    |      | 

| autore    | varchar(200)     | NO   |     | NULL    |      | 

| testo     | text       | NO   |     | NULL    |      |  +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

5 rows in set (0.00 sec) 

Come si vede abbiamo definito tutti i campi descritti precedentemente. Verranno analizzati nel  dettagli qui di seguito:

il campo id

Il campo id è stato definito di tipo INT, cioè intero. Questo tipo di dato viene utilizzato quando è  necessario immagazzinare dei dati di tipo numerico come ad esempio l'età di una persona o, come  in questo caso, un indice incrementale e univoco.

Il campo id è anche stato definito avente la caratteristica UNSIGNED, vale a dire senza segno. In  questo modo non è possibile inserire numeri negativi.

Inoltre il campo id è stato definito come AUTO_INCREMENT. Questo serve a fare in modo che  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

(5)

non sia necessario inserire il valore del campo id ogni volta che si inserisce un nuovo articolo, ci  pensa MySQL incrementando di 1 il valore del campo id dell'articolo precedente.

PRIMARY_KEY significa che il campo id è una chiave primaria, cioè il suo valore non può essere  duplicato (ogni record deve avere il campo id diverso da tutti gli altri record)

il campo titolo

Il campo titolo è stato definito di tipo CHAR, cioè una stringa di testo. Il valore 200 all'interno  delle parentesi serve a dire a MySQL che la stringa non sarà più lunga di 200 caratteri. Nel caso si  cercasse di inserire un articolo avente un titolo più lungo di 200 caratteri MySQL taglierebbe  automaticamente la parte eccedente i 200 caratteri (cioè l'inserimento avviene, ma il titolo viene  troncato). Il valore 200 serve a dire a MySQL di riservare in memoria lo spazio di 200 caratteri per  il campo titolo.

La tringa NOT NULL indica che nel campo titolo non è possibile inserire valori nulli (vedi in  seguito).

il campo  categoria

Per il campo categoria vale quanto detto per il campo titolo, ma con la seguente differenza. Al  posto di CHAR(200) si è scritto VARCHAR(200). Il tipo di dato VARCHAR viene anch'esso  utilizzato per memorizzare le stringhe e il significato del numero tra parentesi (200) è lo stesso di  prima. La differenza è che VARCHAR, al contrario di CHAR, ottimizza lo spazio utilizzato per  memorizzazione del dato. VARCHAR va bene se si prevedono stringhe lunghe.

il campo  autore

Per il campo autore vale quanto detto per il campo categoria

il campo testo

Il campo testo è stato definito di tipo TEXT. Il tipo TEXT viene utilizzato quando è necessario  titolo CHAR(200) NOT NULL

categoria VARCHAR(200) NOT NULL

autore VARCHAR(200) NOT NULL

testo TEXT NOT NULL

(6)

memorizzare molto teso, ad esempio migliaia di caratteri.

 2.1  Altri tipi di dato

Come il PHP, anche MySQL permette di definire molti tipi di dati.

 2.1.1  Dati numerici

Nel caso di dati numerici potete usare i seguenti dati:

numeri interi:

TINYINT   →può contenere al massimo 256 valori, cioè numeri che vanno da ­127 a 128 SMALLINT   può contenere 65536 valori→

MEDIUMINT   può contenere 16.777.216 valori→ INT   oltre 4 miliardi di valori→

BIGINT   circa 18 miliardi di valori→

Tutti i tipo definiti sopra possono essere definiti di tipo UNSIGNED

Nel caso si abbia una tabella che deve contenere migliaia, se non milioni, di record, è consigliato  avere un campo id di tipo INT (se si prevede siano oltre 4 miliardi meglio tipo BIGINT)

numeri con la virgola:

FLOAT   serve per i numeri con la virgola→

DOUBLE   serve per i numeri con la virgola (può contenere più cifre decimali di float)→ DECIMAL   rappresentano numeri "esatti", con → M cifre totali di cui D decimali

 2.1.2  Stringhe

CHAR   per stringhe di breve lunghezza→

VARCHAR   per stringhe lunghe (oltre i 50 caratteri)→ TEXT   per testi lunghi (oltre i 200 caratteri)→

 3  Modificare un database esistente

(7)

 3.1  Cancellare un database esistente:

Per cancellare un database esistente si deve usare la seguente sintassi:

DROP DATABASE <nome_database>;

Cioè nel nostro caso:

DROP DATABASE giornale;

 3.2 Cancellare una tabella esistente

Per cancellare una tabella esistente si deve usare la seguente sintassi:

DROP TABLE <nome_tabella>;

cioè nel nostro caso.

DROP TABLE articoli;

 3.3 Cancellare un campo da una tabella esistente

Cancellare un campo di una tabella significa cancellare un'intera colonna della tabella. Per farlo è  necessario usare la seguente sintassi:

ALTER TABLE <nome_tabella> DROP <nome_campo>;

Ad esempio, proviamo ad eliminare il campo titolo dalla tabella articoli:

ALTER TABLE articoli DROP titolo;

Se ora chiediamo di descrivere la tabella:

DESC articoli;

(8)

Otteniamo:

+­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| Field     | Type       | Null | Key | Default | Extra      |  +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 

| categoria | varchar(200)     | NO   |     | NULL    |      | 

| autore    | varchar(200)     | NO   |     | NULL    |      | 

| testo     | text       | NO   |     | NULL    |      |  +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

4 rows in set (0.00 sec) 

Come si vede il campo titolo è scomparso.

 3.4 Aggiungere un campo ad una tabella esistente

Per aggiungere un campo ad una tabella esistente è necessario usare la seguente sintassi:

ALTER TABLE <nome_tabella> ADD <nome_campo> <tipo_campo>;

Ad esempio, immaginiamo di aggiungere il campo pubblicato, che contiene la stringa yes/no per  indicare se l'articolo è stato pubblicato oppure no:

ALTER TABLE articoli ADD pubblicato CHAR(3) NOT NULL;

Come si vede il campo pubblicato è stato settato come CHAR dovendo contenere una stringa lunga  al massimo 3 caratteri.

Se ora chiediamo di descrivere la tabella:

DESC articoli;

Otteniamo:

+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| Field      | Type       | Null | Key | Default | Extra      |  +­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 

| categoria  | varchar(200)     | NO   |     | NULL    |      | 

| autore     | varchar(200)     | NO   |     | NULL    |      | 

| testo      | text       | NO   |     | NULL    |      | 

| pubblicato | char(3)      | NO   |     | NULL    |      |  +­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

5 rows in set (0.00 sec) 

(9)

Come si vede è stato aggiunto il campo pubblicato.

 3.5 Modificare il tipo di un campo di una tabella esistente

Per modificare il tipo di dato di un campo di una tabella esistente è necessario usare la seguente  sintassi:

ALTER TABLE <nome_tabella> MODIFY <nome_campo> 

<nuovo_tipo_dato_campo>;

Nel nostro caso, proviamo a cambiare il tipo di dato del campo pubblicato da CHAR a VARCHAR:

ALTER TABLE articoli MODIFY pubblicato VARCHAR(3) NOT NULL;

Se ora chiediamo di descrivere la tabella:

DESC articoli;

Otteniamo:

+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| Field      | Type       | Null | Key | Default | Extra      |  +­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 

| categoria  | varchar(200)     | NO   |     | NULL    |      | 

| autore     | varchar(200)     | NO   |     | NULL    |      | 

| testo      | text       | NO   |     | NULL    |      | 

| pubblicato | varchar(3)       | NO   |     | NULL    |      |  +­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

5 rows in set (0.00 sec) 

Come si vede il campo pubblicato è ora VARCHAR.

 3.6 Rinominare un campo di una tabella esistente

Per rinominare il campo di una tabella esistente è necessario usare la seguente sintassi:

ALTER TABLE <nome_tabella> CHANGE <vecchio_nome> <nuovo_nome> 

<tipo_dato>;

Ad esempio per rinominare il campo testo in testo_messaggio dobbiamo scrivere:

(10)

ALTER TABLE articoli CHANGE testo testo_messaggio TEXT NOT NULL;

Se ora chiediamo di descrivere la tabella:

DESC articoli;

Otteniamo:

+­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| Field       | Type       | Null | Key | Default | Extra      |  +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| id      | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 

| categoria       | varchar(200)     | NO   |     | NULL    |      | 

| autore      | varchar(200)     | NO   |     | NULL    |      | 

| testo_messaggio | text       | NO   |     | NULL    |      | 

| pubblicato      | varchar(3)       | NO   |     | NULL    |      |  +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

5 rows in set (0.00 sec) 

 4  Il valore NOT NULL

Quando si definisce un campo come NOT NULL MySQL non accetta che in un quel campo non si  inserisca alcun valore (si deve per forza inserire qualcosa!). Nel caso non lo si facesse, cioè non si  specificasse un valore per un campo di tipo NOT NULL, ci pensa MySQL in automatico mettendo  un valore di default.

Ecco che valori di default inseriti in un campo NOT NULL quando non si specifica alcun valore:

• Se il campo è di tipo numerico e non si specifica un valore MySQL inserisce il valore 0

• Se il campo è di tipo stringa (CHAR, VARCHAR, TEXT) MySQL inserisce la stringa vuota  ''

 5  l'istruzione INSERT: inserire dati in una tabella

Prima di insegnare come inserire, modificare o ottenere i dati all'interno di una tabella MySQL  ripristiniamo la tabella articoli al suo stato iniziale (basta cancellarla e ricrearla) e aggiungiamo  anche un campo chiamato visite, di tipo numerico, il quale deve contenere il numero delle visite ad  un dato articolo.

ALTER TABLE articoli ADD visite INT NOT NULL;

(11)

Se ora chiediamo di descrivere la tabella:

DESC articoli;

Otteniamo:

+­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| Field     | Type       | Null | Key | Default | Extra      |  +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 

| titolo    | char(200)        | NO   |     | NULL    |      | 

| categoria | varchar(200)     | NO   |     | NULL    |      | 

| autore    | varchar(200)     | NO   |     | NULL    |      | 

| testo     | text       | NO   |     | NULL    |      | 

| visite    | int(11)      | NO   |     | NULL    |      |  +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­+ 

6 rows in set (0.00 sec)

Per inserire dati in una tabella esistente è necessario usare l'istruzione INSERT. La sintassi è la  seguente:

INSERT INTO <nome_tabella> ( <lista_campi_da_inserire> ) VALUES  (<lista_dei_valori>);

Dove <lista_campi_da_inserire> rappresenta una lista di tutti i campi che si vogliono riempire,  separati da una virgola. <lista_dei_valori> rappresenta invece la lista dei valori da inserire  (corrispondenti ai campi)

Ad esempio, proviamo a riempire la tabella articoli con i dati mostrati nella Tabella 1 (aggiungendo  anche il valore del campo visite appena aggiunto)

Inseriamo la prima riga:

INSERT INTO articoli (titolo,categoria,autore,testo,visite) VALUES  ('MySQL è facile','informatica','Antonio','Etc Etc','10');

Osserviamo che:

• La lista dei campi va scritta senza apici   → (titolo, categoria, autore,  testo, visite)

• La lista dei valori va scritta con gli apici all'inizio e alla fine di ogni valore ('MySQL è  facile','MySQL for dummies','Antonio','Etc Etc','10')

Inseriamo ora le altre due righe:

(12)

INSERT INTO articoli (titolo,categoria,autore,testo,visite) VALUES  ('MySQL for dummies','informatica','Alberto','Etc Etc','24');

INSERT INTO articoli (titolo,categoria,autore,testo,visite) VALUES  ('Lo sport è salutare','sport','Luigi','Etc Etc','2');

 5.1  Nel caso si inseriscano valori in un campo numerico

Nel caso si fossero inseriti valori in un campo numerico (INT o FLOAT) bisognerebbe evitare di  usare gli apici, altrimenti il valore viene passato non come numero ma come stringa. Se non li si  mette (come abbiamo fatto nelle due istruzioni INSERT mostrate sopra) MySQL trasformerà  comunque quel numero in stringa.

Inseriamo una quarta riga evitando di usare gli apici per il valore numerico del campo visite:

INSERT INTO articoli (titolo,categoria,autore,testo,visite) VALUES  ('Mangiare salutare','alimentazione','Luigi','Etc Etc',5);

Come si vede nell'istruzione INSERT precedente il valore del campo visite, essendo numerico  (definito come INT), può assumere un valore ( 5 ) senza essere costretti ad inserire gli apici.

 5.2 Nel caso si inserisca il valore '

Nel caso si debba inserire l'apice ' in un campo, ad esempio perché una certa parola contiene un  apostrofo, è necessario precedere tale apostrofo con il carattere backslash \. Questo affinché  l'apostrofo non venga confuso con gli apici che racchiudono il valore.

Esempio:

INSERT INTO articoli (titolo,categoria,autore,testo,visite) VALUES  ('L\'aria pulita','ambiente','Antonio','Etc Etc',11);

Come si vede nel campo titolo era presente un apice che è stato preceduto con il carattere \. 

 6  L'istruzione SELECT: estrarre dati da una tabella

Ora che abbiamo inserito dei valori all'interno della tabella vogliamo provare ad estrarli. Per farlo 

(13)

dobbiamo usare l'istruzione SELECT. La sintassi è la seguente:

SELECT <lista_campi> FROM <nome_tabella>;

Ad esempio:

SELECT id,autore,categoria,titolo,visite FROM articoli;

che restituisce il seguente output:

+­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­+ 

| id | autore  | categoria     | titolo       | visite |  +­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­+ 

|  1 | Antonio | informatica   | MySQL è facile       |     10 | 

|  2 | Alberto | informatica   | MySQL for dummies    |     24 | 

|  3 | Luigi   | sport         | Lo sport è salutare  |      2 | 

|  4 | Luigi   | alimentazione | Mangiare salutare    |      5 | 

|  5 | Antonio | ambiente      | L'aria pulita        |     11 |  +­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­+ 

5 rows in set (0.00 sec) 

Come si vede MySQL ha restituito i valori richiesti, con i valori incolonnati. Si noti che il campo id,  benché non sia mai stato riempito, contiene un valore numerico incrementale. Infatto il suo valore è  stato aggiunto in automatico da MySQL dato che il campo id era stato definito come 

AUTO_INCREMENT.

Per selezionare tutti i campi è possibile usare il caratteri asterisco *, come mostrato di seguito:

SELECT * FROM articoli;

che restituisce il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo       | categoria     | autore  | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  1 | MySQL è facile       | informatica   | Antonio | Etc Etc |     10 | 

|  2 | MySQL for dummies    | informatica   | Alberto | Etc Etc |     24 | 

|  3 | Lo sport è salutare  | sport         | Luigi   | Etc Etc |      2 | 

|  4 | Mangiare salutare    | alimentazione | Luigi   | Etc Etc |      5 | 

|  5 | L'aria pulita        | ambiente      | Antonio | Etc Etc |     11 |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

5 rows in set (0.00 sec) 

Come si vede in questo caso sono stati restituiti tutti i campi della tabella articoli.

(14)

 6.1  Indicare anche la tabella di appartenenza di un campo

È possibile indicare, nella SELECT query, anche la tabella dalla quale si vuole estrarre un  determinato campo. Esempio:

SELECT articoli.autore FROM articoli;

che è equivalente a:

SELECT autore FROM articoli;

Nella prima query abbiamo specificato che il campo autore deve essere estratto dalla tabella articoli. 

L'utilità di questo si vedrà in seguito quando impareremo ad estrarre dati da più valori  contemporaneamente.

 6.2 Usare degli alias

È possibile estrarre campi dal database e richiedere che tali campi estratti vengano rinominati come  richiesto (alias).

Esempio:

SELECT autore AS aut, titolo AS tit FROM articoli;

che restituisce il seguente output:

+­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+

| aut     | tit       | +­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+

| Antonio | Guida MySQL       |

| Alberto | Guida MySQL avanzata      |

| Alberto | Aziende informatiche      |

| Carlo   | Stipendi dei parlamentari | +­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+

4 rows in set (0.00 sec)

Come si vede i campi estratti non si chiamano più autore e titolo, ma aut e tit, come richiesto  attraverso la clausola AS (che serve per definire un alias per un certo campo).

 6.3 Affinare la selezione con la clausola WHERE

(15)

È possibile affinare la ricerca usando la clausola WHERE, come mostrato nei seguenti esempi:

 6.3.1  Esempio 1

Per selezionare tutti gli articoli scritti da Antonio (si notino gli apici attorno ad Antonio  nell'istruzione seguente):

SELECT titolo,categoria,autore FROM articoli WHERE autore =  'Antonio';

che restituisce il seguente output:

+­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+ 

| titolo      | categoria   | autore  |  +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+ 

| MySQL è facile  | informatica | Antonio | 

| L'aria pulita   | ambiente    | Antonio |  +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+ 

2 rows in set (0.00 sec)

 6.3.2  Esempio 2

Per selezionare tutti gli articoli scritti da Antonio della categoria informatica:

SELECT titolo,categoria,autore FROM articoli WHERE autore =  'Antonio' AND categoria = 'informatica';

che restituisce il seguente output:

+­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+ 

| titolo      | categoria   | autore  |  +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+ 

| MySQL è facile  | informatica | Antonio |  +­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+ 

1 row in set (0.00 sec) 

 6.3.3  Esempio 3

Selezionare tutti gli articoli che hanno più di 10 visite:

(16)

SELECT * FROM articoli WHERE visite > 10;

che restituisce il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo      | categoria   | autore  | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  2 | MySQL for dummies | informatica | Alberto | Etc Etc |     24 | 

|  5 | L'aria pulita     | ambiente    | Antonio | Etc Etc |     11 |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

2 rows in set (0.00 sec) 

Si noti che il valore 10 è stato scritto senza apici dato che corrisponde ad un campo (visite) di tipo  INT. In ogni caso l'istruzione valeva anche se si scriveva 10 tra apici (come detto, MySQL lo  trasformava automaticamente da stringa a numero)

SELECT * FROM articoli WHERE visite > '10';

 6.4 SUM, AVG, MIN, MAX, COUNT

La funzione SUM calcola la somma dei valori raggruppati (vedi nella sezione sotto il significato). 

La funzione AVG calcola la media, la funzione MIN calcola il minimo, la funzione MAX calcola il  massimo e la funzione COUNT calcola il numero di record raggruppati.

Ad esempio calcoliamo la somma (SUM) di tutte le visite ricevute (di tutti gli articoli), il numero  minimo (MIN) e massimo (MAX) di visite e il numero medio (AVG). Calcoliamo inoltre il numero  di record nella tabella tramite la funzione COUNT.

SELECT SUM(visite), MIN(visite), MAX(visite), AVG(visite), COUNT(*)  FROM articoli;

che restituisce il seguente output:

+­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+ 

| SUM(visite) | MIN(visite) | MAX(visite) | AVG(visite) | COUNT(*) |  +­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+ 

|      52 |       2 |      24 |     10.4000 |        5 |  +­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+ 

1 row in set (0.00 sec) 

La funzione COUNT richiede l'asterisco tra parentesi e serve per contare tutti i record raggruppati  (vedi sotto)

 6.5 GROUP BY: raggruppare i risultati

È possibile aggregare i risultati che hanno qualcosa in comune, ad esempio gli articoli scritti dallo  stesso autore o all'interno della stessa categoria. Questo può essere utile se non si vuole che i campi 

(17)

doppi vengano ripetuti più volte oppure per applicare funzioni di aggregazione (SUM, AVG, MIN,  MAX) sui campi raggruppati.

Estraggo tutte le categorie, evitando di ripetere più di una volta il nome della singola categoria:

SELECT categoria FROM articoli GROUP BY categoria;

che restituisce il seguente output:

+­­­­­­­­­­­­­­­+ 

| categoria     |  +­­­­­­­­­­­­­­­+ 

| alimentazione | 

| ambiente      | 

| informatica   | 

| sport         |  +­­­­­­­­­­­­­­­+ 

4 rows in set (0.00 sec) 

Come sappiamo gli articoli scritti sotto la categoria informatica sono due. Quindi MySQL ha  aggregato i due articoli all'interno della categoria informatica come da noi chiesto attraverso la  clausola GROUP BY, e ha mostrato una sola volta il nome della categoria.

Ora possiamo chiedere di applicare una delle funzioni viste sopra sui valori raggruppati da GROUP  BY:

SELECT COUNT(*),categoria FROM articoli GROUP BY categoria;

che restituisce il seguente output:

+­­­­­­­­­­+­­­­­­­­­­­­­­­+ 

| COUNT(*) | categoria     |  +­­­­­­­­­­+­­­­­­­­­­­­­­­+ 

|        1 | alimentazione | 

|        1 | ambiente      | 

|        2 | informatica   | 

|        1 | sport         |  +­­­­­­­­­­+­­­­­­­­­­­­­­­+ 

4 rows in set (0.00 sec) 

Come si vede MySQL ha raggruppato gli articoli sotto la categoria informatica. Con la funzione  COUNT(*) è possibile chiedergli quanti sono i record della tabella che ha raggruppato (quindi, in 

(18)

questo caso, quanti sono gli articoli aventi la categoria uguale ad informatica)

 6.6 ORDER BY: ordinare i risultati

I risultati estratti possono essere ordinati tramite la clausola ORDER BY, come mostrato nei  seguenti esempi:

 6.6.1  Esempio 1

Ordiniamo i risultati in ordine alfabetico rispetto all'autore:

SELECT * FROM articoli ORDER BY autore;

che restituisce il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo       | categoria     | autore  | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  2 | MySQL for dummies    | informatica   | Alberto | Etc Etc |     24 | 

|  1 | MySQL è facile       | informatica   | Antonio | Etc Etc |     10 | 

|  5 | L'aria pulita        | ambiente      | Antonio | Etc Etc |     11 | 

|  3 | Lo sport è salutare  | sport         | Luigi   | Etc Etc |      2 | 

|  4 | Mangiare salutare    | alimentazione | Luigi   | Etc Etc |      5 |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

5 rows in set (0.00 sec)

Come si vede i risultati sono stati estratti in ordine alfabeto rispetto all'autore. Si poteva ordinarli  rispetto a qualunque campo.

 6.6.2  Esempio 2

Ordiniamo i risultati in ordine alfabetico decrescente rispetto all'autore:

SELECT * FROM articoli ORDER BY autore DESC;

(19)

che restituisce il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo       | categoria     | autore  | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  3 | Lo sport è salutare  | sport         | Luigi   | Etc Etc |      2 | 

|  4 | Mangiare salutare    | alimentazione | Luigi   | Etc Etc |      5 | 

|  1 | MySQL è facile       | informatica   | Antonio | Etc Etc |     10 | 

|  5 | L'aria pulita        | ambiente      | Antonio | Etc Etc |     11 | 

|  2 | MySQL for dummies    | informatica   | Alberto | Etc Etc |     24 |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

5 rows in set (0.00 sec) 

 6.6.3  Esempio 3

Ordinare in ordine decrescente rispetto all'id (l'id viene incrementato ad ogni inserimento e quindi  indica l'ordine di inserimento degli articoli. L'articolo con l'id più grande sarà l'ultimo inserito).

SELECT * FROM articoli ORDER BY id DESC;

che restituisce il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo       | categoria     | autore  | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  5 | L'aria pulita        | ambiente      | Antonio | Etc Etc |     11 | 

|  4 | Mangiare salutare    | alimentazione | Luigi   | Etc Etc |      5 | 

|  3 | Lo sport è salutare  | sport         | Luigi   | Etc Etc |      2 | 

|  2 | MySQL for dummies    | informatica   | Alberto | Etc Etc |     24 | 

|  1 | MySQL è facile       | informatica   | Antonio | Etc Etc |     10 |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

5 rows in set (0.00 sec) 

 6.7 Limitare il numero di record estratti tramite la clausa LIMIT

È possibile specificare il numero di record che si vuole estrarre grazie alla clausola LIMIT

(20)

 6.7.1  Esempio 1

Estraiamo solo due articoli:

SELECT * FROM articoli LIMIT 2;

che restituisce il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo      | categoria   | autore  | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  1 | MySQL è facile    | informatica | Antonio | Etc Etc |     10 | 

|  2 | MySQL for dummies | informatica | Alberto | Etc Etc |     24 |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

2 rows in set (0.00 sec) 

 6.7.2  Esempio 2

Estraiamo due articoli saltando i primi 2 record:

SELECT * FROM articoli LIMIT 2,2;

che restituisce il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo       | categoria     | autore | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  3 | Lo sport è salutare  | sport         | Luigi  | Etc Etc |      2 | 

|  4 | Mangiare salutare    | alimentazione | Luigi  | Etc Etc |      5 |  +­­­­+­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

2 rows in set (0.00 sec) 

 6.8 Mescolare la clausole WHERE, GROUP BY, ORDER BY, LIMIT

SELECT * FROM articoli WHERE visite > '10' ORDER BY autore LIMIT 

(21)

2;

 7  L'istruzione DELETE: cancellare record da una tabella

E' possibile cancellare dei record da una tabella tramite l'istruzione DELETE, la cui sintassi è la  seguente:

DELETE FROM <nome_tabella> WHERE <clausola_where>;

 7.1  Esempio 1

Esempio, immaginiamo di voler cancellare il record avente id=3:

DELETE FROM articoli WHERE id=3;

Ora possiamo provare ad estrarre tutti i record dalla tabella articoli:

SELECT * FROM articoli;

Per ottenere il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo      | categoria     | autore  | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  1 | MySQL è facile    | informatica   | Antonio | Etc Etc |     10 | 

|  2 | MySQL for dummies | informatica   | Alberto | Etc Etc |     24 | 

|  4 | Mangiare salutare | alimentazione | Luigi   | Etc Etc |      5 | 

|  5 | L'aria pulita     | ambiente      | Antonio | Etc Etc |     11 |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

4 rows in set (0.00 sec) 

Come si vede il record avente id=3 è stato cancellato.

(22)

 8  L'istruzione UPDATE: modificare dei record esistenti

È possibile modificare dei record esistenti di una tabella attraverso l'istruzione UPDATE, la cui  sintassi è la seguente:

UPDATE <nome_tabella> SET <campo1>=<valore1>, <campo2>=<valore2> 

WHERE <clausola_where>;

 8.1  Esempio 1

Modifichiamo il titolo, l'autore, la categoria e il numero di visite del record avente id=2 della  tabella articoli:

UPDATE articoli SET titolo='MySQL facile', autore='Marcello',  categoria='database', visite=154 WHERE id=2;

Ora possiamo provare ad estrarre tutti i record dalla tabella articoli:

SELECT * FROM articoli;

Per ottenere il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo      | categoria     | autore   | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  1 | MySQL è facile    | informatica   | Antonio  | Etc Etc |     10 | 

|  2 | MySQL facile      | database      | Marcello | Etc Etc |    154 | 

|  4 | Mangiare salutare | alimentazione | Luigi    | Etc Etc |      5 | 

|  5 | L'aria pulita     | ambiente      | Antonio  | Etc Etc |     11 |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

4 rows in set (0.00 sec) 

Come si vede il record avente id=2 è stato modificato come richiesto.

 8.2 Esempio 2

(23)

Proviamo a usare una clausola WHERE che non faccia uso del campo id. Ad esempio,  modifichiamo tutte le categorie degli articoli scritti da Antonio.

UPDATE articoli SET categoria='computer' WHERE autore='Antonio';

Si noti come siano stati usati gli apici attorno alla stringa Antonio (è una stringa, non un numero).

Ora possiamo provare ad estrarre tutti i record dalla tabella articoli:

SELECT * FROM articoli;

Per ottenere il seguente output:

+­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

| id | titolo      | categoria     | autore   | testo   | visite |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

|  1 | MySQL è facile    | computer      | Antonio  | Etc Etc |     10 | 

|  2 | MySQL facile      | database      | Marcello | Etc Etc |    154 | 

|  4 | Mangiare salutare | alimentazione | Luigi    | Etc Etc |      5 | 

|  5 | L'aria pulita     | computer      | Antonio  | Etc Etc |     11 |  +­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­+­­­­­­­­­+­­­­­­­­+ 

4 rows in set (0.00 sec) 

Come si vede ora tutti gli articoli scritti da Antonio fanno parte della categoria computer.

NB: in questo secondo esempio abbiamo modificato più record contemporaneamente (due).

 9  Appendice

 9.1  Appendice 1: cambiare la password al database

Un metodo per cambiare la password di accesso al database MySQL è il seguente:

Loggatevi al database ed eseguite la seguente istruzione:

UPDATE mysql.user SET password=PASSWORD('<password>') WHERE  User='<user>'; 

(24)

Dove <password> deve essere uguale alla nuova password che volete usare e <user> deve essere  uguale all'utente al quale volete assegnare la password (di solito root).

Fatto questo dovete usare la seguente istruzione per rendere effettive le modifiche:

FLUSH PRIVILEGES;

Riferimenti

Documenti correlati

Generalizzando l’esempio, se indichiamo con V i il valore della grandezza totale (300 euro), con V f il valore finale (la percentuale 36 euro), con t il tasso percentuale,

Come si vede nell'istruzione INSERT precedente il valore del campo visite, essendo numerico (definito come INT), può assumere un valore ( 5 ) senza essere costretti ad inserire

• Principali mansioni e responsabilità Studio degli effetti biologici degli Endocrine disrupters chemicals (EDC) sui sistemi endocrini e salute riproduttiva, inoltre collabora

Lo sviluppo di accessi vascolari simultanei, di tecniche di iniezione a flusso forzato (pressure cooker) e l’utilizzo della via venosa hanno ulteriormente ampliato il

[r]

Enunciare e dimostrare il teorema che lega convergenza assoluta e convergenza semplice?. Che tipo di condizioni fornisce

Dimostrare il criterio sulla sviluppabilit` a in serie

per il riutilizzo funzionale e la rigenerazione degli immobili di proprietà della Regione stessa, della Provincia e dei comuni e di ogni soggetto pubblico, anche