Scopul limbajului SQL. SQL: un limbaj universal pentru lucrul cu baze de date

Fiecare comandă SQL începe cu un cuvânt cheie, un verb care descrie acțiunea pe care o efectuează comanda, cum ar fi CREATE. O echipă poate avea una sau mai multe propoziții. Clauza descrie datele cu care lucrează comanda sau conține informații clarificatoare despre acțiunea pe care o efectuează comanda. Fiecare clauză începe cu un cuvânt cheie, cum ar fi WHERE. Unele clauze din comandă sunt necesare, altele nu. Unele propoziții pot conține cuvinte cheie și expresii suplimentare. Multe propoziții includ nume de tabel sau câmpuri. Numele trebuie să aibă între 1 și 18 caractere, să înceapă cu o literă și să nu conțină spații sau caractere speciale de punctuație. Cuvintele cheie nu pot fi folosite ca nume.

52. SQL (Structured Query Language) - Structured Query Language este un limbaj de interogare standard pentru lucrul cu baze de date relaționale.

SQL nu conține instrucțiuni tradiționale care controlează execuția programelor, conține doar un set de instrucțiuni standard pentru accesarea datelor stocate într-o bază de date.

SQL poate fi folosit pentru a accesa o bază de date în două moduri: munca interactivă si in programe de aplicație.

Cu ajutorul SQL, utilizatorul poate obține rapid răspunsuri la orice, inclusiv la întrebări destul de complexe, în timp ce pentru a implementa aceste interogări într-o altă limbă ar fi necesar să dezvolte un program corespunzător. Programele de aplicație scrise în anumite limbaje de programare folosesc SQL ca incorporat limba pentru accesarea bazei de date.

Caracterizând limbajul SQL în ansamblu, putem evidenția următoarele caracteristici:

· structură de nivel înalt, care amintește de limba engleză;

· independență față de SGBD specific;

· disponibilitatea standardelor în curs de dezvoltare;

· capacitatea de a efectua interogări interactive pentru a prelua date și a modifica structura acestora;

· asigurarea accesului software la bazele de date;

· suport arhitectura client/server;

· extensibilitate și suport pentru tehnologii orientate pe obiecte;



· capacitatea de a accesa date pe Internet.

Principalele funcții ale limbajului SQL:

SQL – limbaj interactiv de interogare. Utilizatorii introduc comenzi SQL în mod interactiv pentru a prelua date și a le afișa pe ecran și pentru a face modificări în baza de date;

SQL – limbaj de programare baze de date. Pentru a accesa baza de date, comenzile SQL sunt introduse în programele de aplicație;

SQL – limbaj de administrare a bazei de date. Un administrator de baze de date poate folosi SQL pentru a defini structura bazei de date și pentru a controla accesul la date;

SQL – limbajul aplicației client/server. În programele de aplicație, SQL este folosit ca mijloc de organizare a comunicării într-o rețea locală cu un server de baze de date, care stochează date partajate etc.

55. Capacități lingvistice Limbajul SQL, care respectă cele mai recente standarde SQL:2003, SQL:1999, este un limbaj foarte bogat și complex, ale cărui capacități sunt greu de înțeles imediat, cu atât mai puțin de înțeles. Prin urmare, trebuie să împărțim limbajul în niveluri. Într-una dintre clasificările oferite de standardul SQL, acest limbaj este împărțit în niveluri „de bază” (de intrare), „intermediar” (intermediar) și „complet”. Nivelul de bază conține aproximativ patruzeci de comenzi, care pot fi grupate pe categorii în funcție de funcționalitatea lor.

CREATE TABLE Detalii (NOMZ INT, NUME COMPLET CHAR(15), YEAR INT, GEN CHAR(3))

DROP TABLE Detalii

ALTER TABLE Detalii (SAMPLE CHAR(10))

CREATE VIEW Academic Progress M1 AS SELECT *FROM Academic Performance WHERE GROUP= "M-1"

INSERT INTO Information VALUES (980101, „IVANOV I. I.”, 1980, „SOȚUL”)

DELETE FROM Detalii WHERE NOMZ=980201

UPDATE Information SET Nume complet = "KRAVTSOVA I. I." WHERE NOMZ=980201

SELECTAȚI * FROM Informații WHERE FULL NAME="SIDOROV S. S." SAU NUME COMPLET="PETROV P. P."

54. Tipuri de date și expresii Pentru a accesa un tabel relațional în SQL, trebuie să scrieți (specificați) o comandă. SELECTARE (selectare)cuvânt cheie spune DBMS ce acțiune va efectua această comandă. Comenzile de interogare încep cu un cuvânt cheie. Pe lângă SELECT, acestea pot fi cuvinte CREA- crea, INTRODUCE-introduce, ȘTERGE- șterge, COMMIT– completă etc.

DE LA – un cuvânt cheie precum SELECT care apare în fiecare comandă. Este urmat de un spațiu și apoi de numele tabelelor folosite ca surse de informații. Numele tabelelor și câmpurilor trebuie să conțină de la 1 la 18 caractere, să înceapă cu o literă și să nu conțină spații sau caractere speciale.

UNDE un cuvânt cheie urmat de un predicat — o condiție impusă unei intrări de tabel pe care trebuie să o îndeplinească pentru a fi inclusă în selecție.

COMANDA PENTRU - sortarea înregistrărilor afișate (Asc – crescător, Desc – descrescător. Dacă nu este specificat tipul de sortare, atunci sortarea are loc în ordine crescătoare).

CHAR(lungime) CHARACTER(lungime)Șiruri de caractere de lungime constantă

INTEGER INTNumere întregi

SMALLINTNumăr întreg mic

NUMERIC(acuratețe, grad) DECIMAL(acuratețe, grad DEC(acuratețe, grad)Număr punct fix

FLOAT (precizie)Număr în virgulă mobilă

Precizie dublanumere cu memorie flotantă, precizie ridicată

Expresiiîn SQL sunt folosite pentru a specifica criterii pentru selectarea datelor sau efectuarea de operații asupra valorilor care sunt citite dintr-o bază de date. Expresiile sunt o secvență specifică de câmpuri de bază de date, constante, funcții conectate de operatori.

constante sunt folosite pentru a indica valori specifice datelor. Constante de punct fix, de exemplu: 21 -375,18 62,3

Constante în virgulă mobilă, de exemplu: 1.5E7 -3.14E9 2.5E-6 0.783E24

Constante de șir trebuie să fie cuprinse între ghilimele simple. Exemple de astfel de constante: „Minsk” „New York” „Ivanov I. I.”

Valoare lipsă(NUL). SQL acceptă gestionarea datelor lipsă folosind conceptul de valoare lipsă.

Majoritatea SGBD-urilor orientate spre SQL acceptă așa-numitele funcții agregate (totale).. Funcțiile agregate utilizate în mod obișnuit includ următoarele:

· NUMARA– numărul de valori din coloana tabelului;

· SUMĂ– suma valorilor din coloană;

· AVG– media aritmetică a valorilor din coloană;

· MAX– valoarea maximă în coloană;

· MIN– valoarea minimă în coloană.

Se pot folosi următoarele expresii: tipuri de operatori:

· aritmetic: + (plus), - (scădere), * (multiplicare), / (Divizia);

· relaţie: = (egal), > (mai mare),< (меньше), >= (mai mare sau egal cu),<= (меньше или равно), <>(nu este egal);

· joc de inteligență: ȘI(logic „ȘI”), SAU(„SAU” logic), NU(negație logică);

56. Comenzi de control al tranzacțiilor vă permit să asigurați integritatea bazei de date.

Tranzacție SQL sunt mai multe comenzi SQL secvențiale care trebuie executate ca o singură unitate.

În limbajul SQL, procesarea tranzacțiilor este implementată folosind două comenzi - COMMITȘi ROLLBACK. Aceștia gestionează modificările făcute de un grup de echipe. Echipă COMMIT raportează finalizarea cu succes a tranzacției. Acesta informează DBMS că tranzacția s-a încheiat, toate comenzile sale au fost finalizate cu succes și nu au apărut inconsecvențe în baza de date. Echipă ROLLBACK raportează finalizarea nereușită a tranzacției. Acesta informează SGBD că utilizatorul nu dorește să finalizeze tranzacția, iar SGBD ar trebui să renunțe la orice modificări aduse bazei de date ca urmare a tranzacției. În acest caz, SGBD returnează baza de date la starea în care se afla înainte de executarea tranzacției.

Echipe COMMITȘi ROLLBACK sunt utilizate în principal în modul program, deși pot fi utilizate și interactiv.

57. Pentru a accesa comenzile de control Acestea sunt comenzi pentru efectuarea de funcții administrative care acordă sau revocă dreptul (privilegiul) de a utiliza tabelele bazei de date într-un anumit mod. Fiecare utilizator al bazei de date are anumite drepturi în legătură cu obiectele bazei de date.

Drepturi– acestea sunt acțiunile cu un obiect pe care utilizatorul le poate efectua. Drepturile se pot schimba în timp: cele vechi pot fi anulate, pot fi adăugate altele noi. Sunt acordate următoarele drepturi:

· INSERT – dreptul de a adăuga date în tabel;

· UPDATE – dreptul de a modifica datele din tabel;

· DELETE – dreptul de a șterge datele din tabel;

· REFERINȚE – dreptul de a defini cheia primară.

58 Încorporarea limbajului în programele de aplicație..Pentru a încorpora Acestea sunt comenzi concepute pentru a implementa accesul la o bază de date din programe de aplicație scrise într-un anumit limbaj de programare.

Limba SQL

Deci, ne-am familiarizat cu conceptele de bază ale teoriei bazelor de date, am instalat și configurat MySQL pentru a funcționa. Acum este momentul să învățați cum să manipulați datele stocate în baze de date. Pentru asta avem nevoie SQL – limbaj de interogare structurat. Acest limbaj face posibilă crearea, editarea și ștergerea informațiilor stocate în baze de date, crearea de noi baze de date și multe altele. SQL este un standard ANSI (American National Standards Institute) și ISO (International Organization for Standardization).

Puțină istorie

Primul standard de limbă internațională SQL a fost adoptat în 1989 și este adesea numit SQL/89 . Printre dezavantajele acestui standard, cel mai notabil este că stabilește multe proprietăți importante ca fiind definite de implementare. Acest lucru a dus la multe discrepanțe în implementările de limbă de către diferiți producători. Au existat, de asemenea, plângeri cu privire la lipsa de referință a standardului la aspectele practice ale limbajului, cum ar fi integrarea acestuia în limbajul de programare C.

Următorul Standard Internațional de Limbă SQL a fost adoptat la sfârșitul anului 1992 și a devenit cunoscut sub numele de SQL/92 . S-a dovedit a fi mult mai precis și complet decât SQL/89 , deși nu a fost lipsit de neajunsurile sale. În prezent, majoritatea sistemelor implementează acest standard aproape complet. Cu toate acestea, după cum știți, progresul nu poate fi oprit, iar în 1999 a apărut un nou standard SQL :1999, cunoscut și ca SQL3. SQL3 este caracterizat ca fiind „orientat pe obiecte” SQL ” și stă la baza mai multor sisteme de gestionare a bazelor de date obiect-relaționale (de exemplu, Oracle's ORACLE8, Informix's Universal Server și IBM's DB2 Universal Database). Acest standard nu este doar o fuziune SQL-92 și tehnologia obiectelor. Conține o serie de extensii la tradițional SQL , iar documentul în sine este conceput pentru a facilita munca de standardizare mai eficientă în viitor.

MySQL este SQL92 entry-level, conține mai multe extensii la acel standard și se străduiește să susțină pe deplin standardul ANSI SQL99 fără a compromite viteza și calitatea codului.

Apoi, vorbind despre elementele de bază ale limbii SQL , vom adera la implementarea sa în SGBD-ul MySQL.

Operatori lingvistici de bază SQL

Funcțiile oricărui SGBD includ:

  1. crearea, ștergerea, modificarea unei baze de date (DB);
  2. adăugarea, modificarea, ștergerea, atribuirea de drepturi de utilizator;
  3. introducerea, ștergerea și modificarea datelor din baza de date (tabele și înregistrări);
  4. preluarea datelor din baza de date.

Doar administratorii SGBD sau utilizatorii privilegiați au acces la primele două funcții. Să ne uităm la cum sunt rezolvate ultimele două probleme (de fapt, sunt șapte probleme).

Înainte de a face ceva cu datele, trebuie să creați tabele în care vor fi stocate aceste date, să aflați cum să modificați structura acestor tabele și să le ștergeți dacă este necesar. În acest scop în limbaj SQL exista operatori CREAȚI TABEL, ALTER TABLEȘi DROP TABLE.

Instrucțiunea CREATE TABLE

mysql>CREATE TABLE Persoane (id INT PRIMARY KEY AUTO_INCREMENT, prenume VARCHAR(50), prenume VARCHAR(100), data_deces INT, descriere TEXT, fotografie INT, cetățenie CHAR(50) DEFAULT „Rusia”); Exemplul 10.1. Crearea tabelului Persoane

Folosind comanda SHOW specifică MySql, puteți vizualiza bazele de date existente, tabelele dintr-o bază de date și câmpurile dintr-un tabel.

Afișați toate bazele de date:

mysql>SHOW baze de date;

Faceți actuala baza de date a cărților și afișați toate tabelele din ea:

mysql>carte de utilizare; mysql>arata tabele;

Afișați toate coloanele din tabelul Persoane:

mysql> arată coloanele din Persons;

Declarația DROP TABLE

Operator DROP TABLEșterge unul sau mai multe tabele. Toate datele și definițiile din tabel sunt eliminate, așa că aveți grijă când utilizați această comandă.

Sintaxă:

DROP TABLE nume_tabel [, nume_tabel,...]

În MySQL 3.22 și mai târziu, puteți folosi cuvintele cheie IF EXISTS pentru a genera o eroare dacă tabelele specificate nu există.

Opțiunile RESTRICT și CASCADE facilitează transferul unui program din alte SGBD. Nu sunt în uz momentan.

mysql> DROP TABLE IF EXISTIS Persoane, Artefacte, test; Exemplul 10.2. Folosind instrucțiunea DROP TABLE

Instrucțiunea ALTER TABLE

Operator ALTER TABLE oferă posibilitatea de a schimba structura unui tabel existent. De exemplu, puteți adăuga sau elimina coloane, puteți crea sau distruge indecși sau puteți redenumi coloanele sau tabelul în sine. De asemenea, puteți modifica comentariul pentru tabel și tipul acestuia.

Sintaxă:

ALTER TABLE nume_tabel alter_specification [, alter_specification ...]

Puteți face următoarele modificări în tabel (toate sunt înregistrate în alter_specification ):

  • adăugarea unui câmp:

    ADD coloană_definiție

    ADD (definiție_coloană, definiție_coloană,...)

  • adăugarea de indici:

    ADĂUGA INDEX [nume_index] (nume_coloană,...) sau ADAUGĂ CHEIE PRIMARĂ (nume_coloană,...) sau ADAUGĂ UNIQUE [nume_index] (nume_coloană,...) sau ADAUGĂ TEXT COMPLET [nume_index] (nume_coloană,...)

  • modificare câmp:

    ALTER nume_coloană (SET DEFAULT literal | DROP DEFAULT) sau SCHIMBAți vechiul_nume_coloană definiția_coloanei sau MODIFICAȚI coloană_definiție

  • ștergerea unui câmp, index, cheie:

    DROP nume_coloană DROP PRIMARY KEY DROP INDEX nume_index

  • redenumire tabel:

    RENAME new_table_name

  • reordonarea câmpurilor tabelului:

    Câmpul ORDER BY

    table_options

Dacă operatorul ALTER TABLE este folosit pentru a modifica definiția tipului de coloană, dar DESCRIBE table_name arată că coloana nu s-a schimbat, atunci MySQL poate ignora această modificare din unul dintre motivele descrise în secțiunea specială a documentației. De exemplu, dacă încercați să schimbați o coloană VARCHAR în CHAR, MySQL va continua să folosească VARCHAR dacă tabelul în cauză conține alte coloane cu lungime variabilă.

Operator ALTER TABLEîn timpul rulării, creează o copie temporară a tabelului original. Modificarea necesară este efectuată asupra copiei, apoi tabelul original este șters și noul tabel este redenumit. Acest lucru se face astfel încât toate actualizările, cu excepția celor eșuate, să fie incluse automat în noul tabel. În timpul rulării ALTER TABLE tabelul original poate fi citit de alți clienți. Operațiunile de actualizare și scriere pe acest tabel sunt suspendate până când noul tabel este gata. Trebuie remarcat faptul că atunci când utilizați orice altă opțiune pentru ALTER TABLE, alta decât RENAME, MySQL va crea întotdeauna un tabel temporar, chiar dacă datele nu trebuie strict copiate (de exemplu, când se schimbă numele unei coloane).

Exemplul 10.3. Să adăugăm un câmp la tabelul Persoane creat pentru a înregistra anul de naștere al persoanei:

mysql> ALTER TABLE Persoane ADD bday INTEGER AFTER last_name; Exemplul 10.3. Adăugarea unui câmp la tabelul Persoane pentru a înregistra anul de naștere al unei persoane

Așadar, am învățat cum să lucrăm cu tabele: să le creăm, să le ștergem și să le modificam. Acum să ne dăm seama cum să facem același lucru cu datele stocate în aceste tabele.

instrucțiunea SELECT

Operator SELECTAȚI folosit pentru a prelua rândurile selectate dintr-unul sau mai multe tabele. Adică, cu ajutorul lui specificăm coloanele sau expresiile care trebuie preluate (select_expressions), tabelele (table_references), din care ar trebui să se facă selecția și, eventual, condiția (where_definition), în care datele din acestea coloanele trebuie să corespundă și ordinea în care trebuie să fie emise aceste date.

În plus, operatorul SELECTAȚI poate fi folosit pentru a prelua rânduri calculate fără referire la niciun tabel. De exemplu, pentru a calcula cu ce este egal 2*2, scrieți pur și simplu

mysql> SELECT 2*2;

Structura operatorului simplificată SELECTAȚI poate fi reprezentat astfel:

Parantezele pătrate înseamnă că operatorul pe care îl conțin este opțional bară verticală | înseamnă o listă de opțiuni posibile. După cuvântul cheie ORDER BY, indicați numele coloanei, numărul (întreg fără semn) sau formula și metoda de ordonare (crescător - ASC sau descrescător - DESC). Ordonarea implicită este crescătoare.

Când scriem „*” într-o expresie selectată, înseamnă selectarea tuturor coloanelor. În plus față de „*”, funcții precum max , min și avg pot fi folosite în select_expressions.

Exemplul 10.4. Selectați din tabelul Persoane toate datele pentru care câmpul first_name are valoarea „Alexander”:

Selectați numele și descrierea (titlu, descriere) artefactului numărul 10:

instrucțiunea INSERT

Operator INTRODUCE inserează rânduri noi într-un tabel existent. Operatorul are mai multe forme. Parametrul table_name din toate aceste forme specifică tabelul în care trebuie scrise rândurile. Coloanele pentru care sunt setate valori sunt specificate în lista de nume de coloane (nume_coloană) sau în partea SET.

Sintaxă:

    INSERT nume_tabel [(nume_coloană,...)] VALORI (expresie,...),(...),...

    Acest formular de comandă INTRODUCE inserează rânduri conform valorilor exacte specificate în comandă. Coloanele sunt enumerate în paranteze după numele tabelului, iar valorile lor sunt enumerate după cuvântul cheie VALUES.

    De exemplu:

    mysql> INSERT INTO Persons (nume, zi) VALORI ("Ivanov", "1934");

    va insera un rând în tabelul Persoane în care valorile numelui (nume) și datei nașterii (zi) vor fi setate, respectiv, ca „Ivanov” și „1934”.

    INSERT nume_tabel [(nume_coloană,...)] SELECT ...

    Acest formular de comandă INTRODUCE inserează rânduri selectate dintr-un alt tabel sau tabele.

    De exemplu:

    va insera în tabelul Artefacte în câmpul „autor” valoarea identificatorului selectat din tabelul Persoane cu condiția ca numele persoanei să fie Ivanov.

    INSERT table_name SET column_name=expresie, column_name=expresie, ...

    De exemplu:

    mysql> INSERT INTO Persons SET last_name="Petrov", first_name="Ivan";

    Această comandă va insera valoarea „Petrov” în tabelul Persons în câmpul last_name, iar șirul „Ivan” în câmpul first_name.

Formă INSERT...VALORI cu o listă de valori multiple este acceptat în MySQL 3.22.5 și mai târziu. Sintaxa expresiei column_name=expresie acceptat în MySQL versiunea 3.22.10 și ulterioară.

Se aplică următoarele acorduri.

  • Dacă nu este specificată nicio listă de coloane pentru INSERT...VALORI sau INSERT...SELECT, atunci valorile pentru toate coloanele trebuie definite în lista VALUES() sau ca urmare a SELECTAȚI. Dacă ordinea coloanelor din tabel este necunoscută, puteți utiliza DESCRIBE table_name.
  • Orice coloană pentru care nu i se dă în mod explicit o valoare va fi setată la valoarea implicită. De exemplu, dacă o listă de coloane dată nu specifică toate coloanele dintr-un tabel dat, atunci coloanele nemenționate sunt setate la valorile implicite.
  • expresia se poate referi la orice coloană care a fost inclusă anterior în lista de valori. De exemplu, puteți specifica următoarele:

    mysql> INSERT INTO table_name (col1,col2) VALUES(15,col1*2);

    Dar nu poți specifica:

    mysql> INSERT INTO table_name (col1,col2) VALUES(col2*2,15);

Nu am discutat încă trei parametri opționali care sunt prezenți în toate cele trei forme ale comenzii: LOW_PRIORITY, DELAYED și IGNORE.

Parametrii LOW_PRIORITY și DELAYED sunt utilizați atunci când un număr mare de utilizatori lucrează cu tabelul. Acestea necesită ca o anumită operație să fie prioritizată față de operațiunile altor utilizatori. Dacă este specificat cuvântul cheie LOW_PRIORITY, atunci execuția acestei comenzi INTRODUCE va fi amânată până când alți clienți vor termina de citit acest tabel. În acest caz, clientul trebuie să aștepte până când comanda de inserare este completă, ceea ce poate dura o perioadă semnificativă de timp dacă tabelul este utilizat intens. În schimb, comanda INSERARE ÎNTÂRZIAT permite unui anumit client să continue imediat o operațiune, indiferent de ceilalți utilizatori.

Dacă în echipă INTRODUCE Dacă este specificat cuvântul cheie IGNORE, atunci toate rândurile care au chei duplicate PRIMAR sau UNICîn acest tabel vor fi ignorate și nu introduse în tabel. Dacă nu specificați IGNORE , operația de inserare se anulează atunci când întâlnește un rând care are o valoare duplicată pentru o cheie existentă.

Declarație UPDATE

Sintaxă:

Operator ACTUALIZAȚI Actualizează valorile coloanelor existente din tabel în funcție de valorile introduse. Instrucțiunea SET specifică ce coloane trebuie modificate și ce valori ar trebui stabilite în ele. Clauza WHERE, dacă este prezentă, specifică ce rânduri sunt actualizate. În caz contrar, toate rândurile sunt actualizate. Dacă este specificată o expresie ORDER BY, rândurile vor fi actualizate în ordinea specificată în ea.

Dacă este specificat cuvântul cheie LOW_PRIORITY, atunci execuția acestei comenzi ACTUALIZAȚI este amânată până când alți clienți au terminat de citit acest tabel.

Dacă este specificat cuvântul cheie IGNORE, comanda de actualizare nu se va anula chiar dacă apare o eroare de cheie duplicată. Rândurile care provoacă conflicte nu vor fi actualizate.

Dacă expresia care specifică noua valoare a coloanei folosește numele acelui câmp, atunci comanda ACTUALIZAȚI folosește valoarea curentă a acestei coloane. De exemplu, următoarea comandă setează coloana death_date la o valoare cu unul mai mare decât valoarea sa actuală:

mysql> UPDATE Persons SET death_date=death_date+1;

În MySQL versiunea 3.23, puteți utiliza parametrul LIMIT # pentru a vă asigura că numai numărul specificat de rânduri a fost modificat.

De exemplu, o astfel de operațiune va înlocui titlul titlului din primul rând al tabelului nostru de exponate cu șirul „Tube computer”:

mysql> UPDATE Artefacte SET title="Tube computer" Limit 1;!}

Declarația DELETE

Operator ȘTERGE elimină rândurile din tabel table_name care îndeplinesc condițiile specificate în where_definition și returnează numărul de înregistrări eliminate.

Dacă operatorul ȘTERGE este rulat fără o definiție WHERE, toate rândurile sunt șterse.

Sintaxă:

De exemplu, următoarea comandă va fi eliminată din tabelul Persoane

02/07/07 11.6K

Introducere în managementul bazelor de date relaționale

sql este adesea numit limba esperanto pentru sistemele de management al bazelor de date (DBMS). Într-adevăr, nu există nicio altă limbă în lume pentru a lucra cu baze de date care ar fi atât de larg utilizate în programe. Primul standard de sol a apărut în 1986 și acum a câștigat recunoașterea universală. Poate fi folosit chiar și atunci când lucrați cu SGBD-uri non-relaționale. Spre deosebire de alte instrumente software, precum limbajele C și Cobol, care sunt apanajul programatorilor profesioniști, sql este folosit de specialiști dintr-o varietate de domenii. Programatori, administratori DBMS, analiști de afaceri - toți procesează cu succes datele folosind sql. Cunoașterea acestui limbaj este utilă pentru toți cei care au de-a face cu baza de date.

În acest articol ne vom uita la conceptele de bază ale sql. Să-i spunem povestea de fundal (și să risipim câteva mituri pe parcurs). Vă veți familiariza cu modelul relațional și veți putea dobândi primele abilități în lucrul cu sql, care vă vor ajuta la stăpânirea în continuare a limbajului.

Este greu să înveți SQL? Depinde cât de adânc vei ajunge. Pentru a deveni profesionist, trebuie să studiezi mult. Limbajul sql a început să apară în 1974 ca subiect al unei scurte lucrări de cercetare de 23 de pagini și a parcurs un drum lung de atunci. Textul standardului actual - documentul oficial „standardul internațional al bazei de date limba sql” (denumit în mod obișnuit sql-92) - conține peste șase sute de pagini, dar nu spune nimic despre caracteristicile specifice ale versiunilor de sol implementate în SGBD-uri. de la Microsoft, Oracle, Sybase etc. Limbajul este atât de dezvoltat și divers încât doar enumerarea capabilităților sale ar necesita mai multe articole de jurnal, iar dacă adunați tot ce a fost scris pe tema sol, veți obține o bibliotecă cu mai multe volume.

Cu toate acestea, pentru utilizatorul obișnuit nu este deloc necesar să cunoască sql complet. Așa cum un turist care se află într-o țară în care vorbește o limbă de neînțeles trebuie doar să învețe câteva expresii comune și reguli gramaticale, așa în SQL - știind puțin, poți obține multe rezultate utile. În acest articol, ne vom uita la comenzile de bază SQL, regulile de stabilire a criteriilor de selectare a datelor și vom arăta cum să obțineți rezultate. Ca urmare, veți putea crea singur tabele și veți putea introduce informații în ele, puteți crea interogări și puteți lucra cu rapoarte. Aceste cunoștințe pot deveni baza pentru dezvoltarea ulterioară independentă a SQL.

Ce este sql?

sql este un limbaj specializat non-procedural care vă permite să descrieți date, să preluați și să procesați informații din SGBD-urile relaționale. Specializarea înseamnă că sol este destinat numai lucrului cu baza de date; Nu puteți crea un sistem de aplicații cu drepturi depline folosind doar această limbă - aceasta va necesita utilizarea altor limbi în care puteți încorpora comenzi SQL. Prin urmare, sql este numit și un instrument de limbaj auxiliar pentru procesarea datelor. O limbă auxiliară este folosită numai împreună cu alte limbi.

Un limbaj de aplicație cu scop general are de obicei facilități pentru crearea de proceduri, dar SQL nu. Cu ajutorul acestuia, nu puteți specifica cum ar trebui efectuată o anumită sarcină, dar puteți determina doar ce anume este aceasta. Cu alte cuvinte, atunci când lucrăm cu sql, ne interesează rezultatele, nu procedurile de obținere a acestora.

Cea mai semnificativă proprietate a sql este capacitatea de a accesa baze de date relaționale. Mulți cred chiar că expresiile „bază de date procesată folosind sql” și „bază de date relațională” sunt sinonime. Cu toate acestea, veți vedea în curând că există o diferență între ele. Standardul sql-92 nici măcar nu are termenul de relație.

Ce este un SGBD relațional?

Fără a intra în detalii, un SGBD relațional este un sistem bazat pe un model de management al datelor relaționale.

Conceptul de model relațional a fost propus pentru prima dată în lucrarea Dr. E. F. Codd, publicată în 1970. Acesta descria un aparat matematic pentru structurarea și manipularea datelor și, de asemenea, propunea un model abstract pentru reprezentarea oricărei informații din lumea reală. Anterior, atunci când se folosea o bază de date, era necesar să se țină cont de caracteristicile specifice de stocare a informațiilor în ea. Dacă structura internă a bazei de date s-a schimbat (de exemplu, pentru a îmbunătăți performanța), a fost necesară relucrarea programelor de aplicație, chiar dacă nu s-au produs modificări la nivel logic. Modelul relațional a făcut posibilă separarea caracteristicilor private ale stocării datelor de la nivelul programului de aplicație. De fapt, modelul nu descrie în niciun fel cum sunt stocate și accesate informațiile. Ceea ce se ia în considerare este modul în care aceste informații sunt percepute de către utilizator. Datorită apariției modelului relațional, abordarea managementului datelor s-a schimbat calitativ: dintr-o artă s-a transformat într-o știință, ceea ce a dus la dezvoltarea revoluționară a industriei.

Concepte de bază ale modelului relațional

Conform modelului relațional, o relație este un tabel cu date. O relație poate avea unul sau mai multe atribute (trăsături) corespunzătoare coloanelor acestui tabel și un set (eventual gol) de date, care sunt seturi ale acestor atribute (se numesc tuple n-are, sau înregistrări) și care corespund cu rândurile mesei.

Pentru orice tuplu, valorile atributelor trebuie să aparțină așa-numitelor domenii. De fapt, un domeniu este un anumit set de date care definește setul tuturor valorilor valide.

Să ne uităm la un exemplu. Să existe un domeniu Zilele săptămânii care să conțină valori de luni până duminică. Dacă o relație are un atribut WeekDay corespunzător acestui domeniu, atunci orice tuplu din relație trebuie să aibă una dintre valorile enumerate în coloana WeekDay. Nu au voie să apară valorile ianuarie sau pisică.

Vă rugăm să rețineți: atributul trebuie să aibă una dintre valorile valide. Specificarea mai multor valori simultan este interzisă. Astfel, pe lângă cerința ca valorile atributelor să aparțină unui anumit domeniu, trebuie îndeplinită condiția atomicității acestuia. Aceasta înseamnă că aceste semnificații nu pot fi descompuse, adică nu pot fi împărțite în părți mai mici fără a pierde sensul de bază. De exemplu, dacă valoarea atributului conținea simultan luni și marți, atunci se pot distinge două părți, păstrând sensul inițial - Ziua săptămânii; prin urmare, această valoare de atribut nu este atomică. Cu toate acestea, dacă încercați să despărțiți semnificația „luni” în părți, veți obține un set de litere individuale - de la „P” la „K”; sensul inițial se pierde, deci sensul „luni” este atomic.

Relațiile au și alte proprietăți. Cea mai semnificativă dintre ele este proprietatea matematică a operațiilor închise. Aceasta înseamnă că, în urma efectuării oricărei operații asupra unei relații, trebuie să apară o nouă relație. Această proprietate vă permite să obțineți rezultate previzibile atunci când efectuați operații matematice asupra relațiilor. În plus, devine posibilă reprezentarea operațiunilor sub formă de expresii abstracte cu diferite niveluri de imbricare.

În lucrarea sa originală, Dr. Codd a definit un set de opt operatori numit algebră relațională. Patru operatori – uniunea, multiplicarea logică, diferența și produsul cartezian – au fost transferați din teoria mulțimilor tradiționale; restul operatorilor au fost creați special pentru a se ocupa de relații. Lucrările ulterioare ale Dr. Codd, Chris Date și alți cercetători au propus operatori suplimentari. Mai târziu în acest articol, ne vom uita la trei operatori relaționali: proiectați, selectați sau restricționați și alăturați.

sql și model relațional

Acum că ești familiarizat cu modelul relațional, să uităm de el. Desigur, nu pentru totdeauna, ci doar pentru a explica următoarele: deși modelul relațional propus de Dr. Codd a fost folosit în dezvoltarea sql, nu există o corespondență completă sau literală între cele două (acesta este unul dintre motive). de ce standardul sql-92 nu are termenul de atitudine). De exemplu, conceptele unui tabel sql și o relație nu sunt echivalente, deoarece tabelele pot avea mai multe rânduri identice simultan, în timp ce tupluri identice nu au voie să apară în relații. În plus, SQL nu prevede utilizarea domeniilor relaționale, deși tipurile de date joacă un rol într-o oarecare măsură (unii susținători influenți ai modelului relațional încearcă acum să insiste pentru includerea domeniilor relaționale în viitorul standard SQL).

Din păcate, inconsecvența dintre sql și modelul relațional a dat naștere de-a lungul anilor la multe neînțelegeri și dispute. Dar, deoarece subiectul principal al articolului este studiul sql și nu modelul relațional, aceste probleme nu sunt discutate aici. Nu uitați că există diferențe între termenii folosiți în SQL și modelul relațional. În continuare, în articol vor fi folosiți numai termenii acceptați în sql. În loc de relații, atribute și tupluri, vom folosi analogii lor sql: tabele, coloane și rânduri.

Sql static și dinamic

Este posibil să fiți deja familiarizați cu termeni precum SQL static și dinamic. O interogare sql este statică dacă este compilată și optimizată într-o etapă anterioară execuției programului. Am menționat deja o formă de SQL static când am vorbit despre încorporarea comenzilor sql în programele C sau Cobol (există un alt nume pentru astfel de expresii - embedded sql). După cum probabil ghiciți, o interogare SQL dinamică este compilată și optimizată în timpul execuției programului. De regulă, utilizatorii obișnuiți folosesc SQL dinamic, care le permite să creeze interogări în conformitate cu nevoile lor imediate. Una dintre opțiunile de utilizare a interogărilor SQL dinamice este apelul lor interactiv sau direct (există chiar și un termen special - directsql), atunci când interogările trimise spre procesare sunt introduse interactiv din terminal. Există anumite diferențe între SQL static și dinamic în sintaxa constructelor utilizate și a caracteristicilor de execuție, dar aceste probleme depășesc domeniul de aplicare al articolului. Remarcăm doar că, pentru claritatea înțelegerii, exemplele sunt date sub formă de interogări sql directe, deoarece acest lucru permite nu numai programatorilor, ci și majorității utilizatorilor finali, să învețe cum să folosească sql.

Cum să înveți sql

Acum sunteți gata să scrieți primele interogări SQL. Dacă aveți acces la baza de date prin sql și doriți să folosiți exemplele noastre în practică, atunci luați în considerare următoarele: trebuie să vă conectați ca utilizator cu drepturi nelimitate și veți avea nevoie de instrumente software pentru procesarea interactivă a interogărilor SQL (dacă suntem vorbind despre o bază de date de rețea, ar trebui să discutați cu administratorul bazei de date despre acordarea drepturilor corespunzătoare). Dacă nu aveți acces la baza de date prin sql, nu vă faceți griji: toate exemplele sunt foarte simple și le puteți da seama „uscate”, fără a merge la mașină.

Pentru a efectua orice acțiune în sql, trebuie să executați o expresie în limbajul sql. Există mai multe tipuri de expresii, dar printre ele se pot distinge trei grupuri principale: comenzi ddl (limbaj de definire a datelor), comenzi dml (limbaj de manipulare a datelor) și instrumente de control al datelor. Astfel, într-un fel, sql combină trei limbi diferite.

Limbajul de descriere a datelor Comenzi

Să începem cu una dintre comenzile principale ddl - create table. Există mai multe tipuri de tabele în sql, principalele sunt de două tipuri: de bază (de bază) și selective (vizualizări). Tabelele de bază sunt cele legate de date reale; selective sunt tabele „virtuale” care sunt create pe baza informațiilor obținute din tabele de bază; dar pentru utilizatori formularele arată ca niște tabele obișnuite. Comanda create table este concepută pentru a crea tabele de bază.

În comanda create table, trebuie să specificați numele tabelului, să specificați lista de coloane și tipurile de date pe care le conțin. Alte elemente opționale pot fi, de asemenea, prezente ca parametri, dar mai întâi să ne uităm doar la parametrii de bază. Să arătăm cea mai simplă formă sintactică pentru această comandă:

creați tableTableName(ColumnDataType) ;

create și table sunt cuvinte cheie SQL; TableName, Column și DataType sunt parametri formali, în loc de care utilizatorul introduce valori reale de fiecare dată. Parametrii Column și DataType sunt încadrați în paranteze. În sql, parantezele sunt utilizate în mod obișnuit pentru a grupa elemente individuale. În acest caz, vă permit să combinați definiții pentru o coloană. Punctul și virgulă de sfârșit este un separator de comandă. Trebuie să încheie orice expresie în limbajul sql.

Să ne uităm la un exemplu. Să presupunem că trebuie să creați un tabel pentru a stoca date despre toate întâlnirile. Pentru a face acest lucru, introduceți comanda în sql:

creați întâlniri de masă (date_date_programare);

După executarea acestei comenzi, va fi creat un tabel numit programări, unde există o coloană, appointment_date, în care se pot scrie date de tipul date. Deoarece nu au fost introduse date încă, numărul de rânduri din tabel este zero (comanda de creare a tabelului definește doar tabelul; valorile reale sunt introduse cu comanda de inserare, care este discutată mai târziu).

Parametrii appointments și appointment_date sunt numiți identificatori deoarece specifică nume pentru anumite obiecte de bază de date, în acest caz nume pentru un tabel și, respectiv, o coloană. Există două tipuri de identificatori în SQL: obișnuiți și delimitați. Identificatorii evidențiați sunt încadrați între ghilimele duble și sunt sensibile la majuscule. Identificatorii obișnuiți nu se disting prin caractere limitate, iar scrierea lor nu face distincție între majuscule și minuscule. Acest articol folosește numai identificatori obișnuiți.

Caracterele folosite pentru a construi identificatorii trebuie să îndeplinească anumite reguli. Identificatorii obișnuiți pot folosi doar litere (nu neapărat latine, ci și alte alfabete), cifre și caracterul de subliniere. Identificatorul nu trebuie să conțină semne de punctuație, spații sau caractere speciale (#, @, % sau!); în plus, nu poate începe cu un număr sau cu un caracter de subliniere. Puteți utiliza cuvinte cheie SQL separate pentru identificatori, dar acest lucru nu este recomandat. Un identificator este destinat să desemneze un obiect, deci trebuie să aibă un nume unic (într-un anumit context): nu puteți crea un tabel cu un nume care se găsește deja în baza de date; Nu puteți avea coloane cu aceleași nume în același tabel. Apropo, rețineți că întâlnirile și întâlnirile sunt aceleași nume pentru sql. Numai schimbarea majusculei literelor nu poate crea un nou identificator.

Deși un tabel poate avea doar o coloană, în practică sunt de obicei necesare tabele cu mai multe coloane. Comanda pentru a crea un astfel de tabel în general arată astfel:

creați tableTableName(ColumnDataType[ ( , ColumnDataType )]) ;

Parantezele pătrate sunt folosite pentru a desemna elemente opționale, parantezele conțin elemente care pot reprezenta o listă de constructe cu o singură cale (atunci când introduceți o comandă SQL reală, nu sunt plasate nici una, nici celelalte paranteze). Această sintaxă vă permite să specificați orice număr de coloane. Rețineți că al doilea element este precedat de o virgulă. Dacă există mai mulți parametri în listă, aceștia sunt separați unul de celălalt prin virgule.

creați tabelul appointments2 (dată_întâlnire, oră, oră, descriere varchar (256)) ;

Această comandă creează tabelul appointments2 (noul tabel trebuie să aibă un alt nume, deoarece tabelul de întâlniri este deja prezent în baza de date). Ca și primul tabel, are o coloană appointment_date pentru a înregistra datele programărilor; În plus, a apărut o coloană appointment_time pentru a înregistra ora acestor întâlniri. Parametrul de descriere este un șir de text care poate conține până la 256 de caractere. Acest parametru este specificat ca varchar (prescurtare pentru caracterul care variază) deoarece nu se știe dinainte cât spațiu va fi necesar pentru intrare, dar este clar că descrierea nu va lua mai mult de 256 de caractere. Când descrieți un parametru de tip șir de caractere (și alte tipuri), este indicată lungimea parametrului. Valoarea acestuia este specificată în paranteze în dreapta numelui tipului.

Poate ați observat că în cele două exemple discutate, intrarea comenzii este formatată diferit. Dacă în primul caz comanda este plasată complet pe o linie, atunci în al doilea după prima paranteză deschisă introducerea este continuată pe o linie nouă, iar definiția fiecărei coloane ulterioare începe pe o linie nouă. Nu există cerințe speciale pentru formatarea înregistrărilor în sql. Spărgerea unui record în rânduri îl face mai ușor de citit. Când scrieți comenzi, limbajul sql vă permite nu numai să divizați comanda în linii, ci și să inserați indentări la începutul liniilor și spații între elementele de înregistrare.

Acum că cunoașteți regulile de bază, să ne uităm la un exemplu mai complex de creare a unui tabel cu mai multe coloane. La începutul articolului a fost afișat tabelul angajaților. Conține următoarele coloane: nume, prenume, data angajării, departament, categorie și salariu pe an. Următoarea comandă sql este utilizată pentru a defini acest tabel:

creați angajați de tabel (caracterul nume_de_nume (13) nu nul, caracterul prenumelui (10) nu nul, data angajării_date, caracterul filială_oficiu (15), grad_nivel mic, salariu zecimal (9, 2));

Echipa întâlnește mai multe elemente noi. În primul rând, există expresia not null la sfârșitul definiției coloanelor last_name și first_name. Cu ajutorul unor astfel de structuri se stabilesc cerințe care trebuie respectate. În acest caz, se indică faptul că la introducere trebuie completate câmpurile last_name și first_name; Nu puteți lăsa aceste coloane goale (acest lucru este destul de logic: cum puteți identifica un angajat fără a-i cunoaște numele?).

În plus, exemplul conține trei tipuri de date noi: caracter, smallint și zecimal. Până acum nu am vorbit prea mult despre tipuri. Deși sql nu are domenii relaționale, are un set de tipuri de date de bază. Aceste informații sunt folosite la alocarea memoriei și la compararea valorilor; într-o anumită măsură restrânge lista de valori posibile de intrare, dar controlul tipului în sql este mai puțin strict decât în ​​alte limbi.

Toate tipurile de date disponibile în sql pot fi împărțite în șase grupuri: șiruri de caractere, valori numerice exacte, valori numerice aproximative, șiruri de biți, date și intervale. Am enumerat toate soiurile, dar acest articol va discuta în detaliu doar câteva dintre ele (șirurile de biți, de exemplu, nu prezintă un interes deosebit pentru utilizatorii obișnuiți).

Apropo, dacă ai crezut că data și ora sunt o greșeală de tipar, te-ai înșelat. Acest grup (datetime) include majoritatea tipurilor de date legate de timp utilizate în sql (parametrii precum intervalele de timp sunt separați într-un grup separat). În exemplul anterior, am întâlnit deja două tipuri de date din grupul dată-oră - data și ora.

Următorul tip de date cu care ești deja familiarizat este caracterul care variază (sau doar varchar); aparține grupului șirurilor de caractere. Dacă varchar este folosit pentru a stoca șiruri de lungime variabilă, atunci tipul char întâlnit în al treilea exemplu este destinat să stocheze șiruri cu un număr fix de caractere. De exemplu, coloana last_name va conține șiruri de 13 caractere, indiferent de numele de familie introduse, fie că este poe sau penworth-chickering (în cazul poe, restul de 10 caractere vor fi umplute cu spații).

Din punctul de vedere al utilizatorului, varchar și char au aceeași semnificație. De ce a fost necesar să se introducă două tipuri? Cert este că, în practică, de obicei, trebuie să cauți un compromis între performanță și economisirea spațiului pe disc. De regulă, utilizarea șirurilor cu o lungime fixă ​​oferă un anumit beneficiu în ceea ce privește viteza de acces, dar dacă lungimea șirului este prea mare, spațiul pe disc este irosit. Dacă în appointments2 rezervați 256 de caractere pentru fiecare linie de comentariu, atunci acest lucru se poate dovedi a fi irațional; cel mai adesea liniile vor fi semnificativ mai scurte. Pe de altă parte, numele de familie variază, de asemenea, în lungime, dar în general necesită aproximativ 13 caractere; în acest caz, pierderile vor fi minime. O regulă generală bună este: dacă știți că lungimea șirului variază puțin sau este relativ mică, atunci folosiți char; în alte cazuri - varchar.

Următoarele două noi tipuri de date, smallint și decimal, aparțin grupului de valori numerice exacte. smallint este prescurtare pentru mic întreg. SQL oferă, de asemenea, un tip de date întreg. Prezența a două tipuri similare în acest caz se explică prin considerente de economisire a spațiului. În exemplul nostru, valorile parametrului grade_level pot fi reprezentate folosind un număr din două cifre, astfel încât este utilizat tipul smallint; cu toate acestea, în practică nu se știe întotdeauna ce valori maxime pot avea parametrii. Dacă nu există astfel de informații, atunci utilizați un întreg. Suma reală alocată pentru stocarea parametrilor smallint și întregi, precum și intervalul corespunzător de valori pentru acești parametri, este specifică fiecărei platforme.

Tipul de date zecimale, folosit în mod obișnuit pentru contabilitatea financiară, vă permite să specificați un model cu numărul necesar de zecimale. Deoarece acest tip este folosit pentru notații numerice precise, garantează precizie atunci când se efectuează operații matematice pe date zecimale. Dacă utilizați tipuri de date din grupul de notații numerice aproximative pentru valori zecimale, de exemplu float (număr cu virgulă mobilă), acest lucru va duce la erori de rotunjire, deci această opțiune nu este potrivită pentru calcule financiare. Pentru a defini parametrii de tip zecimal, se folosește următoarea notație:

unde p este numărul de zecimale, d este numărul de zecimale. În loc de p, scrieți numărul total de cifre semnificative în valorile utilizate, iar în loc de d, scrieți numărul de zecimale.

Bara laterală „Crearea unui tabel” arată un rezumat complet al comenzii de creare a unui tabel. Conține elemente noi și arată formatul pentru toate tipurile de date luate în considerare (În principiu, există și alte tipuri de date, dar nu le luăm în considerare încă).

La început, poate părea că sintaxa comenzilor sql este prea complicată. Dar îl puteți înțelege cu ușurință dacă studiați cu atenție exemplele de mai sus. Un element suplimentar a apărut pe diagramă - o linie verticală; servește la distingerea între modele alternative. Cu alte cuvinte, atunci când definiți fiecare coloană, trebuie să selectați tipul de date adecvat (după cum vă amintiți, parametrii opționali sunt încadrați între paranteze drepte, iar constructele care pot fi repetate de mai multe ori sunt incluse în acolade; aceste caractere speciale nu sunt scrise în comenzi sql reale). Prima parte a diagramei arată numele complete pentru tipurile de date, a doua conține numele lor prescurtate; în practică, puteți folosi oricare dintre ele.

Prima parte a articolului este finalizată. Al doilea va fi dedicat studierii comenzilor DML de inserare, selectare, actualizare și ștergere. Condițiile de eșantionare a datelor, operatori de comparare și operatori logici, utilizarea valorilor nule și logica ternară vor fi, de asemenea, acoperite.

Crearea unui tabel. Sintaxa comenzii create table este următoarea: parametrii opționali sunt indicați între paranteze drepte, iar structurile repetate sunt indicate în paranteze.

creați tabel tabel (caracter coloană (lungime) [ constrângere ] | caracter care variază (lungime) [ constrângere ] | dată [ constrângere ] | oră [ constrângere ] | întreg [ constrângere ] | smallint [ constrângere ] | zecimală (precizie, zecimale) [ constrângere ] |. float (precizie) [ constrângere ] [( , coloană char (lungime) [ constrângere ] | varchar (lungime) [ constrângere ] | dată [ constrângere ] | timp [ constrângere ] | int [ constrângere ] | smallint [ constrângere ] | dec (precizie, zecimale) [ constrângere ] |.

Secretul numelui SQL

La începutul anilor 1970. ibm a început să implementeze modelul de baze de date relaționale propus de Dr. Codd. Donald Chamberlin și un grup de alții de la Unitatea de Cercetare Avansată au creat un limbaj prototip numit limba engleză structurată de interogare, sau pur și simplu o continuare. Ulterior a fost extins și rafinat. Noua versiune propusă de ibm s-a numit sequel/2. A fost folosit ca interfață de programare (api) pentru proiectarea primului sistem de baze de date relaționale de la ibm, system/r. Din motive legate de nuanțe legale, ibm a decis să schimbe numele: în loc de sequel/2, utilizați sql (limbaj de interogare structurat). Această abreviere este adesea pronunțată „see-ku-el”.

Există diferențe semnificative între prototipurile de sequel timpuriu și standardul sql acum recunoscut în diferite organizații. Jim Melton, care a pregătit standardul sql-92, a afirmat chiar că mulți oameni greșesc când cred că cuvântul „structurat” reflectă corect specificul acestui limbaj (jim melton și Alan R. Simon „înțelegerea noului sql: un ghid complet ." San Francisco : morgan kaufmann, 1993. isbn: 1-55860-245-3). Prin urmare, de fapt, sql este doar un nume, o succesiune de litere s-q-l și nimic mai mult.

Rău Bun

Limbaj de programare

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

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

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

În ciuda existenței standardelor, cele mai obișnuite implementări SQL diferă atât de mult încât codul poate fi rareori portat de la un sistem de gestionare a bazelor de date la altul fără a face modificări semnificative. Acest lucru se datorează lungimii și complexității standardului, precum și lipsei sale de specificații în unele domenii importante de implementare.

SQL a fost creat ca o modalitate simplă, standardizată de a prelua și manipula datele conținute într-o bază de date relațională. Ulterior, a devenit mai complex decât intenționat și a devenit mai degrabă un instrument pentru dezvoltatori decât un instrument pentru utilizatorul final. În prezent, SQL (în cea mai mare parte implementat de Oracle) rămâne cel mai popular dintre limbajele de gestionare a bazelor de date, deși există o serie de alternative.

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

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

Trebuie remarcat faptul că SQL implementează o paradigmă de programare declarativă: fiecare instrucțiune descrie doar acțiunea necesară, iar SGBD ia o decizie cu privire la modul de realizare a acesteia, de exemplu. planifică operaţiile elementare necesare efectuării unei acţiuni şi le realizează. Cu toate acestea, pentru a utiliza în mod eficient capacitățile SQL, un dezvoltator trebuie să înțeleagă cum DBMS analizează fiecare instrucțiune și își creează planul de execuție.

Exemple:

Salut Lume!:

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

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

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

factorial:

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

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

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

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

numerele Fibonacci:

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

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

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

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

Salut Lume!:

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

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

factorial:

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

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

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

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

numerele Fibonacci:

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

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

factorial:

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

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

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

numerele Fibonacci:

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

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

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

factorial:

Exemplu pentru versiunile MySQL 5

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

numerele Fibonacci:

Exemplu pentru versiunile MySQL 5

Înlocuiți TABLE cu orice tabel pe care îl puteți accesa, de exemplu mysql.help_topic .

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

Salut Lume!:

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

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

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

factorial:

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

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

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

numerele Fibonacci:

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

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

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

Ecuația pătratică:

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

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

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

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

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

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

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

PHP și baze de date

Capacitatea de a stoca și de a prelua eficient cantități mari de informații a adus o contribuție uriașă la dezvoltarea cu succes a Internetului. De obicei, bazele de date sunt folosite pentru a stoca informații. Funcționarea site-urilor cunoscute precum Yahoo, Amazon și Ebay depinde în mare măsură de fiabilitatea bazelor de date care stochează cantități enorme de informații. Desigur, suportul pentru baze de date nu este doar în beneficiul corporațiilor gigantice – programatorii web au la dispoziție câteva implementări puternice de baze de date, distribuite la un cost relativ scăzut (sau chiar gratuit).

Organizarea corectă a bazei de date oferă capabilități de recuperare a datelor mai rapide și mai flexibile. Simplifică foarte mult implementarea instrumentelor de căutare și sortare, iar problemele privind drepturile de acces la informații sunt rezolvate folosind controalele de privilegii găsite în multe sisteme de gestionare a bazelor de date (DBMS). În plus, procesele de replicare și arhivare a datelor sunt simplificate.

Capitolul începe cu o descriere detaliată a recuperării și actualizării datelor în MySQL, probabil cel mai popular DBMS folosit în PHP (http://www.mysql.com). Folosind MySQL ca exemplu, vom arăta cum datele din baza de date sunt încărcate și actualizate în PHP; Ne vom uita la instrumentele de bază de căutare și sortare utilizate în multe aplicații web. Vom trece apoi la suportul PHP pentru ODBC (Open Data Base Connectivity), o interfață generică care poate fi folosită pentru a se conecta la diferite DBMS-uri în același timp. Suportul ODBC în PHP va fi demonstrat prin conectarea și preluarea datelor dintr-o bază de date Microsoft Access. Capitolul se încheie cu un proiect care folosește PHP și MySQL pentru a crea un director ierarhic care conține informații despre site-urile preferate. Când site-uri noi sunt incluse în catalog, utilizatorul le atribuie uneia dintre categoriile standard definite de administratorul site-ului.

Înainte de a discuta despre MySQL, vreau să spun câteva cuvinte despre SQL, cel mai comun limbaj pentru lucrul cu baze de date. Limbajul SQL este baza aproape a tuturor SGBD-urilor existente. Pentru a continua să priviți exemple de lucru cu baze de date, trebuie să aveți cel puțin o înțelegere generală a modului în care funcționează SQL.

SQL este în general descris ca limbajul standard folosit pentru a interacționa cu bazele de date relaționale (vezi mai jos). Cu toate acestea, SQL nu este un limbaj de programare precum C, C++ sau PHP. Mai degrabă, este un instrument de interfață pentru efectuarea diferitelor operațiuni de bază de date, oferind utilizatorului un set standard de comenzi. Capacitățile SQL nu se limitează la preluarea datelor dintr-o bază de date. SQL acceptă o varietate de opțiuni pentru interacțiunea cu o bază de date, inclusiv:

  • definirea structurii datelor-- definirea structurilor utilizate la stocarea datelor;
  • eșantionarea datelor-- încărcarea datelor din baza de date și prezentarea acestora într-un format convenabil pentru ieșire;
  • procesarea datelor-- inserarea, actualizarea și ștergerea informațiilor;
  • controlul accesului-- capacitatea de a permite/interzice eșantionarea, inserarea, actualizarea și ștergerea datelor la nivelul utilizatorilor individuali;
  • controlul integrității datelor-- Păstrarea structurii datelor în cazul unor probleme precum actualizări paralele sau defecțiuni ale sistemului.

Vă rugăm să rețineți că definiția SQL a declarat că acest limbaj este destinat să funcționeze relaționale baze de date. În SGBD-urile relaționale, datele sunt organizate ca un set de tabele interconectate. Relațiile dintre tabele sunt implementate sub formă de legături către date din alte tabele. Masa poate fi gândit ca o matrice bidimensională în care locația fiecărui element este caracterizată de valori specifice de rând și coloană. Un exemplu de bază de date relațională este prezentat în Fig. 11.1.

Orez. 11.1.Exemplu de bază de date relațională

După cum se poate observa din fig. 11.1, fiecare tabel este format din rânduri (înregistrări) și coloane (câmpuri). Fiecărui câmp i se atribuie un nume unic (în cadrul tabelului). Observați relația dintre tabelele client și comenzi, indicată de o săgeată. Un scurt identificator de client este inclus în informațiile despre comandă, ceea ce evită stocarea redundantă a numelui clientului și a altor detalii. Mai există o relație în baza de date afișată - între tabelele comenzi și produse. Această conexiune se stabilește folosind câmpul prod_id, care stochează identificatorul produsului comandat de acest client (definit de câmpul custjd). Având aceste conexiuni, este ușor să faceți referire la date complete despre clienți și produse folosind identificatori simpli. O bază de date organizată corespunzător devine un instrument puternic pentru organizarea și stocarea eficientă a datelor cu redundanță minimă. Amintiți-vă această bază de date, mă voi referi la ea des în exemple suplimentare.

Deci, cum sunt efectuate operațiunile de baze de date relaționale? Pentru a face acest lucru, SQL are un set special de comenzi generale - cum ar fi SELECT, INSERT, UPDATE și DELETE. De exemplu, dacă trebuie să obțineți adresa de e-mail a unui client cu ID 2001cu (vezi Figura 11.1), trebuie doar să rulați următoarea comandă SQL:

SELECTAȚI cust_email FROM clienții WHERE custjd = "2001cu"

Totul este destul de logic, nu-i așa? Pe scurt, comanda arată astfel:

SELECTAȚI nume_câmp FROM nume_tabel [condiția WHERE]

Parantezele pătrate indică faptul că partea finală a comenzii este opțională. De exemplu, pentru a obține adresele de e-mail ale tuturor clienților din tabelul clienți, rulați următoarea interogare:

SELECTAȚI cust_email FROM clienți

Să presupunem că doriți să adăugați o nouă intrare la tabelul cu produse. Cea mai simplă comandă de inserare arată astfel:

INSERT în produse VALORI ("1009pr", "Roșii roșii", "1.43");

Dacă mai târziu trebuie să ștergeți aceste date, utilizați următoarea comandă:

DELETE FROM produsele WHERE prod_id = 1009r";

Există multe tipuri de comenzi SQL și o descriere completă a acestora depășește scopul acestei cărți. O carte separată ar putea fi scrisă cu ușurință pe această temă! Am încercat să păstrez comenzile SQL folosite în exemple relativ simple, dar suficient de realiste. Există o mulțime de informații și resurse de instruire SQL pe Web. Unele link-uri sunt furnizate la sfârșitul acestei secțiuni.

Nu este necesar să scrieți comenzile SQL cu caractere mari. Cu toate acestea, prefer această notație deoarece ajută la distingerea componentelor cererii.

Din moment ce citiți această carte, probabil vă întrebați cum să lucrați cu baze de date pe Web? De regulă, mai întâi, folosind câteva

sau un limbaj de interfață (PHP, Java sau Perl), se creează o conexiune la baza de date, după care programul accesează baza de date cu interogări folosind un set standard de instrumente. Un limbaj de interfață poate fi gândit ca un fel de „clei” care leagă baza de date de Web. Mă îndrept către limbajul meu favorit pentru front-end - PHP.