7 – 8 delete e select

DELETE

Il delete si occupa di eliminare records dai campi. Oltre a specificare il nome della tabella , dobbiamo inserire dei criteri di ricerca. Ecco un esempio:

delete form atleti where idatleta=11;

Come si nota il delete non ha bisogno di nomi di campi, perché l’istruzione si riferisce a tutta la riga, eliminando l’intero record (idatleta=11).

Anche col delete si possono cancellare più record contemporaneamente, supponiamo che voglio eliminare tutti gli atleti francesi e che il numero 2 corrisponda alla Francia:

delete form atleti where nazione=2;

Con un’unica istruzione elimino tutti gli atleti francesi dal database. Potrebbe però venire scomodo chiamare il codice 2 associato alla Francia, allora posso utilizzare un’espressione che estrapola il codice 2 in base alla descrizione (francia) della tabella nazione:

SELECT

Nella sua forma più semplice la select lavora su una tabella per volta tipo

select cognome , nome from atleti where nazione=3;

Questa sintassi estrae i record di tutti i nominativi associati alla nazione 3.

Passando alla tabella nazioni, scriviamo una select che dal nome estrae gli id

select idnazione from nazioni where nomeNazione='Francia';

Questa espressione estrae il codice numerico (idnazione) della nazione.

Ritornando al nostro delete che cancella gli utenti francesi, inserisco l’espressione della select:

delete form atleti where nazione=(select idnazione from nazioni where nomeNazione='Francia');

ricordiamoci che l’espressione sarà circoscritta dalle parentesi tonde.

L’ uso di una select dentro un altro comando prende il nome di select annidata o sottoselect o subquery.

select cognome , nome from atleti where eta=12 or eta=19;

Abbiamo estratto tutti gli atleti con età di 12 e 19. Ricordiamoci di specificare nuovamente il campo eta dopo OR e non scrivere eta=12 or 19. Da un punto di visa logico quest’ultima scritta è uguale a scrivere eta=12 or TRUE; perché un valore costante è sempre vero, quindi sarebbero stati estratti tutti i risultati.

Chiediamo la lista degli atleti con età compresa tra 20 e 40 anni:

select cognome , nome from atleti where eta>20 and eta<40;

oppure

select cognome , nome from atleti where eta between 20 and 40;

Gli operatori <, > e between funzionano anche con le date. Aggiungiamo un campo data di nascita alla tabella atleti. L’ho aggiunto con workbench, ma riporto il codice SQL:

ALTER TABLE `Olimpiadi`.`atleti` 
ADD COLUMN `DataNascita` DATE NULL AFTER `nazione`;

aggiungiamo un po’ di records:

UPDATE `Olimpiadi`.`atleti` SET `DataNascita`='1987-11-21' WHERE `idatleta`='2';
UPDATE `Olimpiadi`.`atleti` SET `DataNascita`='1990-06-19' WHERE `idatleta`='3';
UPDATE `Olimpiadi`.`atleti` SET `DataNascita`='1985-04-13' WHERE `idatleta`='4';

Vogliamo estrarre tutti gli atleti nati tra il 1 Gennaio 1982 e il 31 Luglio 1991:

select * from atleti where datanascita between '1982-01-01' and '1991-07-31';

CARATTERI JOLLY

da notare nell’esempio di prima l’asterisco (*) che è un carattere jolly che significa seleziona tutto.

Esistono anche altri caratteri jolly, la percentuale (%) e la sottolineatura o underscore (_)

Vogliamo estrarre tutti gli atleti il cui cognome inizia per Ros :

select * from atleti where cognome like 'Ros%';

Tutti gli atleti dove il cognome assomiglia a (like) Ros .

Supponiamo di volere solo quelli che iniziano con Ros ma siano lunghi 5 caratteri

select * from atleti where cognome like 'Ros__';

Un altro esempio è tutti i cognomi compresi tra 4 e 5 caratteri:

select * from atleti where cognome like '____' or cognome like '_____';

Supponiamo ora di avere 2 records atleti con età non specificata e anche nulla:

select * from atleti where eta is null;

o ce non è nulla:

select * from atleti where eta is not null;

Vogliamo estrarre l’atleta più giovane:

select min (eta) from atleti;

L’ operatore min estrae il record più basso del campo specificato tra parentesi. Il risultato di min è un numero del records.

Vogliamo però sapere il suo nome e cognome, quindi userò una select annidata

select cognome, nome from atleti where eta = (select min(eta) from atleti;);

In egual maniera il funzionamento dell’operatore max per estrarre il risultato più grande

select max (eta) from atleti;

o l’operatore average avg cioè media, infatti calcola l’età media

select avg (eta) from atleti;

In questo caso il nome del campo estratto con l’età media sarà avg(eta), nome di difficile interpretazione (specialmente per un impiegata). Possiamo definire re un nome a nostra scelta con la keyword as (come)

select avg (eta) as media from atleti;

se il nome che vogliamo dare, contiene degli spazi andrà racchiuso tra apici

select avg (eta) as 'età media' from atleti;

Se volessimo il cognome degli atleti più giovani con età media:

select cognome from atleti where eta < (select avg (eta) as 'età media' from atleti);

Spesso interessa più che quali, quanti elementi abbiamo, esempio quanti dodicenni?

select count(*) from atleti where eta=12;

Quanti, viene calcolato da SQL con COUNT che vuole tra parentesi o l’asterisco (*) che sta a significare di non tenere conto se i campi di una riga sono stati compilati, considera nel conteggio comunque quella riga, oppure il nome di una colonna specifica, la quale se non era stata compilata l’intera riga non viene conteggiata:

select count(nome) from atleti where eta=12;

In questo caso il count conteggia le righe di atleti con età 12, ma prende in considerazione solo quelle con i nomi compilati, escludendo dal conteggio quelle con nome null. Sottolineo il fatto che count restituisce il conteggio del numero di righe.

Nel caso abbiamo dei campi con records uguali e volessimo escluderli possiamo usare la keyword distinct :

select distinct eta from atleti ;

Ultimo operatore da affiancare a min max e avg, il sum , che restituisce la somma dei valori di una più colonne

select sum (eta) from atleti ;
Anche se ha poco senso logico in questo caso , restituisce la somma delle età desli atleti.