Documente Academic
Documente Profesional
Documente Cultură
SQL
1. Introducere
MySQL este un sistem client/server de gestiune a bazelor de date relaţionale originar din
Scandinavia. MySQL include un server SQL, programe client pentru accesul la server,
instrumente administrative şi o interfaţă e programare pentru scrierea propriilor
dumneavoastră programe.
Bazele sistemului MySQL au fost puse în 1979, o dată cu instrumentul pentru baze de
date NIREG, creat de Michael "Monty" Widenius pentru compania suedeză TcX. În 1994,
TcX a început să caute un server SQL pentru a-l utiliza la dezvoltarea aplicaţiilor Web
Welcome to the MySQL monitor. Commands end with ; or \g. După ce stabiliţi o conexiune
Your MySQL connection id is 1805 to server version: 3.22.25- cu serverul, puteţi încheia
log sesiunea oricând tastând
QUIT: mysql> QUIT Bye
Type 'help' for help.
mysql>
5. Emiterea de interogări
Iată un exemplu de interogare simplă şi rezultatul acesteia:
Această comandă indică data şi ora curentă.
curentă.
(Funcţia NOW() nu este utilă ca atare, dar se poate folosi în
expresii - de exemplu, pentru, a calcula diferenţa dintre data
curentă şi o altă dată.)
De asemenea, mysql afişează numărul
rândurilor rezultatului.
Deoarece mysql aşteaptă caracterul punct şi
virgulă înainte de a trimite interogarea
serverului, nu trebuie să introduceţi toată
interogarea pe un singur rând. Puteţi extinde
o interogare pe mai multe linii, dacă doriţi:
Cele două interogări par similare, dar a doua eşuează, deoarece paranteza nu
apare imediat după numele funcţiei.
6. Crearea bazei de date
Pentru a crea o bază de date nouă, conectaţi-vă la server folosind mysql şi apoi emiteţi o
instrucţiune CREATE DATABASE care specifică numele bazei de date:
mysql> CREATE DATABASE samp_db;
Va trebui să creaţi baza de date samp_db înainte de a putea crea oricare dintre tabelele care
vor fi incluse în aceasta sau înainte de a efectua orice operaţii folosind conţinutul acelor tabele.
Prin crearea bazei de date, devine aceasta baza de date curentă (prestabilită)? Nu, nu devine,
aşa cum se poate vedea prin executarea următoarei interogări:
mysql> SELECT DATABASE();
Pentru ca baza de date samp_db să devină curentă, emiteţi o instrucţiune USE:
mysql> USE samp_db
USE este una dintre puţinele instrucţiuni care nu necesită un caracter punct şi virgulă de
terminare a instrucţiunii, deşi îl puteţi adăuga, dacă doriţi.
6.1. Crearea tabelelor
Pentru evidenţiere modului de creare a tabelelor in mysql, vom folosi cazul bazei de date pentru un
catalog cu note ale unor elevi. Pentru a vedea care sunt tabelele de care avem nevoie pentru
proiectul de evidenţă a rezultatelor şcolare, să examinăm modul în care se pot scrie punctajele atunci
când folosiţi un catalog pe hârtie.
Tip chestionar-test
Data examinare
Redundanţa datelor
O cerinţă impusă tabelului eveniment de macheta prezentată anterior este aceea ca datele să fie unice,
deoarece data este folosită pentru a corela înregistrările din tabelele puncte şi eveniment. Cu alte
cuvinte, nu puteţi da două chestionare în aceeaşi zi, respectiv un chestionar şi un test. Dacă o faceţi,
veţi avea două seturi de înregistrări în tabelul puncte şi două înregistrări în tabelul eveniment, toate cu
aceeaşi dată, şi nu veţi mai putea stabili o corespondenţă între înregistrările din cele două tabele.
Instrucţiunea CREATE TABLE pentru tabelul elev arată astfel:
Instrucţiunea CREATE TABLE creează un tabel denumit elev cu trei coloane: nume, sex şi elev_id. elev_id
nume este o coloană şir de lungime variabilă, care poate conţine maximum 20 de caractere.
sex determină dacă un elev este băiat sau fată. Este o coloană de tip ENUM (enumerare), ceea ce
înseamnă că poate lua numai una din valorile enumerate explicit în specificaţia coloanei, în speţă M sau
F, adică de sex masculin sau feminin. ENUM este util când aveţi un set limitat de valori pe care le poate
conţine o coloană. Am fi putut folosi în schimb CHAR(1), dar ENUM specifică mai exact care pot fi
valorile din coloană. Apropos, valorile dintr-o coloană ENUM nu trebuie să fie neapărat compuse dintr-un
singur caracter. Coloana tip ar fi putut fi declarată astfel: ENUM (' feminin' , ' masculin ').
elev_id este o coloană de tip întreg care va conţine numere unice de identificare a elevilor. Declaraţia
coloanei elev_id are numeroase părţi, chiar dacă nu conţine decât numere:
• INT arată că în coloană sunt incluse numere întregi (valori fără parte fracţionară);
• UNSIGNED interzice utilizarea numerelor negative;
• NOT NULL înseamnă că valoarea coloanei trebuie completată;
• AUTO_INCREMENT este un atribut special în MySQL. MySQL generează automat un număr
unic cu o unitate mai mare decât valoarea maximă care se află în coloană la momentul respectiv.;
• PRIMARY KEY arată că acea coloană este indexată pentru căutări rapide şi că fiecare valoare
din coloană trebuie să fie unică. Aceasta ne împiedică să folosim din greşeală acelaşi identificator
de două ori, ceea ce este o proprietate necesară a numerelor de identificare a elevilor. (Nu numai
atât; MySQL impune ca fiecare coloană AUTO_INCREMENT să aibă un indice unic.)
Instrucţiunea CREATE TABLE pentru tabelul eveniment arată astfel:
data conţine o valoare DATE standard MySQL, în format "AAAA-LL-ZZ" (cu anul scris primul).
tip reprezintă tipul punctajului. Ca şi sex din tabelul elev, tip este o coloană de tip enumerare.
Valorile permise sunt T şi C, reprezentând „test", respectiv „chestionar".
eveniment_id este o coloană AUTO_INCREMENT, similară coloanei elev_id din tabelul elev.
Utilizarea opţiunii AUTO_INCREMENT ne permite să generăm cu uşurinţă valori unice ale
identificatorilor de eveniment. Ca în cazul coloanei elev_id din tabelul elev, valorile particulare
sunt mai puţin importante decât unicitatea lor.
Instrucţiunea CREATE TABLE pentru tabelul puncte arată astfel:
Se presupune că valorile punctajelor sunt întotdeauna întregi. Dacă doriţi să permiteţi includerea
unor punctaje precum 58,5, care,conţin o parte fracţionară, veţi folosi unul din tipurile de coloană cu
virgulă mobilă, precum FLOAT sau DECIMAL.
Coloanele elev_id şi eveniment_id sunt întregi care reprezintă elevul şi evenimentul
pentru care a fost acordat fiecare punctaj. Folosindu-le pentru a stabili legături între
tabelele elev şi eveniment, vom putea determina numele elevului şi data evenimentului.
De asemenea, am transformat combinaţia dintre cele două coloane într-o cheie primară
(PRIMARY KEY). Astfel, ne asigurăm că nu vom avea punctaje repetate pentru un elev la
un test sau chestionar dat. De asemenea, modificarea ulterioară a unui punctaj este mai
simplă. De exemplu, când un punctaj a fost introdus incorect, putem elimina înregistrarea veche
atunci când inserăm înregistrările noi, folosind instrucţiunea MySQL
REPLACE. Nu este necesar să folosim o instrucţiune DELETE combinată cu INSERT;
MySQL execută automat această operaţie.
Reţineţi unicitatea combinaţiei între coloanele eveniment_id şi elev_id. În tabelul puncte, nici o
valoare nu este intrinsec unică. Vor exista mai multe înregistrări de punctaje pentru fiecare valoare
eveniment_id (câte una pentru fiecare elev), respectiv mai multe înregistrări pentru fiecare valoare
elev_id (câte una pentru fiecare chestionar şi test).
absenţe arată astfel:
Instrucţiunea CREATE TABLE pentru tabelul absenţ
Relaţionarea tabelelor în MySql este foarte importantă, iar pentru aceasta se foloseşte
ca linie distinctă în tabelul secundar o instrucţiune de forma:
Există numeroase modalităţi de a adăuga date într-o bază de date. Puteţi insera manual înregistrări într-
un tabel emiţând instrucţiuni INSERT. De asemenea, puteţi adăuga înregistrări citindu-le dintr-un fişier,
fie sub formă de valori de date brute pe care le încărcaţi folosind instrucţiunea LOAD DATA sau utilitarul
mysqlimport, fie în formă de instrucţiuni INSERT redactate anterior, pe care le introduceţi în mysql.
Să începem să adăugăm rezultate folosind INSERT, o instrucţiune SQL pentru care specificaţi
tabelul în care doriţi să inseraţi un rând de date şi valorile care vor fi plasate în rândul respectiv.
Instrucţiunea INSERT are mai multe forme:
o Puteţi specifica valori pentru toate coloanele:
INSERT INTO nume_tabel VALUES (valoare 1, valoare2,....)
Cuvântul INTO este opţional începând de la MySQL 3.22.5. (Acest lucru este valabil şi pentru celelalte
forme ale instrucţiunii INSERT.) Lista VALUES trebuie să conţină o valoare pentru fiecare coloană din
tabel, în ordinea în care sunt stocate coloanele în tabel.
Versiunile MySQL începând de la 3.22.5 vă permit să inseraţi mai multe rânduri într-un tabel cu o
singură instrucţiune INSERT, prin specificarea mai multor liste de valori:
INSERT INTO nume_tabel VALUES (...),(...),...
Acest procedeu necesită introducerea de la tastatură a unei cantităţi mai reduse de text decât cea
impusă de mai multe instrucţiuni INSERT, iar execuţia sa de către server este mai eficientă.
o Puteţi denumi coloanele cărora doriţi să le atribuiţi valori, apoi enumeraţi valorile. Acest procedeu
este util când doriţi să creaţi o înregistrare pentru care numai câteva coloane trebuie configurate iniţial.
INSERT INTO nume_tabel (nume_col1 ,nume_col2,...) VALUES (valoare1,valoare2,...)
De la MySQL 3.22.5, această formă a instrucţiunii INSERT permite de asemenea mai multe liste cu
valori (coloanele care nu sunt specificate în lista de coloane primesc o valoare prestabilită):
Toate coloanele care nu sunt specificate în clauza SET primesc o valoare prestabilită.
Nu puteţi insera mai multe rânduri folosind această formă a instrucţiunii INSERT.
O altă metodă pentru încărcarea înregistrărilor într-un tabel este citirea valorilor datelor direct dintr-un
fişier. Puteţi încărca înregistrări în acest mod cu ajutorul instrucţiunii LOAD DATA sau cu utilitarul
mysqlimport. Instrucţiunea LOAD DATA se comportă ca un încărcător de mare capacitate, care citeşte
date dintr-un fişier. Folosiţi această instrucţiune din interiorul programului mysql:
Această instrucţiune citeşte conţinutul fişierului de date membru.txt localizat în catalogul dumneavoastră
curent din gazda programului client şi o trimite serverului, pentru a fi încărcată în tabelul membru.
6.3. Regăsirea informaţiilor
Acum, tabelele noastre au fost create şi încărcate cu date, deci haideţi să vedem ce putem face cu
acele date. Instrucţiunea SELECT vă permite să regăsiţi şi să afişaţi informaţii din tabelele
dumneavoastră, într-o manieră oricât de generală sau de specifică doriţi. Puteţi afişa întregul
conţinut al unui tabel:
SELECT * FROM elev
sau puteţi selecta o singură coloană a unui singur rând:
SELECT punctaj FROM puncte WHERE nume = “85"
Când folosiţi o clauză FROM pentru a specifica un tabel de unde vor fi regăsite datele, forma cea
mai „generică" a instrucţiunii SELECT este aceea prin care se regăsesc toate datele. Pentru
aceasta, folosiţi caracterul *, care este o abreviere de la „toate coloanele". Interogarea următoare
regăseşte toate rândurile din tabelul elev şi le afişează:
Puteţi denumi în mod explicit coloana sau Dacă precizaţi mai mult de o coloană, separaţi numele
coloanele pe care doriţi să le vedeţi. Pentru a coloanelor prin virgule. Instrucţiunea următoare este
selecta numai numele elevilor, procedaţi echivalentă cu SELECT * FROM elev, dar fiecare
astfel: coloană este specificată în mod explicit:
Pentru a efectua căutări ale valorilor NULL, trebuie să folosiţi o sintaxă specială. în loc de a folosi =
sau ! = pentru a testa egalitatea sau inegalitatea, folosiţi IS NULL sau IS NOT NULL.
Puteţi specifica dacă sortarea unei coloane se va face în ordine ascendentă sau descendentă
folosind cuvintele cheie ASC sau DESC după numele coloanelor din clauza ORDER BY. De
exemplu, pentru a sorta numele preşedinţilor în ordine inversă (descrescătoare), folosiţi
DESC astfel:
Rezultatele interogării pot fi sortate pe mai multe coloane, iar fiecare coloană poate fi sortată în
ordine ascendentă sau descendentă, independent de celelalte coloane. Interogarea următoare
regăseşte rânduri din tabelul preşedinte, le sortează în sens descendent în funcţie de statul de
naştere şi după numele de familie în cadrul fiecărui stat:
Limitarea rezultatelor unei interogări
Când o interogare returnează mai multe rânduri, dar dumneavoastră doriţi să vedeţi numai câteva,
clauza LIMIT este utilă, mai ales în conjuncţie cu ORDER BY. MySQL vă permite să limitaţi datele
de ieşire ale unei interogări la primele n rânduri ale rezultatului returnat. Interogarea următoare
selectează pe primii cinci născuţi preşedinţi americani:
Dacă sortaţi în ordine inversă, folosind ORDER BY data_nastere DESC, veţi obţine pe ultimii cinci
născuţi preşedinţi americani.
De asemenea, LIMIT vă permite să extrageţi o secţiune de înregistrări din mijlocul unui set de
rezultate. Pentru aceasta, trebuie să specificaţi două valori. Prima valoare este numărul
înregistrării iniţiale din setul de rezultate pe care doriţi să-l vedeţi. (Prima înregistrare este
numerotată cu 0, nu 1.) Cea de-a doua valoare indică numărul de înregistrări care vor fi
returnate. Interogarea următoare este similară cu precedenta, care returnează cinci înregistrări,
începând de la al unsprezecelea rând al rezultatului:
Calculul şi denumirea valorilor din coloanele de ieşire
Majoritatea interogărilor precedente au produs date de ieşire prin regăsirea valorilor din tabele. MySQL
vă mai permite să calculaţi o valoare din coloana de ieşire ca rezultat al unei expresii. Expresiile pot fi
simple sau complexe. Interogarea următoare evaluează o expresie simplă (o constantă) şi o expresie
mai complexă, care implică numeroase operaţii aritmetice şi câteva apeluri la funcţii:
Puteţi scădea o dată dintr-o altă dată. Aceasta vă permite să găsiţi intervalul dintre date, care este util
pentru determinarea vârstelor. De exemplu, pentru a determina preşedintele care a trăit cel mai mult, se
scade data naşterii din data decesului. Pentru aceasta, convertiţi data_nastere şi data_deces în zile
folosind funcţia TO_DAYS(), luaţi diferenţa şi o împărţiţi la 365 pentru a obţine vârsta aproximativă, în ani:
Funcţia FLOOR () folosită în această interogare elimină toate părţile fracţionare din valoarea vârstei,
pentru a genera un întreg. Stabilirea diferenţei între date este de asemenea utilă pentru determinarea
distanţei în raport cu o anumită dată de referinţă.
Stabilirea corespondenţei cu un model
MySQL vă permite să căutaţi valori care corespund unui anumit model. Astfel, puteţi selecta înregistrări
fără a furniza o valoare exactă. Pentru a executa o operaţie de stabilire a corespondenţei cu un model,
folosiţi operatori speciali (LIKE şi N0T LIKE) şi specificaţi un sir care conţine caractere de înlocuire.
Caracterul _ corespunde oricărui caracter, iar % corespunde oricărei secvenţe de caractere (inclusiv o
secvenţă vidă). Stabilirea corespondenţei cu un model folosind LIKE şi NOT LIKE nu face diferenţa între
majuscule şi minuscule.
Acest model găseşte numele care încep cu W (sau cu w, dacă ar exista):
Această corespondenţă cu un model este eronată. Interogarea ilustrează o eroare comună, şi anume
folosirea unui model cu un operator aritmetic de comparaţie. Unica posibilitate ca această operaţie să
reuşească este ca în coloană să se afle chiar şirul "W% " sau "w% “.
Acest model corespunde numelor de familie care Acest model corespunde numelor de familie care
conţin litera W sau w oriunde în interiorul numelui: conţin exact patru caractere:
Generarea de sumare
Una dintre cele mai utile operaţii pe care MySQL le poate face pentru
dumneavoastră este să rezume mari cantităţi de date brute şi să realizeze sumarul
acestora. MySQL devine un aliat puternic atunci când veţi învăţa să-l folosiţi pentru
a genera sumare, deoarece aceasta este o activitate extrem de obositoare,
consumatoare de timp şi supusă la erori atunci când este efectuată manual.
O altă formă de realizare a unui sumar este numărarea, folosind funcţia COUNT (). Dacă
folosiţi COUNT(*), aceasta vă indică numărul de rânduri selectat de interogarea
dumneavoastră. Dacă interogarea nu are nici o clauză WHERE, COUNT(*) vă indică
numărul rândurilor din tabelul dumneavoastră.
COUNT() poate fi combinată cu ORDER BY şi LIMIT pentru a găsi, de exemplu, cele mai bine
reprezentate patru state din tabelul preşedinte: