Interogări simple SQL - scurt ajutor și exemple. Utilizarea SQL în Microsoft Access. Caracteristici de formatare a datei și orei

Interogările sunt scrise fără ghilimele de escape, deoarece MySQL, MS SQLȘi PostGree sunt diferite.

Interogare SQL: obținerea câmpurilor specificate (necesare) din tabel

SELECT ID, country_title, count_people FROM table_name

Primim o listă de înregistrări: TOATE țările și populațiile lor. Numele câmpurilor obligatorii sunt indicate separate prin virgule.

SELECT * FROM table_name

* denotă toate câmpurile. Adică vor fi spectacole TOT câmpuri de date.

Interogare SQL: scoaterea înregistrărilor dintr-un tabel, excluzând duplicatele

SELECTAȚI DISTINCT country_title FROM table_name

Primim o listă de înregistrări: țări în care se află utilizatorii noștri. Pot exista mulți utilizatori dintr-o singură țară. În acest caz, este cererea dvs.

Interogare SQL: scoaterea înregistrărilor dintr-un tabel pe baza unei anumite condiții

SELECT ID, country_title, city_title FROM table_name WHERE count_people>100000000

Primim o listă de înregistrări: țări în care numărul de persoane este mai mare de 100.000.000.

Interogare SQL: afișarea înregistrărilor dintr-un tabel cu ordonare

SELECT ID, city_title FROM table_name ORDER BY city_title

Primim o listă de înregistrări: orașe în ordine alfabetică. La începutul A, la sfârșitul Z.

SELECT ID, city_title FROM table_name ORDER BY city_title DESC

Obținem o listă de înregistrări: orașe în sens invers ( DESC) Bine. La început I, la sfârșit A.

Interogare SQL: numărarea numărului de înregistrări

SELECTAȚI COUNT(*) FROM table_name

Obținem numărul (numărul) de înregistrări din tabel. În acest caz, NU există o listă de înregistrări.

Interogare SQL: ieșirea intervalului dorit de înregistrări

SELECT * FROM table_name LIMIT 2, 3

Obținem 2 (a doua) și 3 (a treia) înregistrări din tabel. Interogarea este utilă atunci când se creează navigarea pe pagini WEB.

Interogări SQL cu condiții

Afișarea înregistrărilor dintr-un tabel de condiție dată folosind operatori logici.

Interogare SQL: construcție ȘI

SELECT ID, city_title FROM table_name WHERE country="Russia" AND oil=1

Primim o listă de înregistrări: orașe din Rusia ȘI au acces la petrol. Când să folosiți operatorul ȘI, atunci ambele condiții trebuie să se potrivească.

Interogare SQL: construcție SAU

SELECT ID, city_title FROM table_name WHERE country="Russia" SAU country="USA"

Primim o listă de înregistrări: toate orașele din Rusia SAU STATELE UNITE ALE AMERICII. Când să folosiți operatorul SAU, atunci cel puțin o condiție trebuie să se potrivească.

Interogare SQL: ȘI NU construcție

SELECT ID, user_login FROM table_name WHERE country="Russia" AND NOT count_comments<7

Primim o listă de înregistrări: toți utilizatorii din Rusia ȘI cine a facut NU MAI PUȚIN 7 comentarii.

Interogare SQL: construcție IN (B)

SELECT ID, user_login FROM table_name WHERE country IN ("Rusia", "Bulgaria", "China")

Primim o listă de înregistrări: toți utilizatorii care locuiesc în ( ÎN) (Rusia, sau Bulgaria sau China)

Interogare SQL: NU ÎN construcție

SELECT ID, user_login FROM table_name WHERE country NOT IN ("Rusia","China")

Primim o listă de înregistrări: toți utilizatorii care nu locuiesc în ( NU ÎN) (Rusia sau China).

Interogare SQL: construcție IS NULL (valori goale sau NOT goale)

SELECT ID, user_login FROM table_name WHERE starea ESTE NULL

Primim o listă de înregistrări: toți utilizatorii pentru care starea nu este definită. NULL este o problemă separată și, prin urmare, este verificată separat.

SELECT ID, user_login FROM table_name WHERE starea NU ESTE NULL

Obținem o listă de înregistrări: toți utilizatorii în care starea este definită (NOT NULL).

Interogare SQL: construcție LIKE

SELECT ID, user_login FROM table_name WHERE nume de familie LIKE „Ivan%”

Primim o listă de înregistrări: utilizatori al căror nume de familie începe cu combinația „Ivan”. Semnul % înseamnă ORICE număr de ORICE caractere. Pentru a găsi semnul %, trebuie să utilizați evadarea „Ivan\%”.

Interogare SQL: BETWEEN construcție

SELECT ID, user_login FROM table_name WHERE salariul INTRE 25000 SI 50000

Primim o listă de înregistrări: utilizatori care primesc un salariu de la 25.000 la 50.000 inclusiv.

Există o mulțime de operatori logici, așa că studiați documentația serverului SQL în detaliu.

Interogări SQL complexe

Interogare SQL: combinarea mai multor interogări

(SELECT id, user_login FROM table_name1) UNION (SELECT id, user_login FROM table_name2)

Primim o listă de intrări: utilizatori care sunt înregistrați în sistem, precum și acei utilizatori care sunt înregistrați separat pe forum. Operatorul UNION poate combina mai multe interogări. UNION acționează ca SELECT DISTINCT, adică elimină valorile duplicat. Pentru a obține absolut toate înregistrările, trebuie să utilizați operatorul UNION ALL.

Interogare SQL: valoarea câmpului contorizează MAX, MIN, SUM, AVG, COUNT

Afișarea unei valori maxime a contorului în tabel:

SELECT MAX(contorul) FROM table_name

Ieșire a unei valori minime de contor din tabel:

SELECTAȚI MIN(contorul) FROM table_name

Afișarea sumei tuturor valorilor contorului în tabel:

SELECTAȚI SUMA(contorul) FROM table_name

Afișarea valorii medii a contorului în tabel:

SELECTAȚI AVG(contor) FROM table_name

Afișarea numărului de contoare din tabel:

SELECTAȚI COUNT(contorul) FROM table_name

Afișarea numărului de contoare din atelierul nr. 1 în tabel:

SELECT COUNT(counter) FROM table_name WHERE office="Workshop No. 1"

Acestea sunt cele mai populare echipe. Se recomandă, acolo unde este posibil, utilizarea interogărilor SQL de acest fel pentru calcule, deoarece niciun mediu de programare nu poate compara viteza de procesare a datelor decât serverul SQL însuși atunci când procesează propriile date.

Interogare SQL: gruparea înregistrărilor

SELECTAȚI continentul, SUM(țara_zona) FROM Țara GROUP BY continent

Primim o listă de înregistrări: cu numele continentului și suma zonelor tuturor țărilor lor. Adică, dacă există un director de țări în care fiecare țară are aria sa înregistrată, atunci folosind constructul GROUP BY puteți afla dimensiunea fiecărui continent (pe baza grupării pe continente).

Interogare SQL: folosind mai multe tabele prin alias

SELECT o.order_no, o.amount_paid, c.company FROM comenzi AS o, client AS cu WHERE o.custno=c.custno AND c.city="Tyumen"

Primim o listă de înregistrări: comenzi de la clienți care locuiesc numai în Tyumen.

De fapt, cu o bază de date proiectată corespunzător de acest tip, interogarea este cea mai frecventă, așa că a fost introdus în MySQL un operator special care funcționează de multe ori mai rapid decât codul scris mai sus.

SELECT o.order_no, o.amount_paid, z.company FROM orders AS o LEFT JOIN client AS z ON (z.custno=o.custno)

Subinterogări imbricate

SELECT * FROM table_name WHERE salariu=(SELECT MAX(salariu) FROM angajat)

Obținem o singură înregistrare: informații despre utilizatorul cu salariul maxim.

Atenţie! Subinterogările imbricate sunt unul dintre cele mai mari blocaje din serverele SQL. Împreună cu flexibilitatea și puterea lor, ele măresc, de asemenea, semnificativ sarcina pe server. Ceea ce duce la o încetinire catastrofală pentru alți utilizatori. Cazurile de apeluri recursive în interogări imbricate sunt foarte frecvente. Prin urmare, recomand insistent să NU folosiți interogări imbricate, ci să le împărțiți în altele mai mici. Sau utilizați combinația LEFT JOIN descrisă mai sus. În plus, acest tip de solicitare este o sursă sporită de încălcări de securitate. Dacă decideți să utilizați subinterogări imbricate, atunci trebuie să le proiectați foarte atent și să faceți rulări inițiale pe copii ale bazelor de date (baze de date de testare).

Interogările SQL modifică datele

Interogare SQL: INSERT

Instrucțiuni INTRODUCE vă permit să introduceți înregistrări într-un tabel. Cu cuvinte simple, creați un rând cu date într-un tabel.

Opțiunea 1. O instrucțiune folosită frecvent este:

INSERT INTO table_name (id, user_login) VALUES (1, "ivanov"), (2, "petrov")

la masa" table_name» 2 (doi) utilizatori vor fi introduși deodată.

Opțiunea #2. Este mai convenabil să folosiți stilul:

INSERT table_name SET id=1, user_login="ivanov"; INSERT table_name SET id=2, user_login="petrov";

Acest lucru are avantajele și dezavantajele sale.

Principalele dezavantaje:

  • Multe interogări SQL mici vor rula puțin mai lent decât o interogare SQL mare, dar alte interogări vor fi puse în coadă pentru service. Adică, dacă o interogare SQL mare durează 30 de minute pentru a se executa, atunci în tot acest timp interogările rămase vor fuma bambus și își vor aștepta rândul.
  • Solicitarea se dovedește a fi mai masivă decât versiunea anterioară.

Principalele avantaje:

  • În timpul interogărilor SQL mici, alte interogări SQL nu sunt blocate.
  • Ușurință de citit.
  • Flexibilitate. În această opțiune, nu trebuie să urmați structura, ci să adăugați doar datele necesare.
  • Când creați arhive în acest fel, puteți copia cu ușurință o linie și o puteți rula prin linia de comandă (consolă), astfel nu restaurând întreaga ARHIVĂ.
  • Stilul de scriere este similar cu declarația UPDATE, ceea ce face mai ușor de reținut.

Interogare SQL: UPDATE

UPDATE table_name SET user_login="ivanov", user_surname="Ivanov" WHERE id=1

In masa " table_name„în înregistrarea cu numărul id=1, valorile câmpurilor user_login și user_surname vor fi modificate la valorile specificate.

Interogare SQL: DELETE

DELETE FROM table_name WHERE id=3

În tabelul table_name înregistrarea cu numărul ID 3 va fi ștearsă.

  1. Se recomandă să scrieți toate numele câmpurilor cu litere mici și, dacă este necesar, să le separați cu un spațiu forțat „_” pentru compatibilitate cu diferite limbaje de programare, precum Delphi, Perl, Python și Ruby.
  2. Scrieți comenzile SQL cu majuscule pentru a fi lizibile. Amintiți-vă întotdeauna că alte persoane pot citi codul după dvs. și, cel mai probabil, voi înșivă după N perioadă de timp.
  3. Numiți câmpurile mai întâi cu un substantiv și apoi cu o acțiune. De exemplu: city_status, user_login, user_name.
  4. Încercați să evitați cuvintele rezervate în diferite limbi care pot cauza probleme în SQL, PHP sau Perl, cum ar fi (nume, număr, link). De exemplu: linkul poate fi folosit în MS SQL, dar este rezervat în MySQL.

Acest material este o scurtă referință pentru munca de zi cu zi și nu pretinde a fi o sursă super mega autorizată, care este sursa originală a interogărilor SQL ale unei anumite baze de date.

Această anexă oferă o descriere mai concisă a diferitelor comenzi SQL. Scopul este de a vă oferi o referință și o definiție rapidă și precisă a SQL. Prima secțiune a acestei aplicații definește elementele folosite pentru a crea comenzi SQL; în al doilea rând, detalii despre sintaxă și propoziții cu o scurtă descriere a comenzilor în sine. Următoarele arată condițiile standard (numite condiții BNF):

  • Cuvintele cheie sunt tastate cu majuscule.
  • SQL și alți termeni speciali sunt încadrați între paranteze unghiulare și introduși cu caractere cursive.(< și >)
  • Părțile opționale ale comenzilor sunt incluse între paranteze drepte ().
  • O elipsă (....) indică faptul că partea anterioară a comenzii poate fi repetată de orice număr de ori.
  • O bară verticală (|) înseamnă că ceea ce o precede poate fi înlocuit cu ceea ce o urmează.
  • Parantezele ((și)) indică faptul că totul în interiorul lor trebuie tratat ca un număr întreg pentru a evalua alte caractere (cum ar fi barele verticale sau elipsele).
  • Două două puncte și egal (:: =) înseamnă că ceea ce le urmează este definiția a ceea ce le precede.

    În plus, vom folosi următoarea secvență (.,..) pentru a indica faptul că ceea ce îl precede poate fi repetat de orice număr de ori, cu evenimente individuale separate prin virgulă. Atributele care nu fac parte din standardul oficial vor fi marcate ca (*non-standard*) în descriere.

    Vă rugăm să rețineți: terminologia pe care o folosim aici nu este terminologia oficială ANSI. Terminologia oficială poate fi foarte confuză, așa că am simplificat-o oarecum.

    Din acest motiv, folosim uneori alte condiții decât ANSI, sau folosim aceleași condiții, dar într-un mod ușor diferit. De exemplu, definiția noastră este< predicate >diferă de combinația de definiție standard ANSI< predicate >Cu< search condition >.

    ELEMENTE SQL

    Această secțiune definește elementele comenzilor SQL. Ele sunt împărțite în două categorii: Elemente de bază ale limbajului, Și Elemente funcționale ale limbajului.

    Elemente esentiale- Acest blocuri create limba; Când SQL examinează o comandă, mai întâi evaluează fiecare caracter din textul comenzii în funcție de acele elemente. Separatoare< separator >separa o parte a echipei de alta; tot ce este între separatori< separator >procesat ca modul. Pe baza acestei diviziuni, SQL interpretează comanda.

    Elemente funcționale sunt diverse alte lucruri decât cuvintele cheie care pot fi interpretate ca module. Acestea sunt părțile unei comenzi separate prin delimitatori< separator >, care au o semnificație specială în SQL. Unele dintre ele sunt speciale pentru anumite comenzi și vor fi descrise împreună cu aceste comenzi mai târziu în această anexă. Elementele enumerate aici sunt comune tuturor comenzilor descrise. Elementele funcționale pot fi definite unul în celălalt sau chiar în termeni proprii. De exemplu, predicatul< predicate >, cazul nostru final și cel mai dificil, conține un predicat în cadrul propriei definiții. Aceasta pentru că predicatul< predicate >folosind AND sau OR poate conține orice număr de predicate< predicate >care poate lucra autonom. V-am prezentat predicatul< predicate >într-o secțiune separată din această anexă, datorită diversității și complexității acestui element funcțional al limbii. El va fi prezent în mod constant atunci când vorbește despre alte părți funcționale ale echipelor.

    ELEMENTE ALE LIMBAJULUI DE BAZĂ

    DEFINIȚIA ELEMENTULUI< separator > < comment > | < space > | < newline > < comment > --< string > < newline > < space >spaţiu< newline >sfârşitul şirului de caractere definit de implementare< identifier > < letter >[{< letter or digit > | < underscore}... ] < ИМЕЙТЕ ВВИДУ: Следу строгому стандарту ANSI, символы должны быть набраны в верхнем регистра, а идентификатор < identifier >nu trebuie să aibă mai mult de 18 caractere. DEFINIȚIA ELEMENTULUI< underscore > - < percent sign > % < delimiter >oricare dintre următoarele: , ()< > . : = + " - | <> > = < = или < string > < string >[orice text tastat între ghilimele simple] Notă: În< string >, două ghilimele simple consecutive (" ") sunt interpretate ca unul (").< SQL term >terminand in functie de limba principala. (*numai cuib*)

    ELEMENTE FUNCȚIONALE

    Următorul tabel arată elemente functionale Comenzi SQL și definițiile acestora: DEFINIȚIA ELEMENTULUI< query >clauza SELECT< subquery >O clauză SELECT inclusă între paranteze în interiorul unei alte clauze care este, de fapt, evaluată separat pentru fiecare rând candidat al celeilalte clauze.< value expression > < primary > | < primary > < operator > < primary > | < primary > < operator > < value expression > < operator >oricare dintre următoarele: + - / *< primary > < column name > | < literal > | < aggregate function > | < built-in constant > | < nonstandard function > < literal > < string > | < mathematical expressio ЭЛЕМЕНТ ОПРЕДЕЛЕНИЕ < built-in constant >UTILIZATOR |< implementation-dehned constant > < table name > < identifier > < column spec > [< table name > | < alias >.]< column name > < grouping column > < column spec > | < integer > < ordering column > < column spec > | < integer > < colconstraint >NU NUL | UNIC | VERIFICA (< predicate >) | CHEIE PRIMARĂ | REFERINȚE< table name >[(< column name >)] < tabconstraint >UNIC (< column list >) | VERIFICA (< predicate >) | CHEIA PRINCIPALA (< column list >) | CHEIE EXTERNĂ (< column list >) REFERINȚE< table name >[(< column list >)] < defvalue >VALOARE IMPLICITĂ =< value expression > < data type >Tip de date valid (Consultați Anexa B pentru o descriere a tipurilor furnizate de ANSI sau Anexa C pentru alte tipuri comune.)< size >Valoarea depinde de< data type >(Vezi Anexa B.)< cursor name > < identifier > < index name > < identifier > < synonym > < identifier >(*nestandard*)< owner > < Authorization ID > < column list > < column spec > .,.. < value list > < value expression > .,.. < table reference > { < table name > [< alias >] } .,..

    PREDICATE

    Următoarele definește o listă de diferite tipuri de predicate< predicate >descris pe paginile următoare:

    < predicate > ::=

    { < comparison predicate > | < in predicate > | < null predicate > | < between predicate > | < like predicate > | < quantified predicate > | < exists predicate > } < predicate >este o expresie care poate fi adevărată, falsă sau necunoscută, cu excepția< exists predicate >Și< null predicate >, care poate fi doar adevărat sau fals.

    O necunoscută va fi primită dacă valorile NULL împiedică ieșirea răspunsului primit. Acest lucru se va întâmpla ori de câte ori o valoare NULL este comparată cu orice valoare. Operatorii booleeni standard - AND, OR și NOT - pot fi utilizați cu un predicat. NU adevărat = fals, NU fals = adevărat și NU necunoscut = necunoscut. Rezultatele AND și OR în combinație cu predicate sunt prezentate în următoarele tabele:

    AND AND Adevărat Fals Necunoscut Adevărat adevărat fals necunoscut Fals fals fals fals Necunoscut necunoscut fals necunoscut SAU SAU Adevărat Fals Necunoscut Adevărat adevărat adevărat adevărat Fals adevărat fals necunoscut Necunoscut adevărat necunoscut necunoscut

    Aceste tabele sunt citite într-un mod similar cu o tabelă de înmulțire: combinați valorile adevărate, false sau necunoscute din rânduri cu coloanele lor pentru a obține rezultatul pe cruce. Într-un tabel AND, de exemplu, a treia coloană (Necunoscut) și primul rând (Adevărat) la intersecția din colțul din dreapta sus dau rezultatul - necunoscut, cu alte cuvinte: Adevărat ȘI Necunoscut = necunoscut. Ordinea calculelor este determinată prin paranteze. Ei nu se prezintă de fiecare dată. NOT este evaluat mai întâi, urmat de AND și OR. Tipuri variate predicate< predicate >sunt discutate separat în secțiunea următoare.

    < comparison predicate >(predicat de comparație)

    Sintaxă

    < value expresslon > < relational op > < value expresslon > |
    < subquery >
    < relatlonal op > :: =
    =
    | <
    | >
    | <
    | >=
    | < >

    În cazul în care fie< value expression >= NULL sau< comparison predicate >= necunoscut; cu alte cuvinte, este adevărat dacă comparația este adevărată sau falsă dacă comparația este falsă.
    < relational op >are valori matematice standard pentru valori numerice; pentru alte tipuri de valori, acele valori sunt specifice implementării.
    Ambii< value expression >trebuie să aibă tipuri de date comparabile. Dacă subinterogarea< subquery >este folosit, trebuie să conțină o singură expresie< value expression >în clauza SELECT a cărei valoare va înlocui a doua expresie< value expression >într-un predicat de comparaţie< comparision predicate >, de fiecare dată când< subquery >de fapt împlinite.

    < between predicate >

    Sintaxă

    < value expression >ÎNTRE< value expression >
    ȘI< value expression >

    < between predicate >- A INTRE B SI C , are acelasi sens ca< predicate >- (A >= B ȘI< = C). < between predicate >pentru care A NU ÎNTRE B ŞI C are aceeaşi semnificaţie cu NU (ÎNTRE B ŞI C).< value expression >poate fi dedus folosind o interogare non-standard< subquery >(*nestandard*).

    < in prediicate >

    Sintaxă

    < value expression >ÎN< value list > | < subquery >

    Lista de valori< value list >va consta din una sau mai multe valori enumerate în paranteze și separate prin virgule care au comparabile< value expression >tip de date. Dacă se utilizează o subinterogare< subquery >, trebuie să conțină o singură expresie< value expression >în clauza SELECT (posibil mai mult, dar aceasta va fi în afara standardului ANSI). Subinterogare< subquery >de fapt, este executat separat pentru fiecare rând candidat al interogării principale, iar valorile pe care le va scoate vor forma o listă de valori< value list >pentru această linie. În orice caz, predicatul< in predicate >va fi adevărat dacă expresia< value expression >reprezentate într-o listă de valori< value list >, dacă se specifică NOT. Expresia A NOT IN (B, C) este echivalentă cu expresia NOT (A IN (B, C)).

    < like predicate >

    Sintaxă

    < charvalue >CA< pattern >

    < charvalue >este orice expresie *non-standard*< value expression >tip alfanumeric.< charvalue >poate, conform standardului, doar o anumită coloană< column spec >. Probă< pattern >constă dintr-un șir care va fi verificat pentru o potrivire cu< charvalue >. Simbol de sfârșit< escapechar >este un singur caracter alfanumeric. O potrivire va avea loc dacă următoarele condiții sunt adevărate:

  • Pentru fiecare subliniere< underscore >în probă< pattern >care nu este precedat de un caracter de terminare< escapechar >, există un simbol corespunzător< charvalue >.
  • Pentru fiecare< percent sign >în probă< pattern >, care nu precede< escapechar >, există zerouri sau mai multe caractere care se potrivesc în< charvalue >.
  • Pentru fiecare< escapechar >V< pattern >care nu precede alta< escapechar >, nu există niciun caracter corespunzător în< charvalue >.
  • Pentru fiecare alt personaj din< pattern >, același simbol este setat la marcajul corespunzător în< charvalue >.

    Dacă apare o potrivire,< like predicate >- adevărat dacă NU a fost specificat. Expresia NOT LIKE „text” este echivalentă cu NOT (UN LIKE „text”).

    < null predicate >

    Sintaxă

    < column spec >ESTE NUL

    < column spec >= IS NULL dacă o valoare NULL este prezentă în această coloană. Va face< null predicate >adevărat dacă nu este specificat NULL. Fraza< column spec >IS NOT NULL, are același rezultat ca NOT (< column spec >ESTE NUL).

    < quantified predicate >

    Sintaxă

    < value expression > < relational op >
    < quantifier > < subquery >
    < quantifier >::= ORICE | TOATE | NISTE

    Clauza SELECT de subinterogare< subquery >trebuie să conțină una și o singură expresie de valoare< value expression >. Toate valorile returnate de subinterogare< subquery >alcătuiește un set de rezultate< result set >. < value expression >comparat folosind purtător< relational operator >, cu fiecare membru al setului de rezultate< result set >. Această comparație este evaluată după cum urmează:

  • Dacă< quantifier >= ALL și fiecare membru al setului de rezultate< result set >face această comparație adevărată,< quantified predicate >- Adevărat.
  • Dacă< quantifier >= ORICE și există macar un membru din setul de rezultate< result set >, ceea ce face ca această comparație să fie adevărată, atunci< quantified predicate >este corect.
  • Dacă rezultatul este stabilit< result set >gol, atunci< quantified predicate >adevărat dacă< quantifier >= ALL și false în caz contrar.
  • Dacă< quantifier >= UNELE, efectul este același ca pentru ORICE.
  • Dacă< quantified predicate >nici adevărat, nici infidel, el este necunoscut.

    < exists predicate >

    Sintaxă:

    EXISTĂ (< subquery >)

    Dacă subinterogarea< subquery >tipărește una sau mai multe linii de ieșire,< exists predicate >- credincios; și incorectă în caz contrar.

    COMENZI SQL

    Această secțiune detaliază sintaxa diferitelor comenzi SQL. Acest lucru vă va oferi posibilitatea de a căuta rapid o comandă, de a găsi sintaxa acesteia și de o scurtă descriere a modului în care funcționează.

    ȚINEȚI minte Comenzile care încep cu cuvinte - EXEC SQL, precum și comenzile sau propozițiile care se termină cu un cuvânt - pot fi folosite numai în SQL imbricat.

    ÎNCEPEȚI SECȚIUNEA DE DECLARE

    Sintaxă

    EXEC SQL BEGIN DECLARE SECTION< SQL term > < host-language variable declarations >EXEC SQL END DECLARE SECȚIUNE< SQL term >

    Această comandă creează o secțiune a programului limbaj gazdă pentru a declara principalele variabile care vor fi utilizate în instrucțiunile SQL imbricate. Variabila SQLCODE trebuie inclusă ca una dintre variabilele limbii gazdă declarate.

    ÎNCHIS CURSORUL

    Sintaxă

    EXEC SQL ÎNCHIS CURSOR< cursor name > < SQL term >;

    Această comandă spune cursorului să se închidă, după care nicio valoare nu poate fi preluată din el până când este redeschis.

    COMMIT (MUNCĂ)

    Sintaxă

    Această comandă lasă neschimbate toate modificările făcute în baza de date până când tranzacția curentă se încheie și începe o nouă tranzacție.

    CREAȚI INDEX

    (*NESTANDARD*)

    Sintaxă

    CREAȚI INDEX< Index name >
    PE< table name > (< column list >);

    Această comandă creează o rută eficientă, cu acces rapid, pentru a găsi rândurile care conțin coloanele desemnate. Dacă este specificat UNIQUE, tabelul nu poate conține valori duplicate în aceste coloane.

    CREAȚI SINONIM (*NESTANDARD*)
    (CREAȚI SINONIM) (*NESTANDARD*)

    Sintaxă

    CREAȚI SINONIM IPUBLICl< synonym >PENTRU
    < owner >.< table name >;

    Această comandă creează o alternativă (sinonim) pentru tabel. Sinonimul aparține creatorului său, iar tabelul în sine, de obicei altui utilizator. Folosind un sinonim, proprietarul acestuia nu trebuie să facă referire la tabel prin numele complet (inclusiv proprietarul său). Dacă este specificat PUBLIC, sinonimul aparține directorului SYSTEM și, prin urmare, este disponibil pentru toți utilizatorii.

    CREAȚI TABEL

    Sintaxă

    CREAȚI TABEL< table name >
    ({< column name > < data type >[< size >]
    [< colconstralnt > . . .]
    [< defvalue >]} . , . . < tabconstraint > . , . .);

    Comanda creează un tabel în baza de date. Acest tabel va fi deținut de creatorul său. Coloanele vor fi luate în considerare în ordinea numelui.< data type >- determină tipul de date pe care îl va conține coloana. Standard< data type >descrise în Anexa B; toate celelalte tipuri de date utilizate< data type >, discutat în Anexa C . Valoarea mărimii< size >depinde de tipul de date< data type >.
    < colconstraint >Și< tabconstraint >impune restricții asupra valorilor care pot fi introduse într-o coloană.
    < defvalue >specifică valoarea (implicit) care va fi inserată automat dacă nu este specificată nicio altă valoare pentru acest rând. (Consultați Capitolul 17 pentru detalii despre comanda CREATE TABLE în sine și Capitolul 18 ȘI pentru detalii despre limitări și< defvalue >).

    CREATE VIEW

    Sintaxă

    CREATE VIEW< table name >
    LA FEL DE< query >
    ;

    Vederea este tratată ca orice masă din Comenzi SQL. Când o comandă se referă la un nume de tabel< table name >, cerere< query >este executat, iar rezultatul său se potrivește cu conținutul tabelului specificat în această comandă.
    Unele vizualizări pot fi modificate, ceea ce înseamnă că comenzile de modificare pot fi executate pe acele vederi și transmise tabelului la care a fost referit în interogare.< query >. Dacă se specifică WITH CHECK OPTION, această modificare trebuie să satisfacă și condiția predicatului< predicate >în cerere< query >.

    DECLARE CURSOR

    Sintaxă

    EXEC SQL DECLARE< cursor name >CURSOR PENTRU
    < query >< SQL term >

    Această comandă le leagă de cursor< cursor name >, cu o cerere< query >. Când cursorul este deschis (vezi DESCHIS CURSOR), cererea< query >este executat, iar rezultatul său poate fi preluat (prin comanda FETCH) pentru ieșire. Dacă cursorul este modificabil, tabelul la care se face referire de interogare< query >, poate obține o modificare a conținutului utilizând o operațiune de modificare a cursorului (vezi capitolul 25 despre cursorii modificabili).

    ȘTERGE

    Sintaxă

    ȘTERGERE DIN< table name >
    { ; }
    | UNDE CURENTUL DE< cursorname >< SQL term >

    Dacă lipsește clauza WHERE, TOATE rândurile din tabel sunt șterse. Dacă clauza WHERE folosește un predicat< predicate >, rânduri care îndeplinesc condiția acestui predicat< predicate >sunt șterse. Dacă clauza WHERE are un argument CURRENT OF în numele cursorului< cursor name >, rând din tabel< table name >pe care în acest moment există un link folosind numele cursorului< cursor name >va fi sters. Formularul WHERE CURRENT poate fi folosit numai în SQL imbricat și numai cu cursoare modificabile.

    EXEC SQL

    Sintaxă

    EXEC SQL< embedded SQL command > < SQL term >

    EXEC SQL este folosit pentru a indica începutul tuturor comenzilor SQL imbricate într-o altă limbă.

    FETCH

    Sintaxă

    EXEC SQL FETCH< cursorname >
    ÎN< host-varlable llst >< SQL term >

    FETCH preia ieșirea din șirul de interogare curent< query >, îl inserează în lista de variabile principale< host-variable list >și mută cursorul pe linia următoare. Listă< host-variable list >poate include o variabilă indicator ca variabilă țintă (vezi capitolul 25.)

    Acordarea (DREPTURILE DE TRANSFER)

    Sintaxă (standard)

    Acordați tot
    | (SELECTAȚI
    | INTRODUCE
    | ȘTERGE
    | ACTUALIZAȚI [(< column llst >)]
    | REFERINȚE [(< column llst >)l). , . .
    PE< table name > . , . .
    LA PUBLIC |< Authorization ID > . , . .
    ;

    Argumentul ALL, cu sau fără PRIVILEGII, include fiecare privilegiu din lista de privilegii. PUBLIC include toți utilizatorii existenți și toți cei creați în viitor. Această comandă vă permite să transferați drepturi pentru a efectua acțiuni pe un tabel cu un nume specificat. REFERENȚE vă permite să acordați permisiuni de utilizare a coloanelor din lista de coloane< column list >ca cheie părinte pentru o cheie străină. Alte privilegii constau în dreptul de a executa comenzi pentru care privilegiile sunt indicate prin numele lor în tabel. UPDATE este similar cu REFERENȚE și poate impune restricții asupra anumitor coloane. GRANT OPTION face posibilă transferul acestor privilegii către alți utilizatori.

    Sintaxă (non-standard)

    GRANT DBA
    | RESURSĂ
    | CONECTAȚI... .
    LA< Authorization ID > . , . .
    | < privilege > . , . . }
    DIN ( PUBLIC
    | < Authorization ID > . , . . };

    Privilegiu< privelege >poate fi oricare dintre cele specificate în comanda GRANT. Utilizatorul care oferă REVOKE trebuie să aibă aceleași privilegii ca și utilizatorul care acordă GRANT. Clauza ON poate fi folosită atunci când un privilegiu de tip special este utilizat pe un obiect special.

    ROLLBACK (LUCRARE)
    (ROLLBACK) (TRANZACȚII)

    Sintaxă

    Comanda anulează toate modificările aduse bazei de date în timpul tranzacției curente. De asemenea, o încheie pe cea actuală și începe o nouă tranzacție.

    SELECTAȚI

    Sintaxă

    SELECTAȚI ( IDISTINCT | TOATE]< value expression > . , . . } / *
    DIN< table reference > . , . .

    . , . . ];

    Această instrucțiune organizează interogarea și preia valorile din baza de date (vezi Capitolul 3 - Capitolul 14). Se aplică următoarele reguli:

  • Dacă nu sunt specificate nici ALL, nici DISTINCT, se presupune ALL.
  • Expresie< value expression >cuprinde< column spec >, funcție de agregare< aggregate funct >, funcție non-standard< nonstandard fu nction >, constant< constant >, sau orice combinație a acestora cu operatori în expresii valide.
  • Tabel de referință< table reference >, constă din numele tabelului, inclusiv prefixul proprietarului dacă utilizatorul actual nu este proprietarul sau un sinonim (non-standard) pentru tabel. Tabelul poate fi fie un tabel de bază, fie o vedere. În principiu, un alias poate indica ce alias este folosit pentru un tabel numai pe durata comenzii curente. Numele tabelului sau sinonimul trebuie separat de alias prin unul sau mai mulți delimitatori< separator >.
  • Dacă se utilizează GROUP BY, toate coloanele< column spec >folosit în clauza SELECT va trebui folosit ca un grup de coloane< grouping column >, dacă nu sunt conținute în funcția de agregare< aggregate funct >. Întregul grup de coloane< grouping column >trebuie reprezentat printre expresii< value expressions >specificat în clauza SELECT. Pentru fiecare combinație distinctă de valori ale grupului de coloane< grouping column >, va exista o singură linie de ieșire.
  • Dacă se folosește HAVING, predicatul< predicate >se aplică fiecărui rând produs de clauza GROUP BY, iar acele rânduri care fac acest predicat adevărat vor fi tipărite.
  • Dacă se folosește ORDER BY, ieșirea are o secvență specifică. ID-ul fiecărei coloane< column identifer >se referă la cele specificate< value expression >în clauza SELECT. Dacă aceasta< value expression >este coloana specificată< column spec >, < co lumn identifier >ar putea fi la fel ca< column spec >. In caz contrar< co lumn identifier >poate fi un număr întreg pozitiv care indică locația în care< value expression >în succesiunea clauzei SELECT. Ieșirea va fi generată pentru a se potrivi cu valorile conținute în< column identifier >în ordine crescătoare dacă DESC nu este specificat. Numele ID-ului coloanei< column identifier > venind primulîn clauza ORDER BY va fi precedată de mai târziu nume demne la determinarea secvenţei de ieşire.

    Clauza SELECT evaluează fiecare rând candidat al unui tabel în care rândurile sunt afișate independent. Șirul candidat este definit după cum urmează:

  • Dacă există un singur tabel referit< table reference >este inclus, fiecare rând din acest tabel este la rândul său un rând candidat.
  • Dacă mai mult de un tabel referit< table reference >activat, fiecare rând din fiecare tabel trebuie combinat pe rând cu fiecare combinație de rânduri din toate celelalte tabele. Fiecare astfel de combinație va fi la rândul său un șir candidat.

    Fiecare rând candidat produce valori care formează predicatul< predicate >în clauza WHERE este adevărată, falsă sau necunoscută. Dacă nu se utilizează GROUP BY, fiecare< value expression >se aplică pe rând fiecărui șir candidat a cărui valoare face predicatul adevărat, iar rezultatul acestei operații este rezultatul.
    Dacă se utilizează GROUP BY, rândurile candidate sunt combinate folosind funcții de agregare. Dacă nu există predicat< predicate >nu setat, fiecare expresie< value expression >se aplică fiecărui rând sau grup de candidat. Dacă este specificat DISTINCT, rândurile duplicate vor fi eliminate din rezultat.

    UNIUNE

    Sintaxă

    < query >(UNIUNE< query > } . . . ;

    Emite două sau mai multe interogări< query >vor fi comasate. Fiecare cerere< query >trebuie să conțină același număr< value expression >în clauza SELECT și într-o astfel de ordine încât 1.. n din fiecare să fie compatibil cu tipul de date< data type >și dimensiune< size >cu 1.. n toate celelalte.

    ACTUALIZAȚI

    Sintaxă

    ACTUALIZAȚI< table name >
    A STABILIT (< column name > = < value expression > } . , . .
    ([ UNDE< predlcate >]; }
    | {
    < SQL term >]}

    UPDATE modifică valorile din fiecare coloană numită< column name >la valoarea corespunzătoare< value expression >. Dacă clauza WHERE folosește un predicat< predicate >, apoi numai rândurile de tabel ale căror valori curente fac acel predicat< predicate >corect, supus modificării. Dacă WHERE folosește clauza CURRENT OF, atunci valorile din rândul tabelului numit< table name >situat în cursorul cu numele< cursor name >se schimbă. WHERE CURRENT OF este potrivit doar pentru utilizare în SQL imbricat și numai cu cursoare modificabile. Dacă nu există o clauză WHERE, toate rândurile sunt modificate.

    Oricand (de fiecare data ca)

    Sintaxă

    EXEC SQL oricând< SQLcond > < actlon > < SQL term >
    < SQLcond >::=SQLERROR | NU GĂSIT | SQLAVERTISMENT
    (ultimul nu este standard)
    < action >::=CONTINUA | MERGI LA< target >| MERGI LA< target >
    < target >:: = depinde de limba gazdă

  • Cum pot afla numărul de modele de PC produse de un anumit furnizor? Cum să determinați prețul mediu al computerelor care au același specificații? Acestea și multe alte întrebări legate de unele informații statistice pot fi răspuns folosind funcții finale (agregate).. Standardul oferă următoarele funcții agregate:

    Toate aceste funcții returnează o singură valoare. În același timp, funcțiile COUNT, MINȘi MAX aplicabil oricărui tip de date, în timp ce SUMĂȘi AVG sunt folosite numai pentru câmpurile numerice. Diferența între funcție NUMARA(*)Și NUMARA(<имя поля>) este că al doilea nu ia în considerare valorile NULL la calcul.

    Exemplu. Găsiți prețul minim și maxim pentru computerele personale:

    Exemplu. Găsiți numărul disponibil de computere produse de producătorul A:

    Exemplu. Daca suntem interesati de cantitate diverse modele, produs de producătorul A, atunci interogarea poate fi formulată după cum urmează (folosind faptul că în tabelul Produs fiecare model este înregistrat o singură dată):

    Exemplu. Găsiți numărul de modele diferite disponibile produse de producătorul A. Interogarea este similară cu cea anterioară, în care era necesar să se determine numărul total de modele produse de producătorul A. Aici trebuie să găsiți și numărul de modele diferite în masa PC (adică cele disponibile pentru vânzare).

    Pentru a se asigura că numai valorile unice sunt utilizate la obținerea indicatorilor statistici, când argumentul funcţiilor agregate poate fi folosit parametru DISTINCT. O alta parametrul ALL este implicit și presupune că toate valorile returnate în coloană sunt numărate. Operator,

    Dacă trebuie să obținem numărul de modele de PC produse toata lumea producător, va trebui să utilizați Clauza GROUP BY, urmând sintactic după clauze WHERE.

    Clauza GROUP BY

    Clauza GROUP BY folosit pentru a defini grupuri de șiruri de ieșire cărora li se pot aplica funcții agregate (COUNT, MIN, MAX, AVG și SUM). Dacă această clauză lipsește și sunt utilizate funcții de agregare, atunci toate coloanele cu nume menționate în SELECTAȚI, ar trebui incluse în funcții agregate, iar aceste funcții vor fi aplicate întregului set de rânduri care satisfac predicatul de interogare. În caz contrar, toate coloanele din lista SELECT nu este inclusîn agregat trebuie specificate funcţiile în clauza GROUP BY. Ca urmare, toate rândurile de interogare de ieșire sunt împărțite în grupuri caracterizate prin aceleași combinații de valori în aceste coloane. După aceasta, funcțiile agregate vor fi aplicate fiecărui grup. Rețineți că pentru GROUP BY totul Valori NULL sunt tratați ca egali, adică la gruparea după un câmp care conține valori NULL, toate aceste rânduri vor intra într-un singur grup.
    Dacă dacă există o clauză GROUP BY, în clauza SELECT fără funcții agregate, atunci interogarea va returna pur și simplu un rând din fiecare grup. Această caracteristică, împreună cu cuvântul cheie DISTINCT, poate fi utilizată pentru a elimina rândurile duplicate dintr-un set de rezultate.
    Să ne uităm la un exemplu simplu:
    SELECT model, COUNT(model) AS Cantitate_model, AVG(preț) AS Avg_price
    DE LA PC
    GROUP BY model;

    În această solicitare, pentru fiecare model de PC se determină numărul și costul mediu al acestora. Toate rândurile cu aceeași valoare a modelului formează un grup, iar rezultatul SELECT calculează numărul de valori și valorile prețurilor medii pentru fiecare grup. Rezultatul interogării va fi următorul tabel:
    model Cantitate_model Avg_price
    1121 3 850.0
    1232 4 425.0
    1233 3 843.33333333333337
    1260 1 350.0

    Dacă SELECT ar avea o coloană de dată, atunci ar fi posibil să se calculeze acești indicatori pentru fiecare dată specifică. Pentru a face acest lucru, trebuie să adăugați data ca coloană de grupare, iar apoi funcțiile agregate vor fi calculate pentru fiecare combinație de valori (model-data).

    Sunt mai multe specifice reguli pentru îndeplinirea funcţiilor agregate:

    • Dacă în urma cererii nu au primit rânduri(sau mai mult de un rând pentru un anumit grup), atunci nu există date sursă pentru calcularea vreuneia dintre funcțiile agregate. În acest caz, rezultatul funcțiilor COUNT va fi zero, iar rezultatul tuturor celorlalte funcții va fi NULL.
    • Argument functie de agregat nu poate conține în sine funcții agregate(funcție din funcție). Acestea. într-o singură interogare este imposibil, să zicem, să se obțină maximul de valori medii.
    • Rezultatul executării funcției COUNT este întreg(ÎNTREG). Alte funcții agregate moștenesc tipurile de date ale valorilor pe care le procesează.
    • Dacă funcția SUM produce un rezultat care este mai mare decât valoarea maximă a tipului de date utilizat, eroare.

    Deci, dacă cererea nu conține clauze GROUP BY, Acea funcții agregate inclus în clauza SELECT, sunt executate pe toate rândurile de interogare rezultate. Dacă cererea conţine Clauza GROUP BY, fiecare set de rânduri care are aceleași valori ale unei coloane sau ale unui grup de coloane specificate în Clauza GROUP BY, alcătuiește un grup și funcții agregate sunt efectuate pentru fiecare grupă separat.

    AVÂND oferta

    Dacă clauza WHERE definește un predicat pentru filtrarea rândurilor, apoi AVÂND oferta se aplică după grupare pentru a defini un predicat similar care filtrează grupurile după valori funcții agregate. Această clauză este necesară pentru a valida valorile care se obțin folosind functie de agregat nu din rândurile individuale ale sursei de înregistrare definite în clauza FROM, și de la grupuri de astfel de linii. Prin urmare, un astfel de control nu poate fi inclus în clauza WHERE.

    Expresii de tabel sunt numite subinterogări care sunt folosite acolo unde este de așteptat prezența unui tabel. Există două tipuri de expresii de tabel:

      tabele derivate;

      expresii de tabel generalizate.

    Aceste două forme de expresii de tabel sunt discutate în următoarele subsecțiuni.

    Tabele derivate

    Tabel derivat este o expresie de tabel inclusă în clauza FROM a unei interogări. Tabelele derivate pot fi utilizate în cazurile în care utilizarea aliasurilor de coloană nu este posibilă deoarece traducătorul SQL procesează o altă instrucțiune înainte ca aliasul să fie cunoscut. Exemplul de mai jos arată o încercare de a utiliza un alias de coloană într-o situație în care o altă clauză este procesată înainte ca aliasul să fie cunoscut:

    UTILIZAȚI SampleDb; SELECTARE MONTH(EnterDate) ca enter_month FROM Works_on GROUP BY enter_month;

    Încercarea de a rula această interogare va produce următorul mesaj de eroare:

    Mesajul 207, Nivel 16, Stare 1, Rând 5 Nume nevalid de coloană „enter_month”. (Mesajul 207: Nivelul 16, Stare 1, Linia 5 Nume de coloană nevalid enter_month)

    Motivul erorii este că clauza GROUP BY este procesată înainte ca lista corespunzătoare a instrucțiunii SELECT să fie procesată, iar alias-ul coloanei enter_month este necunoscut când grupul este procesat.

    Această problemă poate fi rezolvată folosind un tabel derivat care conține interogarea anterioară (fără clauza GROUP BY) deoarece clauza FROM este executată înaintea clauzei GROUP BY:

    UTILIZAȚI SampleDb; SELECT enter_month FROM (SELECT MONTH(EnterDate) ca enter_month FROM Works_on) AS m GROUP BY enter_month;

    Rezultatul acestei interogări va fi astfel:

    De obicei, o expresie de tabel poate fi plasată oriunde într-o instrucțiune SELECT unde poate apărea un nume de tabel. (Rezultatul unei expresii de tabel este întotdeauna un tabel sau, în cazuri speciale, o expresie.) Exemplul de mai jos arată utilizarea unei expresii de tabel în lista select a unei instrucțiuni SELECT:

    Rezultatul acestei interogări:

    Expresii de tabel generice

    Expresie comună de tabel (OTB) este o expresie de tabel cu nume acceptată de limbajul Transact-SQL. Expresiile comune de tabel sunt utilizate în următoarele două tipuri de interogări:

      nerecursiv;

      recursiv.

    Aceste două tipuri de solicitări sunt discutate în secțiunile următoare.

    OTB și interogări nerecursive

    Forma nerecursivă a OTB poate fi utilizată ca alternativă la tabelele și vizualizările derivate. De obicei, OTB este determinată de CU clauzeși o interogare suplimentară care face referire la numele folosit în clauza WITH. În Transact-SQL, semnificația cuvântului cheie WITH este ambiguă. Pentru a evita ambiguitatea, instrucțiunea care precede instrucțiunea WITH trebuie terminată cu punct și virgulă.

    UTILIZAȚI AdventureWorks2012; SELECTează SalesOrderID FROM Sales.SalesOrderHeader WHERE TotalDue > (SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR(OrderDate) = "2005") AND Freight > (SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader "Order05Due) =(OrderDate05) ")/2,5;

    Interogarea din acest exemplu selectează comenzi ale căror taxe totale (TotalDue) sunt mai mari decât media tuturor taxelor și ale căror taxe de transport (Freight) sunt mai mari de 40% din taxele medii. Proprietatea principală a acestei interogări este lungimea sa, deoarece subinterogarea trebuie scrisă de două ori. Unul dintre moduri posibile a reduce dimensiunea constructului de interogare ar fi să creați o vizualizare care să conțină o subinterogare. Dar această soluție este puțin complicată, deoarece necesită crearea unei vizualizări și apoi ștergerea acesteia după ce interogarea s-a terminat de executat. O abordare mai bună ar fi crearea unui OTB. Exemplul de mai jos arată utilizarea OTB non-recursivă, care scurtează definiția interogării de mai sus:

    UTILIZAȚI AdventureWorks2012; WITH price_calc(year_2005) AS (SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR(OrderDate) = "2005") SELECT SalesOrderID FROM Sales.SalesOrderHeader WHERE TotalDue > (SELECT year_2005 FROM FROM price >_CALC_2_2 CALC) ) /2,5;

    Sintaxa clauzei WITH în interogările nerecursive este următoarea:

    Parametrul cte_name reprezintă numele OTB care definește tabelul rezultat, iar parametrul column_list reprezintă lista de coloane din expresia tabelului. (În exemplul de mai sus, OTB se numește price_calc și are o coloană, year_2005.) Parametrul inner_query reprezintă o instrucțiune SELECT care specifică setul de rezultate al expresiei de tabel corespunzătoare. Expresia de tabel definită poate fi apoi utilizată în interogarea_exterioară. (Interogarea exterioară din exemplul de mai sus utilizează OTB price_calc și coloana sa year_2005 pentru a simplifica interogarea dublu imbricată.)

    OTB și interogări recursive

    Această secțiune prezintă material de complexitate crescută. Prin urmare, atunci când îl citiți pentru prima dată, este recomandat să îl săriți peste el și să reveniți la el mai târziu. OTB-urile pot fi folosite pentru a implementa recursiuni deoarece OTB-urile pot conține referințe la ei înșiși. Sintaxa de bază OTB pentru o interogare recursivă arată astfel:

    Parametrii cte_name și column_list au aceeași semnificație ca în OTB pentru interogările nerecursive. Corpul unei clauze WITH este format din două interogări combinate de către operator UNIREA TOȚI. Prima interogare este apelată o singură dată și începe să acumuleze rezultatul recursiunii. Primul operand al operatorului UNION ALL nu face referire la OTB. Această interogare se numește interogare de referință sau sursă.

    A doua interogare conține o referință la OTB și reprezintă partea sa recursivă. Din această cauză, se numește membru recursiv. În primul apel către partea recursivă, referința OTB reprezintă rezultatul interogării de referință. Membrul recursiv folosește rezultatul primului apel de interogare. După aceasta, sistemul apelează din nou partea recursivă. Un apel către un membru recursiv se oprește atunci când un apel anterior la acesta returnează un set de rezultate gol.

    Operatorul UNION ALL se alătură rândurilor acum acumulate, precum și rândurilor suplimentare adăugate de apelul curent membrului recursiv. (Prezența operatorului UNION ALL înseamnă că rândurile duplicate nu vor fi eliminate din rezultat.)

    În cele din urmă, parametrul outer_query specifică interogarea exterioară pe care OTB o folosește pentru a prelua toate apelurile la unirea ambilor membri.

    Pentru a demonstra forma recursivă a OTB, folosim tabelul Avion definit și populat cu codul prezentat în exemplul de mai jos:

    UTILIZAȚI SampleDb; CREATE TABLE Airplane(ContainingAssembly VARCHAR(10), ContainedAssembly VARCHAR(10), QuantityContained INT, UnitCost DECIMAL(6,2)); INSERT INTO Airplane VALUES ("Avion", "Fuselaj", 1, 10); INSERT INTO Airplane VALUES ("Avion", "Aripi", 1, 11); INSERT INTO Airplane VALUES ("Avion", "Coada", 1, 12); INSERT INTO Airplane VALUES („Fuselaj”, „Salon”, 1, 13); INSERT INTO Airplane VALUES ("Fuselaj", "Cockpit", 1, 14); INSERT INTO Airplane VALUES ("Fuselaj", "Nas", 1, 15); INSERT INTO Airplane VALUES ("Cabină", ​​NULL, 1,13); INSERT INTO Airplane VALUES ("Cockpit", NULL, 1, 14); INSERT INTO Airplane VALUES („Nas”, NULL, 1, 15); INSERT INTO Airplane VALUES ("Aripi", NULL,2, 11); INSERT INTO Airplane VALUES ("Coada", NULL, 1, 12);

    Tabelul Avion are patru coloane. Coloana ContainingAssembly identifică ansamblul, iar coloana ContainingAssembly identifică părțile (una câte una) care alcătuiesc ansamblul corespunzător. Figura de mai jos prezintă o ilustrare grafică a unui posibil tip de aeronavă și a părților sale componente:

    Tabelul Avion este format din următoarele 11 rânduri:

    Următorul exemplu utilizează clauza WITH pentru a defini o interogare care calculează costul total al fiecărei build:

    UTILIZAȚI SampleDb; WITH list_of_parts(assembly1, amount, cost) AS (SELECT ContainingAssembly, QuantityContained, UnitCost FROM Airplane WHERE ContainedAssembly IS NULL UNION ALL SELECT a.ContainingAssembly, a.QuantityContained, CAST(l.cantity * l.cost AS DECIMAL) ) FROM list_of_pieces l, Avion a WHERE l.assembly1 = a.ContainedAssembly) SELECT assembly1 "Piesă", cantitate "Cantitate", cost "Preț" FROM list_of_pieces;

    Clauza WITH definește o listă OTB numită list_of_parts, constând din trei coloane: asamblare1, cantitate și cost. Prima instrucțiune SELECT din exemplu este apelată o singură dată pentru a stoca rezultatele primului pas al procesului recursiv. Instrucțiunea SELECT de pe ultima linie a exemplului afișează următorul rezultat.

    Limbajul SQL este folosit pentru a prelua date din baza de date. SQL este un limbaj de programare care seamănă foarte mult cu engleza, dar este destinat programelor de gestionare a bazelor de date. SQL este folosit în fiecare interogare din Access.

    Înțelegerea modului în care funcționează SQL vă ajută să creați interogări mai precise și ușurează corectarea interogărilor care returnează rezultate incorecte.

    Acesta este un articol dintr-o serie de articole despre limbajul SQL pentru Access. Descrie elementele de bază ale utilizării SQL pentru a prelua date și oferă exemple de sintaxă SQL.

    În acest articol

    Ce este SQL?

    SQL este un limbaj de programare conceput pentru a lucra cu seturi de fapte și relațiile dintre ele. În programele de control baze de date relaționale date, cum ar fi Microsoft Office Access, limbajul SQL este folosit pentru a lucra cu date. Spre deosebire de multe limbaje de programare, SQL este ușor de citit și de înțeles chiar și pentru începători. Ca multe limbaje de programare, SQL este standard international, recunoscut de comitetele de standardizare precum ISO și ANSI.

    Seturile de date sunt descrise în SQL pentru a ajuta la răspunsul la întrebări. Când utilizați SQL, trebuie să utilizați sintaxa corectă. Sintaxa este un set de reguli care permit combinarea corectă a elementelor unei limbi. Sintaxa SQL se bazează pe sintaxa limbii engleze și împărtășește multe elemente cu sintaxa Limbajul vizual De bază pentru aplicații (VBA).

    De exemplu, simplu Declarație SQL, care preia o listă de nume de familie ale persoanelor de contact numite Mary, ar putea arăta astfel:

    SELECTAȚI Nume
    DIN Contacte
    WHERE Prenume = „Maria”;

    Notă: Limbajul SQL este folosit nu numai pentru a efectua operații asupra datelor, ci și pentru a crea și modifica structura obiectelor bazei de date, cum ar fi tabelele. Partea din SQL care este utilizată pentru a crea și modifica obiectele bazei de date se numește DDL. DDL nu este acoperit în acest articol. Pentru mai multe informații, consultați Crearea sau modificarea tabelelor sau a indecșilor folosind o interogare de definire a datelor.

    Instrucțiuni SELECT

    Instrucțiunea SELECT este folosită pentru a descrie un set de date în SQL. Conține o descriere completă a setului de date care trebuie preluat din baza de date, inclusiv următoarele:

      tabele care conțin date;

      conexiuni între datele de la surse diferite;

      câmpuri sau calcule pe baza cărora sunt selectate datele;

      condiții de selecție care trebuie îndeplinite de datele incluse în rezultatul interogării;

      necesitatea si metoda de sortare.

    Instrucțiuni SQL

    O instrucțiune SQL este alcătuită din mai multe părți numite clauze. Fiecare clauză dintr-o instrucțiune SQL are un scop. Sunt necesare unele oferte. Tabelul de mai jos prezintă instrucțiunile SQL cele mai frecvent utilizate.

    Declarație SQL

    Descriere

    Obligatoriu

    Definește câmpurile care conțin datele necesare.

    Definește tabele care conțin câmpurile specificate în clauza SELECT.

    Definește condițiile de selecție a câmpului pe care trebuie să le îndeplinească toate înregistrările incluse în rezultate.

    Determină ordinea de sortare a rezultatelor.

    Într-o instrucțiune SQL care conține funcții de agregare, specifică câmpurile pentru care nu este calculată o valoare rezumativă în clauza SELECT.

    Doar dacă astfel de câmpuri sunt prezente

    O instrucțiune SQL care conține funcții de agregare definește condițiile care se aplică câmpurilor pentru care se calculează o valoare rezumativă în clauza SELECT.

    termeni SQL

    Fiecare propoziție SQL constă din termeni care pot fi comparați cu părți de vorbire. Tabelul de mai jos prezintă tipurile de termeni SQL.

    Termenul SQL

    Parte comparabilă de vorbire

    Definiție

    Exemplu

    identificator

    substantiv

    Un nume folosit pentru a identifica un obiect de bază de date, cum ar fi un nume de câmp.

    Clienți.[Număr de telefon]

    operator

    verb sau adverb

    Un cuvânt cheie care reprezintă sau modifică o acțiune.

    constant

    substantiv

    O valoare care nu se modifică, cum ar fi un număr sau NULL.

    expresie

    adjectiv

    O combinație de identificatori, operatori, constante și funcții concepute pentru a calcula o singură valoare.

    >= Produse.[Preț]

    Clauze SQL de bază: SELECT, FROM și WHERE

    Formatul general al instrucțiunilor SQL este:

    SELECTează câmpul_1
    DIN tabelul_1
    UNDE criteriul_1
    ;

    Note:

      Accesul nu respectă întreruperile de linie în instrucțiunile SQL. În ciuda acestui fapt, este recomandat să începeți fiecare propoziție cu linie nouă astfel încât instrucțiunea SQL să fie ușor de citit atât pentru persoana care a scris-o, cât și pentru toți ceilalți.

      Fiecare instrucțiune SELECT se termină cu punct și virgulă (;). Un punct și virgulă poate apărea fie la sfârșitul ultimei propoziții, fie la linie separată la sfârșitul instrucțiunii SQL.

    Exemplu în Access

    Exemplul de mai jos arată cum ar putea arăta o instrucțiune SQL în Access pentru simpla cerere pe probă.

    1. Clauza SELECT

    2. clauza FROM

    3. clauza WHERE

    Să ne uităm la exemplul propoziție cu propoziție pentru a înțelege cum funcționează sintaxa SQL.

    clauza SELECT

    SELECT,Companie

    Aceasta este o clauză SELECT. Conține o instrucțiune (SELECT) urmată de doi identificatori ("[Adresa E-mail]” și „Companie”).

    Dacă identificatorul conține spații sau semne speciale(de exemplu, „Adresă de e-mail”), trebuie să fie cuprinsă între paranteze dreptunghiulare.

    Clauza SELECT nu necesită să specificați tabelele care conțin câmpurile și nu puteți specifica condiții de selecție care trebuie îndeplinite de datele incluse în rezultate.

    Într-o instrucțiune SELECT, clauza SELECT vine întotdeauna înaintea clauzei FROM.

    clauza FROM

    DIN Contacte

    Aceasta este o clauză FROM. Conține o instrucțiune (FROM) urmată de un identificator (Contacte).

    Clauza FROM nu specifică câmpurile de selectat.

    clauza WHERE

    WHERE City="Seattle"

    Aceasta este clauza WHERE. Conține o declarație (UNDE) urmată de expresia (Oraș="Rostov").

    Există multe lucruri pe care le puteți face cu clauzele SELECT, FROM și WHERE. Pentru mai multe informații despre utilizarea acestor oferte, consultați următoarele articole:

    Sortarea rezultatelor: ORDER BY

    Ca în Microsoft Excel, în Access puteți sorta rezultatele unei interogări într-un tabel. Folosind clauza ORDER BY, puteți specifica și modul în care sunt sortate rezultatele atunci când interogarea este executată. Dacă se folosește o clauză ORDER BY, aceasta trebuie să apară la sfârșitul instrucțiunii SQL.

    Clauza ORDER BY conține o listă de câmpuri de sortat, în aceeași ordine în care va fi aplicată sortarea.

    De exemplu, să presupunem că doriți mai întâi să sortați rezultatele după câmpul Companie în ordine descrescătoare și apoi, dacă există înregistrări cu aceeași valoare a câmpului Companie, sortați-le după câmpul Adresă de e-mail în ordine crescătoare. Clauza ORDER BY ar arăta astfel:

    COMANDA DE COMPANIA DESC,

    Notă:În mod implicit, Access sortează valorile în ordine crescătoare (de la A la Z, de la cel mai mic la cel mai mare). Pentru a sorta valorile în ordine descrescătoare, trebuie să specificați cuvânt cheie DESC.

    Pentru mai multe informații despre clauza ORDER BY, consultați clauza ORDER BY.

    Lucrul cu date rezumative: clauze GROUP BY și HAVING

    Uneori este nevoie să lucrați cu date rezumative, cum ar fi vânzările totale pentru luna sau cele mai scumpe articole din stoc. Pentru a face acest lucru, în clauza SELECT, aplicați câmpului functie de agregat. De exemplu, dacă ar trebui să rulați o interogare pentru a obține numărul de adrese de e-mail pentru fiecare companie, clauza SELECT ar putea arăta astfel:

    Capacitatea de a utiliza o anumită funcție de agregare depinde de tipul de date din câmp și de expresia dorită. Pentru mai multe informații despre funcțiile agregate disponibile, consultați Funcții statistice SQL.

    Specificarea câmpurilor care nu sunt utilizate într-o funcție de agregare: clauza GROUP BY

    Când utilizați funcții de agregare, de obicei trebuie să creați o clauză GROUP BY. Clauza GROUP BY specifică toate câmpurile cărora nu se aplică funcția de agregare. Dacă funcțiile de agregare se aplică tuturor câmpurilor din interogare, nu trebuie să creați o clauză GROUP BY.

    Clauza GROUP BY trebuie să urmeze imediat clauza WHERE sau FROM dacă nu există nicio clauză WHERE. Clauza GROUP BY listează câmpurile în aceeași ordine ca și clauza SELECT.

    Să continuăm exemplul anterior. În clauza SELECT, dacă funcția de agregare se aplică numai câmpului [Adresă de e-mail], atunci clauza GROUP BY ar arăta astfel:

    GRUP DE COMPANIE

    Pentru mai multe informații despre clauza GROUP BY, consultați articolul despre clauza GROUP BY.

    Restricționarea valorilor agregate folosind condiții de grupare: clauza HAVING

    Dacă trebuie să specificați condiții pentru a limita rezultatele, dar câmpul în care doriți să le aplicați este utilizat într-o funcție de agregare, nu puteți utiliza o clauză WHERE. Ar trebui folosită în schimb clauza HAVING. Clauza HAVING funcționează la fel ca și clauza WHERE, dar este folosită pentru datele agregate.

    De exemplu, să presupunem că funcția AVG (care calculează media) este aplicată primului câmp din clauza SELECT:

    SELECT COUNT(), Companie

    Dacă doriți să limitați rezultatele interogării pe baza valorii funcției COUNT, nu puteți aplica o condiție de selecție acestui câmp în clauza WHERE. În schimb, condiția ar trebui plasată în clauza HAVING. De exemplu, dacă doriți ca interogarea dvs. să returneze rânduri numai dacă o companie are mai multe adrese de e-mail, puteți utiliza următoarea clauză HAVING:

    AVÂND COUNT()>1

    Notă: O interogare poate include atât o clauză WHERE, cât și o clauză HAVING, cu condiții de selecție pentru câmpurile care nu sunt utilizate în functii statistice, sunt specificate în clauza WHERE, iar condițiile pentru câmpurile care sunt utilizate în funcțiile statistice sunt specificate în clauza HAVING.

    Pentru mai multe informații despre clauza HAVING, consultați articolul despre clauza HAVING.

    Combinarea rezultatelor interogării: operator UNION

    Operatorul UNION este folosit pentru a vizualiza simultan toate datele returnate de mai multe interogări de selecție similare ca un set combinat.

    Operatorul UNION vă permite să combinați două instrucțiuni SELECT într-una singură. Instrucțiunile SELECT care trebuie îmbinate trebuie să aibă acelasi numarși ordinea câmpurilor de ieșire cu aceleași tipuri de date sau compatibile. Când se execută o interogare, datele din fiecare set de câmpuri de potrivire sunt combinate într-un singur câmp de ieșire, astfel încât rezultatul interogării are tot atâtea câmpuri câte fiecare instrucțiune SELECT individuală.

    Notă:În interogările de conectare, tipurile de date numerice și text sunt compatibile.

    Folosind operatorul UNION, puteți specifica dacă rândurile duplicate, dacă există, trebuie incluse în rezultatele interogării. Pentru a face acest lucru, utilizați cuvântul cheie ALL.

    O interogare pentru a combina două instrucțiuni SELECT are următoarea sintaxă de bază:

    SELECTează câmpul_1
    DIN tabelul_1
    UNIUNE
    SELECTează câmpul_a
    DIN tabel_a
    ;

    De exemplu, să presupunem că aveți două tabele numite „Produse” și „Servicii”. Ambele tabele conțin câmpuri cu numele produsului sau serviciului, informații despre preț și garanție, precum și un câmp care indică exclusivitatea produsului sau serviciului oferit. Deși tabelele „Produse” și „Servicii” oferă tipuri diferite garanții, informațiile de bază sunt aceleași (fie că anumite produse sau servicii sunt furnizate cu o garanție de calitate). Puteți utiliza următoarea interogare de alăturare pentru a uni patru câmpuri din două tabele:

    SELECTAȚI numele, prețul, warranty_available, exclusive_offer
    DIN Produse
    UNIREA TOȚI
    SELECTAȚI numele, prețul, garanția_disponibilă, oferta_exclusivă
    DE LA Servicii
    ;

    Pentru mai multe informații despre combinarea instrucțiunilor SELECT folosind operatorul UNION, consultați