SQLite Interogare: Selectare, Unde, LIMITĂ, OFFSET, Număr, Grupare după

Pentru a scrie interogări SQL într-un SQLite baza de date, trebuie să știți cum funcționează clauzele SELECT, FROM, WHERE, GROUP BY, ORDER BY și LIMIT și cum să le utilizați.

În timpul acestui tutorial, veți învăța cum să utilizați aceste clauze și cum să scrieți SQLite clauze.

Citirea datelor cu Select

Clauza SELECT este instrucțiunea principală pe care o utilizați pentru a interoga un SQLite Bază de date. În clauza SELECT, specificați ce să selectați. Dar înainte de clauza select, să vedem de unde putem selecta datele folosind clauza FROM.

Clauza FROM este folosită pentru a specifica unde doriți să selectați datele. În clauza from, puteți specifica unul sau mai multe tabele sau subinterogare din care să selectați datele, așa cum vom vedea mai târziu în tutoriale.

Rețineți că, pentru toate exemplele următoare, trebuie să rulați sqlite3.exe și să deschideți o conexiune la baza de date eșantion ca flux:

Pas 1) În această etapă,

  1. Deschideți My Computer și navigați la următorul director „C:\sqlite" și
  2. Apoi deschideți „sqlite3.exe„:

Citirea datelor cu Select

Pas 2) Deschide baza de date „TutorialeSampleDB.db” prin următoarea comandă:

Citirea datelor cu Select

Acum sunteți gata să rulați orice tip de interogare în baza de date.

În clauza SELECT, puteți selecta nu numai un nume de coloană, dar aveți o mulțime de alte opțiuni pentru a specifica ce să selectați. După cum urmează:

SELECTAȚI *

Această comandă va selecta toate coloanele din toate tabelele (sau subinterogările) la care se face referire în clauza FROM. De exemplu:

SELECT * 
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Aceasta va selecta toate coloanele atât din tabelele studenți, cât și din tabelele departamentelor:

Citirea datelor cu Select

SELECTAȚI nume tabel.*

Aceasta va selecta toate coloanele numai din tabelul „tablename”. De exemplu:

SELECT Students.*
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Aceasta va selecta numai toate coloanele din tabelul studenților:

Citirea datelor cu Select

O valoare literală

O valoare literală este o valoare constantă care poate fi specificată în instrucțiunea select. Puteți utiliza valorile literale în mod normal în același mod în care utilizați numele de coloane în clauza SELECT. Aceste valori literale vor fi afișate pentru fiecare rând din rândurile returnate de interogarea SQL.

Iată câteva exemple de diferite valori literale pe care le puteți selecta:

  • Literal numeric – numere în orice format, cum ar fi 1, 2.55, etc.
  • Literale șir – Orice șir „SUA”, „acesta este un text exemplu”, … etc.
  • NULL – valoare NULL.
  • Current_TIME – Vă va oferi ora curentă.
  • CURRENT_DATE – aceasta vă va oferi data curentă.

Acest lucru poate fi util în unele situații în care trebuie să selectați o valoare constantă pentru toate rândurile returnate. De exemplu, dacă doriți să selectați toți studenții din tabelul Studenți, cu o nouă coloană numită țară care conține valoarea „USA”, puteți face acest lucru:

SELECT *, 'USA' AS Country FROM Students;

Acest lucru vă va oferi toate coloanele studenților, plus o nouă coloană „Țara” ca aceasta:

Citirea datelor cu Select

Rețineți că, această nouă coloană Țara nu este de fapt o nouă coloană adăugată la tabel. Este o coloană virtuală, creată în interogarea pentru afișarea rezultatelor și nu va fi creată pe tabel.

Nume și Alias

Aliasul este un nume nou pentru coloana care vă permite să selectați coloana cu un nume nou. Aliasurile de coloană sunt specificate folosind cuvântul cheie „AS”.

De exemplu, dacă doriți să selectați coloana StudentName pentru a fi returnată cu „Student Name” în loc de „StudentName”, îi puteți da un alias ca acesta:

SELECT StudentName AS 'Student Name' FROM Students;

Acest lucru vă va oferi numele elevilor cu numele „Numele elevului” în loc de „Numele elevului”, astfel:

Nume și Alias

Rețineți că, numele coloanei rămâne „Numele studentului„; coloana StudentName este în continuare aceeași, nu se schimbă după alias.

Aliasul nu va schimba numele coloanei; va schimba doar numele afișat în clauza SELECT.

De asemenea, rețineți că, cuvântul cheie „AS” este opțional, puteți pune numele aliasului fără el, ceva de genul acesta:

SELECT StudentName 'Student Name' FROM Students;

Și vă va oferi exact aceeași ieșire ca interogarea anterioară:

Nume și Alias

De asemenea, puteți da tabelelor aliasuri, nu doar coloane. Cu același cuvânt cheie „AS”. De exemplu, puteți face acest lucru:

SELECT s.* FROM Students AS s;

Acest lucru vă va oferi toate coloanele din tabelul Studenți:

Nume și Alias

Acest lucru poate fi foarte util dacă vă alăturați mai mult de o masă; în loc să repetați numele complet al tabelului în interogare, puteți da fiecărui tabel un nume scurt de alias. De exemplu, în următoarea interogare:

SELECT Students.StudentName, Departments.DepartmentName
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Această interogare va selecta numele fiecărui student din tabelul „Studenți” cu numele departamentului său din tabelul „Departamente”:

Nume și Alias

Cu toate acestea, aceeași interogare poate fi scrisă astfel:

SELECT s.StudentName, d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
  • Am dat tabelului Studenți un alias „s”, iar tabelului departamentelor un alias „d”.
  • Apoi, în loc să folosim numele complet al tabelului, am folosit pseudonimele lor pentru a ne referi la ele.
  • INNER JOIN unește două sau mai multe tabele folosind o condiție. În exemplul nostru, am alăturat tabelul Students cu tabelul Departments cu coloana DepartmentId. Există, de asemenea, o explicație aprofundată pentru INNER JOIN în „SQLite Joins” tutorial.

Aceasta vă va oferi rezultatul exact ca interogarea anterioară:

Nume și Alias

UNDE

Scrierea de interogări SQL folosind doar clauza SELECT cu clauza FROM așa cum am văzut în secțiunea anterioară, vă va oferi toate rândurile din tabele. Cu toate acestea, dacă doriți să filtrați datele returnate, trebuie să adăugați o clauză „UNDE”.

Clauza WHERE este folosită pentru a filtra setul de rezultate returnat de Interogare SQL. Iată cum funcționează clauza WHERE:

  • În clauza WHERE, puteți specifica o „expresie”.
  • Acea expresie va fi evaluată pentru fiecare rând returnat din tabelul(e) specificat(e) în clauza FROM.
  • Expresia va fi evaluată ca o expresie booleană, cu un rezultat fie adevărat, fals, fie nul.
  • Apoi vor fi returnate numai rândurile pentru care expresia a fost evaluată cu o valoare adevărată, iar cele cu rezultate false sau nule vor fi ignorate și nu vor fi incluse în setul de rezultate.
  • Pentru a filtra setul de rezultate folosind clauza WHERE, trebuie să utilizați expresii și operatori.

Lista operatorilor din SQLite și cum să le folosiți

În secțiunea următoare, vom explica cum puteți filtra folosind expresii și operatori.

Expresia este una sau mai multe valori sau coloane literale combinate între ele cu un operator.

Rețineți că puteți utiliza expresii atât în ​​clauza SELECT, cât și în clauza WHERE.

În următoarele exemple, vom încerca expresiile și operatorii atât din clauza select, cât și din clauza WHERE. Pentru a vă arăta cum se comportă.

Există diferite tipuri de expresii și operatori pe care îi puteți specifica după cum urmează:

SQLite operatorul de concatenare „||”

Acest operator este folosit pentru a concatena una sau mai multe valori sau coloane literale între ele. Va produce un șir de rezultate din toate valorile sau coloanele literale concatenate. De exemplu:

SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName
FROM Students;

Aceasta se va concatena într-un nou alias „StudentIdWithName„:

  • Valoarea literală a șirului „Id cu nume:
  • cu valoarea „Carnet de student” coloana și
  • cu valoarea de la „Numele studentului” coloana

SQLite operatorul de concatenare „||”

SQLite operator CAST:

Operatorul CAST este folosit pentru a converti o valoare dintr-un tip de date în altul tip de date.

De exemplu, dacă aveți o valoare numerică stocată ca valoare șir ca aceasta ” „12.5” ” și doriți să o convertiți într-o valoare numerică, puteți utiliza operatorul CAST pentru a face acest lucru astfel ”CAST(„12.5” CA REAL)„. Sau dacă aveți o valoare zecimală precum 12.5 și trebuie să obțineți numai partea întreagă, o puteți transforma într-un număr întreg ca acesta „CAST(12.5 AS INTEGER)”.

Exemplu

În următoarea comandă vom încerca să convertim diferite valori în alte tipuri de date:

SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;

Acest lucru vă va oferi:

SQLite CAST OperaTdR

Rezultatul este următorul:

  • CAST('12.5' ​​AS REAL) – valoarea '12.5' ​​este o valoare șir, va fi convertită într-o valoare REAL.
  • CAST(12.5 AS INTEGER) – valoarea 12.5 este o valoare zecimală, va fi convertită într-o valoare întreagă. Partea zecimală va fi trunchiată și devine 12.

SQLite Aritmetică Operators:

Luați două sau mai multe valori numerice literale sau coloane numerice și returnați o valoare numerică. Operatorii aritmetici suportați în SQLite sunt:

  • Adăugare „+” – dați suma celor doi operanzi.
  • Scăderea „-” – scade cei doi operanzi și rezultă diferența.
  • Înmulțirea „*” – produsul celor doi operanzi.
  • Memento (modulo) „%” – dă restul care rezultă din împărțirea unui operand la al doilea operand.
  • Divizia "/” – returnează coeficientul rezultat din împărțirea operandului din stânga la operandul din dreapta.

Exemplu:

În exemplul următor, vom încerca cei cinci operatori aritmetici cu valori numerice literale în același

select clauza:

SELECT 25+6, 25-6, 25*6, 25%6, 25/6;

Acest lucru vă va oferi:

SQLite Aritmetică Operatori

Observați cum am folosit o instrucțiune SELECT fără o clauză FROM aici. Și acest lucru este permis să intre SQLite atâta timp cât selectăm valori literale.

SQLite Operatori de comparație

Comparați doi operanzi unul cu celălalt și returnați un adevărat sau fals după cum urmează:

  • <” – returnează adevărat dacă operandul din stânga este mai mic decât operandul din dreapta.
  • <=” – returnează adevărat dacă operandul din stânga este mai mic sau egal cu operandul din dreapta.
  • >” – returnează adevărat dacă operandul din stânga este mai mare decât operandul din dreapta.
  • >=” – returnează adevărat dacă operandul din stânga este mai mare sau egal cu operandul din dreapta.
  • ="Și"==” – returnează adevărat dacă cei doi operanzi sunt egali. Rețineți că ambii operatori sunt aceiași și nu există nicio diferență între ei.
  • !="Și"<>” – returnează adevărat dacă cei doi operanzi nu sunt egali. Rețineți că ambii operatori sunt aceiași și nu există nicio diferență între ei.

Rețineți că, SQLite exprimă valoarea adevărată cu 1 și valoarea falsă cu 0.

Exemplu:

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 '<>';

Acest lucru va da ceva de genul acesta:

SQLite Comparaţie Operatori

SQLite Operatori de potrivire a modelelor

SIMILAR” – este folosit pentru potrivirea modelelor. Folosind „Aprecieri„, puteți căuta valori care se potrivesc cu un model specificat folosind un wildcard.

Operandul din stânga poate fi fie o valoare literală șir, fie o coloană de șir. Modelul poate fi specificat după cum urmează:

  • Conține model. De exemplu, StudentName LIKE '%a%' – aceasta va căuta numele studenților care conțin litera „a” în orice poziție din coloana StudentName.
  • Începe cu modelul. De exemplu, "StudentName LIKE „a%”” – căutați numele elevilor care încep cu litera „a”.
  • Se termină cu modelul. De exemplu, "StudentName LIKE '%a'” – Căutați numele elevilor care se termină cu litera „a”.
  • Potrivirea oricărui caracter dintr-un șir folosind litera de subliniere „_”. De exemplu, "StudentName LIKE „J___”” – Căutați numele elevilor care au 4 caractere. Trebuie să înceapă cu litera „J” și poate avea alte trei caractere după litera „J”.

Exemple de potrivire a modelelor:

  1. Obțineți nume de studenți care încep cu litera „j”:
    SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';

    Rezultat:

    SQLite Potrivire de model Operatori

  2. Obțineți numele elevilor care se termină cu litera „y”:
    SELECT StudentName FROM Students WHERE StudentName LIKE '%y';

    Rezultat:

    SQLite Potrivire de model Operatori

  3. Obțineți numele studenților care conțin litera „n”:
    SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';

    Rezultat:

    SQLite Potrivire de model Operatori

„GLOB” – este echivalent cu operatorul LIKE, dar GLOB este sensibil la majuscule, spre deosebire de operatorul LIKE. De exemplu, următoarele două comenzi vor returna rezultate diferite:

SELECT 'Jack' GLOB 'j%';
SELECT 'Jack' LIKE 'j%';

Acest lucru vă va oferi:

SQLite Potrivire de model Operatori

  • Prima instrucțiune returnează 0 (fals) deoarece operatorul GLOB este sensibil la majuscule și minuscule, deci „j” nu este egal cu „J”. Cu toate acestea, a doua instrucțiune va returna 1 (adevărat), deoarece operatorul LIKE nu face distincție între majuscule și minuscule, deci „j” este egal cu „J”.

Alti operatori:

SQLite AND

Un operator logic care combină una sau mai multe expresii. Va returna adevărat, numai dacă toate expresiile dau o valoare „adevărată”. Cu toate acestea, va returna false numai dacă toate expresiile dau o valoare „falsă”.

Exemplu:

Următoarea interogare va căuta studenți care au StudentId > 5 și StudentName începe cu litera N, studenții returnați trebuie să îndeplinească cele două condiții:

SELECT * 
FROM Students 
WHERE (StudentId > 5) AND (StudentName LIKE 'N%');

SQLite AND OperaTdR

Ca rezultat, în captura de ecran de mai sus, aceasta vă va oferi doar „Nancy”. Nancy este singura studentă care îndeplinește ambele condiții.

SQLite OR

Un operator logic care combină una sau mai multe expresii, astfel încât, dacă unul dintre operatorii combinați rezultă adevărat, atunci va returna adevărat. Cu toate acestea, dacă toate expresiile sunt false, va returna false.

Exemplu:

Următoarea interogare va căuta studenți care au StudentId > 5 sau StudentName începe cu litera N, studenții returnați trebuie să îndeplinească cel puțin una dintre condiții:

SELECT * 
FROM Students 
WHERE (StudentId > 5) OR (StudentName LIKE 'N%');

Acest lucru vă va oferi:

SQLite OR OperaTdR

Ca rezultat, în captura de ecran de mai sus, aceasta vă va oferi numele unui student cu litera „n” în numele său plus ID-ul studentului având valoare>5.

După cum puteți vedea, rezultatul este diferit de interogarea cu operatorul AND.

SQLite ÎNTRE

BETWEEN este utilizat pentru a selecta acele valori care se află într-un interval de două valori. De exemplu, "X INTRE Y SI Z” va returna true (1) dacă valoarea X este între cele două valori Y și Z. În caz contrar, va returna false (0). „X INTRE Y SI Z" este echivalent cu "X >= Y ȘI X <= Z„, X trebuie să fie mai mare sau egal cu Y și X este mai mic sau egal cu Z.

Exemplu:

În următorul exemplu de interogare, vom scrie o interogare pentru a obține studenții cu valoarea ID între 5 și 8:

SELECT *
FROM Students
WHERE StudentId BETWEEN 5 AND 8;

Acest lucru va oferi numai studenților cu id-urile 5, 6, 7 și 8:

SQLite ÎNTRE OperaTdR

SQLite IN

Preia un operand și o listă de operanzi. Va returna true dacă valoarea primului operand este egală cu una dintre valoarea operanzilor din listă. Operatorul IN returnează true (1) dacă lista de operanzi conține prima valoare a operandului în valorile sale. În caz contrar, va returna false (0).

Ca aceasta: "col IN(x, y, z)„. Acest lucru este echivalent cu ” (col=x) sau (col=y) sau (col=z) ".

Exemplu:

Următoarea interogare va selecta numai studenții cu ID-uri 2, 4, 6, 8:

SELECT * 
FROM Students
WHERE StudentId IN(2, 4, 6, 8);

Asa:

SQLite IN OperaTdR

Interogarea anterioară va oferi rezultatul exact ca următoarea interogare, deoarece sunt echivalente:

SELECT * 
FROM Students
WHERE (StudentId = 2) OR (StudentId =  4) OR (StudentId =  6) OR (StudentId = 8);

Ambele interogări oferă rezultatul exact. Cu toate acestea, diferența dintre cele două interogări este că prima interogare am folosit operatorul „IN”. În a doua interogare, am folosit mai mulți operatori „SAU”.

Operatorul IN este echivalent cu utilizarea mai multor operatori SAU. „WHERE StudentId IN(2, 4, 6, 8)" este echivalent cu " WHERE (StudentId = 2) SAU (StudentId = 4) SAU (StudentId = 6) SAU (StudentId = 8);

Asa:

SQLite IN OperaTdR

SQLite NU ÎN

Operandul „NOT IN” este opusul operatorului IN. Dar cu aceeași sintaxă; este nevoie de un operand și o listă de operanzi. Va returna true dacă valoarea primului operand nu este egală cu una dintre valoarea operanzilor din listă. adică, va returna true (0) dacă lista de operanzi nu conține primul operand. Ca aceasta: "col NOT IN(x, y, z)„. Aceasta este echivalentă cu „(col<>x) ȘI (col<>y) ȘI (col<>z)".

Exemplu:

Următoarea interogare va selecta studenți cu ID-uri care nu sunt egale cu unul dintre aceste ID-uri 2, 4, 6, 8:

SELECT * 
FROM Students
WHERE StudentId NOT IN(2, 4, 6, 8);

Ca asta

SQLite NU ÎN OperaTdR

Interogarea anterioară dăm rezultatul exact ca următoarea interogare, deoarece sunt echivalente:

SELECT * 
FROM Students
WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);

Asa:

SQLite NU ÎN OperaTdR

În captura de ecran de mai sus,

Am folosit mai mulți operatori care nu sunt egali „<>” pentru a obține o listă de studenți, care nu sunt egali cu niciunul dintre următoarele Id-uri 2, 4, 6 sau 8. Această interogare va returna toți ceilalți studenți în afară de aceste liste de Id-uri.

SQLite EXISTĂ

Operatorii EXISTS nu preiau operanzi; este nevoie doar de o clauză SELECT după ea. Operatorul EXISTS va returna true (1) dacă există rânduri returnate din clauza SELECT și va returna false (0) dacă nu există rânduri returnate de la clauza SELECT.

Exemplu:

În exemplul următor, vom selecta numele departamentului, dacă id-ul departamentului există în tabelul studenților:

SELECT DepartmentName
FROM Departments AS d
WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);

Acest lucru vă va oferi:

SQLite EXISTĂ OperaTdR

Doar cele trei departamente”IT, Fizică și Arte” va fi returnat. Și numele departamentului „matematica” nu va fi returnat deoarece nu există niciun student în acea secție, deci ID-ul departamentului nu există în tabelul studenților. De aceea operatorul EXISTS a ignorat „matematica” departament.

SQLite NU

Reversează rezultatul operatorului precedent care vine după el. De exemplu:

  • NOT BETWEEN – Va returna true dacă BETWEEN returnează false și invers.
  • NOT LIKE – Va returna true dacă LIKE returnează false și invers.
  • NOT GLOB – Va returna true dacă GLOB returnează false și invers.
  • NOT EXISTS – Va returna true dacă EXISTS returnează false și invers.

Exemplu:

În exemplul următor, vom folosi operatorul NOT cu operatorul EXISTS pentru a obține numele departamentelor care nu există în tabelul Studenți, care este rezultatul invers al operatorului EXISTS. Deci, căutarea se va face prin DepartmentId care nu există în tabelul departamentului.

SELECT DepartmentName
FROM Departments AS d
WHERE NOT EXISTS (SELECT DepartmentId 
                  FROM Students AS s 
                  WHERE d.DepartmentId = s.DepartmentId);

producție:

SQLite NU OperaTdR

Doar departamentul”matematica ” va fi returnat. Deoarece "matematica” catedra este singura catedra, care nu exista in tabelul studentilor.

Limitare și ordonare

SQLite Order

SQLite Ordinea este de a sorta rezultatul după una sau mai multe expresii. Pentru a ordona setul de rezultate, trebuie să utilizați clauza ORDER BY după cum urmează:

  • În primul rând, trebuie să specificați clauza ORDER BY.
  • Clauza ORDER BY trebuie specificată la sfârșitul interogării; numai clauza LIMIT poate fi specificată după aceasta.
  • Specificați expresia cu care să ordonați datele, această expresie poate fi un nume de coloană sau o expresie.
  • După expresie, puteți specifica o direcție opțională de sortare. Fie DESC, pentru a ordona datele descendent, fie ASC pentru a ordona datele crescător. Dacă nu ați specificat niciunul dintre ele, datele ar fi sortate crescător.
  • Puteți specifica mai multe expresii folosind „,” între ele.

Exemplu

În exemplul următor, vom selecta toți studenții ordonați după nume, dar în ordine descrescătoare, apoi după numele departamentului în ordine crescătoare:

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;

Acest lucru vă va oferi:

Limitare și ordonare

  • SQLite va ordona mai întâi toți studenții după numele departamentului în ordine crescătoare
  • Apoi, pentru fiecare nume de departament, toți studenții sub acel nume de departament vor fi afișați în ordine descrescătoare după numele lor

SQLite Limită:

Puteți limita numărul de rânduri returnate de interogarea dvs. SQL, utilizând clauza LIMIT. De exemplu, LIMIT 10 vă va oferi doar 10 rânduri și va ignora toate celelalte rânduri.

În clauza LIMIT, puteți selecta un anumit număr de rânduri începând de la o anumită poziție folosind clauza OFFSET. De exemplu, "LIMITA 4 OFFSET 4” va ignora primele 4 rânduri și va returna 4 rânduri începând de la al cincilea rând, astfel încât veți obține rândurile 5,6,7, 8, XNUMX și XNUMX.

Rețineți că clauza OFFSET este opțională, o puteți scrie ca „LIMIT 4, 4” și vă va oferi rezultatele exacte.

Exemplu:

În exemplul următor, vom returna doar 3 studenți pornind de la id-ul studentului 5 folosind interogarea:

SELECT * FROM Students LIMIT 4,3;

Acest lucru vă va oferi doar trei studenți începând de la rândul 5. Prin urmare, vă va oferi rândurile cu StudentId 5, 6 și 7:

Limitare și ordonare

Eliminarea duplicatelor

Dacă interogarea dvs. SQL returnează valori duplicate, puteți utiliza „DISTINCT” pentru a elimina acele duplicate și a reveni pe valori distincte. Puteți specifica mai mult de o coloană după funcționarea tastei DISTINCT.

Exemplu:

Următoarea interogare va returna „valori nume de departament” duplicat: Aici avem valori duplicate cu nume IT, Fizică și Arte.

SELECT d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Acest lucru vă va oferi valori duplicate pentru numele departamentului:

Eliminarea duplicatelor

Observați cum există valori duplicate pentru numele departamentului. Acum, vom folosi cuvântul cheie DISTINCT cu aceeași interogare pentru a elimina acele duplicate și pentru a obține doar valori unice. Ca aceasta:

SELECT DISTINCT d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Acest lucru vă va oferi doar trei valori unice pentru coloana cu numele departamentului:

Eliminarea duplicatelor

Agregat

SQLite Agregatele sunt funcții încorporate definite în SQLite care va grupa mai multe valori ale mai multor rânduri într-o singură valoare.

Iată agregatele susținute de SQLite:

SQLite AVG()

A returnat media pentru toate valorile x.

Exemplu:

În exemplul următor vom obține nota medie pe care o obțin elevii la toate examenele:

SELECT AVG(Mark) FROM Marks;

Aceasta vă va oferi valoarea „18.375”:

Agregat:SQLite AVG()

Aceste rezultate provin din însumarea tuturor valorilor notelor împărțite la numărul lor.

COUNT() – COUNT(X) sau COUNT(*)

Returnează numărul total de câte ori a apărut valoarea x. Și iată câteva opțiuni pe care le puteți folosi cu COUNT:

  • COUNT(x): Numărează numai valorile x, unde x este un nume de coloană. Va ignora valorile NULL.
  • COUNT(*): Numără toate rândurile din toate coloanele.
  • COUNT (DISTINCT x): Puteți specifica un cuvânt cheie DISTINCT înainte de x, care va obține numărul valorilor distincte ale lui x.

Exemplu

În exemplul următor, vom obține numărul total de departamente cu COUNT(DepartmentId), COUNT(*) și COUNT(DISTINCT DepartmentId) și modul în care sunt diferite:

SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;

Acest lucru vă va oferi:

Agregat:COUNT() – COUNT(X) sau COUNT(*)

După cum urmează:

  • COUNT(DepartmentId) vă va oferi numărul tuturor ID-ului departamentului și va ignora valorile nule.
  • COUNT(DISTINCT DepartmentId) vă oferă valori distincte ale DepartmentId, care sunt doar 3. Care sunt cele trei valori diferite ale numelui departamentului. Observați că există 8 valori ale numelui departamentului în numele studentului. Dar numai cele trei valori diferite care sunt matematică, informatică și fizică.
  • COUNT(*) numără numărul de rânduri din tabelul studenților care sunt 10 rânduri pentru 10 studenți.

GROUP_CONCAT() – GROUP_CONCAT(X) sau GROUP_CONCAT(X,Y)

Funcția agregată GROUP_CONCAT concatenează mai multe valori într-o singură valoare cu o virgulă pentru a le separa. Are următoarele opțiuni:

  • GROUP_CONCAT(X): Aceasta va concatena toată valoarea lui x într-un șir, cu virgula „,” folosită ca separator între valori. Valorile NULL vor fi ignorate.
  • GROUP_CONCAT(X, Y): Aceasta va concatena valorile lui x într-un șir, valoarea lui y folosită ca separator între fiecare valoare în loc de separatorul implicit „,”. De asemenea, valorile NULL vor fi ignorate.
  • GROUP_CONCAT(DISTINCT X): Aceasta va concatena toate valorile distincte ale lui x într-un șir, cu virgula „,” folosită ca separator între valori. Valorile NULL vor fi ignorate.

GROUP_CONCAT(DepartmentName) Exemplu

Următoarea interogare va concatena toate valorile numelui departamentului din tabelul studenților și al departamentelor într-un șir separat prin virgulă. Deci, în loc să returnați o listă de valori, o valoare pe fiecare rând. Va returna o singură valoare pe un rând, cu toate valorile separate prin virgulă:

SELECT GROUP_CONCAT(d.DepartmentName)
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Acest lucru vă va oferi:

Agregat:GROUP_CONCAT() – GROUP_CONCAT(X) sau GROUP_CONCAT(X,Y)

Aceasta vă va oferi lista cu valorile numelor de 8 departamente concatenate într-un șir separate prin virgulă.

GROUP_CONCAT(DISTINCT DepartmentName) Exemplu

Următoarea interogare va concatena valorile distincte ale numelui departamentului din tabelul studenți și departamente într-un șir separat prin virgulă:

SELECT GROUP_CONCAT(DISTINCT d.DepartmentName)
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Acest lucru vă va oferi:

Agregat:GROUP_CONCAT(DISTINCT DepartmentName) Exemplu

Observați cum rezultatul este diferit de rezultatul anterior; au fost returnate doar trei valori care sunt numele departamentelor distincte, iar valorile duplicate au fost eliminate.

GROUP_CONCAT(DepartmentName ,'&') Exemplu

Următoarea interogare va concatena toate valorile coloanei cu numele departamentului din tabelul studenți și departamente într-un singur șir, dar cu caracterul „&” în loc de virgulă ca separator:

SELECT GROUP_CONCAT(d.DepartmentName, '&')
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Acest lucru vă va oferi:

Agregat:GROUP_CONCAT(DepartmentName ,'&') Exemplu

Observați cum este folosit caracterul „&” în loc de caracterul implicit „,” pentru a separa valorile.

SQLite MAX() și MIN()

MAX(X) vă returnează cea mai mare valoare dintre valorile X. MAX va returna o valoare NULL dacă toate valorile lui x sunt nule. În timp ce MIN(X) vă returnează cea mai mică valoare din valorile X. MIN va returna o valoare NULL dacă toate valorile lui X sunt nule.

Exemplu

În următoarea interogare, vom folosi funcțiile MIN și MAX pentru a obține nota cea mai mare și nota cea mai mică de la „Marks" masa:

SELECT MAX(Mark), MIN(Mark) FROM Marks;

Acest lucru vă va oferi:

Agregat:SQLite MAX() și MIN()

SQLite SUMA(x), Total(x)

Ambele vor returna suma tuturor valorilor x. Dar ele sunt diferite în următoarele:

  • SUM va returna nul dacă toate valorile sunt nule, dar Total va returna 0.
  • TOTAL returnează întotdeauna valori în virgulă mobilă. SUM returnează o valoare întreagă dacă toate valorile x sunt un număr întreg. Cu toate acestea, dacă valorile nu sunt un număr întreg, va returna o valoare în virgulă mobilă.

Exemplu

În următoarea interogare vom folosi SUM și total pentru a obține suma tuturor notelor din „Marks" Mese:

SELECT SUM(Mark), TOTAL(Mark) FROM Marks;

Acest lucru vă va oferi:

Agregat:SQLite SUMA(x), Total(x)

După cum puteți vedea, TOTAL returnează întotdeauna o virgulă mobilă. Dar SUM returnează o valoare întreagă, deoarece valorile din coloana „Marcați” pot fi în numere întregi.

Diferența dintre SUM și TOTAL exemplu:

În următoarea interogare vom arăta diferența dintre SUM și TOTAL atunci când obțin SUMA valorilor NULL:

SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;

Acest lucru vă va oferi:

Agregat: Diferența dintre SUM și TOTAL Exemplu

Rețineți că nu există semne pentru TestId = 4, deci există valori nule pentru acel test. SUM returnează o valoare nulă ca un gol, în timp ce TOTAL returnează 0.

A se grupa cu

Clauza GROUP BY este folosită pentru a specifica una sau mai multe coloane care vor fi folosite pentru a grupa rândurile în grupuri. Rândurile cu aceleași valori vor fi adunate (aranjate) împreună în grupuri.

Pentru orice altă coloană care nu este inclusă în gruparea după coloane, puteți utiliza o funcție de agregare pentru aceasta.

Exemplu:

Următoarea interogare vă va oferi numărul total de studenți prezenți în fiecare departament.

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;

Acest lucru vă va oferi:

Grupați clauza BY:HAVING

Clauza GROUPBY DepartmentName va grupa toți studenții în grupuri câte unul pentru fiecare nume de departament. Pentru fiecare grupă de „catedra”, se va număra studenții pe ea.

clauza HAVING

Dacă doriți să filtrați grupurile returnate de clauza GROUP BY, atunci puteți specifica o clauză „HAVING” cu expresia după GROUP BY. Expresia va fi folosită pentru a filtra aceste grupuri.

Exemplu

În următoarea interogare, vom selecta acele departamente care au doar doi studenți:

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;

Acest lucru vă va oferi:

A se grupa cu

Clauza HAVING COUNT(S.StudentId) = 2 va filtra grupurile returnate și va returna numai acele grupuri care conțin exact doi studenți pe ea. În cazul nostru, departamentul de Arte are 2 studenți, deci este afișat în ieșire.

SQLite Interogare și subinterogare

În interiorul oricărei interogări, puteți utiliza o altă interogare fie într-o interogare SELECT, INSERT, DELETE, UPDATE sau în interiorul unei alte subinterogări.

Această interogare imbricată se numește subinterogare. Vom vedea acum câteva exemple de utilizare a subinterogărilor în clauza SELECT. Cu toate acestea, în tutorialul Modificarea datelor, vom vedea cum putem folosi subinterogări cu instrucțiunile INSERT, DELETE și UPDATE.

Utilizarea subinterogării în exemplul clauzei FROM

În următoarea interogare vom include o subinterogare în clauza 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;

Interogarea:

   SELECT StudentId, Mark
   FROM Tests AS t
   INNER JOIN Marks AS m ON t.TestId = m.TestId

Interogarea de mai sus este numită subinterogare aici deoarece este imbricată în clauza FROM. Observați că i-am dat un nume de alias „t”, astfel încât să ne putem referi la coloanele returnate din acesta în interogare.

Această interogare vă va oferi:

SQLite Interogare și subinterogare: Utilizarea subinterogare în clauza FROM

Deci, în cazul nostru,

  • s.StudentName este selectat din interogarea principală care dă numele elevilor și
  • t.Mark este selectat din subinterogare; care dă note obţinute de fiecare dintre aceşti elevi

Folosind subinterogare în exemplul clauzei WHERE

În următoarea interogare vom include o subinterogare în clauza WHERE:

SELECT DepartmentName
FROM Departments AS d
WHERE NOT EXISTS (SELECT DepartmentId 
                  FROM Students AS s 
                  WHERE d.DepartmentId = s.DepartmentId);

Interogarea:

SELECT DepartmentId 
FROM Students AS s 
WHERE d.DepartmentId = s.DepartmentId

Interogarea de mai sus este numită subinterogare aici deoarece este imbricată în clauza WHERE. Subinterogarea va returna valorile DepartmentId care vor fi folosite de operatorul NOT EXISTS.

Această interogare vă va oferi:

SQLite Interogare și subinterogare: Utilizarea subinterogare în clauza WHERE

În interogarea de mai sus, am selectat departamentul care nu are niciun student înscris în ea. Care este departamentul „Matematică” de aici.

set Opera– UNION,Intersect

SQLite acceptă următoarele operații SET:

UNIRE & UNIRE TOATE

Combină unul sau mai multe seturi de rezultate (un grup de rânduri) returnate din mai multe instrucțiuni SELECT într-un singur set de rezultate.

UNION va returna valori distincte. Cu toate acestea, UNION ALL nu va include și va include duplicate.

Rețineți că numele coloanei va fi numele coloanei specificat în prima instrucțiune SELECT.

UNIREA Exemplu

În exemplul următor, vom obține lista cu DepartmentId din tabelul studenți și lista cu DepartmentId din tabelul departamente din aceeași coloană:

SELECT DepartmentId AS DepartmentIdUnioned FROM Students
UNION
SELECT DepartmentId FROM Departments;

Acest lucru vă va oferi:

set Operațiuni - UNION Exemplu

Interogarea returnează doar 5 rânduri care sunt valori distincte ale ID-ului departamentului. Observați prima valoare care este valoarea nulă.

SQLite UNION ALL Exemplu

În exemplul următor, vom obține lista cu DepartmentId din tabelul studenți și lista cu DepartmentId din tabelul departamente din aceeași coloană:

SELECT DepartmentId AS DepartmentIdUnioned FROM Students
UNION ALL
SELECT DepartmentId FROM Departments;

Acest lucru vă va oferi:

set Operațiuni - UNION Exemplu

Interogarea va returna 14 rânduri, 10 rânduri din tabelul studenți și 4 din tabelul departamentelor. Rețineți că, există duplicate în valorile returnate. De asemenea, rețineți că numele coloanei a fost cel specificat în prima instrucțiune SELECT.

Acum, să vedem cum UNION all va da rezultate diferite dacă înlocuim UNION ALL cu UNION:

SQLite INTERSECT

Returnează valorile care există în ambele seturi de rezultate combinate. Valorile care există într-unul dintre seturile de rezultate combinate vor fi ignorate.

Exemplu

În următoarea interogare, vom selecta valorile DepartmentId care există în ambele tabele Students și Departments din coloana DepartmentId:

SELECT DepartmentId FROM Students
Intersect
SELECT DepartmentId FROM Departments;

Acest lucru vă va oferi:

set Operațiuni - INTERSECT

Interogarea returnează doar trei valori 1, 2 și 3. Care sunt valorile care există în ambele tabele.

Cu toate acestea, valorile null și 4 nu au fost incluse deoarece valoarea nulă există numai în tabelul studenți și nu în tabelul departamentelor. Iar valoarea 4 există în tabelul departamentelor și nu în tabelul studenților.

De aceea, ambele valori NULL și 4 au fost ignorate și nu au fost incluse în valorile returnate.

CU EXCEPTIA

Să presupunem că dacă aveți două liste de rânduri, list1 și list2, și doriți doar rândurile din list1 care nu există în list2, puteți utiliza clauza „EXCEPȚIE”. Clauza EXCEPT compară cele două liste și returnează acele rânduri care există în list1 și nu există în list2.

Exemplu

În următoarea interogare, vom selecta valorile DepartmentId care există în tabelul departamente și nu există în tabelul studenți:

SELECT DepartmentId FROM Departments
EXCEPT
SELECT DepartmentId FROM Students;

Acest lucru vă va oferi:

set Operațiuni - CU EXCEPȚIA

Interogarea returnează doar valoarea 4. Care este singura valoare care există în tabelul departamente și nu există în tabelul studenți.

manipulare NULL

"NULL” valoarea este o valoare specială în SQLite. Este folosit pentru a reprezenta o valoare necunoscută sau care lipsește. Rețineți că valoarea nulă este total diferită de „0” sau valoare goală „”. Deoarece 0 și valoarea goală este o valoare cunoscută, totuși, valoarea nulă este necunoscută.

Valorile NULL necesită o manipulare specială SQLite, vom vedea acum cum să gestionăm valorile NULL.

Căutați valori NULL

Nu puteți utiliza operatorul normal de egalitate (=) pentru a căuta valorile nule. De exemplu, următoarea interogare caută studenții care au o valoare DepartmentId nulă:

SELECT * FROM Students WHERE DepartmentId = NULL;

Această interogare nu va da niciun rezultat:

Manipulare NULL

Deoarece valoarea NULL nu este egală cu nicio altă valoare care include o valoare nulă în sine, de aceea nu a returnat niciun rezultat.

  • Cu toate acestea, pentru a face interogarea să funcționeze, trebuie să utilizați „Este nulă” operator pentru a căuta valori nule după cum urmează:
SELECT * FROM Students WHERE DepartmentId IS NULL;

Acest lucru vă va oferi:

Manipulare NULL

Interogarea va returna acei studenți care au o valoare DepartmentId nulă.

  • Dacă doriți să obțineți acele valori care nu sunt nule, atunci trebuie să utilizați „NU ESTE NULL” operator ca acesta:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;

Acest lucru vă va oferi:

Manipulare NULL

Interogarea va returna acei studenți care nu au o valoare NULL DepartmentId.

Rezultate condiționate

Dacă aveți o listă de valori și doriți să selectați oricare dintre ele în funcție de anumite condiții. Pentru aceasta, condiția pentru valoarea respectivă ar trebui să fie adevărată pentru a fi selectată.

Expresia CASE va evalua aceste liste de condiții pentru toate valorile. Dacă condiția este adevărată, va returna acea valoare.

De exemplu, dacă aveți o coloană „Notă” și doriți să selectați o valoare text pe baza valorii notei, după cum urmează:

– „Excelent” dacă nota este mai mare de 85.

– „Foarte bine” dacă nota este între 70 și 85.

– „Bine” dacă nota este între 60 și 70.

Apoi puteți folosi expresia CASE pentru a face asta.

Aceasta poate fi folosită pentru a defini o anumită logică în clauza SELECT, astfel încât să puteți selecta anumite rezultate în funcție de anumite condiții, cum ar fi declarația if, de exemplu.

Operatorul CASE poate fi definit cu diferite sintaxe, după cum urmează:

  1. Puteți utiliza diferite condiții:
CASE 
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  WHEN condition3 THEN result3
  …
  ELSE resultn
END
  1. Sau, puteți folosi o singură expresie și puneți diferite valori posibile din care să alegeți:
CASE expression
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  WHEN value3 THEN result3
  …
  ELSE restuln 
END

Rețineți că clauza ELSE este opțională.

Exemplu

În exemplul următor, vom folosi CASE expresie cu NULL valoare în coloana ID departament din tabelul Studenți pentru a afișa textul „Fără departament” după cum urmează:

SELECT 
  StudentName,
  CASE 
    WHEN DepartmentId IS NULL THEN 'No Department'
    ELSE DepartmentId 
  END AS DepartmentId
FROM Students;
  • Operatorul CASE va verifica valoarea DepartmentId-ului dacă este nulă sau nu.
  • Dacă este o valoare NULL, atunci va selecta valoarea literală „Fără departament” în loc de valoarea DepartmentId.
  • Dacă nu este o valoare nulă, atunci va selecta valoarea coloanei DepartmentId.

Acest lucru vă va oferi rezultatul așa cum se arată mai jos:

Rezultate condiționate

Expresie comună de tabel

Expresiile comune de tabel (CTE) sunt subinterogări care sunt definite în interiorul instrucțiunii SQL cu un nume dat.

Are un avantaj față de subinterogări, deoarece este definit din instrucțiunile SQL și va face interogările mai ușor de citit, întreținut și înțeles.

O expresie de tabel comună poate fi definită punând clauza WITH în fața unei instrucțiuni SELECT, după cum urmează:

WITH CTEname
AS
(
   SELECT statement
)
SELECT, UPDATE, INSERT, or update statement here FROM CTE

"Nume CTE” este orice nume pe care îl poți da pentru CTE, îl poți folosi pentru a te referi la el mai târziu. Rețineți că puteți defini instrucțiunile SELECT, UPDATE, INSERT sau DELETE pe CTE

Acum, să vedem un exemplu de utilizare a CTE în clauza SELECT.

Exemplu

În exemplul următor, vom defini un CTE dintr-o instrucțiune SELECT și apoi îl vom folosi mai târziu la o altă interogare:

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;

În această interogare, am definit un CTE și i-am dat numele „Toate departamentele„. Acest CTE a fost definit dintr-o interogare SELECT:

SELECT DepartmentId, DepartmentName
  FROM Departments

Apoi, după ce am definit CTE, l-am folosit în interogarea SELECT care urmează după el.

Rețineți că, expresiile comune de tabel nu afectează rezultatul interogării. Este o modalitate de a defini o vedere logică sau o subinterogare pentru a le reutiliza în aceeași interogare. Expresiile comune de tabel sunt ca o variabilă pe care o declarați și o reutilizați ca subinterogare. Doar instrucțiunea SELECT afectează rezultatul interogării.

Această interogare vă va oferi:

Expresie comună de tabel

Interogări avansate

Interogările avansate sunt acele interogări care conțin îmbinări complexe, subinterogări și unele agregate. În secțiunea următoare vom vedea un exemplu de interogare avansată:

De unde obținem,

  • Numele departamentelor cu toți studenții pentru fiecare departament
  • Numele elevilor separat prin virgulă și
  • Arată departamentul care are cel puțin trei studenți în ea
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;

Am adăugat un JOIN clauză pentru a obține DepartmentName din tabelul Departments. După aceea am adăugat o clauză GROUP BY cu două funcții agregate:

  • „COUNT” pentru a număra studenții pentru fiecare grup de departamente.
  • GROUP_CONCAT pentru a concatena studenții pentru fiecare grup, separați prin virgulă într-un șir.
  • După GROUP BY, am folosit clauza HAVING pentru a filtra departamentele și a selecta doar acele departamente care au cel puțin 3 studenți.

Rezultatul va fi următorul:

Întrebări avansate

Rezumat

Aceasta a fost o introducere în scris SQLite interogări și elementele de bază ale interogării bazei de date și cum puteți filtra datele returnate. Acum poți să-l scrii pe al tău SQLite întrebări.