ADEVĂRAREA ACESTEI LOCURI SUNT PUNCTE tabele de date și comenzi executate pentru a extrage aceste date, crezând că aceste mese fuseseră deja create de cineva în fața noastră. Aceasta este într-adevăr cea mai realistă situație, atunci când un număr mic de oameni creează mese care sunt apoi folosite de alte persoane. Scopul nostru este de a lărgi mai întâi informațiile, apoi de a merge la mai multe probleme înguste.
În acest capitol, vom discuta despre crearea, modificarea și ștergerea tabelelor. Toate acestea sunt valabile pentru tabelele în sine și nu pentru datele conținute în ele. Indiferent dacă veți efectua aceste operațiuni pe cont propriu sau nu, înțelegerea lor conceptuală va crește înțelegerea limbajului SQL și a naturii tabelelor pe care le utilizați. Acest capitol ne introduce în zona SQL numită - DDL (Data Definition Language), unde sunt create obiecte de date SQL.
Acest capitol prezintă, de asemenea, un alt tip de obiect de date SQL - Index. Indicii sunt utilizați pentru a face căutarea mai eficientă și, uneori, pentru a forța valorile să difere una de cealaltă. Ei lucrează, de obicei în liniște pentru tine, dar dacă încercați să-l pună într-un tabel, iar acestea vor fi respinse, din cauza lor nu este unică, aceasta va însemna că celălalt rând are aceeași valoare pentru acest domeniu, și că acest domeniu are un index unic sau constrângere care îi prescrie unicitatea. Discutarea celor de mai sus, în continuare la capitolul 18.
ECHIPA PENTRU CREAREA UNUI TABEL
Tabelele sunt create folosind comanda CREATE TABLE. Această comandă creează o masă goală - un tabel fără rânduri. Valorile sunt introduse folosind DML-ul comenzii INSERT (vezi Capitolul 15). Comanda CREATE TABLE defineste tabelele ca o descriere a setului de nume de coloane specificate intr-o anumita ordine. De asemenea, definește tipurile de date și dimensiunile coloanelor. Fiecare tabel trebuie să aibă cel puțin o coloană. După cum este menționat în Capitolul 2, tipurile de date variază semnificativ de la program la program. Pentru compatibilitatea cu standardul, toți ar trebui să susțină cel puțin standardul de tip ANSI. Este descris în Anexa B.
Deoarece spațiile sunt folosite pentru a separa părți ale unei comenzi SQL, ele nu pot face parte din numele tabelului (sau din orice alt obiect, cum ar fi un index). Underscore (_) - Se utilizează de obicei pentru a separa cuvintele din numele tabelelor.
Valoarea argumentului dimensiune depinde de tipul de date. Dacă nu îl specificați, sistemul dvs. va atribui automat valoarea. Pentru valorile numerice, aceasta este cea mai bună cale de ieșire, deoarece în acest caz toate genurile de acest tip vor avea aceeași dimensiune care te eliberează de problemele legate de compatibilitatea lor obișnuită (vezi capitolul 14). În plus, folosirea unui argument de dimensiune cu unele seturi numerice nu este exact o întrebare simplă. Dacă aveți nevoie pentru a stoca un număr mare, cu siguranță aveți nevoie de asigurări că podeaua este suficient de mare pentru a le găzdui.
Un tip de date pentru care, în principiu, trebuie să atribuiți o dimensiune este CHAR. Argumentul de mărime este un număr întreg care specifică numărul maxim de caractere pe care un câmp le poate deține. De fapt, numărul de simboluri de câmp poate fi de la zero (dacă câmpul este NULL) la acest număr. Implicit, argumentul pentru mărime este 1, ceea ce înseamnă că câmpul poate conține numai o singură literă. Acest lucru nu este cu siguranță exact ceea ce vreți.
Tabelele aparțin utilizatorului care le-a creat, iar numele tuturor tabelelor aparținând acestui utilizator trebuie să difere unul de celălalt, precum și numele tuturor coloanelor din acest tabel. Tabelele individuale pot utiliza aceleași nume de coloane, chiar dacă aparțin aceluiași utilizator. Un exemplu este coloana orașului din tabelul Clienți și din tabelul Vânzătorii. Utilizatorii care nu sunt proprietari de tabele se pot referi la aceste tabele folosind numele proprietarului acestor tabele urmat de un punct; de exemplu, tabelul Employees creat de Smith va fi numit Smith.Employees atunci când este menționat de un alt utilizator (înțelegem că Smith este ID-ul ID-ului de utilizator (ID-ul tău autorizat este al tău în SQL). discutată în Capitolul 2 și va fi continuată în capitolul 22).
Această comandă va crea un tabel de vânzători: Ordinea coloanelor din tabel este determinată de ordinea în care sunt specificate. Coloana nu trebuie separată atunci când linia este mutată (ceea ce se face pentru lizibilitate), dar separat prin virgule.
Indicii sunt instrumentul SQL pe care piața însăși a dat naștere, nu ANSI. Prin urmare, standardul ANSI în sine nu suportă în prezent indicii, deși sunt foarte utile și utilizate pe scară largă.
Când creați un index într-un câmp, baza dvs. de date memorează ordinea corespunzătoare a tuturor valorilor acestui câmp în zona de memorie. Să presupunem că tabelul nostru de clienți are mii de intrări și doriți să găsiți un număr de client = 2999. Deoarece rândurile nu sunt ordonate, programul dvs. va scana întreaga tabelă, rând după rând, verificând de fiecare dată când valoarea câmpului cnum corespunde valorii de 2999. Totuși, dacă există un index în câmpul cnum. atunci programul ar putea merge la numărul 2999 direct pe index și va oferi informații despre cum să găsiți rândul corect al tabelului.
În timp ce indexul îmbunătățește în mod semnificativ eficiența interogărilor, utilizarea indexului încetinește încet operațiile de modificare a DML (cum ar fi INSERT și DELETE), iar indexul însuși ocupă cantitatea de memorie. Prin urmare, de fiecare dată când creați un tabel, trebuie să decideți dacă doriți să îl indexați sau nu. Indicii pot consta din mai multe domenii. Dacă este specificat mai mult de un câmp pentru un index, al doilea este ordonat în interiorul primului, al treilea în cel de-al doilea și așa mai departe. Dacă ai avut primul și ultimul în două câmpuri diferite ale tabelului, ai putea crea un index care să sorteze câmpul anterior în următorul câmp. Acest lucru se poate face indiferent de modul în care sunt comandate coloanele în tabel.
Sintaxa pentru crearea unui index este de obicei următoarea (rețineți că acesta nu este standardul ANSI): Tabelul, desigur, ar trebui să fie deja creat și trebuie să conțină o coloană. Indicele nu poate fi folosit pentru nimic altceva în baza de date (orice utilizator). Odată creat, indicele va fi invizibil pentru utilizator. SQL însuși decide când este necesar să se refere la ea și o face automat. Dacă, de exemplu, tabelul de clienți este cel mai adesea menționat în cererile vânzătorilor către propria clientelă, ar fi corect să creați un astfel de indice în câmpul snum al tabelului Client. Acum, acel vânzător care este legat de această masă va putea să-și găsească propria clientelă foarte repede.
UNICITATEA INDEXULUI
Indicele din exemplul anterior, din fericire, nu este prescris unicitatea, în ciuda remarcii noastre că aceasta este una dintre atribuțiile index. Acest vânzător poate avea orice număr de clienți. Cu toate acestea, acest lucru nu se întâmplă dacă folosim cuvântul cheie UNIQUE înainte de cuvântul cheie INDEX. Câmpul cum, ca cheie primară, va fi primul candidat pentru indexul unic: NOTĂ: această comandă va fi respinsă dacă există deja valori identice în câmpul cnum. Cea mai bună modalitate de a face față indexurilor este să le creați imediat după crearea tabelului și înainte de introducerea oricăror valori. De asemenea, rețineți că pentru un indice unic de mai mult de un gen, aceasta este o combinație de valori, fiecare dintre care poate să nu fie unică. Exemplul anterior este o modalitate indirectă de a face ca câmpul cnum să funcționeze ca cheia primară a tabelului Clienți. Bazele de date afectează mai direct cheile primare și celelalte. Vom discuta această concluzie mai târziu în capitolele 18 și 19.
DETERMINAREA INDICILOR
Semnul principal al indexului este el - astfel încât acesta poate fi șters. De obicei, utilizatorii nu știu despre existența indexului. SQL determină automat dacă utilizatorul are permisiunea de a utiliza indexul și, dacă da, permite utilizarea acestuia. Cu toate acestea, dacă doriți să ștergeți indexul, trebuie să îl cunoașteți. Această sintaxă este utilizată pentru a șterge indexul:
SCHIMBAREA TABELULUI DUPĂ CUM A FOST CREATĂ
Comanda ALTER TABLE nu face parte din standardul ANSI; dar este disponibil pe scară largă și o formă destul de semnificativă, deși capacitățile sale sunt oarecum limitate. Se utilizează pentru a schimba definiția unui tabel existent. De obicei, adaugă coloane în tabel. Uneori poate șterge coloane sau le poate redimensiona, iar în unele programe adaugă sau elimină restricții (discutate în capitolul 18). Sintaxa tipică este adăugarea unei coloane în tabel. Coloana va fi adăugată cu o valoare NULL pentru toate rândurile din tabel. Coloana nouă devine ultima coloană din tabel. În general, puteți adăuga simultan câteva coloane noi, separându-le cu virgule, într-o singură comandă. Puteți să ștergeți sau să modificați coloanele. Cel mai adesea, schimbarea unei coloane poate duce pur și simplu la mărirea acesteia sau la adăugarea (ștergerea) unei constrângeri. Sistemul dvs. ar trebui să vă asigurați că orice modificări nu contravin datelor existente - de exemplu, atunci când încercați să adăugați o restricție la o coloană care a contestat deja în încălcarea căreia restricția va fi respinsă. Cel mai bine este să verificați din nou. Cel puțin, uitați-vă la documentația sistemului dvs. pentru a vedea dacă garantează exact acest motiv. Datorită caracterului nestandard al comenzii ALTER TABLE, trebuie totuși să vă uitați la secțiunea documentației sistemului dvs. care vorbește despre cazuri speciale.
Dacă sistemul dvs. nu acceptă ALTER TABLE. sau dacă doriți să evitați utilizarea acestuia, puteți să creați pur și simplu o tabelă nouă, cu modificările necesare la crearea și să utilizați comanda INSERT cu o interogare SELECT * pentru a suprascrie datele din tabela veche. Utilizatorilor care au primit acces la tabela veche (a se vedea capitolul 22) ar trebui să li se acorde acces la tabelul nou.
Eliminarea tabelului
Trebuie să fiți proprietarul (creatorul) tabelului pentru a putea să îl ștergeți. Deci, nu vă faceți griji despre distrugerea accidentală a datelor dvs., SQL va cere mai întâi să ștergeți tabelul înainte de al șterge din baza de date. Tabelul cu rândurile din el nu poate fi șters. Consultați Capitolul 15 pentru detalii despre ștergerea rândurilor dintr-o tabelă. Sintaxa pentru ștergerea tabelului, dacă este desigur goală, este următoarea: Când această comandă este dată, tabela nu mai este recunoscută de ea și nu există o astfel de comandă care să poată fi dată acestui obiect. Trebuie să vă asigurați că acest tabel nu se referă la un tabel străin cu o cheie străină (cheile externe sunt discutate în Capitolul 19) și că nu este utilizat în definiția Vizualizare (Capitolul 20).
Această comandă nu este de fapt parte a standardului ANSI, dar este, în general, susținută și utilă. Din fericire, este mai simplu și, prin urmare, mai consistent decât ALTER TABLE. ANSI pur și simplu nu are o modalitate de a identifica tabele rupte sau incorecte.
Acum sunteți deja fluent în elementele de bază ale definițiilor datelor. Puteți crea, modifica și șterge tabele. În timp ce numai prima dintre aceste funcții face parte din standardul oficial SQL, altele se vor schimba din când în când, în special ALTER TABLE. DROP TABLE vă permite să scăpați de mese inutile. Distruge doar tabele goale și, prin urmare, nu distruge datele.
Știți acum despre indexuri și cum să le creați și să le ștergeți. SQL nu vă oferă prea mult control asupra acestora, deoarece implementarea pe care o utilizați determină destul de repede cât de repede sunt executate diferite comenzi. Indexuri - acesta este unul dintre instrumentele care vă oferă posibilitatea de a lucra direct asupra eficienței comenzilor dvs. în SQL. Am analizat indicii aici pentru a le distinge de constrângeri, cu care nu pot fi confundate. Restricțiile fac obiectul capitolelor 18 și 19.
Lucrul cu SQL
1. Scrieți o instrucțiune CREATE TABLE care va scoate masa clientului nostru. 2. Scrieți o comandă care să permită utilizatorului să preluați rapid ordinele grupate după dată din tabelul de comandă. 3. Dacă tabela de comandă a fost deja creată, cum puteți face câmpul onum să fie unic (presupunând că toate valorile curente sunt unice). 4. Creați un index care să permită fiecărui vânzător să își găsească rapid ordinele grupate după dată. 5. Să presupunem că fiecare vânzător are un singur client cu acest rating, introduceți comanda care îl va extrage. (A se vedea Anexa A pentru răspunsuri.)