SQL SELECT

Tra i comandi di tipo DQL (Data Query Language) di SQL, SELECT è sicuramente quello più utilizzato e conosciuto, in quanto interroga le tabelle per il recupero dei dati. In questo post analizziamo alcune delle sfumature di questo comando per stabilirne le potenzialità.

Partiamo dalla creazione di una tabella che chiameremo ‘users’ con 4 colonne: ‘id’, ‘firstname’ , ‘lastname’ e ‘age’. Popoliamo la tabella creando 5 utenti:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(6) unsigned PRIMARY KEY AUTO_INCREMENT,
  `firstname` varchar(24) NOT NULL,
  `lastname` varchar(32) NOT NULL,
  `age` int(3) NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `users` (`firstname`, `lastname`, `age`) VALUES
  ('Fred', 'Flintstone', '44'),
  ('Barney', 'Rubble', '39'),
  ('Battlestar', 'Galactica', '440'),
  ('Millenium', 'Falcon', '727'),
  ('Fred', 'Agathon', '27');

Utilizziamo subito il comando SELECT per verificare tutto il contenuto della tabella:

SELECT * FROM users;
| id |  firstname |   lastname | age |
|----|------------|------------|-----|
|  1 |       Fred | Flintstone |  44 |
|  2 |     Barney |     Rubble |  39 |
|  3 | Battlestar |  Galactica | 440 |
|  4 |  Millenium |     Falcon | 727
|  5 |       Fred |    Agathon |  27 |

La query "SELECT * FROM users" ha come effetto quella di recuperare TUTTO il contenuto della tabella users, grazie all’uso dell’asterisco.

IMPORTANTE: Le keyword SQL sono case-insensitive, quindi select * from users è equivalente a SELECT * FROM users. Tuttavia, per distinguere le keyword SQL dai nomi che si utilizzano nella query, in questo post utilizziamo keyword maiuscole.

Ora che abbiamo la nostra tabella users possiamo iniziare ad estrarre i dati.

Funzione SQL DISTINCT

La funzione DISTINCT si usa per recuperare tutti i valori distinti (diversi) presenti in una tabella. Nella nostra tabella users ci sono 2 username identici (Fred), per cui nel conteggio apparirà solamente una volta:

SELECT DISTINCT firstname FROM users;
|  firstname |
|------------|
|       Fred |
|     Barney |
| Battlestar |
|  Millenium |

SQL WHERE

Per recuperare il valore contenuto nella colonna username, per l’id = 1, possiamo scrivere:

SELECT firstname FROM users WHERE id = 1;

Il risultato di questa query è:

| firstname |
|-----------|
|      Fred |

Se invece è nostra intenzione recuperare il valore della colonna lastname che corrisponde all’id = 3, possiamo scrivere:

SELECT lastname FROM users WHERE id = 3;

E otteniamo:

|  lastname |
|-----------|
| Galactica |

SQL LIKE

L’operatore LIKE viene utilizzato insieme all’operatore WHERE per trovare un determinato pattern nei valori delle tabelle. Ed insieme a LIKE vengono generalmente utilizzati i due metacaratteri%” (percentuale) e “_” (underscore).

SELECT firstname FROM users WHERE firstname LIKE '%ttles%';

In questa query chiediamo di selezionare dalla colonna firstname della tabella users tutti i valori della colonna che contengono il valore “ttles” al loro interno. E ci viene restituito questo:

|  firstname |
|------------|
| Battlestar |

Nell’esempio precedente sono stati utilizzati due metacaratteri %, ma le varianti sono tante:

  • WHERE firstname LIKE 'Mill%' – restituisce tutti i valori che iniziano per ‘Mill’;
  • WHERE firstname LIKE '%nium' – restituisce tutti i valori che finiscono per ‘nium’;
  • WHERE firstname LIKE '%gatho%' – restitusce tutti i valori che contengono ‘gatho’;
  • WHERE firstname LIKE '_r%' – restituisce tutti i valori che contengono una ‘r’ in seconda posizione;
  • WHERE firstname LIKE 'a_%_%' – restituisce tutti i valori che iniziano per ‘a’ e sono lunghi almeno 3 caratteri;
  • WHERE firstname LIKE 'a%o' – restituisce tutti i valori che iniziano per ‘a’ finiscono per ‘o’.

Gli operatori SQL AND, OR, NOT

La clausola WHERE può essere utilizzata anche in combinazione con gli operatori AND, OR e NOT. I primi due vengono usati per filtrare i record in base a una o più condizioni:

  • WHERE firstname = 'Fred' AND lastname = 'Agathon' – permette il recupero dei valori se tutte le condizioni vengono soddisfatte;
  • WHERE firstname = 'Fred' OR lastname = 'Rubble' – permette il recupero dei valori se almeno una delle condizioni viene soddisfatta (quindi mostrerà tutti i valori che soddisfano una condizione oppure l’altra);
  • WHERE NOT firstname = 'Fred' – permette il recupero dei valori escludendo quello (o quelli) della clausola;

Possono essere perfino utilizzate in combinazione tra loro:

  • WHERE Country='Germany' AND (City='Berlin' OR City='München');
  • WHERE NOT Country='Germany' AND NOT Country='USA';

Funzione SQL ORDER BY

La keyword ORDER BY viene utilizzata in SQL per dare un ordinamento ai risultati secondo un criterio ASCENDENTE o DISCENDENTE. Per impostazione predefinita, i risultati vergono ordinati secondo un criterio ascendente. Vediamo un esempio:

SELECT firstname FROM users ORDER BY firstname ASC;

Questa query restituisce i valori della colonna firstname ordinati secondo un criterio ascendente della stessa colonna firstname:

|  firstname |
|------------|
|     Barney |
| Battlestar |
|       Fred |
|       Fred |
|  Millenium |

Mentre la query SELECT firstname, age FROM users ORDER BY age ASC restituisce i valori delle colonne firstname e age ordinati secondo valori crescenti della colonna age:

|  firstname | age |
|------------|-----|
|       Fred |  27 |
|     Barney |  39 |
|       Fred |  44 |
| Battlestar | 440 |
|  Millenium | 727 |

Funzioni SQL LIMIT e TOP

La keyword LIMIT viene impiegata per recuperare i valori di una colonna limitandone il numero a quello specificato nella query:

SELECT * FROM users LIMIT 3;

Mentre la keyword TOP permette di recuperare i primi valori della colonna, tanti quanti specificati nella query:

SELECT TOP 3 * FROM users;

Entrambe le query precedenti restituiscono questi valori:

| id |  firstname |   lastname | age |
|----|------------|------------|-----|
|  1 |       Fred | Flintstone |  44 |
|  2 |     Barney |     Rubble |  39 |
|  3 | Battlestar |  Galactica | 440 |

Funzioni SQL MIN e MAX

La funzione MIN() restituisce il valore più piccolo tra quelli presenti in tabella, per una determinata colonna. Molto importante da ricordare: non c’è uno spazio tra la keyword e le parentesi:

SELECT MIN(age) AS SmallestAge FROM users;

Abbiamo usato la keyword AS che permette di creare un alias: la colonna che viene restituita si chiama (in questo esempio) SmallestAge

| SmallestAge |
|-------------|
|          27 |

Funzioni SQL COUNT, AVG e SUM

La funzione COUNT() restituisce il numero di colonne che soddisfano un certo criterio specificato. La funzione AVG() invece restituisce una media di valori mentre SUM() ne restituisce la somma.

SELECT COUNT(age)FROM users;

| COUNT(age) |
|------------|
|          5 |
SELECT AVG(age) FROM users;

| AVG(age) |
|----------|
|    255.4 |
SELECT SUM(age) FROM users;
| SUM(age) |
|----------|
|     1277 |

Operatori SQL IN e NOT IN

L’operatore IN permette di specificare valori multipli all’interno della clausola WHERE, o meglio permette una abbreviazione sull’uso multiplo della clausola OR

SELECT * FROM users WHERE firstname IN ('Fred', 'Millenium', 'Albert');

Con questa query vogliamo recuperare tutti i dati relativi alle righe in cui appare uno dei firstname (Fred, Millenium e Albert) specificati tra parentesi. La query restituisce:

| id | firstname |   lastname | age |
|----|-----------|------------|-----|
|  1 |      Fred | Flintstone |  44 |
|  4 | Millenium |     Falcon | 727 |
|  5 |      Fred |    Agathon |  27 |

Mentre se volessimo avere solo l’id:

SELECT id FROM users WHERE firstname IN ('Fred', 'Millenium', 'Albert');

E otterremmo:

| id |
|----|
|  1 |
|  4 |
|  5 |

Con l’operatore NOT IN ci assicuriamo di escludere dal risultato tutte le righe in cui sia presente uno dei termini tra parentesi

SELECT * FROM users WHERE firstname NOT IN ('Fred', 'Millenium', 'Albert');
| id |  firstname |  lastname | age |
|----|------------|-----------|-----|
|  2 |     Barney |    Rubble |  39 |
|  3 | Battlestar | Galactica | 440 |

L’operatore SQL BETWEEN

L’operatore BETWEEN restituisce i valori che stanno all’interno di un certo range specificato:

SELECT * FROM users WHERE age BETWEEN 38 AND 500;
| id |  firstname |   lastname | age |
|----|------------|------------|-----|
|  1 |       Fred | Flintstone |  44 |
|  2 |     Barney |     Rubble |  39 |
|  3 | Battlestar |  Galactica | 440 |

http://sqlfiddle.com/#!9/0b650a/21

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.