Ho già scritto due articoli su questo argomento, che consiglio di andare a leggere. Ho deciso di continuare scrivendo una nuova guida un po’ più avanzata rispetto alle precedenti.
Oggi infatti effettueremo delle query avanzate con il database. Effettueremo query avanzate, usando il comando SELECT, per riuscire a leggere dal database dei dati in modo avanzato.
Dato che oggi effettueremo delle query più avanzate, ci servirà un database ben fornito. Io ho scelto questo già pronto, che mi sembra perfetto per le esercitazioni.
Ora possiamo iniziare.
Per prima cosa vediamo una problematica. Ho la necessità di selezionare dei determinati parametri, dando un nome specifico alle colonne.
Come vedrete ora i dati vengono mostrati sotto il nome della colonna. Quindi ad esempio i nomi dei vari customer sono sotto la voce CustomerName.
Questo può risultare un problema, se si dovesse avere la necessità di presentare alcuni dati in un certo modo. Per fortuna esiste un comando, ovvero As, che permette di fare tutto ciò senza problemi.
Es:
SELECT CustomerName As Nome , Address As Indirizzo FROM Customers;
Il risultato prodotto è questo:
Come possiamo notare, il risultato è proprio come sperato.
Andiamo avanti. Ora mettiamo che io voglia far visualizzare il nome e l’indirizzo di tutti i Customer con il nome che inizia per “f”
SELECT CustomerName As Nome , Address As Indirizzo FROM Customers WHERE CustomerName Like “F%”;
Il comando utilizzato in questo caso è LIKE. Questo comando, come nella lingua inglese, vuol dire come. Una somiglianza a. Ho inserito dopo il comando il parametro di somiglianza. In questo caso la lettera f, seguita dal simbolo di percentuale. Questo per fare in modo che il comando comprendesse che io volessi che solo il primo carattere del nome dovesse essere la f e non l’intero nome.
Il risultato finale è questo:
Vediamo cosa succede se io togliessi il simbolo di percentuale.
SELECT CustomerName As Nome , Address As Indirizzo FROM Customers WHERE CustomerName Like “F”;
Il risultato prodotto sarebbe questo:
Eh già il risultato è vuoto. Questo perché, come ho detto anche in precedenza, senza il %, il comando LIKE comprende che tutta la stringa di testo deve essere uguale ad f e non solo la prima lettera.
Ora dal database scegliamo la tabella Employees dal menu in alto a destra
La tabella è organizzata in questo modo
In questo caso noi vogliamo selezionare il nome, cognome e le note per tutti i lavoratori nati tra il 1940 e il 1970. Come facciamo?
In questo ci viene di aiuto il comando BETWEEN.
SELECT LastName As Cognome, FirstName As Nome, BirthDate As AnnoNascita, Notes As VarieAnnotazioni FROM Employees
WHERE BirthDate BETWEEN #01-01-1940# AND #01-01-1970#;
Il comando BETWEEN ha bisogno di due condizioni. Il comando BETWEEN infatti significa “tra due valori”. Quindi dopo aver inserito in comando inseriamo il primo valore, poi dopo ne specifichiamo un altro, utilizzando il comando AND. Lo so, potrete fare confusione, anche perché il comando AND viene usato per inserire molteplici condizioni in una SELECT. Ma dopo aver scritto il comando BETWEEN nella sua forma corretta, è possibile sempre inserire ulteriori condizioni alla query usando sempre AND.
Le date le ho inserite tra due cancelletti. Senza, mysql non avrebbe capito che doveva trattare i dati inseriti come date.
Ecco qui il risultato prodotto.
Ora complichiamo questa query, facendo in modo che vengano visualizzati i dati delle persone nate tra il 1940 e il 1960 e con l’iniziale del cognome tra la a e la f. Inoltre farò ordinare i risultati in ordine alfabetico e con le date di nascita in ordine crescente. Quest’ultima parte la si può effettuare grazie al comando ORDER BY.
Questo comando accetta due parametri. ASC e DESC. ASC permette di ordinare i risultati in ordine crescente e DESC in ordine decrescente.
Come vedremo nella query, la funzione ORDER BY necessita anche del nome della tabella in cui si andrà applicare la funzione. È possibile processare più tabelle con questo comando usando la “,”.
SELECT LastName As Cognome, FirstName As Nome, BirthDate As AnnoNascita, Notes As VarieAnnotazioni FROM Employees
WHERE BirthDate BETWEEN #01-01-1940# AND #01-01-1970# AND LastName BETWEEN “A%” AND “F%” ORDER BY LastName ASC, BirthDate ASC;
Per fare in modo che vengano selezionati soltanto i risultati delle persone che hanno un cognome che inizia con una lettera contenuta nell’intervallo “a” e “f”, incluse queste due lettere, non c’è bisogno di usare il comando LIKE, in quanto è incompatibile con il comando BETWEEN.
Sarà sufficiente inserire le lettere che si vogliono mostrare.
Il risultato prodotto quindi è:
Ora mettiamo caso che mi servano 10 risultati della tabella Employees, con il cognome ordinato in modo decrescente. Per fare questo utilizzeremo il comando LIMIT. LIMIT è un comando che serve ad interrompere la query dopo aver raggiunto il risultato voluto. Questa funzione accetta semplicemente il numero di risultati massimi che deve far stampare dalla query.
SELECT LastName As Cognome, FirstName As Nome, BirthDate As DataNascita, Notes As VarieAnnotazioni FROM Employees ORDER BY LastName DESC LIMIT 10;
Il risultato prodotto è:
Bene. Ora andiamo ad aggiungere qualcosa di nuovo.
Ora introduciamo il concetto di JOIN.
Questo concetto prevede di selezionare e stampare valori provenienti da più tabelle diverse. Quindi nel comando FROM andremo ad inserire più di un nome di una tabella.
Ad esempio, nel mio caso, voglio stampare il nome dei vari Customers e il nome e cognome delle persone assunte (Employees).
Vediamo come si fa grazie a questa query
SELECT CustomerName As NomeCustomer, LastName As Cognome, FirstName As Nome FROM Customers, Employees;
Il risultato prodotto sarà questo:
Come funzionano le JOIN? In pratica quando pratichiamo questo tipo di query, il database mysql creerà una tabella fittizia nella quale verranno inseriti i valori contenuti nelle tabelle richiamate.
Se una tabella contiene meno rows (righe) rispetto ad un’altra (ad esempio employess contiene meno righe rispetto a Customers), si duplicheranno i dati delle righe per poter coprire “lo spazio bianco”. Ma questo non è un problema, in quanto si può controllare il fenomeno con il comando DISTINCT e il comando LIMIT.
Questo comando serve per evitare che ci siano delle righe doppie all’interno del risultato della query.
Anche se utilizzeremo il comando DISTINCT ci saranno sempre molte righe come risultato. Per limitarle dovremmo utilizzare il comando LIMIT, già visto in precedenza.
Vediamo come funziona:
SELECT DISTINCT CustomerName As NomeCustomer, LastName As Cognome, FirstName As Nome FROM Customers, Employees;
Produce il seguente risultato:
Ora vediamo qualcosa di più semplice, ma che potrebbe risultare importante per molte operazioni
Sempre effettuando delle query, usando il comando SELECT, è possibile stampare i risultati di diversi valori numerici contenuti nel database, effettuandoci diverse operazioni.
Per esempio è possibile effettuare la divisione su un valore numerico. La divisione si effettua usando due comandi: DIV e “/”. Il comando DIV si utilizza per effettuare delle divisioni intere (senza resto). Il comando “/” si utilizza per effettuare delle divisioni decimali (che il risultato potrebbe avere quindi un resto).
Un esempio di query con la divisione è questo
SELECT Price / 2 As Prezzo FROM Products;
Il risultato prodotto è questo:
Come operatori operazionali è possibile usare:
Somma: +
Sottrazione: –
Divisione: DIV, /
Prodotto: *
Questi operatori si utilizzano nello stesso modo che abbiamo appena visto per la divisione.
Vediamo qualche altro operatore che ci può tornare utile. Andando fuori dal campo delle operazioni aritmetiche, ritorniamo alle classiche query che abbiamo visto finora. E qui ci rimaniamo ancora per un attimo, per introdurre un’altro operatore. Abbiamo visto il comando LIKE, molto utile per comparare delle stringhe. Ma se volessimo comparare una stringa con il valore di un’altra (quindi un paragone di stringa intera e non parte di essa, come ci permette di fare LIKE), in modo più veloce, possiamo usare l’operatore =.
Vediamo come funziona con questa query
SELECT * FROM Suppliers WHERE City = ‘Londona’;
Come possiamo notare, come molta facilità, abbiamo imposto come condizione, di selezionare tutti i valori della tabella Suppliers che avessero sotto City, il valore Londona.
Il risultato della query è il seguente:
Vediamo il contrario dell’operatore appena visto, ovvero “!=”, oppure “<>”, che producono lo stesso risultato.
Ci sono 2 operatori che fanno la stessa identica cosa, perché l’operatore “!=” potrebbe non funzionare con alcune versione di mysql e non funziona su mysql con motore innoDB.
Vediamo un esempio:
SELECT * FROM Suppliers WHERE City <> ‘Londona’;
Che produce il seguente risultato:
Esiste poi l’operatore maggiore “>” e minore “<“ e maggiore uguale “>=”. Questi operatori funzionano nello stesso modo visto anche con l’operatore di uguaglianza e disuguaglianza.
Vediamo altri due operatori, ovvero:
IS NULL
IS NOT NULL
Questi due operatori servono rispettivamente per controllare se un determinato campo in una tabella è vuoto (null) o pieno (not null) e quindi usarlo come una condizione.
Ovvero: Se il valore della colonna del prezzo non è vuoto, seleziona il valore, altrimenti no.
Vediamo quindi una query
SELECT * FROM Products WHERE Price IS NOT NULL;
Il risultato è:
Se lanciamo la query sostituendo IS NOT NULL con IS NULL, ovviamente non stamperà nulla, in quanto la colonna del prezzo è stata riempita di valori.
SELECT * FROM Products WHERE Price IS NULL;
Infatti il risultato è:
Bene. Direi che per oggi abbiamo visto diversi comandi molto interessanti per poter ampliare le funzioni delle query. Ora siamo in grado di effettuare query complesse, in grado di estrapolare il valore necessario o di ottenere i dati necessari nel modo più mirato possibile.
Che dire quindi? Beh praticamente niente, se non che spero che questa nuova parte di documentazione su mysql vi sia stata di aiuta e l’abbiate trovata interessante.
Con questo vi saluto e alla prossima!