Structured Query Language è un linguaggio standard per database che viene usato per creare, mantenere e recuperare il database relazionale. Di seguito ci sono alcuni fatti interessanti su SQL.
- SQL è case insensitive. Ma è una pratica raccomandata usare le parole chiave (come SELECT, UPDATE, CREATE, ecc) in lettere maiuscole e usare le cose definite dall’utente (come il nome della tabella, il nome della colonna, ecc) in lettere piccole.
- Possiamo scrivere commenti in SQL usando “-” (doppio trattino) all’inizio di qualsiasi linea.
- SQL è il linguaggio di programmazione per i database relazionali (spiegato sotto) come MySQL, Oracle, Sybase, SQL Server, Postgre, ecc. Altri database non relazionali (chiamati anche NoSQL) come MongoDB, DynamoDB, ecc. non usano SQL
- Anche se esiste uno standard ISO per SQL, la maggior parte delle implementazioni varia leggermente nella sintassi. Quindi possiamo incontrare query che funzionano in SQL Server ma non in MySQL.
Che cos’è il database relazionale?
Il database relazionale significa che i dati sono memorizzati e recuperati in forma di relazioni (tabelle). La tabella 1 mostra il database relazionale con una sola relazione chiamata STUDENT che memorizza ROLL_NO, NAME, INDIRIZZO, TELEFONO ed ETÀ degli studenti.
STUDENTE
ROLL_NO | NOME | INDIRIZZO | PHONE | ETÀ |
1 | RAM | DELHI | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9652431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | DELHI | 9156768971 | 18 |
TABELLA 1
Queste sono alcune importanti terminologie che sono usate in termini di relazione.
Attributo: Gli attributi sono le proprietà che definiscono una relazione. ad esempio; ROLL_NO, NAME ecc.
Tupla: Ogni riga nella relazione è conosciuta come tupla. La relazione di cui sopra contiene 4 tuple, una delle quali è mostrata come:
1 | RAM | DELHI | 9455123451 | 18 |
Grado: Il numero di attributi nella relazione è noto come grado della relazione. La relazione STUDENT definita sopra ha grado 5.
Cardinalità: Il numero di tuple in una relazione è noto come cardinalità. La relazione STUDENT definita sopra ha cardinalità 4.
Colonna: La colonna rappresenta l’insieme dei valori di un particolare attributo. La colonna ROLL_NO è estratta dalla relazione STUDENT.
ROLL_NO
Le query per trattare con il database relazionale possono essere categorie come:
Data Definition Language: Viene utilizzato per definire la struttura del database. ad esempio; CREATE TABLE, ADD COLUMN, DROP COLUMN e così via.
Data Manipulation Language: È usato per manipolare i dati nelle relazioni. ad esempio; INSERT, DELETE, UPDATE e così via.
Linguaggio di interrogazione dei dati: Si usa per estrarre i dati dalle relazioni. ad esempio; SELECT
Prima consideriamo il linguaggio di interrogazione dei dati. Una query generica per recuperare da un database relazionale è:
- SELECT Attribute_List FROM R1,R2….RM
- ]
- ];
La parte della query rappresentata dalla dichiarazione 1 è obbligatoria se si vuole recuperare da un database relazionale. Le dichiarazioni scritte all’interno sono opzionali. Esamineremo le possibili combinazioni di query sulla relazione mostrata nella Tabella 1.
Caso 1: Se vogliamo recuperare gli attributi ROLL_NO e NAME di tutti gli studenti, la query sarà:
SELECT ROLL_NO, NAME FROM STUDENT;
ROLL_NO | NOME |
1 | RAM |
2 | RAMESH |
3 | SUJIT |
4 | SURESH |
Caso 2: Se vogliamo recuperare ROLL_NO e NAME degli studenti il cui ROLL_NO è maggiore di 2, la query sarà:
SELECT ROLL_NO, NAME FROM STUDENT WHERE ROLL_NO>2;
ROLL_NO | NAME |
3 | SUJIT |
4 | SURESH |
Caso 3: Se vogliamo recuperare tutti gli attributi degli studenti, possiamo scrivere * al posto di scrivere tutti gli attributi come:
SELECT * FROM STUDENT WHERE ROLL_NO>2;
ROLL_NO | NAME | INDIRIZZO | PHONE | ETÀ |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | DELHI | 9156768971 | 18 |
Caso 4: Se vogliamo rappresentare la relazione in ordine crescente per ETÀ, possiamo usare la clausola ORDER BY come:
SELECT * FROM STUDENT ORDER BY AGE;
ROLL_NO | NOME | INDIRIZZO | PHONE | ETÀ |
1 | RAM | DELHI | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9652431543 | 18 |
4 | SURESH | DELHI | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
Nota: ORDER BY AGE è equivalente a ORDER BY AGE ASC. Se vogliamo recuperare i risultati in ordine decrescente di ETÀ, possiamo usare ORDER BY AGE DESC.
Caso 5: Se vogliamo recuperare i valori distinti di un attributo o di un gruppo di attributi, si usa DISTINCT come in:
SELECT DISTINCT ADDRESS FROM STUDENT;
INDIRIZZO
DELHI
GURGAON
ROHTAK
Se DISTINCT non è usato, DELHI sarà ripetuto due volte nel set di risultati. Prima di capire GROUP BY e HAVING, abbiamo bisogno di capire le funzioni di aggregazione in SQL.
FUNZIONI DI AGGREGAZIONE: Le funzioni di aggregazione sono usate per eseguire operazioni matematiche sui valori dei dati di una relazione. Alcune delle comuni funzioni di aggregazione usate in SQL sono:
- COUNT: La funzione Count è usata per contare il numero di righe in una relazione. es;
SELECT COUNT (PHONE) FROM STUDENT;
COUNT(PHONE)
- SUM: La funzione SUM è usata per aggiungere i valori di un attributo in una relazione. es;
SELECT SUM (AGE) FROM STUDENT;
SUM(AGE)
Nello stesso modo, MIN, MAX e AVG possono essere usati. Come abbiamo visto sopra, tutte le funzioni di aggregazione restituiscono solo 1 riga.
AVERAGE: Dà i valori medi delle tabelle. E’ anche definita come somma divisa per i valori di conteggio.
Sintassi:AVG(attributename)
O
Sintassi:SUM(attributename)/COUNT(attributename)
La sintassi di cui sopra recupera anche il valore medio dei tuppi.
MAXIMUM:Estrae il valore massimo tra l’insieme delle tartine.
Sintassi:MAX(attributename)
MINIMUM:Estrae il valore minimo tra l’insieme di tutte le tartine.
Sintassi:MIN(attributename)
GROUP BY: Group by è usato per raggruppare le tuple di una relazione sulla base di un attributo o di un gruppo di attributi. È sempre combinato con la funzione di aggregazione che è calcolata sul gruppo. ad esempio;
SELECT ADDRESS, SUM(AGE) FROM STUDENTGROUP BY (ADDRESS);
In questa query, SUM(AGE) sarà calcolata ma non per l’intera tabella ma per ogni indirizzo. cioè; somma di AGE per l’indirizzo DELHI(18+18=36) e similmente anche per altri indirizzi. L’output è:
INDIRIZZO | SUM(AGE) |
DELHI | 36 |
GURGAON | 18 |
ROHTAK | 20 |
Se proviamo ad eseguire la query indicata di seguito, risulterà in un errore perché anche se abbiamo calcolato SUM(AGE) per ogni indirizzo, ci sono più di 1 ROLL_NO per ogni indirizzo che abbiamo raggruppato. Quindi non può essere visualizzato nel set di risultati. Abbiamo bisogno di usare le funzioni aggregate sulle colonne dopo l’istruzione SELECT per dare un senso all’insieme risultante quando usiamo GROUP BY.
SELECT ROLL_NO, ADDRESS, SUM(AGE) FROM STUDENTGROUP BY (ADDRESS);
NOTA: Un attributo che non fa parte della clausola GROUP BY non può essere usato per la selezione. Qualsiasi attributo che fa parte della clausola GROUP BY può essere usato per la selezione, ma non è obbligatorio. Ma potremmo usare gli attributi che non fanno parte della clausola GROUP BY in una funzione aggregata.
Quiz su SQL