8.2 Standarde și structuri lingvistice, obiecte baze de date stocate
Limba SQL este relativ completă. Se bazează pe calculul relațional pe tupluri, însă conține operații de algebră relativă peste seturi. Operațiunea este cel mai des utilizată
- INTERSECT - intersecție;
- MINUS este diferența.
8.2.1 Standardele SQL
Standardul de limbă SQL1, adoptat de ANSI în 1986, descria doar întrebări. Cu aceasta puteți lucra în WinRDBI. În prezent, SQL1 nu este utilizat.
Sistemele DBMS industriale se bazează pe următoarele versiuni:
Vom fi ghidați de versiunea SQL2, dar luăm în considerare mai multe extensii de limbă dincolo de această versiune. Evident, studierea bazelor oficiale ale limbajului este importantă, dar nu este suficient să se obțină doar o bază de artizanat - "o faceți o dată, faceți două". Este important să înțelegeți de ce limbajul este astfel aranjat. Înțelegând structura internă a obiectului sau esența fenomenului, veți fi mereu gata să îi percepeți schimbările.
Există trei niveluri de SQL-direct, încorporate și dinamice. Primul nivel oferă interacțiunea directă a utilizatorului cu DBMS. Built-in SQL definește construcțiile sale, încorporate în alte limbi. În COS, textul SQL încorporat este plasat în interiorul parantezelor sql (text_SQL). Vezi secțiunea 8.9 pentru detalii. În cele din urmă, SQL dinamic vă permite să creați constructe SQL directe "în mișcare" și să le executați.
Să ne amintim în ce fel ați făcut eu și cu mine. În primul rând, știm deja că limbajul de interogare este construit pe baza algebrei relaționale, iar alte limbi de interogare pot fi completate relațional numai dacă permit aplicarea unor echivalente ale acelor interogări create pe baza algebrei relaționale.
Am spus deja că una dintre principalele diferențe dintre limbi bazate pe calcul și limbi care utilizează algebra relațională este gradul de proceduralitate. Limba algebrei relaționale este complet procedurală, adică prescrie cum și ce se face pentru a obține răspunsul literal în pași. Limbile bazate pe calcul sunt slab procedural. Interogarea scrisă în aceste limbi definește proprietățile pe care trebuie să le aibă datele primite ca urmare a interogării, dar nu este specificată modul de executare a interogării.
Problema este că în diferite implementări ale SGBD, modalitățile de realizare a rezultatelor pot fi complet diferite. Prin urmare, atunci când ați scris o interogare care vă oferă posibilitatea de a obține datele de care aveți nevoie, tot trebuie să vă gândiți dacă funcționează bine în baza de date selectată. În limba comună, ei spun că dvs. (sau DBMS) trebuie să alegeți planul de execuție optim. Și, desigur, crearea de interogări cu planuri de execuție optime este un alt nivel de cunoaștere a programării, mai profund decât abilitatea de a scrie o interogare.
Și totuși, știm deja că, de fapt, modelele matematice dau posibilitatea de a construi numai limbi de interogare. De aceea, în secțiunile anterioare nu am creat și schimbat schema bazei de date. Se credea că există deja un set de relații sau un set de copaci și nici nu am încercat să-l umplem cu datele originale. Desigur, înțelegeți că, dacă vrem să lucrăm cu baza de date, ar trebui să putem seta schema aplicației, să o schimbăm și să o umplem cu date. Afacerea se schimbă, nevoile de informare se schimbă și, bineînțeles, trebuie să vedem cumva toate acestea. Prin urmare, limbile utilizate în SGBD implementate, pe lângă capacitatea de a scrie interogări, vă permit să creați, să modificați, să ștergeți obiecte de bază de date și să manipulați date. Ultimul înseamnă capacitatea de a insera înregistrări, de a le actualiza și de a le șterge. E o imagine atât de complicată.
Vom studia SQL într-un mod nu destul de standard. Ca întotdeauna, aproape totul poate fi testat în practică. În plus, materialul va fi pregătit treptat, care ne va permite să adâncim mai mult decât de obicei în manualele de bază, să studiem semantica, să izolăm și să adăugăm semnificații legate de date.
8.2.2 Sublanguage SQL
Următoarele sublanguage sunt definite în SQL:
- Limba de definiție a datelor (JOD). El este, de asemenea, o limbă de definiție a datelor (DDL). Definește structura bazei de date, stabilește obiectele stocate și privilegiile de acces la acestea.
- Limba manipulării datelor (NMD). Este, de asemenea, limbajul de manipulare a datelor (DML). Inserie, actualizează și șterge datele și execută interogări către ele.
- Limbajul de gestionare a datelor / tranzacțiilor (JAD). Limbă de control al datelor (DCL). Gestionează tranzacțiile.
O remarcă despre JAD. Am fost deja atenți la nevoia de a colabora cu utilizatorii atunci când au vorbit despre importanța contabilității care pune întrebări cu privire la conținutul bazei de date și în ce condiții este posibil. Deci, drepturile SGBD ale utilizatorului sunt determinate de privilegiile. De exemplu, privilegiul CREATE SESSION permite utilizatorului să se conecteze la baza de date, privilegiul ALTER TABLE vă permite să modificați tabelele și așa mai departe.
În general, utilizatorii sunt tratați diferit în diferite DBMS-uri. De exemplu, Oracle cere ca toate drepturile utilizatorului creat să fie clarificate complet. Asta este, dacă am creat un utilizator care are un nume și o parolă, atunci el chiar deschide o sesiune, care este, conecta la DBMS, nu poate. Golenky, ca și Pinocchio, înainte să aibă un capac cu o perie. Toate privilegiile trebuie acordate explicit utilizatorului. Desigur, puteți selecta colecții privilegii - roluri - și le puteți utiliza, puteți defini un utilizator public a cărui drepturi sunt disponibile pentru toți utilizatorii și așa mai departe.
Limbile de manipulare a datelor vă permit să inserați, să actualizați și să ștergeți date. De obicei, limba de interogare este considerată parte a limbajului de manipulare a datelor, deși este uneori distinsă. Faptul este că limba de interogare este construită în esență pe baza unui singur șablon SELECT, dar este foarte complicat.
Am vorbit despre limba gestionării tranzacțiilor în secțiunea 6.2. Amintiți-vă - începutul tranzacției BEGIN TRANSACTION, finalizarea tranzacției este COMMIT sau ROLLBACK. De fapt, există și alte instrucțiuni, dar acestea sunt mai puțin frecvente.
8.2.3 Terminologia utilizată
Și câteva remarci despre terminologie. Primul, de fapt, nu are legătură cu SQL, ci cu faptul că implementarea folosește terminologia tabulară, adică nu "relația", ci "tabelul", nu "tupla", ci "șirul". Atributul se numește, în funcție de ceea ce vă place, fie o coloană, fie o coloană (tabelul 8.1).
Tabelul 8.1. Respectarea termenilor HLM și SQL
Trebuie reținut faptul că versiunile moderne ale SQL funcționează în modele de date relaționale extinse. Și aceste extensii sunt atât de mari încât este logic să nu vorbim despre bazele de date relaționale, ci despre bazele de date relaționale sau tabulare. Termenul englez "declarație", care definește construcțiile limbajului, este tradus ca "operator", "comandă", "expresie" în literatura de limbă rusă. Vom folosi termenul "instrucțiune", deoarece "comanda" are mai mult sens procedural decât ne-ar plăcea, iar termenii "operator" și "expresie" au un dublu sens.
Componentele instrucțiunilor vor fi numite fraze.
8.2.4 Obiecte stocate ale bazei de date
Bazele bazei de date relaționale sunt obiectele stocate. Acestea sunt tabele, vizualizări, indexuri, declanșatoare, secvențe și utilizatori. Să trecem prin aceste concepte fluent. Dacă nu înțelegeți totul, nu vă stânjeniți - le vom discuta în detaliu mai târziu.
Tabelele stochează date. Să acordăm atenție unei circumstanțe aparent obișnuite: tabelul nu salvează istoricul modificărilor datelor sale. Nu toate mesele sunt aranjate în mod identic. Ce se numește pur și simplu o masă poate fi un tabel organizat ca o grămadă. Tabele organizate indexabil (tabelul organizat index IOT) pot fi utilizate. În ele, datele tabelului sunt stocate în nodurile de frunze ale arborelui index.
Cel de-al doilea obiect stocat este o vedere, în jargonul programului este o vedere. Dar, spre deosebire de tabela care conține date, numai baza de interogare pe care este construită această reprezentare este stocată în baza de date. Vizualizarea, ca și tabelul, are un nume, iar când accesăm vizualizarea, interogarea care o generează este combinată cu cererea utilizatorului. Atunci vom analiza modul în care se face acest lucru.
Indici. Este o astfel de organizație de acces la date care poate accelera accesul, dar întotdeauna încetinește manipularea datelor. Cel mai adesea folosiți indici B * și indici biți. Mai mult, vom examina indicii din "Stocarea și accesul la date".
Declanșatoarele sunt proceduri speciale care declanșează când apare un eveniment, numit eveniment declanșator.
Baza este numită activă dacă face ceva dincolo de ceea ce a fost cerut de ea. Să ne imaginăm cum funcționează constrângerea de integritate a "cheii primare". De îndată ce încercați să scrieți date în tabel, constrângerea de integritate determină declanșarea procedurii sale interne, care ar trebui să verifice dacă se repetă valoarea cheii primare. Dacă da, atunci intrarea nu este permisă și, dacă nu, este permisă. Este important să înțelegem că comportamentul activ al bazei de date în aplicații este cel mai adesea organizat de factorii de declanșare.
Secvențe (secvență). Acesta este un alt obiect nou, probabil neobișnuit cu tine. De fapt, este un generator de valori succesive cu toate variantele posibile (secvențele sunt ciclice, non-ciclice etc.)
Utilizatorii (utilizator). O serie de probleme de acces și restricții de acces sunt asociate cu acestea. Am spus deja că utilizatorii sunt organizați diferit în diferite baze.
De fapt, nu este posibil să rezolvăm toate problemele practice folosind numai limbajul SQL. Prin urmare, sistemele DBMS moderne au o parte procedurală puternică, care diferă în diferite DBMS-uri.
În partea procedurală, se adaugă următoarele obiecte stocate:
- Procedură (procedură);
- Funcții (funcție);
- Declanșatoare (trigger);
Există un alt obiect procedural care nu este stocat în baza de date. Acesta este cursorul. S-ar putea să vă obișnuiți cu faptul că cursorul este o imagine pe care o conduceți în jurul ecranului cu un mouse sau un touchpad. De fapt, în standardul SQL, cursorul este definit ca zona de memorie destinată stocării, în primul rând, numele cursorului, în al doilea rând, interogarea pe care se bazează cursorul și, în al treilea rând, datele pe care cursorul le selectează din baza de date. Există un indicator pentru liniile de date rezultate.
Rețineți că re-menționarea declanșatorilor în partea procedurală nu este o eroare. Declanșatoarele sunt proceduri de un fel special.
Procedurile și funcțiile pot fi grupate în pachete.
Notă. Indicii vor fi studiați în "Stocarea datelor și accesul la ele" "Stocarea datelor și accesul la acestea". Partea procedurală a DBMS în acest curs este luată în considerare doar în studiul modelelor obiectuale.
8.2.5 Tipuri de date în SQL
Standard SQL-92 set specificat de tipuri de date definite de cuvântul cheie: caracter, CARACTER varierea, BIT, BIT varierea, NUMERIC, decimal, integer, SMALLINT, flotată, REAL, dublă precizie, data, ora, TIMESTAMP, și INTERVAL. În standardele SQL ulterioare, această listă sa extins semnificativ.
Vom lucra cu o mică parte din tipuri care sunt puse în aplicare în baza de date pentru carte. Acestea sunt tipurile de șiruri de caractere (șiruri de caractere), exact tipurile de date numerice (exacte numerice), tipuri numerice aproximative (numerice aproximative), data și tipuri de timp (datetime). Tipuri de colectare, stiluri și tipuri de referință definite de utilizator vor fi luate în considerare în „Entitate Data Model“ în studiul modelelor de obiecte.
Unele alte tipuri din carte nu sunt considerate deloc. Căutați-le în documentația DBMS pe care o veți folosi.
8.2.6 Tipuri de caractere de caractere
- CHAR specifică șiruri de caractere cu lungime fixă Dacă specificația specifică CHAR (5). și se introduce valoarea "abc", atunci, de exemplu, constanta "abc" va fi stocată în Oracle. care conține două spații la capătul liniei.
- VARCHAR definește șiruri de caractere de lungime variabilă care stochează exact cât mai multe caractere au fost introduse, dar într-o sumă care nu depășește specificațiile specificate în VARCHAR (n). Apropo, în Oracle este de dorit să desemneze acest tip ca VARCHAR2.
Rețineți că în Cache, tipurile CHAR și VARCHAR nu se disting prin comportament, deoarece spațiile care termină șirul sunt șterse întotdeauna.
8.2.7 Tipuri numerice
Tipurile numerice exacte (tipuri de puncte fixe) și tipurile aproximative (punct de flotare) sunt rezumate în Tabelul 8.2:
În Cache, în tipul NUMBER (n, s), precizia lui n este 21, dar poate fi schimbată. Tipul NUMBER fără argumente indică numere întregi în intervalul de la -9223372036854775807 la +9232372036854775808. În Oracle n<38, а значение s, определяющее положение младшего разряда от —84 до +127.
8.2.8 Tipurile de date și de timp
Tipurile de dată și de timp utilizate în carte sunt rezumate în Tabelul 8.3.
Tabelul 8.3. Se potrivesc tipurile de dată și oră
Format intern - număr de zile de la 31.12.1840
De la 01.01.4712 la RX până la 31.12.9999 după PX
Secunde secundare de la 0 la 9 biți (implicit 6)
Valorile tip DATE constau din trei componente: anul, luna și data. Semnificația anului este determinată de cronologia de la nașterea lui Hristos. Unul dintre formatele de ieșire posibile "yyyy-mm-dd", unde toate componentele - an, lună și zi - sunt reprezentate prin numere zecimale. În Cache, data de începere este -31.12.1840.
Valorile tipului TIME sunt compuse din valorile fracțiunilor oră, minut, secundă și, eventual, fracționate ale unei secunde.
Tipul TIMESTAMP combină datele din cele două tipuri anterioare.