Introducere în limbajul de interogare structurat SQL. Scurtă descriere SQL

Limbaj de programare

SQL (Structured Query Language) este un limbaj de gestionare a bazelor de date pentru baze de date relaționale. SQL în sine nu este un limbaj de programare complet Turing, dar standardul său permite crearea de extensii procedurale pentru acesta, care își extind funcționalitatea într-un limbaj de programare cu drepturi depline.

Limbajul a fost creat în anii 1970 sub numele „SEQUEL” pentru sistemul de gestionare a bazelor de date (DBMS) System R. Mai târziu a fost redenumit „SQL” pentru a evita conflictele mărci. În 1979, SQL a fost publicat pentru prima dată ca produs comercial, Oracle V2.

Primul standard de limbă oficială a fost adoptat de ANSI în 1986 și ISO în 1987. De atunci, au mai fost create câteva versiuni ale standardului, unele dintre ele repetându-le pe cele anterioare cu variații minore, altele luând noi caracteristici semnificative.

În ciuda existenței standardelor, cele mai comune Implementări SQL diferă atât de mult încât codul poate fi rar transferat de la un SGBD la altul fără a face modificări semnificative. Acest lucru se datorează lungimii și complexității standardului, precum și lipsei sale de specificații în unele domenii importante de implementare.

SQL a fost creat ca o modalitate simplă, standardizată de a prelua și manipula datele conținute în baza de date relationala date. Mai târziu, a devenit mai complex decât intenționat și a devenit mai degrabă un instrument de dezvoltare decât Utilizator final. În prezent, SQL (în cea mai mare parte implementat de Oracle) rămâne cel mai popular dintre limbajele de gestionare a bazelor de date, deși există o serie de alternative.

SQL este format din patru părți distincte:

  1. Data Definition Language (DDL) este folosit pentru a defini structurile de date stocate în baza de date. Instrucțiunile DDL vă permit să creați, să modificați și să ștergeți obiecte individuale din baza de date. Tipurile de obiecte valide depind de SGBD utilizat și includ de obicei baze de date, utilizatori, tabele și un număr de obiecte suport mai mici, cum ar fi roluri și indecși.
  2. Limbajul de manipulare a datelor (DML) este folosit pentru a prelua și modifica datele din baza de date. Instrucțiunile DML vă permit să preluați, să inserați, să modificați și să ștergeți date din tabele. Uneori, instrucțiunile de selectare pentru extragerea datelor nu sunt considerate parte a DML deoarece nu schimbă starea datelor. Toate declarațiile DML sunt de natură declarativă.
  3. Limbajul de definire a accesului la date (DCL) este utilizat pentru a controla accesul la datele din baza de date. Declarațiile DCL se aplică privilegiilor și vă permit să acordați și să revocați drepturi de a aplica anumite instrucțiuni DDL și DML anumitor obiecte de bază de date.
  4. Transaction Control Language (TCL) este folosit pentru a controla procesarea tranzacțiilor din baza de date. În mod obișnuit, declarațiile TCL includ commit to commit modificările făcute în timpul unei tranzacții, rollback pentru a le derula înapoi și salvare pentru a împărți tranzacția în mai multe părți mai mici.

Trebuie remarcat faptul că SQL implementează o paradigmă de programare declarativă: fiecare instrucțiune descrie doar acțiunea necesară, iar SGBD ia o decizie cu privire la modul de executare, de ex. planifică operaţiile elementare necesare efectuării unei acţiuni şi le realizează. Cu toate acestea, pentru utilizare eficientă Capabilitati SQL Dezvoltatorul trebuie să înțeleagă modul în care SGBD analizează fiecare instrucțiune și își creează planul de execuție.

Exemple:

Salut Lume!:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

Șirul „Hello, World!” este selectat din tabelul dual încorporat, care este utilizat pentru interogări care nu necesită acces la tabele reale.

selectați „Bună ziua, lume!” din dual ;

factorial:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

SQL nu acceptă bucle, recursivitate sau funcții personalizate. Acest exemplu demonstrează o posibilă soluție folosind:

  • nivel de pseudo-coloană pentru a crea pseudo-tabele t1 și t2 care conțin numere de la 1 la 16,
  • funcția agregată sum , care vă permite să însumați elementele unei mulțimi fără a utiliza în mod explicit o buclă,
  • Și functii matematice ln și exp , care vă permit să înlocuiți produsul (necesar pentru a calcula factorialul) cu suma (furnizată de SQL).

Linia „0! = 1” nu va fi inclus în setul de rânduri rezultat, deoarece încercarea de a evalua ln(0) are ca rezultat o excepție.

numerele Fibonacci:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

SQL nu acceptă bucle sau recursivitate, iar concatenarea câmpurilor din diferite rânduri dintr-un tabel sau interogare nu este standard functie de agregat. Acest exemplu folosește:

  • Formula lui Binet și funcțiile matematice ROUND, POWER și SQRT pentru calcularea celui de-al n-lea număr Fibonacci;
  • nivel de pseudo-coloană pentru a crea un pseudo-tabel t1 care conține numere de la 1 la 16;
  • funcția încorporată SYS_CONNECT_BY_PATH pentru concatenarea ordonată a numerelor primite.

SELECTARE REPLACE (MAX (SYS_CONNECT_BY_PATH (fib || ", " , "/" )), "/" , "" ) || „...” fiblist FROM ( SELECT n , fib , ROW_NUMBER () OVER (ORDER BY n ) r FROM ( selectați n , rotund ((putere ((1 + sqrt (5 ) )) * 0 . 5 , n ) - putere ((1 - sqrt (5 )) * 0 . 5 , n )) / sqrt (5 )) fib din (selectați nivelul n din conectarea duală după nivel<= 16 ) t1 ) t2 ) START WITH r = 1 CONNECT BY PRIOR r = r - 1 ;

Salut Lume!:

Exemplu pentru versiunile Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012, MySQL 5, PostgreSQL 8.4, PostgreSQL 9.1, sqlite 3.7.3

selectați „Bună ziua, lume!” ;

factorial:

Exemplu pentru versiunile Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012

Se folosește o definiție recursivă a factorial, implementată printr-o interogare recursivă. Fiecare linie de interogare conține două câmpuri numerice, n și n!, iar fiecare linie ulterioară este calculată folosind datele din cea precedentă.

Puteți calcula doar factoriali întregi până la 20!. Când încerci să calculezi 21! Apare eroarea „Eroare de depășire aritmetică”, adică. grila de biți se revarsă.

Pentru numerele reale, factorialul este 100! (Pentru a face acest lucru, în exemplu trebuie să înlocuiți bigint cu float în a treia linie)

numerele Fibonacci:

Exemplu pentru versiunile Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012

Se folosește determinarea iterativă a numerelor Fibonacci, implementată printr-o interogare recursivă. Fiecare linie de interogare conține două numere adiacente în secvență, iar următoarea linie este calculată ca (ultimul număr, suma numerelor) a liniei anterioare. Astfel, toate numerele, cu excepția primului și ultimului, apar de două ori, astfel încât rezultatul include doar primele numere ale fiecărei linii.

factorial:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

Acest exemplu demonstrează utilizarea operatorului model, disponibil în Oracle 10g, care permite ca șirurile de interogări să fie tratate ca elemente de matrice. Fiecare linie conține două câmpuri - numărul liniei n și factorialul său f.

selectați n || "! = " || factorul f din modelul dual returnează toate dimensiunile rândurilor prin (0 d) măsuri (0 f, 1 n) reguli iterate (17) (f [număr_iterație] = decodificare (număr_iterație, 0, 1, f [număr_iterație - 1] * număr_iterație) , n [ iteration_number ] = iteration_number );

numerele Fibonacci:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

Acest exemplu demonstrează utilizarea operatorului model, disponibil în Oracle 10g, care permite ca șirurile de interogări să fie tratate ca elemente de matrice. Fiecare linie conține două câmpuri - numărul Fibonacci însuși și concatenarea tuturor numerelor mai mici sau egale cu acesta. Concatenarea iterativă a numerelor în aceeași interogare care le generează este mai ușoară și mai rapidă decât agregarea ca operație separată.

selectați max(uri) || ", ..." din (selectați s din modelul dual returnează toate dimensiunile rândurilor cu ( 0 d ) măsuri ( turn ( " " ca varchar2 (200 )) s , 0 f ) reguli iterate ( 16 ) ( f [ iterație_număr ] = decode (număr_iterație, 0, 1, 1, 1, f [număr_iterație - 1] + f [număr_iterație - 2]), s [număr_iterație] = decode (număr_iterație, 0, to_char (f [număr_iterație - [iterație]),_număr 1 ] ||. ", " ||.

factorial:

Exemplu pentru versiunile MySQL 5

selectează concat (cast (t2 . n ca char ), "!= " , cast (exp (sum (sum (log (t1 . n ))) ca char )) din ( select @ i : = @ i + 1 AS n din TABLE , (selectați @ i : = 0 ) ca limită sel1 16 ) t1 , ( selectați @ j : = @ j + 1 AS n din TABEL , (selectați @ j : = 0 ) ca limită sel1 16 ) t2 unde t1 . n<= t2 . n group by t2 . n

numerele Fibonacci:

Exemplu pentru versiunile MySQL 5

Înlocuiți TABLE cu orice tabel pe care îl puteți accesa, cum ar fi mysql.help_topic .

selectați concat (group_concat (f separator ", " ), ", ..." ) din (selectați @ f : = @ i + @ j ca f , @ i : = @ j , @ j : = @ f din TABLE , (selectați @ i : = 1 , @ j : = 0 ) sel1 limită 16 ) t

Salut Lume!:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

Acest exemplu folosește un bloc PL/SQL anonim care imprimă un mesaj la ieșirea standard folosind pachetul dbms_output.

începe dbms_output . put_line("Bună, lume!"); Sfârşit ;

factorial:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

Acest exemplu demonstrează calculul iterativ al factorial folosind PL/SQL.

declara n numar := 0 ; număr f := 1 ; începe în timp ce (n<= 16 ) loop dbms_output . put_line (n || "! = " || f ); n : = n + 1 ; f : = f * n ; end loop ; end ;

numerele Fibonacci:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

Acest exemplu folosește determinarea iterativă a numerelor Fibonacci. Numerele deja calculate sunt stocate într-o structură de date varray - un analog al unui tablou.

vectorul tip declara este varray (16) de număr; vector fib := vector(); i număr; s varchar2(100); începe fib . extinde(16); fib (1) := 1; fib (2) := 1; s : = fib (1 ) || ", " || fib(2) || ", "; pentru i în 3 .. 16 buclă fib (i) : = fib (i - 1) + fib (i - 2); s := s || fib(i) || ", "; buclă de capăt; dbms_output. put_line (s || "..." ); Sfârşit ;

Ecuația pătratică:

Exemplu pentru versiunile Oracle 10g SQL, Oracle 11g SQL

Acest exemplu a fost testat în SQL*Plus, TOAD și PL/SQL Developer.

Pure SQL vă permite să introduceți variabile în timpul execuției interogării sub formă de variabile înlocuibile. Pentru a defini o astfel de variabilă, numele acesteia (în acest caz A, B și C) ar trebui să fie folosit cu un ampersand și în fața ei ori de câte ori variabila trebuie să fie referită. Când interogarea este executată, utilizatorului i se solicită să introducă valorile tuturor variabilelor de înlocuire utilizate în interogare. Odată ce valorile sunt introduse, fiecare referință la o astfel de variabilă este înlocuită cu valoarea acesteia, iar cererea rezultată este executată.

Există mai multe moduri de a introduce valori pentru variabilele de înlocuire. În acest exemplu, prima referință la fiecare variabilă este precedată de un ampersand dublu && în loc de un singur ampersand. În acest fel, valoarea pentru fiecare variabilă este introdusă o singură dată, iar toate referințele ulterioare la aceasta vor fi înlocuite cu aceeași valoare (atunci când se utilizează un singur și în SQL*Plus, valoarea pentru fiecare referință la aceeași variabilă trebuie introdusă separat). ). În PL/SQL Developer, toate referințele la variabile trebuie să fie precedate de un singur caracter &, altfel va apărea o eroare ORA-01008 „Nu toate variabilele sunt legate”.

Prima linie a exemplului specifică caracterul pentru separatorul zecimal, care este utilizat la conversia numerelor rădăcină în șiruri.

Cererea în sine constă din patru cereri diferite. Fiecare interogare returnează un șir care conține rezultatul calculului într-unul dintre cazuri (A=0, D=0, D>0 și D<0) и ничего — в трех остальных случаях. Результаты всех четырех запросов объединяются, чтобы получить окончательный результат.

modificare sesiunea NLS_NUMERIC_CHARACTERS = "; selectați „Nu este o ecuație pătratică”. și de la dual unde && A = 0 unire selectați "x = " || to_char (-&& B / 2 /& A ) din dual unde & A != 0 și & B *& B - 4 *& A *&& C = 0 unire selectează "x1 = " || to_char ((-& B + sqrt (& B *& B - 4 *& A *& C )) / 2 /& A ) || ", x2 = " || to_char (-& B - sqrt (& B *& B - 4 *& A *& C )) / 2 /& A din dual unde & A != 0 și & B *& B - 4 *& A *& C > 0 unire selectați „x1 = (" || to_char (-& B / 2 /& A ) || "," || to_char (sqrt (-& B *& B + 4 *& A *& C ) / 2 /& A ) || "), " || "x2 = (" || to_char (-& B / 2 /& A ) || "," || to_char (- sqrt (-& B *& B + 4 *& A *& C ) / 2 /& A ) || ")" din dual unde & A != 0 și & B *& B - 4 *& A *& C< 0 ;

Cuvinte rezervate sunt o parte permanentă a limbajului SQL și au un sens fix. Ele ar trebui să fie scrise exact așa cum sunt scrise și nu ar trebui să fie împărțite în părți pentru a trece de la o linie la alta. Cuvintele definite de utilizator sunt specificate de utilizator însuși (conform regulilor sintactice) și reprezintă identificatori sau nume ale diferitelor obiecte de bază de date. Cuvintele din enunț sunt de asemenea plasate în conformitate cu regulile sintactice stabilite.

Identificatori Limbajele SQL sunt destinate să se refere la obiecte dintr-o bază de date și sunt nume de tabele, vederi, coloane și alte obiecte de bază de date. Simboluri care pot fi folosite în creat de utilizator identificatori Limbajul SQL trebuie definit ca un set de caractere. Standardul SQL specifică un set de caractere implicit care include litere latine mici și majuscule (A-Z, a-z), numere (0-9) și litera de subliniere (_). Următoarele restricții se aplică formatului de identificare:

  • Identificatorul poate avea până la 128 de caractere;
  • identificatorul trebuie să înceapă cu o literă;
  • identificatorul nu poate conține spații.

<идентификатор>::=<буква> {<буква>|<цифра>)[,...n]

Majoritatea componentelor limbajului nu fac distincție între majuscule și minuscule. Deoarece limbajul SQL este în format liber, instrucțiunile SQL individuale și secvențele lor vor avea un aspect mai lizibil atunci când se utilizează indentarea și alinierea.

Se numește limbajul în care este descris limbajul SQL metalimbaj. Definițiile sintactice sunt de obicei specificate folosind simboluri metalingvistice speciale numite Forme Backus-Nauer(BPF). Literele mari sunt folosite pentru a scrie cuvinte rezervateși trebuie specificat în declarații exact așa cum se arată. Literele mici sunt folosite pentru a scrie cuvinte definite de utilizator. Simbolurile utilizate în notația BNF și denumirile lor sunt prezentate în tabel.

Tabelul 1.1.
Simbol Desemnare
::= Egal prin definiție
| Necesitatea de a selecta una dintre mai multe valori date
<…> Structura limbajului descrisă folosind un metalimbaj
{…} Selectarea obligatorie a unui design din listă
[…] Selectarea opțională a unor constructe din listă
[,…n] Abilitatea opțională de a repeta designul de la zero la de mai multe ori

Descrierea bazei de date de instruire

În prezentarea următoare, o mică bază de date va fi folosită ca exemplu, reflectând procesul de furnizare sau vânzare a unui anumit produs către clienții obișnuiți.

Pe baza analizei domeniul subiectului, putem distinge două tipuri de entități - PRODUS și CLIENT, care sunt interconectate printr-o relație „mulți-la-mulți”, deoarece Fiecare cumpărător poate cumpăra mai multe articole dintr-un produs și fiecare produs poate fi achiziționat de mulți cumpărători. Cu toate acestea, modelul de date relaționale necesită înlocuirea relației multi-la-mulți cu relații multiple unu-la-mulți. Să adăugăm încă un tip de entitate care afișează procesul de vânzare a mărfurilor - TRANZACȚIE.

Să stabilim conexiuni între obiecte. Un singur client poate achiziționa articole de mai multe ori, astfel încât există o relație unu-la-mulți între obiectele CLIENT și TRANZACȚIE. Fiecare articol al unui produs poate participa la tranzacții de mai multe ori, ca urmare, există o relație unu-la-mulți între obiectele PRODUS și TRANZACȚIE.

Să definim atribute și să le asociem cu entități și relații. Obiectul MARFURI include caracteristici precum numele, tipul, prețul, clasa. Pentru obiectul CLIENT – prenume, patronim, prenume, firma, oras, telefon. Tipul de entitate TRANZACȚIE poate fi caracterizat prin caracteristici precum data și cantitatea mărfurilor vândute.

Un pas important în crearea unei baze de date este definirea atributelor care le identifică în mod unic pe fiecare instanță de entitate, adică Identificare chei primare.

Pentru tabelul PRODUCT, numele nu poate fi difuzat cheia principala, deoarece Produsele de diferite tipuri pot avea aceleași nume, așa că să introducem codul de produs cheie primară, care poate fi înțeles, de exemplu, ca articol de produs. La fel, nici Numele, nici Firma, nici Orașul nu pot servi cheia principalaîn tabelul CLIENT. Să introducem codul client al cheii primare, care poate fi înțeles ca un număr de pașaport, un număr de identificare a contribuabilului sau orice alt atribut care identifică în mod unic fiecare client. Pentru masa DEAL cheia principala este câmpul Cod tranzacție, deoarece identifică în mod unic data, clientul și alte elemente de date. La fel de cheia principala ar fi posibil să selectați nu un câmp, ci un anumit set de câmpuri, dar pentru ilustrare constructe ale limbajului hai sa ne limitam la simplu chei primare.

Funcțiile ferestre nu sunt acceptate în toate elementele de interogare, doar în clauzele SELECT și ORDER BY. Pentru a înțelege motivul acestei limitări, voi explica mai întâi un principiu numit procesarea logică a cererii. După aceea, voi reveni la instrucțiunile care acceptă funcțiile ferestrei, iar la sfârșit voi explica cum să ocoliți această limitare în alte propuneri.

Procesare logică a interogărilor

Procesarea logică a interogărilor descrie principiile evaluării unei interogări SELECT în funcție de sistemul logic al limbajului. Descrie un proces care constă din mai mulți pași, sau faze, care încep cu tabelele de intrare ale unei interogări și se termină cu setul de rezultate al interogării.

Rețineți că prin procesarea logică a interogărilor mă refer la conceptul de evaluare a interogărilor, care nu este neapărat același cu procesul fizic de procesare a unei interogări de către SQL Server. Ca parte a optimizării, SQL Server poate scurta calea, poate schimba ordinea unor pași și poate face tot ce dorește. Dar toate acestea sunt doar cu condiția ca acesta să returneze același rezultat care ar trebui să fie obținut în timpul procesării logice a cererii la definirea ei declarativ.

Fiecare etapă logică de procesare a interogării operează pe unul sau mai multe tabele (seturi de rânduri) ca date de intrare și returnează un tabel ca rezultat. Tabelul rezultat al unei etape devine intrarea pentru etapa următoare.

Următoarea figură arată diagrama de procesare a interogărilor logice în SQL Server 2012:

Rețineți că atunci când scrieți o interogare, clauza SELECT este întotdeauna scrisă prima, dar în timpul procesării logice este aproape la sfârșit - chiar înainte ca clauza ORDER BY să fie procesată.

O carte întreagă ar putea fi dedicată procesării logice a interogărilor, dar pentru scopul nostru este suficientă o prezentare mai concisă. În scopul discuției noastre, este important să observăm ordinea în care sunt procesate diferitele propoziții. Următoarea listă reprezintă această ordine (fazele în care sunt activate funcțiile ferestrei sunt evidențiate):

    1. Evaluarea expresiilor

      Eliminarea duplicatelor

  1. OFFSET-FETCH/TOP

Înțelegerea procedurii și ordinii procesării logice a interogărilor ne permite să înțelegem de ce utilizarea funcțiilor ferestrei a fost permisă numai în anumite propoziții.

Propuneri care suportă funcțiile ferestrei

După cum puteți vedea din figura anterioară, funcțiile ferestrei acceptă doar clauzele SELECT și ORDER BY direct. Motivul limitării este evitarea ambiguității atunci când lucrați cu rezultatul (aproape) final al interogării setat la începutul operațiunii ferestrei. Dacă activați funcțiile ferestrei în etapele anterioare fazei SELECT, ferestrele inițiale ale acelor etape pot fi diferite de fereastra fazei SELECT și, prin urmare, în unele forme ale interogării va fi foarte dificil să determinați rezultatul corect.

Voi încerca să demonstrez această ambiguitate cu un exemplu. Mai întâi rulați următorul cod pentru a crea tabelul T1 și completați-l cu date:

SETARE NOCOUNT ON; UTILIZAȚI TSQL2012; DACA OBJECT_ID("dbo.T1", "U") NU ESTE NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 (col1 VARCHAR(10) NOT NULL CONSTRAINT PK_T1 PRIMARY KEY); INSERT INTO dbo.T1(col1) VALUES("A"),("B"),("C"),("D"),("E"),("F"); MERGE

Să presupunem că funcțiile ferestrei sunt activate în pașii înainte de SELECTARE, cum ar fi în pasul WHERE. Priviți următoarea interogare și încercați să determinați ce valori ar trebui să conțină col1 în rezultat:

Înainte de a spune că este evident că acestea ar trebui să fie valorile C, D și E, amintiți-vă principiul „toate o dată” în SQL. Acest principiu implică faptul că, conceptual, toate expresiile aceluiași pas logic sunt executate simultan. Aceasta înseamnă că ordinea expresiilor nu ar trebui să afecteze rezultatul. Dacă da, atunci următoarea interogare ar trebui să fie echivalentă semantic cu aceasta:

Vă puteți da seama ce expresie este corectă de data aceasta? Este C, D și E sau doar C?

Acesta este un exemplu de ambiguitate despre care vorbeam. Permiterea utilizării funcțiilor ferestrei numai în clauzele SELECT și ORDER BY elimină această ambiguitate.

Când analizați diagrama de flux din figura de mai sus, este posibil să fi observat că în pasul SELECT, funcțiile ferestrei acceptă pasul 5-1 (Evaluați expresiile) și se execută înainte de pasul 5-2 (Eliminați duplicatele). Dacă întrebați de ce este atât de important să cunoașteți astfel de detalii, vă voi demonstra de ce este necesar.

Iată o întrebare care returnează atributele empid și țară ale tuturor angajaților din tabelul Angajați:

SELECT empid, tara FROM HR.Angajați;

Acum uitați-vă la următoarea interogare și încercați să determinați care va fi rezultatul înainte de a executa interogarea:

SELECTAȚI ȚARA DISTINȚĂ, ROW_NUMBER() OVER(ORDER BY country) AS rownum FROM HR.Angajații;

Unii oameni se vor aștepta la acest rezultat:

Dar, în realitate, veți obține asta:

Acum amintiți-vă că în această interogare, funcția ROW_NUMBER este evaluată în pasul 5-1, care evaluează expresiile listei SELECT - înainte de a elimina duplicatele în pasul 5-2. Funcția ROW_NUMBER atribuie nouă numere de rând unice care conțin informații despre angajați, astfel încât clauza DISTINCT nu are nimic de eliminat.

Odată ce îți dai seama că motivul este ordinea în care cererea este procesată logic pe diferite elemente, te poți gândi la o soluție. De exemplu, puteți crea o expresie de tabel bazată pe o interogare care returnează pur și simplu țări unice și să atribuiți numere de rând cu o interogare exterioară după eliminarea duplicatelor:

WITH EmpCountries AS (SELECTARE Țară DISTINTA FROM HR.Angajați) SELECTARE Țara, ROW_NUMBER() OVER(ORDER BY country) AS rownum FROM EmpCountries;

Vă puteți gândi la alte modalități de a rezolva problema, cel puțin mai simple decât aceasta?

Faptul că funcțiile ferestrei sunt evaluate în faza SELECT sau ORDER BY înseamnă că fereastra definită pentru calcul - înainte de aplicarea constrângerilor ulterioare - este forma intermediară a rândurilor obținute după toate fazele anterioare, adică după aplicarea FROM cu toate tabelele. operatori (de exemplu, conexiuni), precum și filtrarea folosind WHERE, gruparea și filtrarea grupului. Această interogare poate fi considerată un exemplu:

Clauza FROM este mai întâi evaluată, apoi se realizează îmbinarea. Filtrul lasă apoi doar rânduri care datează din 2007. După aceasta, rândurile rămase sunt grupate după ID-ul angajatului. Numai atunci sunt evaluate expresiile din lista SELECT, inclusiv funcția RANK, care este evaluată folosind ordonarea descrescătoare a numărului total. Dacă ar exista alte funcții de fereastră în lista SELECT, acestea ar folosi același set de rezultate ca punct de plecare.

Amintiți-vă că mai devreme, când am discutat despre alternativele la funcțiile ferestre (cum ar fi interogările imbricate), am spus că acestea încep să privească datele de la zero, ceea ce înseamnă că trebuie să repetați toată logica interogării exterioare în fiecare interogare imbricată, ceea ce crește foarte mult. cantitatea de cod.

Ocolirea restricțiilor

Am explicat de ce utilizarea funcțiilor ferestrei a fost interzisă în etapele de procesare a interogărilor logice premergătoare clauzei SELECT. Dar dacă doriți să filtrați sau să grupați pe baza calculelor efectuate în funcțiile ferestrei? Soluția este să folosiți o expresie de tabel, cum ar fi un CTE sau un tabel derivat. Efectuați o interogare să apeleze o funcție fereastră din lista sa SELECT, dând expresiei un alias. Definiți o expresie de tabel pe baza acestei interogări și apoi faceți-o referire într-o interogare alias.

Iată un exemplu care demonstrează cum puteți filtra pe baza rezultatelor unei funcții de fereastră folosind CTE:

În instrucțiunile care modifică datele, funcțiile ferestre sunt complet interzise deoarece clauzele SELECT și ORDER BY nu sunt acceptate în aceste instrucțiuni. Dar există cazuri în care sunt necesare funcții de fereastră în instrucțiunile de modificare a datelor. Expresiile de tabel pot rezolva și această problemă, deoarece T-SQL vă permite să schimbați datele prin expresii de tabel. Voi demonstra acest comportament folosind exemplul UPDATE. Mai întâi rulați următorul cod pentru a crea un tabel T1 cu coloanele col1 și col2 și completați-l cu date:

SETARE NOCOUNT ON; UTILIZAȚI TSQL2012; DACA OBJECT_ID("dbo.T1", "U") NU ESTE NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 (col1 INT NULL, col2 VARCHAR(10) NOT NULL); INSERT INTO dbo.T1(col2) VALUES("C"),("A"),("B"),("A"),("C"),("B"); MERGE

Valorile coloanei col2 sunt definite în mod explicit, iar col1 a fost completată cu valori NULL.

Imaginați-vă că acest tabel ilustrează situația problemelor de calitate a datelor. Nu există nicio cheie creată în acest tabel, astfel încât rândurile nu pot fi identificate în mod unic. Doriți să atribuiți valori unice în coloana col1 tuturor rândurilor. Ai crezut că ar fi convenabil să folosești funcția ROW_NUMBER într-o instrucțiune UPDATE ca aceasta:

UPDATE dbo.T1 SET col1 = ROW_NUMBER() OVER(ORDER BY col2);

Dar, după cum vă amintiți, acest lucru este interzis în astfel de instrucțiuni. O soluție este să creați o interogare împotriva T1 care returnează col1 și o expresie bazată pe funcția ROW_NUMBER (să o numim rownum); definiți o expresie de tabel bazată pe această interogare și, în final, aplicați o instrucțiune UPDATE CTE pentru a atribui valoarea rownum coloanei col1:

CU C AS (SELECT col1, col2, ROW_NUMBER() OVER(ORDER BY col2) AS rownum FROM dbo.T1) UPDATE C SET col1 = rownum; SELECT col1, col2 FROM dbo.T1;

Obțineți datele de la T1 - veți vedea că toate rândurile au primit o valoare unică în coloana col1:

Posibilitatea de a crea filtre suplimentare

Am arătat cum în T-SQL puteți lua o soluție și utilizați indirect funcțiile ferestrei în elemente care nu le suportă direct. Această soluție se bazează pe utilizarea unei expresii de tabel sub forma unui CTE sau a unui tabel derivat. Este plăcut să aveți opțiunea suplimentară, dar o expresie de tabel folosește un strat suplimentar de interogare și face lucrurile puțin mai complicate. Exemplele pe care le-am dat sunt simple, dar cum rămâne cu interogările lungi și complexe. Este posibilă o soluție mai simplă fără acest strat suplimentar?

Când vine vorba de funcțiile ferestrelor, în prezent nu există altă soluție în SQL Server. Cu toate acestea, este interesant de văzut cum se confruntă alții cu această problemă. De exemplu, Teradata a creat o clauză de filtru numită CALIFICAși se evaluează fundamental după clauza SELECT. Aceasta înseamnă că poate accesa direct funcțiile ferestrei, ca în exemplul următor:

Nu funcționează în SQL Server 2012 SELECT orderid, orderdate, val FROM Sales.OrderValues ​​​​QUALIFY RANK() OVER(ORDER BY val DESC)

Mai mult, vă puteți referi la aliasuri ale coloanelor definite în lista SELECT, astfel:

Nu funcționează în SQL Server 2012 SELECT orderid, orderdate, val, RANK() OVER(ORDER BY val DESC) AS rnk FROM Sales.OrderValues ​​​​QUALIFY rnk

Clauza QUALIFY nu este în SQL standard - este acceptată doar în produsele Teradata. Dar pare o soluție foarte interesantă și ar fi bine dacă atât standardul, cât și SQL Server să răspundă acestei nevoi.

Reutilizarea definițiilor ferestrelor

Imaginați-vă că trebuie să apelați mai multe funcții de fereastră într-o singură solicitare și o parte din definiția ferestrei (sau toată definiția) este aceeași pentru mai multe funcții. Dacă specificați o definiție de fereastră în toate funcțiile, codul poate deveni foarte mare, ca în acest exemplu:

SELECTEAZĂ empid, ordermonth, qty, SUM(qty) OVER (PARTIȚIE BY empid ORDER BY ordermonth RÂNDURI ÎNTRE RÂNDUL PRECEDENT ȘI CURRENT NEBORNAT) AS run_sum_qty, AVG(qty) OVER (PARTIȚIE BY empid ORDER BY ordermonth ȘI RÂNDUL PRECEDENT CURRENTEWETWEEN) AS run_avg_qty, MIN(qty) OVER (PARTIȚIE BY empid ORDER BY ordermonth RÂNDURI ÎNTRE RÂNDUL PRECEDENT ȘI CURRENT NEBORNAT) AS run_min_qty, MAX(qty) OVER (PARTIȚIE DUPĂ empid ORDER BY ordermonth RÂNDURI ÎNTRE RÂNDUL PRECEDENT ȘI CURRENT NEBORNAT) ASCURR CURRENT_Qty, MAX(qty) PESTE .Comenzi;

Standard SQL are o soluție la această problemă sub forma unei clauze numită WINDOW, care vă permite să atribuiți un nume definiției unei ferestre sau unei părți a unei ferestre. Acest nume poate fi apoi folosit în alte definiții de fereastră, utilizat în funcțiile ferestrei sau chiar în alte definiții de nume de fereastră. Conceptual, această clauză este evaluată după clauza HAVING și înaintea clauzei SELECT.

SQL Server nu acceptă încă oferta WINDOWS. În SQL standard, puteți scurta interogarea anterioară folosind clauza WINDOW astfel:

Nu funcționează în SQL Server 2012 SELECT empid, ordermonth, qty, SUM(qty) OVER W1 AS run_sum_qty, AVG(qty) OVER W1 AS run_avg_qty, MIN(qty) OVER W1 AS run_min_qty, MAX(qty) OVER W1 AS run_max_qty FROM Sales .EmpOrders WINDOW W1 AS (PARTIȚIE DUPĂ empid ORDER BY ordermonth RÂNDURI ÎNTRE RÂNDUL PRECEDENT ȘI CURRENT NEBORDAT);

După cum puteți vedea, diferența este vizibilă. În acest caz, clauza WINDOW atribuie numele W1 unei definiții complete de fereastră cu opțiuni de partiționare, ordonare și încadrare. W1 este apoi folosit ca definiție de fereastră în toate cele patru funcții. Clauza WINDOW este destul de complexă. După cum sa menționat deja, nu este necesar să denumești întreaga definiție a ferestrei, poți numi doar o parte a definiției. În acest caz, definiția ferestrei conține un amestec de părți numite și parametri specificați în mod explicit. Apropo, descrierea clauzei WINDOW din standardul SQL ocupă zece pagini! Și să le înțelegi nu este atât de ușor.

Ar fi grozav dacă SQL Server ar adăuga suport pentru această clauză, mai ales acum că suportul pentru funcțiile ferestrei s-a extins și utilizatorii vor trebui să scrie definiții lungi pentru ferestre.

Ultima actualizare: 24.06.2017

SQL Server este unul dintre cele mai populare sisteme de gestionare a bazelor de date (DBMS) din lume. Acest SGBD este potrivit pentru o mare varietate de proiecte: de la aplicații mici la proiecte mari, foarte încărcate.

SQL Server a fost creat de Microsoft. Prima versiune a fost lansată în 1987. Iar versiunea actuală este versiunea 16, care a apărut în 2016 și va fi folosită în ghidul actual.

SQL Server a fost de mult timp exclusiv un sistem de gestionare a bazelor de date pentru Windows, dar începând cu versiunea 16, este disponibil și pe Linux.

SQL Server este caracterizat de caracteristici precum:

    Performanţă. SQL Server este foarte rapid.

    Fiabilitate și siguranță. SQL Server oferă criptarea datelor.

    Simplitate. Acest SGBD este relativ ușor de utilizat și de administrat.

Aspectul central în MS SQL Server, ca în orice SGBD, este baza de date. O bază de date este un depozit de date organizate într-un mod specific. Adesea, baza de date reprezintă fizic un fișier de pe hard disk, deși această corespondență nu este necesară. Sistemele de management al bazelor de date sau SGBD-urile sunt folosite pentru a stoca și administra bazele de date. Și doar MS SQL Server este unul dintre astfel de SGBD.

MS SQL Server folosește un model relațional pentru a organiza bazele de date. Acest model de bază de date a fost dezvoltat în 1970 de către Edgar Codd. Și astăzi este de fapt standardul pentru organizarea bazelor de date.

Modelul relațional presupune stocarea datelor sub formă de tabele, fiecare dintre ele constând din rânduri și coloane. Fiecare rând stochează un obiect separat, iar coloanele conțin atributele acelui obiect.

O cheie primară este utilizată pentru a identifica fiecare rând dintr-un tabel. Cheia primară poate fi una sau mai multe coloane. Folosind o cheie primară, putem face referire la un anumit rând dintr-un tabel. În consecință, două rânduri nu pot avea aceeași cheie primară.

Prin chei, un tabel poate fi legat de altul, adică se pot organiza relații între două tabele. Și masa în sine poate fi reprezentată ca o relație.

Pentru a interacționa cu baza de date, se folosește limbajul SQL (Structured Query Language). Clientul (de exemplu, un program extern) trimite o solicitare în SQL folosind un API special. SGBD interpretează și execută corect cererea și apoi trimite rezultatul execuției clientului.

SQL a fost dezvoltat inițial de IBM pentru un sistem de baze de date numit System/R. În același timp, limba în sine a fost numită SEQUEL (Structured English Query Language). Deși nici baza de date, nici limba în sine nu au fost ulterior publicate oficial, în mod tradițional, termenul SQL în sine este adesea pronunțat ca „o continuare”.

În 1979, Relational Software Inc. a dezvoltat primul sistem de gestionare a bazelor de date, numit Oracle, care a folosit limbajul SQL. Datorită succesului acestui produs, compania a fost redenumită Oracle.

Ulterior, au început să apară și alte sisteme de baze de date care foloseau SQL. Drept urmare, în 1989, Institutul Național American de Standarde (ANSI) a codificat limba și a publicat primul său standard. După aceasta, standardul a fost actualizat și completat periodic. Ultima sa actualizare a avut loc în 2011. Dar, în ciuda existenței unui standard, producătorii de DBMS folosesc adesea propriile implementări ale limbajului SQL, care sunt ușor diferite unele de altele.

Există două varietăți de limbaj SQL: PL-SQL și T-SQL. PL-SQL este folosit în SGBD-uri precum Oracle și MySQL. T-SQL (Transact-SQL) este utilizat în SQL Server. De fapt, acesta este motivul pentru care T-SQL va fi luat în considerare în ghidul actual.

În funcție de sarcina pe care o îndeplinește comanda T-SQL, aceasta poate fi unul dintre următoarele tipuri:

    DDL (Data Definition Language). Acest tip include diverse comenzi care creează o bază de date, tabele, indexuri, proceduri stocate etc. În general, datele sunt determinate.

    În special, putem clasifica următoarele comenzi ca acest tip:

    • CREATE : creează obiecte de bază de date (baza de date în sine, tabele, indecși etc.)

      ALTER: modifică obiectele bazei de date

      DROP: Elimină obiectele bazei de date

      TRUNCATE: elimină toate datele din tabele

    DML (Limbaj de manipulare a datelor). Acest tip include comenzi pentru selectarea datelor, actualizarea, adăugarea, ștergerea - în general, toate acele comenzi cu care putem gestiona datele.

    Următoarele comenzi aparțin acestui tip:

    • SELECT: preia datele din baza de date

      UPDATE: actualizează datele

      INSERT: adaugă date noi

      DELETE: șterge datele

    DCL (Data Control Language / Data Access Control Language). Acest tip include comenzi care gestionează drepturile de acces la date. În special, acestea sunt următoarele comenzi:

    • GRANT: acordă permisiuni de acces la date

      REVOCA: revocă drepturile de acces la date

Standardul limbajului SQL a fost adoptat în 1992 și este încă în uz astăzi. Acesta a devenit standardul pentru mulți. Desigur, unii producători folosesc propriile interpretări ale standardului. Dar orice sistem mai are componentele principale - instrucțiuni SQL.

Introducere

Folosind instrucțiunile SQL, valorile și tabelele sunt gestionate și obținute pentru analiză și afișare ulterioară. Sunt un set de cuvinte cheie prin care sistemul înțelege ce să facă cu datele.

Sunt definite mai multe categorii de instrucțiuni SQL:

  • definirea obiectelor bazei de date;
  • manipularea valorilor;
  • protectie si control;
  • parametrii de sesiune;
  • informatii despre baza de date;
  • SQL static;
  • SQL dinamic.

Instrucțiuni SQL pentru manipularea datelor

INTRODUCE. Inserează rânduri într-un tabel existent. Poate fi folosit pentru o valoare sau mai multe, definite de o anumită condiție. De exemplu:

numele tabelului (numele coloanei 1, numele coloanei 2)

VALORI(valoarea 1, valoarea 2).

Pentru a utiliza instrucțiunea INSERT pe mai multe valori, utilizați următoarea sintaxă:

numele tabelului 1 (numele coloanei 1, numele coloanei 2)

SELECTAȚI numele coloanei 1, numele coloanei 2

FROM numele tabelului 2

WHERE nume tabel 2.nume coloană 1>2

Această interogare va selecta toate datele din tabelul 2 care sunt mai mari decât 2 în coloana 1 și le va insera în prima.

ACTUALIZAȚI. După cum sugerează și numele, această instrucțiune de interogare SQL actualizează datele dintr-un tabel existent pe baza unei caracteristici specifice.

UPDATE numele tabelului 1

SET numele coloanei 2 = „Vasily”

WHERE nume tabel 1.nume coloană 1 = 1

Această construcție va umple cu valoarea Vasily toate liniile în care întâlnește numărul 1 în prima coloană.

Date din tabel. Puteți specifica o condiție sau puteți elimina toate liniile.

DELETE FROM numele tabelului

WHERE nume tabel.nume coloană 1 = 1

Interogarea de mai sus va elimina din baza de date toate datele cu valoarea unu din prima coloană. Iată cum puteți șterge întregul tabel:

instrucțiunea SELECT

Scopul principal al SELECT este de a selecta datele în funcție de anumite condiții. Rezultatul muncii sale este întotdeauna un nou tabel cu date selectate. Operatorul MS poate fi utilizat într-o varietate de interogări diferite. Prin urmare, împreună cu acesta, puteți lua în considerare și alte cuvinte cheie înrudite.

Pentru a selecta toate datele dintr-un anumit tabel, utilizați semnul „*”.

FROM numele tabelului 1

Rezultatul muncii a acestei cereri va fi o copie exactă a tabelului 1.

Și aici se face o selecție folosind condiția WHERE, care preia din tabelul 1 toate valorile mai mari decât 2 din coloana 1.

FROM numele tabelului 1

WHERE nume tabel 1.nume coloană 1 > 2

De asemenea, puteți specifica în selecție că sunt necesare doar anumite coloane.

SELECTează numele tabelului 1.numele coloanei 1

FROM numele tabelului 1

Rezultatul acestei interogări vor fi toate rândurile cu valori din coloana 1. Folosind instrucțiuni MS SQL, vă puteți crea propriul tabel, înlocuind, calculând și înlocuind anumite valori din mers.

numele tabelului 1.numele coloanei 1

numele tabelului 1.numele coloanei 2

numele tabelului 1.numele coloanei 3

nume tabel 1.nume coloană 2 * nume tabel 1.nume coloană 3 AS SUMMA

FROM numele tabelului 1

Având în vedere, la prima vedere interogare complexă preia toate valorile din tabelul 1, apoi creează noi coloane EQ și SUMMA. Primul este completat cu semnul „+”, iar al doilea este produsul datelor din coloanele 2 și 3. Rezultatul obținut poate fi prezentat sub forma unui tabel pentru a înțelege cum funcționează:

Când utilizați instrucțiunea SELECT, puteți sorta imediat datele în funcție de orice criteriu. Cuvântul ORDER BY este folosit pentru aceasta.

numele tabelului 1.numele coloanei 1

numele tabelului 1.numele coloanei 2

numele tabelului 1.numele coloanei 3

FROM numele tabelului 1

ORDENAȚI DUPĂ numele coloanei 2

Tabelul rezultat va arăta astfel:

Adică, toate rândurile au fost setate într-o astfel de ordine încât în ​​coloana 2 valorile au fost în ordine crescătoare.

Datele pot fi obținute și din mai multe tabele. Pentru claritate, mai întâi trebuie să vă imaginați că există două dintre ele în baza de date, ceva de genul acesta:

Tabelul „Angajați”

Tabelul „Salariu”

Acum trebuie să conectați cumva aceste două tabele pentru a obține valori generale. Folosind instrucțiuni SQL de bază, puteți face acest lucru astfel:

Angajati.Numar

Numele Angajatului

Salariu.Rata

Salariul acumulat

DE LA Angajati, Salariu

WHERE Employees.Number = Salary.Number

Iată o selecție a două mese diferite valori combinate prin număr. Rezultatul va fi următorul set de date:

Mai multe despre SELECT. Utilizarea funcțiilor agregate

Unul dintre operatorii principali poate efectua unele calcule la preluare. Pentru asta foloseste anumite funcții si formule.

De exemplu, pentru a obține numărul de înregistrări din tabelul Angajați, trebuie să utilizați interogarea:

SELECTAȚI NUMĂRUL (*) CA N

DE LA Angajati

Rezultatul este un tabel cu o valoare și o coloană.

Puteți rula o interogare ca aceasta și să vedeți ce se întâmplă:

SUM(Salariu. Acumulat) AS SUMMA

MAX(Salariu. Acumulat) AS MAX

MIN(Salariu. Acumulat) AS MIN

AVG(Salariu. Acumulat) CA SRED

DIN Salariul

Masa finală va fi așa:

În acest fel, puteți selecta valorile dorite din baza de date, calculând diverse funcții din mers.

Unire, intersecție și diferențe

Combinați mai multe interogări în SQL

SELECT Angajati.Nume

DE LA Angajati

UNDE Angajații.Număr = 1

SELECT Angajati.Nume

DE LA Angajati, Salariu

UNDE Salariu.Număr = 1

Trebuie avut în vedere că cu o astfel de unire, tabelele trebuie să fie compatibile. Adică să aibă același număr de coloane.

Sintaxa instrucțiunii SELECT și ordinea de procesare

Primul lucru pe care îl face SELECT este să determine zona din care va prelua date. Pentru aceasta se foloseste cuvânt cheie DIN. Daca nu este indicat ce anume sa alegi.

Atunci poate fi prezentă clauza SQL WHERE. Cu el folosind SELECT parcurge toate rândurile tabelului și verifică datele pentru conformitate cu condiția.

Dacă interogarea conține GROUP BY, atunci valorile sunt grupate în funcție de parametrii specificați.

Operatori pentru compararea datelor

Există mai multe tipuri. În comparație SQL, operatorii pot verifica Tipuri variate valorile.

    „=". Denotă, după cum ați putea ghici, egalitatea a două expresii. De exemplu, a fost deja folosit în exemplele de mai sus - WHERE Salary.Number = 1.

    „>”. Mai mult semn. Dacă valoarea părții stângi a expresiei este mai mare, atunci adevărul logic este returnat și condiția este considerată îndeplinită.

    «<». Знак меньше. Обратный предыдущему оператор.

    Semne "<=» и «>=". Diferă de operatorii simpli mai mult și mai puțin prin aceea că, dacă operanzii sunt egali, condiția va fi și adevărată.

CA

Acest cuvânt cheie poate fi tradus ca „similar”. Operatorul LIKE în SQL este folosit aproximativ în același mod - execută o interogare bazată pe un șablon. Adică, vă permite să extindeți selecția de date din baza de date folosind expresii regulate.

De exemplu, a fost stabilită următoarea sarcină: din baza de date deja cunoscută „Angajați”, obțineți toate persoanele al căror nume se termină cu „I”. Atunci interogarea poate fi scrisă astfel:

DE LA Angajati

UNDE Numele LIKE `%i`

Semnul procentual în acest caz înseamnă o mască, adică orice caracter și numărul lor. Și prin litera „I”, SQL va determina că ultimul caracter ar trebui să fie exact așa.

CAZ

Această instrucțiune SQL Server este o implementare a selecției multiple. Amintește de construcția switch în multe limbaje de programare. Instrucțiunea CASE în SQL efectuează o acțiune bazată pe mai multe condiții.

De exemplu, trebuie să selectați valorile maxime și minime din tabelul „Salariu”.

Atunci interogarea poate fi scrisă astfel:

DIN Salariul

WHERE CAZ WHEN SELECT MAX(Acumulat) THEN Maxim

WHEN SELECT MIN(Acumulat) THEN Minimum

În acest context, sistemul caută valoarea maximă și minimă în coloana Acumulat. Apoi, folosind END, se creează un câmp „total”, în care se va introduce „Maximum” sau „Minim”, în funcție de rezultatul condiției.

Apropo, SQL are și o formă mai compactă de CASE - COALESCE.

Operatori de definire a datelor

Această vizualizare vă permite să efectuați diferite modificări ale tabelelor - crearea, ștergerea, modificarea și lucrul cu indecși.

Primul care merită luat în considerare este CREATE TABLE. Nu face altceva decât să creeze un tabel. Dacă introduceți pur și simplu interogarea CREATE TABLE, nu se va întâmpla nimic, deoarece mai trebuie să specificați mai mulți parametri.

De exemplu, pentru a crea tabelul deja familiar „Angajați”, trebuie să utilizați comenzile:

CREAȚI TABEL Angajații

(Numărul (10) NU NUL

Nume varchar(50) NOT NULL

Nume varchar(50) NOT NULL)

În această interogare, numele câmpurilor și tipurile lor sunt determinate imediat în paranteze, precum și dacă poate fi egal cu NULL.

DROP TABLE

Efectuează o sarcină simplă - aruncarea tabelului specificat. Are un parametru suplimentar DACĂ EXISTĂ. Absoarbe o eroare de drop dacă tabelul pe care îl căutați nu există. Exemplu de utilizare:

DROP TABLE Angajații DACĂ EXISTĂ.

CREAȚI INDEX

SQL are un sistem de indexare care vă permite să accelerați accesul la date. În general, este un link care indică o anumită coloană. Puteți crea un index cu o interogare simplă:

CREATE INDEX nume_index

ON nume_tabel(nume_coloană)

Acest operator este folosit în T-SQL, Oracle, PL SQL și multe alte tehnologii de interpretare.

ALTER TABLE

Un operator foarte funcțional cu numeroase opțiuni. În general, modifică structura, definiția și plasarea tabelelor. Operator folosit în Oracle SQL, Postgres și multe altele.

    ADĂUGA. Adaugă o coloană la tabel. Sintaxa sa este următoarea: ALTER TABLE nume_tabel ADD nume_coloană tip_date_stocat. Poate avea o opțiune IF NOT EXISTS pentru a suprima eroarea dacă coloana creată există deja;

    CĂDERE BRUSCA. Îndepărtează o coloană. Are și o cheie IF EXISTS, fără de care va fi generată o eroare care indică lipsa coloanei necesare;

    SCHIMBARE. Servește pentru a redenumi numele câmpului cu cel specificat. Exemplu de utilizare: ALTER TABLE nume_tabel CHANGE nume_vechi nume_nou;

    MODIFICA. Această comandă vă va ajuta să schimbați tipul și atributele suplimentare ale unei anumite coloane. Și este folosit astfel: ALTER TABLE table_name MODIFY column_name data_type attributes;

CREATE VIEW

În SQL există așa ceva ca o vizualizare. Pe scurt, acesta este un fel de tabel virtual cu date. Se formează ca rezultat al selecției folosind instrucțiunea SQL SELECT. Vizualizările pot restricționa accesul la baza de date, le pot ascunde și pot înlocui numele coloanelor reale.

Procesul de creare are loc folosind o cerere simplă:

CREATE VIEW view name AS SELECT FROM * nume tabel

Eșantionarea poate avea loc fie din întreaga bază de date, fie pe baza unei anumite condiții.

Câteva despre funcții

Interogările SQL folosesc foarte des diverse funcții încorporate care vă permit să interacționați cu datele și să le transformați din mers. Merită să le luați în considerare deoarece fac parte integrantă dintr-un limbaj structurat.

    NUMARA. Numărează înregistrările sau rândurile dintr-un anumit tabel. Puteți specifica numele coloanei ca parametru, apoi datele vor fi preluate din aceasta. SELECTARE NUMĂR * FROM Angajați;

    AVG. Se aplică numai coloanelor cu date numerice. Rezultatul său este determinarea mediei aritmetice a tuturor valorilor;

    MIN și MAX. Aceste funcții au fost deja utilizate în acest articol. Ele determină valorile maxime și minime dintr-o coloană specificată;

    SUMĂ. Este simplu - funcția calculează suma valorilor coloanei. Se aplică exclusiv datelor numerice. Prin adăugarea parametrului DISTINCT la interogare, vor fi însumate numai valorile unice;

    RUNDĂ. Funcție pentru rotunjirea fracțiilor zecimale. Sintaxa folosește numele coloanei și numărul de zecimale;

    LEN. O funcție simplă care calculează lungimea valorilor unei coloane. Rezultatul va fi un nou tabel care indică numărul de caractere;

    ACUM. Acest cuvânt cheie este folosit pentru a calcula data și ora curente.

Operatori suplimentari

Multe exemple de instrucțiuni SQL au cuvinte cheie care efectuează sarcini mici, dar totuși simplifică foarte mult recuperarea sau manipularea bazei de date.

    LA FEL DE. Este folosit atunci când trebuie să formatați vizual rezultatul atribuind numele specificat tabelului rezultat.

    ÎNTRE. Un instrument de eșantionare foarte convenabil. Specifică intervalul de valori printre care datele trebuie preluate. Ia ca intrare parametrul de la și la ce număr este utilizat intervalul;.

    NU. Operatorul dă opusul expresiei.

    TRUNCHIA. Șterge datele din secțiunea specificată a bazei de date. Diferă de operatorii similari prin faptul că este imposibil să restabiliți datele după ce le utilizați. Merită să luați în considerare faptul că implementarea acestui cuvânt cheie în diferite interpretări SQL poate diferi. Prin urmare, înainte de a încerca să utilizați TRUNCATE, este mai bine să citiți informațiile de ajutor.

    LIMITĂ. Setează numărul de linii de ieșit. Particularitatea operatorului este că acesta este întotdeauna situat la capăt. Acceptă un parametru obligatoriu și unul opțional. Prima specifică câte rânduri de date selectate trebuie afișate. Și dacă se folosește al doilea, atunci operatorul funcționează ca pentru un interval de valori.

    UNIUNE. Un operator foarte convenabil pentru combinarea mai multor interogări. A fost deja găsit printre exemple în acest articol. Puteți afișa rândurile dorite din mai multe tabele combinându-le cu UNION pentru o utilizare mai convenabilă. Sintaxa sa este următoarea: SELECT nume_coloană FROM nume_tabelă UNION SELECT alt_nume_coloană FROM nume_altă_tabelă. Rezultatul este un tabel pivot cu interogările combinate.

    CHEIA PRINCIPALA. Tradus ca „cheie primară”. De fapt, aceasta este exact terminologia folosită în materialele de referință. Înseamnă un identificator unic de rând. Se folosește, de regulă, la crearea unui tabel pentru a indica câmpul care îl va conține.

    MOD IMPLICIT. La fel ca și operatorul anterior, acesta este utilizat în timpul execuției cererii de creare. Acesta definește valoarea implicită cu care va fi populat câmpul atunci când este creat.

    NUL. Începătorii și nu doar programatorii, atunci când scriu interogări, uită foarte des de posibilitatea de a obține valoarea NULL. Ca rezultat, o eroare se strecoară în cod, care este dificil de urmărit în timpul depanării. Prin urmare, atunci când creați tabele, selectați sau recalculați valori, trebuie să vă opriți și să vă gândiți dacă apariția lui NULL în această parte a interogării este luată în considerare.

    Memorie. Acest articol a arătat mai multe funcții care pot îndeplini anumite sarcini. Când dezvoltați un shell pentru lucrul cu o bază de date, puteți externaliza calculul expresiilor simple către sistemul de management al bazei de date. În unele cazuri, acest lucru oferă o creștere semnificativă a performanței.

    Restricții. Dacă trebuie să obțineți doar două rânduri dintr-o bază de date cu mii de rânduri, atunci ar trebui să utilizați operatori precum LIMIT sau TOP. Nu este nevoie să extrageți date folosind un limbaj de dezvoltare shell.

    Compus. După ce primesc date de la mai multe tabele, mulți programatori încep să le adună împreună folosind memoria shell. Dar de ce? La urma urmei, puteți crea o singură cerere în care toate acestea vor fi prezente. Nu este nevoie să scrieți cod suplimentar și să rezervați memorie suplimentară în sistem.

    Triere. Dacă este posibil să aplicați comanda într-o interogare, adică folosind SGBD, atunci trebuie să îl utilizați. Acest lucru vă va permite să economisiți semnificativ resursele atunci când rulați un program sau un serviciu.

    O mulțime de cereri. Dacă trebuie să introduceți mai multe înregistrări secvenţial, atunci pentru optimizare ar trebui să vă gândiţi la inserarea în lot a datelor cu o singură solicitare. Acest lucru va crește, de asemenea, performanța întregului sistem în ansamblu.

    Plasarea atentă a datelor. Înainte de a compila structura bazei de date, trebuie să vă gândiți dacă sunt necesare atâtea tabele și câmpuri. Poate că există o modalitate de a le combina sau de a le arunca. Foarte des, programatorii folosesc o cantitate excesivă de date care nu vor fi niciodată folosite nicăieri.

    Tipuri. Pentru a economisi spațiu și resurse, trebuie să fiți sensibil la tipurile de date pe care le utilizați. Dacă este posibil să utilizați un tip care este mai puțin „greu” pentru memorie, atunci ar trebui să îl utilizați. De exemplu, dacă știți că valoarea numerică dintr-un anumit câmp nu va depăși 255, atunci de ce să folosiți un INT de 4 octeți dacă există un TINYINT de 1 octet.

Concluzie

În concluzie, trebuie remarcat faptul că limbajul de interogare structurat SQL este acum folosit aproape peste tot - site-uri web, servicii web, programe PC, aplicații pentru dispozitive mobile. Prin urmare, cunoașterea SQL va ajuta toate ramurile de dezvoltare.

Cu toate acestea, modificările standardului limbii originale diferă uneori unele de altele. De exemplu, instrucțiunile PL SQL pot avea o sintaxă diferită de cea din SQL Server. Prin urmare, înainte de a începe dezvoltarea cu această tehnologie, merită să citiți tutorialele despre ea.

În viitor, analogii care ar putea depăși SQL în funcționalitate și performanță este puțin probabil să apară, așa că această zonă este o nișă destul de promițătoare pentru orice programator.