Crearea de interogări în sql server. Interogări în Access

Interogările din Access sunt instrumentul principal pentru selectarea, actualizarea și procesarea datelor în tabelele bazei de date. Access, în conformitate cu conceptul de baze de date relaționale, utilizează Structured Query Language (SQL) pentru a executa interogări. Cu ajutorul instrucțiunilor SQL, orice interogare în Access este implementată.

Principalul tip de cerere este o cerere selectă. Rezultatul acestei interogări este un tabel nou care există până când interogarea este închisă. Înregistrările se formează prin unirea înregistrărilor tabelelor pe care este construită interogarea. Metoda de combinare a înregistrărilor de tabel este specificată la definirea relației lor în schema de date sau la crearea unei interogări. Condițiile de selecție formulate în interogare vă permit să filtrați înregistrările care alcătuiesc rezultatul îmbinării tabelelor.

În Access pot fi create mai multe tipuri de interogări:

  • cerere de mostra- selectează date dintr-un tabel sau interogare sau mai multe tabele conexe și alte interogări. Rezultatul este un tabel care există până când interogarea este închisă. Formarea înregistrărilor tabelului de rezultate se realizează în conformitate cu condițiile de selecție specificate și atunci când se utilizează mai multe tabele prin combinarea înregistrărilor acestora;
  • interogare pentru a crea un tabel- selectează datele din tabelele aferente și din alte interogări, dar, spre deosebire de o interogare select, salvează rezultatul într-un nou tabel permanent;
  • solicitări de actualizare, adăugare, ștergere- sunt cereri de acțiune, în urma cărora datele din tabele sunt modificate.

Interogările din Access în modul proiectare conțin o schemă de date care afișează tabelele utilizate și un formular de interogare în care sunt construite structura tabelului de interogare și condițiile de selectare a înregistrărilor (Fig. 4.1).

Folosind o interogare, puteți efectua următoarele tipuri de prelucrare a datelor:

  • includeți câmpuri de tabel selectate de utilizator în tabelul de interogări;
  • efectuați calcule în fiecare dintre înregistrările primite;
  • selectați înregistrările care îndeplinesc criteriile de selecție;
  • formați un nou tabel virtual bazat pe unirea înregistrărilor tabelelor aferente;
  • înregistrările grupului care au aceleași valori în unul sau mai multe câmpuri, îndeplinesc simultan funcții statistice pe alte câmpuri ale grupului și includ în rezultat câte o înregistrare pentru fiecare grup;
  • creați un nou tabel de bază de date folosind date din tabelele existente;
  • actualizați câmpurile din subsetul de înregistrări selectat;
  • eliminați subsetul selectat de înregistrări din tabelul bazei de date;
  • adăugați subsetul selectat de înregistrări la un alt tabel.

Interogările din Access servesc ca surse de înregistrare pentru alte interogări, formulare, rapoarte. Folosind o interogare, puteți colecta informații complete pentru a forma un anumit document de domeniu din mai multe tabele, apoi le puteți utiliza pentru a crea un formular - o reprezentare electronică a acestui document. Dacă un formular sau un raport este creat de către vrăjitor pe baza mai multor tabele interconectate, atunci o interogare este generată automat pentru acestea ca sursă de înregistrare.
Pentru remediere, urmăriți tutorialul video.

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

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

SELECT ID, country_title, count_people FROM table_name

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

SELECTAȚI * FROM table_name

* denotă toate câmpurile. Adică vor fi afișaje TOT câmpuri de date.

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

SELECTAȚI DISTINCT country_title FROM table_name

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

Interogare SQL: afișarea înregistrărilor dintr-un tabel conform 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ă. A la început, Z la sfârșit.

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) e 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: afișarea 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 în funcție de o condiție dată folosind operatori logici.

Interogare SQL: construcție ȘI (ȘI)

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

Obținerea unei liste de înregistrări: orașe din Rusia ȘI au acces la petrol. Când se folosește operatorul? ȘI, atunci ambele condiții trebuie să se potrivească.

Interogare SQL: construcție SAU (OR)

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

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

Interogare SQL: AND NOT construit (ȘI NU)

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

Obțineți o listă de înregistrări: toți utilizatorii din Rusia ȘI făcut 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: construcție NOT IN (NU IN)

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 un subiect 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ă (NU ZERO).

Interogare SQL: construct LIKE

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

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 scăparea „Ivan\%”.

Interogare SQL: BETWEEN construct

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ă FOARTE mulți operatori logici, așa că studiați documentația serverului SQL în detaliu.

Interogări SQL complexe

Interogare SQL: uniți mai multe 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: calculul valorilor câmpului MAX, MIN, SUM, AVG, COUNT

Ieșirea unuia, valoarea maximă a contorului din tabel:

SELECTAȚI MAX(contorul) FROM table_name

Ieșirea unuia, valoarea minimă a contorului 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

Concluzia numărului de contoare din magazinul nr. 1, în tabel:

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

Acestea sunt cele mai populare comenzi. Se recomandă, acolo unde este posibil, utilizarea interogărilor SQL de acest fel pentru calcul, deoarece niciun mediu de programare nu poate fi comparat în 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(country_area) FROM country GROUP BY continent

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

Interogare SQL: utilizarea mai multor tabele prin alias (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 cumpărători 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ă MySQL a introdus 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 comenzi 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 blocajele din serverele SQL. Împreună cu flexibilitatea și puterea lor, ele măresc semnificativ încărcarea serverului. Ceea ce duce la o încetinire catastrofală pentru alți utilizatori. Există cazuri foarte frecvente de apeluri recursive cu interogări imbricate. 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 față de acest tip de solicitări, acestea reprezintă un accent sporit al breșelor 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 copiile bazei de date (baze de date de testare).

Interogările SQL modifică datele

Interogare SQL: INSERT

Instruire INTRODUCE vă permit să introduceți înregistrări în tabel. Cu cuvinte simple, creați o linie cu date într-un tabel.

Opțiunea numărul 1. Instrucțiuni folosite des:

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

In masa " table_name» va introduce 2 (doi) utilizatori simultan.

Opțiunea numărul 2. Este mai convenabil să folosești 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 sunt puțin mai lente decât o interogare SQL mare, dar alte interogări vor fi puse în coadă pentru service. Adică, dacă o interogare SQL mare rulează timp de 30 de minute, atunci în tot acest timp restul interogărilor vor fuma bambus și vor aștepta rândul lor.
  • Solicitarea este 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 puteți urmări structura, ci puteți adăuga doar datele necesare.
  • Atunci 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ă (consola), astfel încât să nu restabiliți întreaga ARHIVĂ.
  • Stilul de scriere este similar cu declarația UPDATE, care este 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

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

  1. Se recomandă ca toate numele câmpurilor să fie scrise cu litere mici și, dacă este necesar, separate printr-un spațiu forțat „_” pentru compatibilitate cu diferite limbaje de programare precum Delphi, Perl, Python și Ruby.
  2. Comenzile SQL sunt scrise cu majuscule pentru a fi lizibile. Amintește-ți întotdeauna că alte persoane pot citi codul după tine, dar cel mai probabil tu însuți 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 de rezervă î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 primară de interogări SQL ale unei anumite baze de date.

Fiecare dintre noi întâlnește și folosește în mod regulat diverse baze de date. Când selectăm o adresă de e-mail, lucrăm cu o bază de date. Bazele de date folosesc servicii de căutare, bănci pentru a stoca datele clienților și așa mai departe.

Dar, în ciuda utilizării constante a bazelor de date, chiar și pentru mulți dezvoltatori de sisteme software există multe „puncte albe” din cauza interpretărilor diferite ale acelorași termeni. Vom oferi o scurtă definiție a termenilor de bază ale bazei de date înainte de a ne uita la limbajul SQL. Asa de.

Bază de date - un fișier sau un set de fișiere pentru stocarea structurilor ordonate de date și a relațiilor lor. Foarte des, o bază de date se numește sistem de management - este doar un depozit de informații într-un anumit format și poate funcționa cu diverse DBMS.

masa - Să ne imaginăm un folder care stochează documente grupate după un anumit atribut, de exemplu, o listă de comenzi pentru ultima lună. Acesta este tabelul din computer. Un tabel separat are propriul nume unic.

Tip de date - tipul de informații care pot fi stocate într-o anumită coloană sau rând. Pot fi numere sau text de un anumit format.

Coloană și rând- toți am lucrat cu foi de calcul care au și rânduri și coloane. Orice bază de date relațională funcționează cu tabele în același mod. Rândurile sunt uneori numite înregistrări.

cheia principala- fiecare rând de tabel poate avea una sau mai multe coloane pentru a-l identifica în mod unic. Fără o cheie primară, este foarte dificil să actualizați, să modificați și să ștergeți rândurile dorite.

Ce este SQL?

SQL(Engleză - limbaj de interogare structurat) a fost dezvoltat doar pentru lucrul cu baze de date și este în prezent standardul pentru toate DBMS populare. Sintaxa limbajului constă dintr-un număr mic de operatori și este ușor de învățat. Dar, în ciuda simplității externe, permite crearea de interogări sql pentru operațiuni complexe cu o bază de date de orice dimensiune.

Din 1992 a existat un standard general acceptat numit ANSI SQL. Definește sintaxa și funcțiile de bază ale operatorilor și este susținut de toți liderii de piață DBMS, cum ar fi ORACLE. Este imposibil să acoperim toate posibilitățile limbajului într-un articol mic, așa că vom lua în considerare pe scurt doar interogările SQL de bază. Exemplele arată clar simplitatea și posibilitățile limbajului:

  • crearea de baze de date și tabele;
  • eșantionarea datelor;
  • adăugarea înregistrărilor;
  • modificarea și ștergerea informațiilor.

Tipuri de date SQL

Toate coloanele dintr-un tabel de bază de date stochează același tip de date. Tipurile de date în SQL sunt aceleași ca în alte limbaje de programare.

Crearea de tabele și baze de date

Există două moduri de a crea baze de date noi, tabele și alte interogări în SQL:

  • prin consola DBMS
  • Utilizarea instrumentelor de administrare interactive incluse cu serverul de baze de date.

O nouă bază de date este creată de către operator CREAȚI BAZĂ DE DATE<наименование базы данных>; . După cum puteți vedea, sintaxa este simplă și concisă.

Creăm tabele în interiorul bazei de date folosind instrucțiunea CREATE TABLE cu următorii parametri:

  • numele tabelului
  • numele coloanelor și tipurile de date

De exemplu, să creăm un tabel de mărfuri cu următoarele coloane:

Cream un tabel:

CREATE TABLE Marfa

(commodity_id CHAR(15) NOT NULL,

vendor_id CHAR(15) NOT NULL,

nume_marfă CHAR(254) NULL,

preț_marfă DECIMAL(8,2) NULL,

commodity_desc VARCHAR(1000) NULL);

Tabelul are cinci coloane. După numele vine tipul de date, coloanele sunt separate prin virgule. Valoarea unei coloane poate fi goală (NULL) sau trebuie completată (NOT NULL), iar aceasta este determinată în momentul creării tabelului.

Selectarea datelor dintr-un tabel

Operatorul de selecție a datelor este cea mai frecvent utilizată interogare SQL. Pentru a obține informații, trebuie să specificați ce vrem să alegem dintr-un astfel de tabel. Mai întâi un exemplu simplu:

SELECTAȚI nume_marfă FROM Mărfuri

După instrucțiunea SELECT, specificăm numele coloanei pentru obținerea informațiilor, iar FROM definește tabelul.

Rezultatul executării interogării va fi toate rândurile de tabel cu valori Commodity_name în ordinea în care au fost introduse în baza de date, adică. fără nicio sortare. O clauză ORDER BY suplimentară este folosită pentru a ordona rezultatul.

Pentru a interoga pe mai multe câmpuri, enumerați-le separate prin virgule, ca în exemplul următor:

SELECTAȚI ID-ul mărfii, numele_marfei, prețul_marfei FROM Mărfuri

Este posibil să obțineți valoarea tuturor coloanelor dintr-un rând ca rezultat al interogării. Pentru aceasta se folosește semnul „*”:

SELECTAȚI * DIN MARFĂ

  • În plus, SELECT acceptă:
  • Sortarea datelor (instrucțiunea ORDER BY)
  • Selectați în funcție de condiții (UNDE)
  • Termen de grupare (GROUP BY)

Adăugarea unei linii

Pentru a adăuga un rând la un tabel, sunt folosite interogări SQL cu instrucțiunea INSERT. Adăugarea se poate face în trei moduri:

  • adăugați o nouă linie întreagă;
  • parte dintr-un șir;
  • rezultatele interogării.

Pentru a adăuga un rând complet, trebuie să specificați numele tabelului și valorile coloanelor (câmpurilor) noului rând. Iată un exemplu:

INSERT INTO Commodity VALUES ("106", "50", "Coca-Cola", "1,68", "Fără alcool ,)

Exemplul adaugă un produs nou la tabel. Valorile sunt specificate după VALORI pentru fiecare coloană. Dacă nu există o valoare corespunzătoare pentru coloană, atunci trebuie specificat NULL. Coloanele sunt populate cu valori în ordinea specificată la crearea tabelului.

Dacă adăugați doar o parte dintr-un rând, trebuie să specificați în mod explicit numele coloanelor, ca în exemplu:

INSERT INTO Commodity (commodity_id, vendor_id, commodity_name)

VALUES ("106 ", '50", "Coca Cola",)

Am introdus doar identificatorii produsului, furnizorul și numele acestuia, iar restul câmpurilor am lăsat goale.

Adăugarea rezultatelor interogării

INSERT este folosit în primul rând pentru a adăuga rânduri, dar poate fi folosit și pentru a adăuga rezultatele unei instrucțiuni SELECT.

Schimbați datele

Pentru a modifica informațiile din câmpurile unui tabel de bază de date, trebuie să utilizați instrucțiunea UPDATE. Operatorul poate fi utilizat în două moduri:

  • Toate rândurile din tabel sunt actualizate.
  • Doar pentru o anumită linie.

UPDATE constă din trei elemente principale:

  • tabelul în care este necesar să se facă modificări;
  • numele câmpurilor și noile lor valori;
  • condițiile de selectare a rândurilor de schimbat.

Luați în considerare un exemplu. Să presupunem că prețul unui produs cu ID=106 s-a modificat, așa că acest rând trebuie actualizat. Scriem următorul operator:

UPDATE Mărfuri SET pretul_marfă = "3.2" WHERE id_marfă = "106"

Am specificat denumirea tabelului, în cazul nostru Marfă, unde se va efectua actualizarea, apoi după SET - noua valoare a coloanei și am găsit înregistrarea dorită prin specificarea valorii ID dorite în WHERE.

Pentru a modifica mai multe coloane, specificați mai multe perechi coloană-valoare separate prin virgule după instrucțiunea SET. Să ne uităm la un exemplu în care numele și prețul produsului sunt actualizate:

UPDATE Commodity SET commodity_name='Fanta', commodity_price = "3.2" WHERE commodity_id = "106"

Pentru a șterge informații dintr-o coloană, o puteți seta la NULL dacă structura tabelului o permite. Trebuie amintit că NULL este exact „nicio” valoare și nu zero sub formă de text sau număr. Eliminați descrierea produsului:

UPDATE Commodity SET commodity_desc = NULL WHERE commodity_id = "106"

Eliminarea rândurilor

Interogările SQL pentru ștergerea rândurilor dintr-un tabel sunt executate cu instrucțiunea DELETE. Există două cazuri de utilizare:

  • anumite rânduri din tabel sunt șterse;
  • toate rândurile din tabel sunt șterse.

Un exemplu de ștergere a unui rând dintr-un tabel:

DELETE FROM Commodity WHERE commodity_id = „106”

Dupa DELETE FROM specificam numele tabelului in care se vor sterge randurile. Clauza WHERE conține o condiție prin care rândurile vor fi selectate pentru ștergere. În exemplu, ștergem linia de produse cu ID=106. Specificarea UNDE este foarte importantă. omiterea acestei declarații va șterge toate rândurile din tabel. Acest lucru este valabil și pentru modificarea valorii câmpurilor.

Instrucțiunea DELETE nu specifică numele coloanelor sau metacaracterele. Îndepărtează complet rândurile, dar nu poate elimina o singură coloană.

Utilizarea SQL în Microsoft Access

Folosit de obicei interactiv pentru a crea tabele, baze de date, pentru a gestiona, modifica, analiza date din baza de date și pentru a implementa interogări SQL Access printr-un designer de interogări interactiv convenabil (Query Designer), cu ajutorul căruia puteți construi și executa imediat instrucțiuni SQL de orice complexitate.

Este acceptat și modul de acces la server, în care Access DBMS poate fi folosit ca generator de interogări SQL către orice sursă de date ODBC. Această capacitate permite aplicațiilor Access să interacționeze cu orice format.

Extensii SQL

Deoarece interogările SQL nu au toate caracteristicile limbajelor de programare procedurală, cum ar fi bucle, ramuri etc., furnizorii de SGBD dezvoltă propria versiune de SQL cu caracteristici avansate. În primul rând, acesta este suport pentru procedurile stocate și operatorii standard ai limbajelor procedurale.

Cele mai comune dialecte ale limbii:

  • Baza de date Oracle - PL/SQL
  • Interbase, Firebird - PSQL
  • Microsoft SQL Server - Transact-SQL
  • PostgreSQL - PL/pgSQL.

SQL pe web

SGBD-ul MySQL este distribuit sub licența publică generală GNU. Există o licență comercială cu capacitatea de a dezvolta module personalizate. Ca parte integrantă, este inclus în cele mai populare ansambluri de servere de Internet, precum XAMPP, WAMP și LAMP, și este cel mai popular DBMS pentru dezvoltarea aplicațiilor pe Internet.

A fost dezvoltat de Sun Microsystems și este întreținut în prezent de Oracle Corporation. Suportă baze de date de până la 64 de terabytes, standard de sintaxă SQL:2003, replicare a bazelor de date și servicii cloud.

Expresii de tabel numite subinterogări, care sunt folosite acolo unde se așteaptă un 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 atunci când nu este posibilă utilizarea aliasurilor de coloană 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 executa această interogare va returna următorul mesaj de eroare:

Mesajul 207, Nivel 16, Stare 1, Rând 5 Nume de coloană invalid „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 nu este cunoscut când grupul este procesat.

Această problemă poate fi rezolvată folosind o vizualizare 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) as 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 ar putea apărea numele tabelului. (Rezultatul unei expresii de tabel este întotdeauna un tabel sau, în cazuri speciale, o expresie.) Următorul exemplu arată utilizarea unei expresii de tabel în lista select a unei instrucțiuni SELECT:

Rezultatul acestei interogări este:

Expresii de tabel generice

Expresie comună de tabel (OTB) (CTE pe scurt) 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 definit de CU clauzeși o interogare suplimentară care se referă 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 "Order05YEAR" =(OrderDate05) ")/2,5;

Interogarea din acest exemplu selectează comenzi ale căror taxe totale (TotalDue) sunt mai mari decât media tuturor taxelor și al căror transport este mai mare de 40% din taxele medii. Proprietatea principală a acestei interogări este volumul său, deoarece interogarea imbricată trebuie scrisă de două ori. O modalitate posibilă de a reduce domeniul de aplicare al constructului de interogare ar fi crearea unei vizualizări care conține o subinterogare. Dar această soluție este puțin complicată, deoarece necesită crearea vizualizării și apoi ștearsă după terminarea interogării. Cea mai bună abordare 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 price >_calc)_2 FROM price) (SELECT) /2,5;

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

Parametrul cte_name este numele OTB care definește tabelul rezultat, iar parametrul column_list este lista de coloane din expresia tabelului. (În exemplul de mai sus, OTB este numit 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 recursive 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 clauzei WITH este format din două interogări unite prin instrucțiune UNIREA TOȚI. Prima interogare este apelată o singură dată și începe să acumuleze rezultatul recursiunii. Primul operand al operatorului UNION ALL nu se referă la un OTB. Această interogare se numește interogare de referință sau sursă.

A doua interogare conține un link către 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 la interogare. După aceea, sistemul apelează din nou partea recursivă. Un apel către un membru recursiv se termină atunci când un apel anterior la acesta returnează un set de rezultate gol.

Operatorul UNION ALL se alătură rândurilor acumulate până acum, 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 definește interogarea exterioară pe care OTB o folosește pentru a obține toate apelurile către uniunea ambilor membri.

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

UTILIZAȚI SampleDb; CREATE TABLE Avion (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(„Salon”, NULL, 1,13); INSERT INTO Airplane VALUES(„cabină”, 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 definește ansamblul, iar coloana ContainedAssembly definește 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 constitutive:

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 "Parte", cantitatea "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.

Ultima actualizare: 07/05/2017

În ultimul subiect, în SQL Management Studio a fost creată o bază de date simplă cu un singur tabel. Acum să definim și să executăm prima interogare SQL. Pentru a face acest lucru, deschideți SQL Management Studio, faceți clic dreapta pe elementul de nivel superior din Object Explorer (numele serverului) și selectați New Query din meniul contextual care apare:

După aceea, în partea centrală a programului se va deschide o fereastră pentru introducerea comenzilor SQL.

Să executăm o interogare pe tabelul care a fost creat în subiectul anterior, în special, vom obține toate datele din acesta. Baza noastră de date se numește universitate, iar tabelul este dbo.Students, așa că pentru a obține date din tabel, vom introduce următoarea interogare:

SELECT * FROM university.dbo.Students

Instrucțiunea SELECT vă permite să selectați date. FROM specifică sursa de unde se obțin datele. De fapt, cu această interogare spunem „SELECT all FROM table university.dbo.Students”. Este de remarcat faptul că calea completă a tabelului este utilizată pentru numele tabelului, indicând baza de date și schema.

După ce ați introdus interogarea, faceți clic pe butonul Execute din bara de instrumente sau puteți apăsa tasta F5.

Ca urmare a executării interogării, în partea de jos a programului va apărea un mic tabel, care va afișa rezultatele interogării - adică toate datele din tabelul Studenți.

Dacă trebuie să facem mai multe interogări asupra aceleiași baze de date, atunci putem folosi comanda USE pentru a confirma baza de date. În acest caz, atunci când interogați tabele, este suficient să specificați numele acestora fără numele și schema bazei de date:

USE university SELECT * FROM studenți

În acest caz, executăm interogarea ca un întreg pentru server, putem accesa orice bază de date de pe server. Dar putem executa interogări doar într-o anumită bază de date. Pentru a face acest lucru, faceți clic dreapta pe baza de date dorită și selectați Interogare nouă din meniul contextual:

Dacă în acest caz dorim să interogăm tabelul Studenți folosit mai sus, atunci nu ar trebui să specificăm numele și schema bazei de date în interogare, deoarece aceste valori ar fi deja clare.