SQLite Forespørgsel: Vælg, Hvor, LIMIT, OFFSET, Count, Group By
At skrive SQL-forespørgsler i en SQLite database, skal du vide, hvordan SELECT-, FROM-, WHERE-, GROUP BY-, ORDER BY- og LIMIT-klausulerne fungerer, og hvordan du bruger dem.
I løbet af denne øvelse lærer du, hvordan du bruger disse klausuler, og hvordan du skriver SQLite klausuler.
Læsning af data med Select
SELECT-sætningen er hovedsætningen, du bruger til at forespørge på en SQLite database. I SELECT-sætningen angiver du, hvad du skal vælge. Men før select-klausulen, lad os se, hvorfra vi kan vælge data ved hjælp af FROM-klausulen.
FROM-sætningen bruges til at angive, hvor du vil vælge data. I fra-klausulen kan du angive en eller flere tabeller eller underforespørgsler til at vælge data fra, som vi vil se senere i vejledningerne.
Bemærk, at for alle de følgende eksempler skal du køre sqlite3.exe og åbne en forbindelse til eksempeldatabasen som flydende:
Trin 1) I dette trin,
- Åbn Denne computer og naviger til følgende mappe "C:\sqlite"Og
- Åbn derefter "sqlite3.exe"
Trin 2) Åbn databasen "TutorialsSampleDB.db” ved følgende kommando:
Nu er du klar til at køre enhver form for forespørgsel på databasen.
I SELECT-sætningen kan du ikke kun vælge et kolonnenavn, men du har en masse andre muligheder for at angive, hvad du skal vælge. Som følgende:
VÆLG *
Denne kommando vil vælge alle kolonnerne fra alle de refererede tabeller (eller underforespørgsler) i FROM-sætningen. For eksempel:
SELECT * FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Dette vil vælge alle kolonnerne fra både tabellerne studerende og afdelingstabellerne:
VÆLG tabelnavn.*
Dette vil vælge alle kolonnerne fra kun tabellen "tabelnavn". For eksempel:
SELECT Students.* FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Dette vil kun vælge alle kolonnerne fra elevtabellen:
En bogstavelig værdi
En literal værdi er en konstant værdi, der kan angives i select-sætningen. Du kan bruge bogstavelige værdier normalt på samme måde, som du bruger kolonnenavne i SELECT-sætningen. Disse bogstavelige værdier vil blive vist for hver række fra de rækker, der returneres af SQL-forespørgslen.
Her er nogle eksempler på forskellige bogstavelige værdier, som du kan vælge:
- Numerisk bogstav – tal i ethvert format som 1, 2.55, … osv.
- Streng bogstaver – Enhver streng 'USA', 'dette er en eksempeltekst', … osv.
- NULL – NULL værdi.
- Current_TIME – Det vil give dig det aktuelle klokkeslæt.
- CURRENT_DATE – dette giver dig den aktuelle dato.
Dette kan være praktisk i nogle situationer, hvor du skal vælge en konstant værdi for alle de returnerede rækker. For eksempel, hvis du vil vælge alle eleverne fra Elever-tabellen med en ny kolonne kaldet et land, som indeholder værdien "USA", kan du gøre dette:
SELECT *, 'USA' AS Country FROM Students;
Dette vil give dig alle elevernes kolonner plus en ny kolonne "Land" som denne:
Bemærk, at denne nye kolonne Land faktisk ikke er en ny kolonne tilføjet til tabellen. Det er en virtuel kolonne, der er oprettet i forespørgslen til at vise resultaterne, og den vil ikke blive oprettet på bordet.
Navne og Alias
Aliaset er et nyt navn til kolonnen, der lader dig vælge kolonnen med et nyt navn. Kolonnealiasserne er specificeret ved hjælp af nøgleordet "AS".
For eksempel, hvis du vil vælge kolonnen StudentName, der skal returneres med "Student Name" i stedet for "StudentName", kan du give den et alias som dette:
SELECT StudentName AS 'Student Name' FROM Students;
Dette vil give dig elevernes navne med navnet "Student Name" i stedet for "StudentName" som dette:
Bemærk, at kolonnenavnet stadig "Elevnavn"; kolonnen StudentName er stadig den samme, den ændres ikke af aliaset.
Aliaset ændrer ikke kolonnenavnet; det vil blot ændre visningsnavnet i SELECT-sætningen.
Bemærk også, at nøgleordet "AS" er valgfrit, du kan sætte aliasnavnet uden det, noget som dette:
SELECT StudentName 'Student Name' FROM Students;
Og det vil give dig nøjagtig samme output som den forrige forespørgsel:
Du kan også give tabeller aliaser, ikke kun kolonner. Med samme søgeord "AS". For eksempel kan du gøre dette:
SELECT s.* FROM Students AS s;
Dette vil give dig alle kolonnerne i tabellen Elever:
Dette kan være meget nyttigt, hvis du deltager i mere end ét bord; i stedet for at gentage det fulde tabelnavn i forespørgslen, kan du give hver tabel et kort aliasnavn. For eksempel i følgende forespørgsel:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Denne forespørgsel vil vælge hvert elevnavn fra "Studenter"-tabellen med dets afdelingsnavn fra "Afdelinger"-tabellen:
Den samme forespørgsel kan dog skrives sådan:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
- Vi gav elevtabellen et alias "s" og afdelingstabellen et alias "d".
- Så i stedet for at bruge hele tabellens navn, brugte vi deres aliaser til at henvise til dem.
- INNER JOIN forbinder to eller flere tabeller ved hjælp af en betingelse. I vores eksempel forenede vi Studenter-tabel med Departments-tabel med DepartmentId-kolonnen. Der er også en uddybende forklaring på INNER JOIN i "SQLite Deltager” tutorial.
Dette vil give dig det nøjagtige output som den forrige forespørgsel:
HVOR
At skrive SQL-forespørgsler ved at bruge SELECT-sætning alene med FROM-sætningen, som vi så i det foregående afsnit, vil give dig alle rækkerne fra tabellerne. Men hvis du vil filtrere de returnerede data, skal du tilføje en "WHERE"-klausul.
WHERE-sætningen bruges til at filtrere det resultatsæt, der returneres af SQL forespørgsel. Sådan fungerer WHERE-klausulen:
- I WHERE-sætningen kan du angive et "udtryk".
- Dette udtryk vil blive evalueret for hver række, der returneres fra den eller de tabeller, der er specificeret i FROM-sætningen.
- Udtrykket vil blive evalueret som et boolsk udtryk, med resultatet enten sandt, falsk eller null.
- Derefter returneres kun rækker, for hvilke udtrykket blev evalueret med en sand værdi, og dem med falske eller null-resultater vil blive ignoreret og ikke inkluderet i resultatsættet.
- For at filtrere resultatsættet ved hjælp af WHERE-sætningen, skal du bruge udtryk og operatorer.
Liste over operatører i SQLite og hvordan man bruger dem
I det følgende afsnit vil vi forklare, hvordan du kan filtrere ved hjælp af udtryk og operatorer.
Udtryk er en eller flere bogstavelige værdier eller kolonner kombineret med hinanden med en operator.
Bemærk, at du kan bruge udtryk i både SELECT-udtrykket og i WHERE-udtrykket.
I de følgende eksempler vil vi prøve udtrykkene og operatorerne i både select-udtrykket og WHERE-udtrykket. For at vise dig, hvordan de klarer sig.
Der er forskellige typer udtryk og operatorer, som du kan angive som følger:
SQLite sammenkædningsoperatoren "||"
Denne operator bruges til at sammenkæde en eller flere bogstavelige værdier eller kolonner med hinanden. Det vil producere en række resultater fra alle sammenkædede bogstavelige værdier eller kolonner. For eksempel:
SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName FROM Students;
Dette vil sammenkædes i et nyt alias "StudentIdWithName"
- Den bogstavelige strengværdi "ID med navn: "
- med værdien af "Studiekort” kolonne og
- med værdien fra "Elevnavn” kolonne
SQLite CAST-operatør:
CAST-operatoren bruges til at konvertere en værdi fra en datatype til en anden datatype.
For eksempel, hvis du har en numerisk værdi gemt som en strengværdi som denne " '12.5' " og du vil konvertere det til en numerisk værdi, kan du bruge CAST-operatoren til at gøre dette på denne måde "CAST( '12.5' SOM RIGTIG)“. Eller hvis du har en decimalværdi som f.eks. 12.5, og du kun skal hente heltalsdelen, kan du caste den til et heltal som dette "CAST(12.5 AS INTEGER)".
Eksempel
I følgende kommando vil vi forsøge at konvertere forskellige værdier til andre datatyper:
SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;
Dette vil give dig:
Resultatet er som følger:
- CAST('12.5' AS REAL) – værdien '12.5' er en strengværdi, den vil blive konverteret til en REAL værdi.
- CAST(12.5 SOM HELTAL) – værdien 12.5 er en decimalværdi, den vil blive konverteret til at være en heltalsværdi. Decimaldelen afkortes, og den bliver 12.
SQLite Aritmetik Operators:
Tag to eller flere numeriske bogstavelige værdier eller numeriske kolonner og returner en numerisk værdi. De aritmetiske operatorer understøttet i SQLite er:
|
Eksempel:
I det følgende eksempel vil vi prøve de fem aritmetiske operatorer med bogstavelige numeriske værdier i samme
vælg klausul:
SELECT 25+6, 25-6, 25*6, 25%6, 25/6;
Dette vil give dig:
Bemærk, hvordan vi brugte en SELECT-sætning uden en FROM-sætning her. Og det er tilladt ind SQLite så længe vi vælger bogstavelige værdier.
SQLite Sammenligningsoperatører
Sammenlign to operander med hinanden og returner en sand eller falsk som følger:
|
Noter det, SQLite udtrykker den sande værdi med 1 og den falske værdi med 0.
Eksempel:
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 '<>';
Dette vil give noget som dette:
SQLite Mønstermatchende operatorer
"LIKE” – bruges til mønstertilpasning. Ved brug af "lignende", kan du søge efter værdier, der matcher et mønster angivet ved hjælp af et jokertegn.
Operanden til venstre kan enten være en bogstavlig strengværdi eller en strengkolonne. Mønsteret kan specificeres som følger:
- Indeholder mønster. For eksempel, Elevnavn LIKE '%a%' – dette vil søge efter elevernes navne, der indeholder bogstavet "a" på en hvilken som helst position i kolonnen Elevnavn.
- Starter med mønsteret. For eksempel, "Elevnavn SOM "a%"” – søg på elevernes navne, der starter med bogstavet ”a”.
- Slutter med mønsteret. For eksempel, "Elevnavn LIKE '%a'” – Søg efter elevernes navne, der ender med bogstavet “a”.
- Matcher ethvert enkelt tegn i en streng ved hjælp af understregningsbogstavet "_". For eksempel, "Elevnavn SOM "J___"” – Søg efter elevernes navne på 4 tegn. Det skal starte med bogstavet "J" og kan have yderligere tre tegn efter bogstavet "J".
Eksempler på mønstermatchning:
- Få elevernes navne, der starter med bogstavet 'j':
SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';
Resultat:
- Få elevernes navne til at slutte med bogstavet 'y':
SELECT StudentName FROM Students WHERE StudentName LIKE '%y';
Resultat:
- Få elevernes navne, der indeholder bogstavet 'n':
SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';
Resultat:
"GLOB" – svarer til LIKE-operatoren, men GLOB skelner mellem store og små bogstaver i modsætning til LIKE-operatoren. For eksempel vil følgende to kommandoer returnere forskellige resultater:
SELECT 'Jack' GLOB 'j%'; SELECT 'Jack' LIKE 'j%';
Dette vil give dig:
- Den første sætning returnerer 0(falsk), fordi GLOB-operatoren skelner mellem store og små bogstaver, så 'j' er ikke lig med 'J'. Den anden sætning vil dog returnere 1 (sand), fordi LIKE-operatoren er ufølsom mellem store og små bogstaver, så 'j' er lig med 'J'.
Andre operatører:
SQLite AND
En logisk operator, der kombinerer et eller flere udtryk. Det vil kun returnere sandt, hvis alle udtryk giver en "sand" værdi. Det vil dog kun returnere falsk, hvis alle udtryk giver en "falsk" værdi.
Eksempel:
Følgende forespørgsel vil søge efter elever, der har StudentId > 5 og StudentName begynder med bogstavet N, de returnerede elever skal opfylde de to betingelser:
SELECT * FROM Students WHERE (StudentId > 5) AND (StudentName LIKE 'N%');
Som output, i ovenstående skærmbillede, vil dette kun give dig "Nancy". Nancy er den eneste studerende, der opfylder begge betingelser.
SQLite OR
En logisk operator, der kombinerer et eller flere udtryk, så hvis en af de kombinerede operatorer giver sand, så vil den returnere sand. Men hvis alle udtryk giver falsk, vil det returnere falsk.
Eksempel:
Følgende forespørgsel vil søge efter elever, der har StudentId > 5 eller StudentName begynder med bogstavet N, de returnerede elever skal opfylde mindst én af betingelserne:
SELECT * FROM Students WHERE (StudentId > 5) OR (StudentName LIKE 'N%');
Dette vil give dig:
Som et output, i ovenstående skærmbillede, vil dette give dig navnet på en elev med bogstavet "n" i deres navn plus elev-id'et med værdi >5.
Som du kan se, er resultatet anderledes end forespørgslen med AND-operator.
SQLite MELLEM
BETWEEN bruges til at vælge de værdier, der er inden for et interval på to værdier. For eksempel, "X MELLEM Y OG Z” vil returnere sand (1), hvis værdien X er mellem de to værdier Y og Z. Ellers vil den returnere falsk (0). “X MELLEM Y OG Z" svarer til "X >= Y OG X <= Z", X skal være større end eller lig med Y, og X er mindre end eller lig med Z.
Eksempel:
I følgende eksempelforespørgsel vil vi skrive en forespørgsel for at få elever med Id-værdi mellem 5 og 8:
SELECT * FROM Students WHERE StudentId BETWEEN 5 AND 8;
Dette vil kun give eleverne med id 5, 6, 7 og 8:
SQLite IN
Tager en operand og en liste over operander. Det vil returnere sandt, hvis den første operandværdi er lig med en af operandernes værdi fra listen. IN-operatoren returnerer sand (1), hvis listen over operander indeholder den første operandværdi inden for dens værdier. Ellers vil det returnere falsk (0).
Sådan her: "col IN(x, y, z)". Dette svarer til ” (col=x) eller (col=y) eller (col=z) ".
Eksempel:
Følgende forespørgsel vil kun vælge elever med id 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId IN(2, 4, 6, 8);
Sådan her:
Den forrige forespørgsel vil give det nøjagtige resultat som følgende forespørgsel, fordi de er ækvivalente:
SELECT * FROM Students WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);
Begge forespørgsler giver det nøjagtige output. Men forskellen mellem de to forespørgsler er, den første forespørgsel, vi brugte "IN"-operatoren. I den anden forespørgsel brugte vi flere "ELLER"-operatorer.
IN-operatoren svarer til at bruge flere OR-operatorer. Den "WHERE StudentId IN(2, 4, 6, 8)" svarer til " HVOR (StudentId = 2) ELLER (StudentId = 4) ELLER (StudentId = 6) ELLER (StudentId = 8);"
Sådan her:
SQLite IKKE I
"NOT IN" operand er det modsatte af IN-operatoren. Men med samme syntaks; det kræver en operand og en liste over operander. Det vil returnere sandt, hvis den første operandværdi ikke er lig med en af operandernes værdi fra listen. dvs. den vil returnere sand (0), hvis listen over operander ikke indeholder den første operand. Sådan: "col NOT IN(x, y, z)“. Dette svarer til "(col<>x) AND (col<>y) AND (col<>z)".
Eksempel:
Følgende forespørgsel vil vælge elever med id'er, der ikke er lig med et af disse id'er 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId NOT IN(2, 4, 6, 8);
Ligesom dette
Den forrige forespørgsel giver vi det nøjagtige resultat som følgende forespørgsel, fordi de er ækvivalente:
SELECT * FROM Students WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);
Sådan her:
I ovenstående skærmbillede,
Vi brugte flere ikke-lige-operatorer "<>" for at få en liste over elever, der ikke er lig med nogen af de følgende Id'er 2, 4, 6 eller 8. Denne forespørgsel vil returnere alle andre elever end disse liste over Id'er.
SQLite EXISTS
EXISTS-operatorerne tager ingen operander; det tager kun en SELECT-sætning efter sig. EXISTS-operatoren returnerer sand (1), hvis der er nogen rækker, der returneres fra SELECT-sætningen, og den vil returnere falsk (0), hvis der slet ikke er nogen rækker returneret fra SELECT-udtrykket.
Eksempel:
I det følgende eksempel vil vi vælge afdelingens navn, hvis afdelings-id'et findes i elevtabellen:
SELECT DepartmentName FROM Departments AS d WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Dette vil give dig:
Kun de tre afdelinger "IT, fysik og kunst” vil blive returneret. Og afdelingsnavnet "Math” returneres ikke, fordi der ikke er nogen studerende i den pågældende afdeling, så afdelings-id'et findes ikke i elevtabellen. Det er derfor, EXISTS-operatøren ignorerede "Math” afdeling.
SQLite IKKE
Revsletter resultatet af den foregående operator, der kommer efter det. For eksempel:
- NOT BETWEEN – Det vil returnere sandt, hvis BETWEEN returnerer falsk og omvendt.
- IKKE LIKE – Det vil returnere sandt, hvis LIKE returnerer falsk og omvendt.
- IKKE GLOB – Det vil returnere sandt, hvis GLOB returnerer falsk og omvendt.
- IKKE FINDER – Det vil returnere sandt, hvis EXISTS returnerer falsk og omvendt.
Eksempel:
I det følgende eksempel vil vi bruge NOT-operatoren med EXISTS-operatoren for at få de afdelingers navne, der ikke findes i Elever-tabellen, som er det omvendte resultat af EXISTS-operatoren. Så søgningen vil blive udført via afdelings-id, der ikke findes i afdelingstabellen.
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Produktion:
Kun afdelingen"Math ” vil blive returneret. Fordi "Math” afdeling er den eneste afdeling, der ikke findes i elevtabellen.
Begrænsning og bestilling
SQLite Bestilt
SQLite Ordren er at sortere dit resultat efter et eller flere udtryk. For at bestille resultatsættet skal du bruge ORDER BY-klausulen som følger:
- Først skal du angive ORDER BY-klausulen.
- ORDER BY-sætningen skal angives i slutningen af forespørgslen; kun LIMIT-sætningen kan specificeres efter den.
- Angiv udtrykket for at bestille dataene med, dette udtryk kan være et kolonnenavn eller et udtryk.
- Efter udtrykket kan du angive en valgfri sorteringsretning. Enten DESC for at rækkefølge dataene faldende eller ASC for at rækkefølge dataene stigende. Hvis du ikke specificerede nogen af dem, ville dataene blive sorteret stigende.
- Du kan angive flere udtryk ved at bruge "," mellem hinanden.
Eksempel
I det følgende eksempel vil vi vælge alle eleverne sorteret efter deres navne, men i faldende rækkefølge, derefter efter afdelingsnavnet i stigende rækkefølge:
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;
Dette vil give dig:
- SQLite vil først bestille alle eleverne efter deres afdelingsnavn i stigende rækkefølge
- For hvert afdelingsnavn vil alle elever under det pågældende afdelingsnavn blive vist i faldende rækkefølge efter deres navne
SQLite Begrænse:
Du kan begrænse antallet af rækker, der returneres af din SQL-forespørgsel, ved at bruge LIMIT-sætningen. For eksempel vil LIMIT 10 kun give dig 10 rækker og ignorere alle de andre rækker.
I LIMIT-klausulen kan du vælge et bestemt antal rækker startende fra en specifik position ved hjælp af OFFSET-klausulen. For eksempel, "LIMIT 4 OFFSET 4” ignorerer de første 4 rækker og returnerer 4 rækker fra den femte række, så du får rækkerne 5,6,7 og 8.
Bemærk, at OFFSET-klausulen er valgfri, du kan skrive den som "LIMIT 4, 4” og det vil give dig de nøjagtige resultater.
Eksempel:
I det følgende eksempel returnerer vi kun 3 elever fra elev-id 5 ved at bruge forespørgslen:
SELECT * FROM Students LIMIT 4,3;
Dette vil kun give dig tre elever fra række 5. Så det vil give dig rækkerne med StudentId 5, 6 og 7:
Fjerner dubletter
Hvis din SQL-forespørgsel returnerer duplikerede værdier, kan du bruge "DISTINCT” nøgleord for at fjerne disse dubletter og returnere forskellige værdier. Du kan angive mere end én kolonne efter DISTINCT-tastens arbejde.
Eksempel:
Følgende forespørgsel vil returnere duplikerede "afdelingsnavneværdier": Her har vi dubletværdier med navnene IT, Fysik og Kunst.
SELECT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Dette vil give dig dublerede værdier for afdelingsnavnet:
Bemærk, hvordan der er duplikerede værdier for afdelingsnavnet. Nu vil vi bruge DISTINCT-søgeordet med den samme forespørgsel til at fjerne disse dubletter og kun få unikke værdier. Sådan her:
SELECT DISTINCT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Dette giver dig kun tre unikke værdier for kolonnen afdelingsnavn:
Aggregate
SQLite Aggregater er indbyggede funktioner defineret i SQLite der vil gruppere flere værdier af flere rækker i én værdi.
Her er aggregaterne understøttet af SQLite:
SQLite AVG()
Returnerede gennemsnittet for alle x-værdierne.
Eksempel:
I det følgende eksempel får vi den gennemsnitlige karakter, som eleverne får fra alle eksamenerne:
SELECT AVG(Mark) FROM Marks;
Dette vil give dig værdien "18.375":
Disse resultater kommer fra summeringen af alle mærkeværdierne divideret med deres antal.
COUNT() – COUNT(X) eller COUNT(*)
Returnerer det samlede antal gange, x-værdien dukkede op. Og her er nogle muligheder, du kan bruge med COUNT:
- COUNT(x): Tæller kun x værdier, hvor x er et kolonnenavn. Det vil ignorere NULL-værdier.
- COUNT(*): Tæl alle rækkerne fra alle kolonnerne.
- COUNT (DISTINCT x): Du kan angive et DISTINCT nøgleord før x, som vil få tællingen af de distinkte værdier af x.
Eksempel
I det følgende eksempel får vi det samlede antal afdelinger med COUNT(DepartmentId), COUNT(*) og COUNT(DISTINCT DepartmentId), og hvordan de er forskellige:
SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;
Dette vil give dig:
Som følgende:
- COUNT(DepartmentId) vil give dig antallet af alle afdelings-id'erne, og det vil ignorere null-værdierne.
- COUNT(DISTINCT DepartmentId) giver dig distinkte værdier af DepartmentId, som kun er 3. Hvilket er de tre forskellige værdier af afdelingsnavnet. Bemærk, at der er 8 værdier af afdelingsnavn i elevens navn. Men kun de forskellige tre værdier som er matematik, IT og fysik.
- COUNT(*) tæller antallet af rækker i elevtabellen, som er 10 rækker for 10 elever.
GROUP_CONCAT() – GROUP_CONCAT(X) eller GROUP_CONCAT(X,Y)
GROUP_CONCAT aggregatfunktion sammenkæder flere værdier til én værdi med et komma for at adskille dem. Den har følgende muligheder:
- GROUP_CONCAT(X): Dette vil sammenkæde al værdien af x i én streng, med kommaet "," brugt som en separator mellem værdierne. NULL-værdier vil blive ignoreret.
- GROUP_CONCAT(X, Y): Dette vil sammenkæde værdierne af x i én streng, hvor værdien af y bruges som en separator mellem hver værdi i stedet for standardseparatoren ','. NULL-værdier vil også blive ignoreret.
- GROUP_CONCAT(DISTINCT X): Dette vil sammenkæde alle de distinkte værdier af x i én streng, med kommaet "," brugt som en separator mellem værdierne. NULL-værdier vil blive ignoreret.
GROUP_CONCAT(Afdelingsnavn) Eksempel
Følgende forespørgsel vil sammenkæde alle afdelingsnavnets værdier fra de studerende og afdelingstabellen i en streng, adskilt komma. Så i stedet for at returnere en liste med værdier, én værdi på hver række. Det returnerer kun én værdi på én række, med alle værdierne komma adskilt:
SELECT GROUP_CONCAT(d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Dette vil give dig:
Dette vil give dig listen over 8 afdelingers navne værdier sammenkædet i en streng, kommasepareret.
GROUP_CONCAT(DISTINCT Afdelingsnavn) Eksempel
Følgende forespørgsel vil sammenkæde de forskellige værdier af afdelingsnavnet fra tabellen over studerende og afdelinger i én streng, adskilt komma:
SELECT GROUP_CONCAT(DISTINCT d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Dette vil give dig:
Læg mærke til, hvordan resultatet er anderledes end det forrige resultat; kun tre værdier returnerede, som er de forskellige afdelingers navne, og duplikatværdierne blev fjernet.
GROUP_CONCAT(Afdelingsnavn ,'&') Eksempel
Følgende forespørgsel vil sammenkæde alle værdierne i afdelingsnavnskolonnen fra elev- og afdelingstabellen i én streng, men med tegnet '&' i stedet for et komma som separator:
SELECT GROUP_CONCAT(d.DepartmentName, '&') FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Dette vil give dig:
Bemærk, hvordan tegnet "&" bruges i stedet for standardtegnet "," til at adskille mellem værdierne.
SQLite MAX() & MIN()
MAX(X) giver dig den højeste værdi fra X-værdierne. MAX returnerer en NULL-værdi, hvis alle værdierne af x er nul. Mens MIN(X) returnerer den mindste værdi fra X-værdierne. MIN vil returnere en NULL-værdi, hvis alle værdierne af X er nul.
Eksempel
I den følgende forespørgsel vil vi bruge funktionerne MIN og MAX til at få det højeste mærke og det laveste mærke fra "Marks" bord:
SELECT MAX(Mark), MIN(Mark) FROM Marks;
Dette vil give dig:
SQLite SUM(x), Total(x)
Begge vil returnere summen af alle x-værdierne. Men de er forskellige i følgende:
- SUM returnerer null, hvis alle værdierne er nul, men Total returnerer 0.
- TOTAL returnerer altid flydende kommaværdier. SUM returnerer en heltalsværdi, hvis alle x-værdierne er et heltal. Men hvis værdierne ikke er et heltal, vil det returnere en flydende kommaværdi.
Eksempel
I den følgende forespørgsel vil vi bruge SUM og total for at få summen af alle karaktererne i "Marks” tabeller:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks;
Dette vil give dig:
Som du kan se, returnerer TOTAL altid et flydende komma. Men SUM returnerer en heltalsværdi, fordi værdierne i "Mark"-kolonnen kan være i heltal.
Forskel mellem SUM og TOTAL eksempel:
I den følgende forespørgsel vil vi vise forskellen mellem SUM og TOTAL, når de får SUM af NULL-værdier:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;
Dette vil give dig:
Bemærk, at der ikke er nogen markeringer for TestId = 4, så der er null-værdier for den test. SUM returnerer en nulværdi som blank, mens TOTAL returnerer 0.
Gruppe BY
GROUP BY-sætningen bruges til at angive en eller flere kolonner, der skal bruges til at gruppere rækkerne i grupper. Rækkerne med samme værdier vil blive samlet (ordnet) i grupper.
For enhver anden kolonne, der ikke er inkluderet i gruppen efter kolonner, kan du bruge en aggregeret funktion til den.
Eksempel:
Følgende forespørgsel vil give dig det samlede antal studerende til stede i hver afdeling.
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;
Dette vil give dig:
GROUPBY DepartmentName-klausulen vil gruppere alle studerende i grupper en for hvert afdelingsnavn. For hver gruppe af "afdeling" vil den tælle eleverne på den.
HAVE klausul
Hvis du vil filtrere de grupper, der returneres af GROUP BY-udtrykket, kan du angive et "HAVING"-udtryk med udtryk efter GROUP BY. Udtrykket vil blive brugt til at filtrere disse grupper.
Eksempel
I den følgende forespørgsel vil vi vælge de afdelinger, der kun har to studerende på:
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;
Dette vil give dig:
Klausulen HAVING COUNT(S.StudentId) = 2 vil filtrere de returnerede grupper og kun returnere de grupper, der indeholder præcis to elever på den. I vores tilfælde har Arts-afdelingen 2 studerende, så det vises i outputtet.
SQLite Forespørgsel og underforespørgsel
Inde i enhver forespørgsel kan du bruge en anden forespørgsel enten i en SELECT, INSERT, DELETE, UPDATE eller i en anden underforespørgsel.
Denne indlejrede forespørgsel kaldes en underforespørgsel. Vi vil nu se nogle eksempler på brug af underforespørgsler i SELECT-sætningen. Men i selvstudiet om ændring af data vil vi se, hvordan vi kan bruge underforespørgsler med INSERT, DELETE og UPDATE-sætning.
Brug af underforespørgsel i eksemplet FROM-sætning
I den følgende forespørgsel vil vi inkludere en underforespørgsel i FROM-sætningen:
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;
Forespørgslen:
SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId
Ovenstående forespørgsel kaldes her en underforespørgsel, fordi den er indlejret inde i FROM-sætningen. Bemærk, at vi gav det et aliasnavn "t", så vi kan henvise til de kolonner, der returneres fra det i forespørgslen.
Denne forespørgsel vil give dig:
Så i vores tilfælde,
- s.StudentName er valgt fra hovedforespørgslen, der giver navn på elever og
- t.Mark er valgt fra underforespørgslen; der giver karakterer opnået af hver af disse elever
Brug af underforespørgsel i eksemplet WHERE-sætning
I den følgende forespørgsel vil vi inkludere en underforespørgsel i WHERE-sætningen:
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Forespørgslen:
SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId
Ovenstående forespørgsel kaldes her en underforespørgsel, fordi den er indlejret i WHERE-sætningen. Underforespørgslen returnerer de DepartmentId-værdier, der vil blive brugt af operatøren FINDER IKKE.
Denne forespørgsel vil give dig:
I ovenstående forespørgsel har vi valgt den afdeling, som ikke har nogen studerende tilmeldt sig. Hvilket er "Matematik"-afdelingen herovre.
sæt Operationer – UNION, Kryds
SQLite understøtter følgende SET-handlinger:
UNION & UNION ALLE
Den kombinerer et eller flere resultatsæt (en gruppe rækker), der returneres fra flere SELECT-sætninger, til et resultatsæt.
UNION returnerer forskellige værdier. UNION ALL vil dog ikke og vil inkludere dubletter.
Bemærk, at kolonnenavnet vil være det kolonnenavn, der er angivet i den første SELECT-sætning.
UNION Eksempel
I det følgende eksempel vil vi få listen over afdelings-id fra elevtabellen og listen over afdelings-id fra afdelingstabellen i samme kolonne:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION SELECT DepartmentId FROM Departments;
Dette vil give dig:
Forespørgslen returnerer kun 5 rækker, som er de forskellige afdelings-id-værdier. Bemærk den første værdi, som er nulværdien.
SQLite UNION ALLE Eksempel
I det følgende eksempel vil vi få listen over afdelings-id fra elevtabellen og listen over afdelings-id fra afdelingstabellen i samme kolonne:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION ALL SELECT DepartmentId FROM Departments;
Dette vil give dig:
Forespørgslen returnerer 14 rækker, 10 rækker fra elevtabellen og 4 fra afdelingstabellen. Bemærk, at der er dubletter i de returnerede værdier. Bemærk også, at kolonnenavnet var det, der var angivet i den første SELECT-sætning.
Lad os nu se, hvordan UNION alle vil give forskellige resultater, hvis vi erstatter UNION ALL med UNION:
SQLite KRYDSE
Returnerer de værdier, der findes i både det kombinerede resultatsæt. Værdier, der findes i et af de kombinerede resultatsæt, vil blive ignoreret.
Eksempel
I den følgende forespørgsel vil vi vælge de afdelings-id-værdier, der findes i både tabellerne Studerende og afdelinger i kolonnen Afdelings-id:
SELECT DepartmentId FROM Students Intersect SELECT DepartmentId FROM Departments;
Dette vil give dig:
Forespørgslen returnerer kun tre værdier 1, 2 og 3. Hvilket er de værdier, der findes i begge tabeller.
Værdierne null og 4 blev dog ikke inkluderet, fordi null-værdien kun findes i elevtabellen og ikke i afdelingstabellen. Og værdien 4 findes i afdelingstabellen og ikke i elevtabellen.
Det er grunden til, at både værdierne NULL og 4 blev ignoreret og ikke inkluderet i de returnerede værdier.
UNDTAGEN
Antag, at hvis du har to lister med rækker, liste1 og liste2, og du kun vil have rækkerne fra liste1, der ikke findes i liste2, kan du bruge "EXCEPT"-sætning. EXCEPT-udtrykket sammenligner de to lister og returnerer de rækker, der findes i liste1 og ikke findes i liste2.
Eksempel
I den følgende forespørgsel vil vi vælge de DepartmentId-værdier, der findes i afdelingstabellen og ikke findes i elevtabellen:
SELECT DepartmentId FROM Departments EXCEPT SELECT DepartmentId FROM Students;
Dette vil give dig:
Forespørgslen returnerer kun værdien 4. Hvilket er den eneste værdi, der findes i afdelingstabellen, og som ikke findes i elevtabellen.
NULL håndtering
Den "NULL”værdi er en særlig værdi i SQLite. Det bruges til at repræsentere en værdi, der er ukendt eller manglende værdi. Bemærk, at null-værdien er helt anderledes end "0” eller tom ”” værdi. Fordi 0 og den tomme værdi er en kendt værdi, er null-værdien imidlertid ukendt.
NULL-værdier kræver en særlig håndtering i SQLite, vil vi nu se, hvordan vi håndterer NULL-værdierne.
Søg efter NULL-værdier
Du kan ikke bruge den normale lighedsoperator (=) til at søge i nulværdierne. For eksempel søger følgende forespørgsel efter de studerende, der har en null DepartmentId-værdi:
SELECT * FROM Students WHERE DepartmentId = NULL;
Denne forespørgsel giver ikke noget resultat:
Fordi NULL-værdien ikke er lig med nogen anden værdi inkluderet en null-værdi i sig selv, er det derfor, den ikke returnerede noget resultat.
- Men for at få forespørgslen til at fungere, skal du bruge "ER NULL" operator for at søge efter null-værdier som følger:
SELECT * FROM Students WHERE DepartmentId IS NULL;
Dette vil give dig:
Forespørgslen returnerer de studerende, der har en null DepartmentId-værdi.
- Hvis du vil have de værdier, der ikke er null, skal du bruge "ER IKKE NULL" operatør som denne:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;
Dette vil give dig:
Forespørgslen returnerer de studerende, der ikke har en NULL DepartmentId-værdi.
Betingede resultater
Hvis du har en liste over værdier, og du vil vælge en af dem baseret på nogle betingelser. Til det skal betingelsen for den pågældende værdi være sand for at blive valgt.
CASE-udtryk vil evaluere disse betingelser for alle værdierne. Hvis betingelsen er sand, returnerer den denne værdi.
For eksempel, hvis du har en kolonne "Karakter", og du vil vælge en tekstværdi baseret på karakterværdien som følger:
– "Fremragende", hvis karakteren er højere end 85.
– "Meget god", hvis karakteren er mellem 70 og 85.
– "Godt", hvis karakteren er mellem 60 og 70.
Så kan du bruge CASE-udtrykket til at gøre det.
Dette kan bruges til at definere en vis logik i SELECT-sætningen, så du kan vælge bestemte resultater afhængigt af visse betingelser som f.eks. if-sætning.
CASE-operatoren kan defineres med forskellige syntakser som følger:
- Du kan bruge forskellige betingelser:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN condition3 THEN result3 … ELSE resultn END
- Eller du kan kun bruge ét udtryk og sætte forskellige mulige værdier at vælge imellem:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 WHEN value3 THEN result3 … ELSE restuln END
Bemærk, at ELSE-sætningen er valgfri.
Eksempel
I det følgende eksempel vil vi bruge CASE udtryk med NULL værdi i kolonnen afdelings-id i tabellen Studerende for at vise teksten 'Ingen afdeling' som følger:
SELECT StudentName, CASE WHEN DepartmentId IS NULL THEN 'No Department' ELSE DepartmentId END AS DepartmentId FROM Students;
- CASE-operatøren vil kontrollere værdien af DepartmentId, uanset om den er null eller ej.
- Hvis det er en NULL-værdi, vil den vælge den bogstavelige værdi 'No Department' i stedet for DepartmentId-værdien.
- Hvis det ikke er en nulværdi, vil den vælge værdien for afdelings-id-kolonnen.
Dette vil give dig output som vist nedenfor:
Fælles tabeludtryk
Almindelige tabeludtryk (CTE'er) er underforespørgsler, der er defineret inde i SQL-sætningen med et givet navn.
Det har en fordel i forhold til underforespørgslerne, fordi det er defineret ud fra SQL-sætningerne og vil gøre forespørgslerne nemmere at læse, vedligeholde og forstå.
Et almindeligt tabeludtryk kan defineres ved at sætte WITH-sætningen foran en SELECT-sætning som følger:
WITH CTEname AS ( SELECT statement ) SELECT, UPDATE, INSERT, or update statement here FROM CTE
Den "CTEnavn” er et hvilket som helst navn du kan give til CTE, du kan bruge det til at henvise til det senere. Bemærk, at du kan definere SELECT, UPDATE, INSERT eller DELETE-sætning på CTE'er
Lad os nu se et eksempel på, hvordan man bruger CTE i SELECT-sætningen.
Eksempel
I det følgende eksempel vil vi definere en CTE fra en SELECT-sætning, og så bruger vi den senere på en anden forespørgsel:
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;
I denne forespørgsel definerede vi en CTE og gav den navnet "Alle afdelinger“. Denne CTE blev defineret ud fra en SELECT-forespørgsel:
SELECT DepartmentId, DepartmentName FROM Departments
Så efter at vi havde defineret CTE, brugte vi den i SELECT-forespørgslen, der kommer efter den.
Bemærk, at almindelige tabeludtryk ikke påvirker outputtet af forespørgslen. Det er en måde at definere en logisk visning eller underforespørgsel for at genbruge dem i den samme forespørgsel. Almindelige tabeludtryk er som en variabel, du erklærer, og genbruger den som en underforespørgsel. Kun SELECT-sætningen påvirker outputtet af forespørgslen.
Denne forespørgsel vil give dig:
Avancerede forespørgsler
Avancerede forespørgsler er de forespørgsler, der indeholder komplekse joinforbindelser, underforespørgsler og nogle aggregater. I det følgende afsnit vil vi se et eksempel på en avanceret forespørgsel:
Hvor vi får,
- Instituttets navne med alle elever for hver afdeling
- Elevens navn adskilt med komma og
- Viser, at afdelingen har mindst tre studerende i den
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;
Vi tilføjede en JOIN klausul for at hente afdelingsnavnet fra tabellen afdelinger. Derefter tilføjede vi en GROUP BY-klausul med to aggregerede funktioner:
- “COUNT” for at tælle eleverne for hver afdelingsgruppe.
- GROUP_CONCAT for at sammenkæde elever for hver gruppe med komma adskilt i én streng.
- Efter GROUP BY brugte vi HAVING-klausulen til at filtrere afdelingerne og kun vælge de afdelinger, der har mindst 3 studerende.
Resultatet bliver som følger:
Resumé
Dette var en introduktion til skrivning SQLite forespørgsler og det grundlæggende i at forespørge databasen, og hvordan du kan filtrere de returnerede data. Du kan nu, skrive din egen SQLite forespørgsler.