SQLite Interrogazione: Seleziona, Dove, LIMITE, OFFSET, Conteggio, Raggruppa per
Per scrivere query SQL in un file SQLite database, รจ necessario sapere come funzionano le clausole SELECT, FROM, WHERE, GROUP BY, ORDER BY e LIMIT e come utilizzarle.
Durante questo tutorial imparerai come utilizzare queste clausole e come scrivere SQLite clausole.
Lettura dei dati con Seleziona
La clausola SELECT รจ l'istruzione principale che usi per interrogare un SQLite Banca dati. Nella clausola SELECT, dichiari cosa selezionare. Ma prima della clausola select, vediamo da dove possiamo selezionare i dati utilizzando la clausola FROM.
La clausola FROM viene utilizzata per specificare dove si desidera selezionare i dati. Nella clausola from, รจ possibile specificare una o piรน tabelle o sottoquery da cui selezionare i dati, come vedremo piรน avanti nei tutorial.
Si noti che, per tutti gli esempi seguenti, รจ necessario eseguire sqlite3.exe e aprire una connessione al database di esempio come segue:
Passo 1) In questa fase,
- Aprire Risorse del computer e andare alla seguente directory โC:\sqlite" e
- Quindi apri โsqlite3.exe"
Passo 2) Apri la banca datiโTutorialSampleDB.db" con il seguente comando:
Ora sei pronto per eseguire qualsiasi tipo di query sul database.
Nella clausola SELECT, puoi selezionare non solo un nome di colonna, ma hai molte altre opzioni per specificare cosa selezionare. Come segue:
SELECT *
Questo comando selezionerร tutte le colonne da tutte le tabelle (o sottoquery) a cui si fa riferimento nella clausola FROM. Per esempio:
SELECT * FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Questo selezionerร tutte le colonne sia dalle tabelle studenti che dalle tabelle dipartimenti:
SELEZIONA nometabella.*
Ciรฒ selezionerร tutte le colonne solo dalla tabella "nometabella". Per esempio:
SELECT Students.* FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Questo selezionerร tutte le colonne solo dalla tabella degli studenti:
Un valore letterale
Un valore letterale รจ un valore costante che puรฒ essere specificato nell'istruzione select. ร possibile utilizzare normalmente valori letterali nello stesso modo in cui si utilizzano i nomi delle colonne nella clausola SELECT. Questi valori letterali verranno visualizzati per ogni riga tra le righe restituite dalla query SQL.
Ecco alcuni esempi di diversi valori letterali che puoi selezionare:
- Letterale numerico: numeri in qualsiasi formato come 1, 2.55, ... ecc.
- Stringhe letterali: qualsiasi stringa "USA", "questo รจ un testo di esempio", ... ecc.
- NULL โ Valore NULL.
- Current_TIME โ Ti darร l'ora corrente.
- CURRENT_DATE โ questo ti darร la data corrente.
Questo puรฒ essere utile in alcune situazioni in cui devi selezionare un valore costante per tutte le righe restituite. Ad esempio, se vuoi selezionare tutti gli studenti dalla tabella Studenti, con una nuova colonna chiamata Paese che contiene il valore "USA", puoi farlo:
SELECT *, 'USA' AS Country FROM Students;
Questo ti darร tutte le colonne degli studenti, piรน una nuova colonna "Paese" come questa:
Tieni presente che questa nuova colonna Paese non รจ effettivamente una nuova colonna aggiunta alla tabella. ร una colonna virtuale, creata nella query per visualizzare i risultati e non verrร creata nella tabella.
Nomi e alias
L'alias รจ un nuovo nome per la colonna che consente di selezionare la colonna con un nuovo nome. Gli alias delle colonne vengono specificati utilizzando la parola chiave "AS".
Ad esempio, se desideri selezionare la colonna StudentName da restituire con "Student Name" anzichรฉ "StudentName" puoi assegnarle un alias come questo:
SELECT StudentName AS 'Student Name' FROM Students;
Questo ti darร i nomi degli studenti con il nome "Nome studente" invece di "Nome studente" in questo modo:
Tieni presente che il nome della colonna รจ ancora "Nome dello studenteโ; la colonna StudentName รจ sempre la stessa, non cambia con l'alias.
L'alias non modificherร il nome della colonna; cambierร semplicemente il nome visualizzato nella clausola SELECT.
Inoltre, tieni presente che la parola chiave "AS" รจ facoltativa, puoi inserire il nome dell'alias senza di essa, qualcosa del genere:
SELECT StudentName 'Student Name' FROM Students;
E ti darร esattamente lo stesso risultato della query precedente:
Puoi anche dare alias alle tabelle, non solo alle colonne. Con la stessa parola chiave โASโ. Ad esempio, puoi fare questo:
SELECT s.* FROM Students AS s;
Questo ti darร tutte le colonne nella tabella Studenti:
Questo puรฒ essere molto utile se si stanno unendo piรน tabelle; invece di ripetere il nome completo della tabella nella query, รจ possibile assegnare a ogni tabella un nome alias breve. Ad esempio, nella query seguente:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Questa query selezionerร il nome di ciascun studente dalla tabella "Studenti" con il nome del dipartimento dalla tabella "Dipartimenti":
Tuttavia, la stessa query puรฒ essere scritta in questo modo:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
- Abbiamo assegnato alla tabella Studenti un alias โsโ e alla tabella Dipartimenti un alias โdโ.
- Quindi invece di utilizzare il nome completo della tabella, abbiamo utilizzato i loro alias per fare riferimento ad esse.
- INNER JOIN unisce due o piรน tabelle insieme utilizzando una condizione. Nel nostro esempio, abbiamo unito la tabella Studenti alla tabella Dipartimenti con la colonna DepartmentId. C'รจ anche una spiegazione approfondita per l'INNER JOIN nella sezione "SQLite Unisciโ tutorial.
Questo ti darร l'output esatto della query precedente:
DOVE
Scrivere query SQL utilizzando la sola clausola SELECT con la clausola FROM, come abbiamo visto nella sezione precedente, ti darร tutte le righe delle tabelle. Tuttavia, se desideri filtrare i dati restituiti, devi aggiungere una clausola "WHERE".
La clausola WHERE viene utilizzata per filtrare il set di risultati restituito da Query SQL. Ecco come funziona la clausola WHERE:
- Nella clausola WHERE รจ possibile specificare una "espressione".
- Tale espressione verrร valutata per ogni riga restituita dalle tabelle specificate nella clausola FROM.
- L'espressione verrร valutata come espressione booleana, con un risultato vero, falso o nullo.
- Quindi verranno restituite solo le righe per le quali l'espressione รจ stata valutata con un valore vero e quelle con risultati falsi o nulli verranno ignorate e non incluse nel set di risultati.
- Per filtrare i risultati impostati utilizzando la clausola WHERE, รจ necessario utilizzare espressioni e operatori.
Elenco degli operatori in SQLite e come usarli
Nella sezione seguente spiegheremo come filtrare utilizzando espressioni e operatori.
L'espressione รจ uno o piรน valori letterali o colonne combinati tra loro con un operatore.
Tieni presente che puoi utilizzare le espressioni sia nella clausola SELECT che nella clausola WHERE.
Negli esempi seguenti, proveremo le espressioni e gli operatori sia nella clausola select che nella clausola WHERE. Per mostrarti come funzionano.
Esistono diversi tipi di espressioni e operatori che รจ possibile specificare come segue:
SQLite l'operatore di concatenazione โ||โ
Questo operatore viene utilizzato per concatenare uno o piรน valori letterali o colonne tra loro. Produrrร una stringa di risultati da tutti i valori o colonne letterali concatenati. Per esempio:
SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName FROM Students;
Questo si concatenerร in un nuovo alias โStudentIdConNome"
- Il valore stringa letterale โId con nome: "
- con il valore del โStudentId"colonna e
- con il valore da "Nome dello studente"colonna
SQLite Operatore CAST:
L'operatore CAST viene utilizzato per convertire un valore da un tipo di dati a un altro tipo di dati.
Ad esempio, se hai un valore numerico memorizzato come valore stringa come questo " '12.5' " e vuoi convertirlo in un valore numerico puoi usare l'operatore CAST per farlo in questo modo "CAST('12.5' โโCOME REALE)โ. Oppure se hai un valore decimale come 12.5 e devi ottenere solo la parte intera, puoi convertirlo in un numero intero come questo "CAST(12.5 AS INTEGER)".
Esempio
Nel seguente comando proveremo a convertire valori diversi in altri tipi di dati:
SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;
Questo ti darร :
Il risultato รจ il seguente:
- CAST('12.5' โโAS REAL) โ il valore '12.5' โโรจ un valore stringa, verrร convertito in un valore REAL.
- CAST(12.5 AS INTEGER) โ il valore 12.5 รจ un valore decimale, verrร convertito in un valore intero. La parte decimale verrร troncata e diventerร 12.
SQLite Aritmetica Operatori:
Prendi due o piรน valori letterali numerici o colonne numeriche e restituisci un valore numerico. Gli operatori aritmetici supportati in SQLite siamo:
|
Esempio:
Nell'esempio seguente, proveremo i cinque operatori aritmetici con valori numerici letterali nello stesso
seleziona la clausola:
SELECT 25+6, 25-6, 25*6, 25%6, 25/6;
Questo ti darร :
Nota come qui abbiamo utilizzato un'istruzione SELECT senza una clausola FROM. E questo รจ consentito SQLite purchรฉ selezioniamo valori letterali.
SQLite Operatori di confronto
Confronta due operandi tra loro e restituisci un vero o un falso come segue:
|
Notare che, SQLite esprime il valore vero con 1 e il valore falso con 0.
Esempio:
SELECT 10<6 AS '<', 10<=6 AS '<=', 10>6 AS '>', 10>=6 AS '>=', 10=6 AS '=', 10==6 AS '==', 10!=6 AS '!=', 10<>6 AS '<>';
Questo darร qualcosa del genere:
SQLite Operatori di corrispondenza di pattern
"COMEโ โ viene utilizzato per la corrispondenza dei modelli. Utilizzando โComeโ, รจ possibile cercare valori che corrispondono a un modello specificato utilizzando un carattere jolly.
L'operando a sinistra puรฒ essere un valore letterale stringa o una colonna stringa. Il modello puรฒ essere specificato come segue:
- Contiene modello. Per esempio, NomeStudente MI PIACE '%a%' โ cercherร i nomi degli studenti che contengono la lettera โaโ in qualsiasi posizione nella colonna NomeStudente.
- Inizia con il modello. Per esempio, "NomeStudente MI PIACE 'a%'โ โ cerca i nomi degli studenti che iniziano con la lettera โaโ.
- Termina con il modello. Per esempio, "NomeStudente MI PIACE '%a'โ โ Cerca i nomi degli studenti che terminano con la lettera โaโ.
- Corrispondenza di qualsiasi singolo carattere in una stringa utilizzando la lettera di sottolineatura "_". Per esempio, "NomeStudente COME 'J___'โ โ Cerca i nomi degli studenti lunghi 4 caratteri. Deve iniziare con la lettera "J" e puรฒ contenere altri tre caratteri dopo la lettera "J".
Esempi di corrispondenza dei modelli:
- Ottieni nomi di studenti che iniziano con la lettera "j":
SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';
Risultato:
- Ottieni che i nomi degli studenti finiscano con la lettera "y":
SELECT StudentName FROM Students WHERE StudentName LIKE '%y';
Risultato:
- Ottieni i nomi degli studenti che contengono la lettera "n":
SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';
Risultato:
โGLOBโ โ รจ equivalente all'operatore LIKE, ma GLOB รจ sensibile alle maiuscole e alle minuscole, a differenza dell'operatore LIKE. Ad esempio, i due comandi seguenti restituiranno risultati diversi:
SELECT 'Jack' GLOB 'j%'; SELECT 'Jack' LIKE 'j%';
Questo ti darร :
- La prima istruzione restituisce 0 (falso) perchรฉ l'operatore GLOB distingue tra maiuscole e minuscole, quindi "j" non รจ uguale a "J". Tuttavia, la seconda istruzione restituirร 1 (vero) perchรฉ l'operatore LIKE non fa distinzione tra maiuscole e minuscole, quindi "j" รจ uguale a "J".
Altri operatori:
SQLite and
Un operatore logico che combina una o piรน espressioni. Restituirร vero, solo se tutte le espressioni restituiscono un valore "vero". Tuttavia, restituirร false solo se tutte le espressioni restituiscono un valore โfalseโ.
Esempio:
La query seguente cercherร gli studenti che hanno StudentId > 5 e StudentName che inizia con la lettera N; gli studenti restituiti devono soddisfare le due condizioni:
SELECT * FROM Students WHERE (StudentId > 5) AND (StudentName LIKE 'N%');
Come output, nello screenshot qui sopra, questo ti darร solo "Nancy". Nancy รจ l'unica studentessa che soddisfa entrambe le condizioni.
SQLite OR
Un operatore logico che combina una o piรน espressioni, in modo che se uno degli operatori combinati restituisce vero, restituirร vero. Tuttavia, se tutte le espressioni restituiscono false, verrร restituito false.
Esempio:
La seguente query cercherร gli studenti che hanno StudentId > 5 o StudentName che inizia con la lettera N; gli studenti restituiti devono soddisfare almeno una delle condizioni:
SELECT * FROM Students WHERE (StudentId > 5) OR (StudentName LIKE 'N%');
Questo ti darร :
Come output, nello screenshot sopra, questo ti darร il nome di uno studente con la lettera "n" nel nome piรน l'ID studente con valore>5.
Come puoi vedere il risultato รจ diverso dalla query con l'operatore AND.
SQLite TRA
BETWEEN viene utilizzato per selezionare i valori compresi in un intervallo di due valori. Per esempio, "X TRA Y E Z" restituirร true (1) se il valore X รจ compreso tra i due valori Y e Z. Altrimenti, restituirร false (0). "X TRA Y E Z" รจ equivalente a "X >= Y E X <= Zโ, X deve essere maggiore o uguale a Y e X รจ minore o uguale a Z.
Esempio:
Nella seguente query di esempio, scriveremo una query per ottenere gli studenti con valore Id compreso tra 5 e 8:
SELECT * FROM Students WHERE StudentId BETWEEN 5 AND 8;
Questo darร solo agli studenti con ID 5, 6, 7 e 8:
SQLite IN
Accetta un operando e un elenco di operandi. Restituirร true se il valore del primo operando รจ uguale al valore di uno degli operandi dall'elenco. L'operatore IN restituisce true (1) se l'elenco di operandi contiene il valore del primo operando nei suoi valori. Altrimenti, restituirร false (0).
Come questo: "colIN(x, y, z)โ. Ciรฒ equivale aโ (col=x) o (col=y) o (col=z) ".
Esempio:
La seguente query selezionerร solo gli studenti con ID 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId IN(2, 4, 6, 8);
Mi Piace
La query precedente fornirร lo stesso risultato della query seguente perchรฉ sono equivalenti:
SELECT * FROM Students WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);
Entrambe le query forniscono l'output esatto. Tuttavia, la differenza tra le due query รจ che nella prima query abbiamo utilizzato l'operatore "IN". Nella seconda query abbiamo utilizzato piรน operatori โORโ.
L'operatore IN equivale a utilizzare piรน operatori OR. IL "DOVE IDStudente IN(2, 4, 6, 8)" รจ equivalente a " DOVE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);"
Mi Piace
SQLite NON IN
L'operando โNOT INโ รจ l'opposto dell'operatore IN. Ma con la stessa sintassi; richiede un operando e un elenco di operandi. Restituirร vero se il valore del primo operando non รจ uguale a uno dei valori degli operandi dall'elenco. cioรจ restituirร vero (0) se l'elenco degli operandi non contiene il primo operando. Come questo: "col NON IN(x, y, z)โ. Ciรฒ equivale a โ(col<>x) AND (col<>y) AND (col<>z)".
Esempio:
La seguente query selezionerร gli studenti con ID diversi da uno di questi ID 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId NOT IN(2, 4, 6, 8);
Ti piace questa
La query precedente fornisce lo stesso risultato esatto della query seguente perchรฉ sono equivalenti:
SELECT * FROM Students WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);
Mi Piace
Nello screenshot sopra,
Abbiamo utilizzato piรน operatori diversi da "<>" per ottenere un elenco di studenti che non sono uguali a nessuno dei seguenti ID: 2, 4, 6 o 8. Questa query restituirร tutti gli altri studenti diversi da questi elenchi di ID.
SQLite ESISTE
Gli operatori EXISTS non accettano operandi; dopo รจ necessaria solo una clausola SELECT. L'operatore EXISTS restituirร vero (1) se sono presenti righe restituite dalla clausola SELECT e restituirร falso (0) se non sono presenti righe restituite dalla clausola SELECT.
Esempio:
Nell'esempio seguente, selezioneremo il nome del dipartimento, se l'ID del dipartimento esiste nella tabella studenti:
SELECT DepartmentName FROM Departments AS d WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Questo ti darร :
Solo i tre dipartimentiโInformatica, fisica e arte" verrร restituito. E il nome del dipartimentoโMatematica" non verrร restituito perchรฉ non ci sono studenti in quel dipartimento, quindi l'ID dipartimento non esiste nella tabella degli studenti. Ecco perchรฉ l'operatore EXISTS ha ignorato il "Matematica" Dipartimento.
SQLite NON
Reverse il risultato dell'operatore precedente che viene dopo. Ad esempio:
- NOT BETWEEN โ Restituirร vero se BETWEEN restituisce falso e viceversa.
- NOT LIKE โ Restituirร vero se LIKE restituisce falso e viceversa.
- NOT GLOB โ Restituirร vero se GLOB restituisce falso e viceversa.
- NON ESISTE โ Restituirร vero se EXISTS restituisce falso e viceversa.
Esempio:
Nell'esempio seguente, useremo l'operatore NOT con l'operatore EXISTS per ottenere i nomi dei dipartimenti che non esistono nella tabella Students, che รจ il risultato inverso dell'operatore EXISTS. Quindi, la ricerca verrร eseguita tramite DepartmentId che non esiste nella tabella department.
SELECT DepartmentName
FROM Departments AS d
WHERE NOT EXISTS (SELECT DepartmentId
FROM Students AS s
WHERE d.DepartmentId = s.DepartmentId);
Uscita:
Solo il dipartimentoโMatematica " verrร restituito. Perchรฉ il "Matematicaโ รจ l'unico dipartimento che non esiste nella tabella degli studenti.
Limitare e ordinare
SQLite Ordine
SQLite L'ordine consiste nell'ordinare il risultato in base a una o piรน espressioni. Per ordinare il set di risultati, รจ necessario utilizzare la clausola ORDER BY come segue:
- Innanzitutto, devi specificare la clausola ORDER BY.
- La clausola ORDER BY deve essere specificata alla fine della query; dopo di essa รจ possibile specificare solo la clausola LIMIT.
- Specificare l'espressione con cui ordinare i dati, questa espressione puรฒ essere un nome di colonna o un'espressione.
- Dopo l'espressione รจ possibile specificare una direzione di ordinamento facoltativa. O DESC, per ordinare i dati in ordine decrescente o ASC per ordinare i dati in ordine crescente. Se non ne specificassi nessuno, i dati verrebbero ordinati in modo crescente.
- ร possibile specificare piรน espressioni utilizzando "," tra loro.
Esempio
Nell'esempio seguente selezioneremo tutti gli studenti ordinati in base al loro nome ma in ordine decrescente, quindi in base al nome del dipartimento in ordine crescente:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ORDER BY d.DepartmentName ASC , s.StudentName DESC;
Questo ti darร :
- SQLite ordinerร innanzitutto tutti gli studenti in base al nome del dipartimento in ordine crescente
- Quindi, per ciascun nome di dipartimento, tutti gli studenti sotto quel nome di dipartimento verranno visualizzati in ordine decrescente in base ai loro nomi
SQLite Limite:
Puoi limitare il numero di righe restituite dalla tua query SQL, utilizzando la clausola LIMIT. Ad esempio, LIMIT 10 ti darร solo 10 righe e ignorerร tutte le altre righe.
Nella clausola LIMIT รจ possibile selezionare un numero specifico di righe a partire da una posizione specifica utilizzando la clausola OFFSET. Per esempio, "SPOSTAMENTO LIMITE 4 4" ignorerร le prime 4 righe e restituirร 4 righe a partire dalla quinta riga, quindi otterrai le righe 5,6,7 e 8.
Tieni presente che la clausola OFFSET รจ facoltativa, puoi scriverla come "LIMITE 4, 4" e ti darร i risultati esatti.
Esempio:
Nell'esempio seguente, restituiremo solo 3 studenti a partire dall'ID studente 5 utilizzando la query:
SELECT * FROM Students LIMIT 4,3;
Questo ti darร solo tre studenti a partire dalla riga 5. Quindi ti darร le righe con StudentId 5, 6 e 7:
Rimozione dei duplicati
Se la tua query SQL restituisce valori duplicati, puoi utilizzare il comando "DISTINCT" parola chiave per rimuovere tali duplicati e restituire valori distinti. ร possibile specificare piรน di una colonna dopo il tasto DISTINCT.
Esempio:
La seguente query restituirร valori duplicati dei "nomi dipartimento": qui abbiamo valori duplicati con i nomi IT, Fisica e Arti.
SELECT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Questo ti darร valori duplicati per il nome del dipartimento:
Notare come sono presenti valori duplicati per il nome del dipartimento. Ora utilizzeremo la parola chiave DISTINCT con la stessa query per rimuovere tali duplicati e ottenere solo valori univoci. Come questo:
SELECT DISTINCT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Questo ti darร solo tre valori univoci per la colonna del nome del dipartimento:
Aggregato
SQLite Gli aggregati sono funzioni integrate definite in SQLite che raggrupperร piรน valori di piรน righe in un unico valore.
Ecco gli aggregati supportati da SQLite:
SQLite AVG()
Restituita la media per tutti i valori x.
Esempio:
Nell'esempio seguente otterremo il voto medio che gli studenti devono ottenere da tutti gli esami:
SELECT AVG(Mark) FROM Marks;
Questo ti darร il valore โ18.375โ:
Questi risultati derivano dalla somma di tutti i valori dei voti divisi per il loro conteggio.
COUNT() โ COUNT(X) o COUNT(*)
Restituisce il conteggio totale del numero di volte in cui รจ apparso il valore x. Ed ecco alcune opzioni che puoi utilizzare con COUNT:
- COUNT(x): conta solo i valori x, dove x รจ il nome di una colonna. Ignorerร i valori NULL.
- COUNT(*): conta tutte le righe da tutte le colonne.
- COUNT (DISTINCT x): รจ possibile specificare una parola chiave DISTINCT prima di x che otterrร il conteggio dei valori distinti di x.
Esempio
Nell'esempio seguente, otterremo il conteggio totale dei dipartimenti con COUNT(DepartmentId), COUNT(*) e COUNT(DISTINCT DepartmentId) e le loro differenze:
SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;
Questo ti darร :
Come segue:
- COUNT(DepartmentId) ti fornirร il conteggio di tutti gli ID del dipartimento e ignorerร i valori null.
- COUNT(DISTINCT DepartmentId) fornisce valori distinti di DepartmentId, che sono solo 3. Quali sono i tre diversi valori del nome del dipartimento. Si noti che ci sono 8 valori del nome del dipartimento nel nome dello studente. Ma solo i tre diversi valori che sono matematica, informatica e fisica.
- COUNT(*) conta il numero di righe nella tabella studenti che corrispondono a 10 righe per 10 studenti.
GRUPPO_CONCAT() โ GRUPPO_CONCAT(X) o GRUPPO_CONCAT(X,Y)
La funzione di aggregazione GROUP_CONCAT concatena piรน valori in un unico valore, separandoli con una virgola. Ha le seguenti opzioni:
- GRUPPO_CONCAT(X): concatena tutto il valore di x in un'unica stringa, con la virgola "", utilizzata come separatore tra i valori. I valori NULL verranno ignorati.
- GROUP_CONCAT(X, Y): concatenerร i valori di x in un'unica stringa, con il valore di y utilizzato come separatore tra ciascun valore invece del separatore predefinito ','. Anche i valori NULL verranno ignorati.
- GROUP_CONCAT(DISTINCT X): concatenerร tutti i valori distinti di x in un'unica stringa, con la virgola "", utilizzata come separatore tra i valori. I valori NULL verranno ignorati.
GRUPPO_CONCAT(NomeDipartimento) Esempio
La query seguente concatenerร tutti i valori del nome del dipartimento dalla tabella studenti e dipartimenti in una stringa separata da virgole. Quindi, invece di restituire un elenco di valori, un valore su ogni riga. Restituirร solo un valore su una riga, con tutti i valori separati da virgole:
SELECT GROUP_CONCAT(d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Questo ti darร :
Questo ti darร l'elenco dei valori dei nomi di 8 dipartimenti concatenati in una stringa separata da virgole.
GRUPPO_CONCAT(DISTINCTNomeDipartimento) Esempio
La seguente query concatenerร i valori distinti del nome del dipartimento dalle tabelle studenti e dipartimenti in un'unica stringa separata da virgole:
SELECT GROUP_CONCAT(DISTINCT d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Questo ti darร :
Nota come il risultato รจ diverso dal risultato precedente; sono stati restituiti solo tre valori che sono i nomi dei dipartimenti distinti e i valori duplicati sono stati rimossi.
GRUPPO_CONCAT(NomeDipartimento ,'&') Esempio
La seguente query concatenerร tutti i valori della colonna del nome del dipartimento dalle tabelle studenti e dipartimenti in un'unica stringa, ma con il carattere '&' al posto della virgola come separatore:
SELECT GROUP_CONCAT(d.DepartmentName, '&') FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Questo ti darร :
Notare come viene utilizzato il carattere "&" al posto del carattere predefinito "," per separare i valori.
SQLite MASSIMO() e MINIMO()
MAX(X) restituisce il valore piรน alto tra i valori X. MAX restituirร un valore NULL se tutti i valori di x sono nulli. Mentre MIN(X) restituisce il valore piรน piccolo tra i valori X. MIN restituirร un valore NULL se tutti i valori di X sono nulli.
Esempio
Nella seguente query, utilizzeremo le funzioni MIN e MAX per ottenere il punteggio piรน alto e il punteggio piรน basso da โMarks" tavolo:
SELECT MAX(Mark), MIN(Mark) FROM Marks;
Questo ti darร :
SQLite SOMMA(x), Totale(x)
Entrambi restituiranno la somma di tutti i valori x. Ma sono diversi in quanto segue:
- SUM restituirร null se tutti i valori sono null, ma Total restituirร 0.
- TOTAL restituisce sempre valori in virgola mobile. SOMMA restituisce un valore intero se tutti i valori x sono interi. Tuttavia, se i valori non sono interi, verrร restituito un valore in virgola mobile.
Esempio
Nella query seguente useremo SUM e total per ottenere la somma di tutti i voti nella โMarks"tabelle:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks;
Questo ti darร :
Come puoi vedere, TOTAL restituisce sempre un punto mobile. Ma SUM restituisce un valore intero perchรฉ i valori nella colonna "Mark" potrebbero essere numeri interi.
Differenza tra SUM e TOTALE esempio:
Nella seguente query mostreremo la differenza tra SUM e TOTAL quando ottengono la SOMMA dei valori NULL:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;
Questo ti darร :
Tieni presente che non ci sono segni per TestId = 4, quindi ci sono valori null per quel test. SUM restituisce un valore nullo come spazio vuoto, mentre TOTAL restituisce 0.
Raggruppa per
La clausola GROUP BY viene utilizzata per specificare una o piรน colonne che verranno utilizzate per raggruppare le righe in gruppi. Le righe con gli stessi valori verranno raccolte (organizzate) insieme in gruppi.
Per qualsiasi altra colonna non inclusa nel raggruppamento di colonne, รจ possibile utilizzare una funzione di aggregazione.
Esempio:
La seguente query ti fornirร il numero totale di studenti presenti in ciascun dipartimento.
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName;
Questo ti darร :
La clausola GROUPBY DepartmentName raggrupperร tutti gli studenti in gruppi, uno per ciascun nome di dipartimento. Per ogni gruppo di โdipartimentoโ, conterร gli studenti presenti.
Clausola AVENTE
Se desideri filtrare i gruppi restituiti dalla clausola GROUP BY, puoi specificare una clausola "HAVING" con l'espressione dopo la clausola GROUP BY. L'espressione verrร utilizzata per filtrare questi gruppi.
Esempio
Nella seguente query selezioneremo i dipartimenti che hanno solo due studenti:
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName HAVING COUNT(s.StudentId) = 2;
Questo ti darร :
La clausola HAVING COUNT(S.StudentId) = 2 filtrerร i gruppi restituiti e restituirร solo quei gruppi che contengono esattamente due studenti. Nel nostro caso, il dipartimento artistico ha 2 studenti, quindi viene visualizzato nell'output.
SQLite Query e sottoquery
All'interno di qualsiasi query, puoi utilizzare un'altra query in SELECT, INSERT, DELETE, UPDATE o all'interno di un'altra sottoquery.
Questa query nidificata รจ chiamata sottoquery. Vedremo ora alcuni esempi di utilizzo delle sottoquery nella clausola SELECT. Tuttavia, nel tutorial sulla modifica dei dati, vedremo come utilizzare le sottoquery con le istruzioni INSERT, DELETE e UPDATE.
Utilizzo della sottoquery nell'esempio della clausola FROM
Nella query seguente includeremo una sottoquery all'interno della clausola FROM:
SELECT s.StudentName, t.Mark FROM Students AS s INNER JOIN ( SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId ) ON s.StudentId = t.StudentId;
La domanda:
SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId
La query precedente รจ chiamata qui sottoquery perchรฉ รจ nidificata all'interno della clausola FROM. Si noti che gli abbiamo assegnato un nome alias "t" in modo da poter fare riferimento alle colonne restituite da esso nella query.
Questa query ti darร :
Quindi nel nostro caso,
- s.StudentName viene selezionato dalla query principale che fornisce il nome degli studenti e
- t.Mark รจ selezionato dalla sottoquery; che dร i voti ottenuti da ciascuno di questi studenti
Utilizzo della sottoquery nell'esempio della clausola WHERE
Nella seguente query includeremo una sottoquery nella clausola WHERE:
SELECT DepartmentName
FROM Departments AS d
WHERE NOT EXISTS (SELECT DepartmentId
FROM Students AS s
WHERE d.DepartmentId = s.DepartmentId);
La domanda:
SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId
La query precedente รจ chiamata qui sottoquery perchรฉ รจ nidificata nella clausola WHERE. La sottoquery restituirร i valori DepartmentId che verranno utilizzati dall'operatore NOT EXISTS.
Questa query ti darร :
Nella query precedente, abbiamo selezionato il dipartimento in cui non sono iscritti studenti. Che รจ il dipartimento di "Matematica" qui.
Impostato Operazioni โ UNIONE,Intersezione
SQLite supporta le seguenti operazioni SET:
UNIONE E UNIONE TUTTI
Combina uno o piรน set di risultati (un gruppo di righe) restituiti da piรน istruzioni SELECT in un unico set di risultati.
UNION restituirร valori distinti. Tuttavia, UNION ALL non includerร e includerร duplicati.
Tieni presente che il nome della colonna sarร il nome della colonna specificato nella prima istruzione SELECT.
UNIONE Esempio
Nell'esempio seguente, otterremo l'elenco di DepartmentId dalla tabella studenti e l'elenco di DepartmentId dalla tabella dipartimenti nella stessa colonna:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION SELECT DepartmentId FROM Departments;
Questo ti darร :
La query restituisce solo 5 righe che rappresentano i valori ID del dipartimento distinti. Notare il primo valore che รจ il valore null.
SQLite UNIONE TUTTI Esempio
Nell'esempio seguente, otterremo l'elenco di DepartmentId dalla tabella studenti e l'elenco di DepartmentId dalla tabella dipartimenti nella stessa colonna:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION ALL SELECT DepartmentId FROM Departments;
Questo ti darร :
La query restituirร 14 righe, 10 righe dalla tabella studenti e 4 dalla tabella dipartimenti. Tieni presente che sono presenti duplicati nei valori restituiti. Inoltre, tieni presente che il nome della colonna era quello specificato nella prima istruzione SELECT.
Ora vediamo come UNION all darร risultati diversi se sostituiamo UNION ALL con UNION:
SQLite INTERSEZIONE
Restituisce i valori presenti in entrambi i set di risultati combinati. I valori presenti in uno dei set di risultati combinati verranno ignorati.
Esempio
Nella query seguente selezioneremo i valori DepartmentId presenti in entrambe le tabelle Students e Departments nella colonna DepartmentId:
SELECT DepartmentId FROM Students Intersect SELECT DepartmentId FROM Departments;
Questo ti darร :
La query restituisce solo tre valori 1, 2 e 3. Quali sono i valori presenti in entrambe le tabelle.
Tuttavia, i valori null e 4 non sono stati inclusi perchรฉ il valore null esiste solo nella tabella degli studenti e non nella tabella dei dipartimenti. E il valore 4 esiste nella tabella dei dipartimenti e non nella tabella degli studenti.
Ecco perchรฉ entrambi i valori NULL e 4 sono stati ignorati e non inclusi nei valori restituiti.
SALVO
Supponiamo di avere due elenchi di righe, list1 e list2, e di volere solo le righe di list1 che non esistono in list2, puoi usare la clausola "EXCEPT". La clausola EXCEPT confronta i due elenchi e restituisce quelle righe che esistono in list1 e non esistono in list2.
Esempio
Nella query seguente selezioneremo i valori DepartmentId presenti nella tabella departments e non presenti nella tabella students:
SELECT DepartmentId FROM Departments EXCEPT SELECT DepartmentId FROM Students;
Questo ti darร :
La query restituisce solo il valore 4. Che รจ l'unico valore esistente nella tabella dei dipartimenti e non esiste nella tabella degli studenti.
Gestione NULL
Il "NULL" Il valore รจ un valore speciale in SQLite. Viene utilizzato per rappresentare un valore sconosciuto o mancante. Tieni presente che il valore null รจ totalmente diverso da "0" o un valore "" vuoto. Poichรฉ 0 e il valore vuoto sono valori noti, tuttavia, il valore null รจ sconosciuto.
I valori NULL richiedono una gestione speciale in SQLite, vedremo ora come gestire i valori NULL.
Cerca valori NULL
Non puoi usare il normale operatore di uguaglianza (=) per cercare i valori nulli. Ad esempio, la query seguente cerca gli studenti che hanno un valore DepartmentId nullo:
SELECT * FROM Students WHERE DepartmentId = NULL;
Questa query non darร alcun risultato:
Poichรฉ il valore NULL non รจ uguale a nessun altro valore incluso un valore null stesso, ecco perchรฉ non ha restituito alcun risultato.
- Tuttavia, per far funzionare la query, รจ necessario utilizzare il file "ร ZERO" operatore per cercare valori nulli come segue:
SELECT * FROM Students WHERE DepartmentId IS NULL;
Questo ti darร :
La query restituirร gli studenti che hanno un valore DepartmentId null.
- Se vuoi ottenere quei valori che non sono nulli, allora devi usare il comando "NON ร NULLโ operatore in questo modo:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;
Questo ti darร :
La query restituirร gli studenti che non hanno un valore DepartmentId NULL.
Risultati condizionali
Se disponi di un elenco di valori e desideri selezionarne uno in base ad alcune condizioni. Per questo, la condizione per quel particolare valore dovrebbe essere vera per essere selezionata.
L'espressione CASE valuterร questo elenco di condizioni per tutti i valori. Se la condizione รจ vera, restituirร quel valore.
Ad esempio, se hai una colonna "Voto" e vuoi selezionare un valore di testo in base al valore del voto come segue:
โ โEccellenteโ se il voto รจ superiore a 85.
โ โMolto buonoโ se il voto รจ compreso tra 70 e 85.
โ โBuonoโ se il voto รจ compreso tra 60 e 70.
Quindi puoi usare l'espressione CASE per farlo.
Questo puรฒ essere utilizzato per definire una logica nella clausola SELECT in modo da poter selezionare determinati risultati in base a determinate condizioni, come ad esempio l'istruzione if.
L'operatore CASE puรฒ essere definito con diverse sintassi come segue:
- Puoi utilizzare diverse condizioni:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN condition3 THEN result3 โฆ ELSE resultn END
- Oppure puoi utilizzare una sola espressione e inserire diversi valori possibili tra cui scegliere:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 WHEN value3 THEN result3 โฆ ELSE restuln END
Tieni presente che la clausola ELSE รจ facoltativa.
Esempio
Nell'esempio seguente, utilizzeremo il CASI espressione con NULL valore nella colonna ID dipartimento nella tabella Studenti per visualizzare il testo 'Nessun dipartimento' come segue:
SELECT
StudentName,
CASE
WHEN DepartmentId IS NULL THEN 'No Department'
ELSE DepartmentId
END AS DepartmentId
FROM Students;
- L'operatore CASE controllerร il valore di DepartmentId se รจ nullo o meno.
- Se รจ un valore NULL, selezionerร il valore letterale "No Department" invece del valore DepartmentId.
- Se non รจ un valore null, selezionerร il valore della colonna DepartmentId.
Questo ti darร l'output come mostrato di seguito:
Espressione di tabella comune
Le espressioni di tabella comuni (CTE) sono sottoquery definite all'interno dell'istruzione SQL con un determinato nome.
Ha un vantaggio rispetto alle sottoquery perchรฉ รจ definita dalle istruzioni SQL e renderร le query piรน facili da leggere, gestire e comprendere.
Un'espressione di tabella comune puรฒ essere definita inserendo la clausola WITH davanti alle istruzioni SELECT come segue:
WITH CTEname AS ( SELECT statement ) SELECT, UPDATE, INSERT, or update statement here FROM CTE
Il "Nome CTE" รจ qualsiasi nome tu possa dare al CTE, puoi usarlo per farvi riferimento in seguito. Nota che puoi definire istruzioni SELECT, UPDATE, INSERT o DELETE sui CTE
Vediamo ora un esempio di come utilizzare CTE nella clausola SELECT.
Esempio
Nell'esempio seguente, definiremo un CTE da un'istruzione SELECT e lo utilizzeremo in seguito in un'altra query:
WITH AllDepartments AS ( SELECT DepartmentId, DepartmentName FROM Departments ) SELECT s.StudentId, s.StudentName, a.DepartmentName FROM Students AS s INNER JOIN AllDepartments AS a ON s.DepartmentId = a.DepartmentId;
In questa query, abbiamo definito un CTE e gli abbiamo dato il nome โTutti i dipartimentiโ. Questo CTE รจ stato definito da una query SELECT:
SELECT DepartmentId, DepartmentName FROM Departments
Quindi, dopo aver definito il CTE, lo abbiamo utilizzato nella query SELECT che segue.
Tieni presente che le espressioni di tabella comuni non influiscono sull'output della query. ร un modo per definire una vista logica o una sottoquery per riutilizzarle nella stessa query. Le espressioni di tabella comuni sono come una variabile che dichiari e la riutilizzi come sottoquery. Solo l'istruzione SELECT influisce sull'output della query.
Questa query ti darร :
Query avanzate
Le query avanzate sono quelle query che contengono join complessi, sottoquery e alcuni aggregati. Nella sezione seguente vedremo un esempio di query avanzata:
Dove otteniamo il,
- Nomi dei dipartimenti con tutti gli studenti per ciascun dipartimento
- Nomi degli studenti separati da virgola e
- Mostrare che il dipartimento ha almeno tre studenti al suo interno
SELECT d.DepartmentName, COUNT(s.StudentId) StudentsCount, GROUP_CONCAT(StudentName) AS Students FROM Departments AS d INNER JOIN Students AS s ON s.DepartmentId = d.DepartmentId GROUP BY d.DepartmentName HAVING COUNT(s.StudentId) >= 3;
Abbiamo aggiunto a ISCRIVITI clausola per ottenere DepartmentName dalla tabella Departments. Successivamente abbiamo aggiunto una clausola GROUP BY con due funzioni aggregate:
- โCOUNTโ per contare gli studenti per ogni gruppo di dipartimento.
- GROUP_CONCAT per concatenare gli studenti per ciascun gruppo con virgole separate in un'unica stringa.
- Dopo il GRUPPO BY, abbiamo utilizzato la clausola HAVING per filtrare i dipartimenti e selezionare solo quelli che hanno almeno 3 studenti.
Il risultato sarร il seguente:
Sintesi
Questa รจ stata un'introduzione alla scrittura SQLite query e nozioni di base sull'esecuzione di query sul database e su come filtrare i dati restituiti. Ora puoi scrivere il tuo SQLite interrogazioni.




















































