Documente Academic
Documente Profesional
Documente Cultură
MySQL este un limbaj SQL (Structured Query Language) server foarte rapid,
robust, multi-utilizator i cu interfaare pentru foarte multe alte programe.
MySQL, cel mai popular limbaj de lucru cu baze de date SQL cu surs deschis
(Open Source SQL database), este produs de MySQL AB. MySQL AB este o
companie comercial care i constituie afacerile din realizarea unor programe
aplicaie cu ajutorul bazelor de date MySQL.
Caracteristici specifice MySQL
- MySQL este un sistem de management a bazelor de date. O baz de date este o
colecie structurat de date. Poate fi orice de la o simpl list de cumprturi pn
la o vast cantitate de informaii n cadrul unei corporaii. Pentru a aduga, accesa
i procesa datele stocate ntr-o baz de date de pe un computer, se poate folosi un
sistem de management a bazelor de date cum ar fi MySQL. Att timp ct
computerele sunt foarte bune n manipularea unor mari cantiti de date,
managementul bazelor de date joac un rol foarte important n aplicaiile de sine
stttoare sau ca pri componente a altor aplicaii.
- MySQL este un sistem de management a bazelor de date relaionale. O baz de
date relaional stocheaz datele n tabele diferite i nu ntr-un singur tabel pentru
c acest sistem este mai flexibil i mai rapid. Tabele sunt interconectate prin
definire de relaii fcnd astfel posibil combinarea de date din diferite tabele n
cadrul unei singure interogri.
- partea SQL din cadrul denumirii MySQL deriv de la "Structured Query
Language" - limbaj de lucru cu baze de date structurat pe interogri - care este unul
dintre cele mai utilizate limbaje pentru accesarea bazelor de date.
- MySQL este un limbaj de lucru cu baze de date cu surs deschis. Sursa deschis
se refer la faptul c este posibil ca oricine s utilizeze i s modifice sursa i
diferitele aplicaii dezvoltate de diferii developeri. Se pot descrca de Internet i se
pot modifica dup propriile dorine i necesiti fr a plti nimic. MySQL
folosete GPL (GNU General Public License), o licen care specific ce poi i ce
nu poi face cu programul software n diferite situaii. Pentru necesitatea de
aplicaii comerciale se poate cumpra versiunea comercial cu licen.
- Motivaia utilizrii limbajului MySQL este faptul c ofer rapiditate,
performan i simplitate n utilizare. Chiar de la bun nceput, MySQL a fost
dezvoltat pentru a manipula baze de date mari mult mai repede dect programele
- 1-
existente la data respectiv pe pia. A fost utilizat cu mare succes de civa ani n
mediile de producie cu cerine ridicate. Dei este n continu dezvoltare, MySQL
ofer astzi un set bogat i foarte util de funcii. Conectivitatea, viteza i
securitatea determin MySQL s fie potrivit pentru accesarea bazelor de date pe
Internet.
- MySQL este un sistem client/server care const ntr-o interfaare cu multiple fire
de execuie pe serverul SQL (suport diferite reveniri) i prezint mai multe
programe client i librrii, programe administrative i cteva interfee de
programare. MySQL are disponibile foarte multe programe software de interfaare
i este foarte probabil s aflai c multe dintre aplicaiile preferate suport deja
interfaare cu limbajul MySQL.
- 2-
/sau mysqld-opt.exe
C:\mysql\bin\mysqlshow
C:\mysql\bin\mysqlshow -u root mysql
C:\mysql\bin\mysqladmin version status proc
C:\mysql\bin\mysql test
- 3-
Dac mysqld rspunde greu la conectri sub Win95/Win98, s-ar putea s existe
probleme cu DNS-ul. n acest caz, pornii mysqld cu opiunea --skip-name-resolve
i utilizai doar localhost-ul la acordarea permisiunilor pe tabelele MySQL.
Exist 2 versiuni de comand MySQL:
mysql - compilat sub Windows, ofer capaciti limitate de editare de text.
mysqlc - compilat cu compilatorul i librriile Cygnus GNU, care ofer editare
linie cu linie.
Dac se dorete utilizarea programului mysqlc.exe, trebuie copiat fiierul
`C:\mysql\lib\cygwinb19.dll' n directorul sistem Windows (`\windows\system').
1.3. Setarea parolei i a drepturilor de utilizare
Privilegiile implicite sub Windows dau tuturor utilizatorilor locali toate drepturile
(privilegiile) asupra tuturor bazelor de date fr a specifica o parol.
Pentru a face mediul MySQL mai sigur, trebuie setat o parol pentru toi
utilizatorii i trebuie tears linia din tabelul mysql.user care are Host='localhost' i
User=''.
Va trebui de asemenea setat o parol pentru super-utilizatorul root. Urmtorul
exemplu ncepe prin tergerea utilizatorul anonim i apoi se seteaz parola pentru
utilizatorul de root:
C:\> C:\mysql\bin\mysql mysql
mysql> DELETE FROM user WHERE Host='localhost' AND User='';
mysql> QUIT
C:\> C:\mysql\bin\mysqladmin reload
C:\> C:\mysql\bin\mysqladmin -u root password parola
Exemplu:
shell> mysql --user=root mysql
mysql> INSERT INTO user SET Host='localhost', User='nume',
Password='parola';
mysql> GRANT ALL PRIVILEGES ON *.* TO nume@localhost
IDENTIFIED BY 'parola' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
Tabelul de drepturi este ncrcat la pornirea serverului sau se poate actualiza dup
o modificare prin instruciunea FLUSH PRIVILEGES.
1.4. Conectarea i deconectarea de la server
Pentru conectarea la server, este nevoie, de obicei, de numele utilizatorului i de o
parol. Dac serverul lucreaz pe un alt sistem dect cel de pe care lucrai e nevoie
s fie specificat numele host-ului:
shell> mysql -h host -u user -p
Enter password: ********
Numele limbilor trebuie specificate cu litere mici, iar fiierele specifice se afl
localizate n directorul `mysql_base_dir/share/LANGUAGE/'.
1.5. Utilizarea mysql n mod Batch
Se poate utiliza mysql n mod interactiv prin introducerea interogrilor la prompter
i vizualizarea rezultatelor. Se poate de asemenea utiliza mysql n mod batch.
Pentru a face acest lucru, se scriu comenzile care se doresc a fi rulate ntr-un fiier
i apoi se ruleaz mysql cu specificarea fiierului de intrare:
shell> mysql < batch-file
Crearea unui fiier script i executarea lui mai trziu are o serie de avantaje fa de
modul interactiv de lucru. Dintre acestea ar fi:
Se pot rula una sau mai multe interogri n mod repetat (zilnic sau
sptmnal), iar scrierea unui script permite evitarea rescrierii interogrilor.
Se pot genera noi interogri de la cele deja existente care au similariti prin
copierea i editarea fiierelor script.
Modul Batch poate fi util atunci cnd exist o interogare pe mai multe linii sau
exist mai multe comenzi. Dac se face o greeal, nu trebuie scris totul din nou.
Se corecteaz eroarea i se execut fiierul nc o dat .
Dac exist o interogare care are un rezultat pe mai multe pagini, se poate scrie
ieirea prin intermediul unui paginator:
shell> mysql < batch-file | more
- 6-
- 7-
Dac se dorete inserarea de date binare ntr-o coloan de tip BLOB urmtoarele
caractere trebuie reprezentate prin secvene escape:
NUL - ASCII 0. Acesta trebuie reprezentat prin `\0` (un backslash i un `0`).
\ - ASCII 92, backslash. Reprezentat prin`\\`.
' - ASCII 39, apostrof. Reprezentat prin `\'`.
" - ASCII 34, ghilimele. Reprezentate prin`\"`.
Dac scriei un cod C, putei folosi funcia C API:
mysql_escape_string()
- 8-
2.1.2. Numere
Numerele ntregi (integer) sunt reprezentate drept secvene de digii. Numerele
reale (float) folosesc ca separator zecimal punctul (`.`). Fiecare tip de numr poate
fi precedat de semnul `-` pentru a indica o valoare negativ.
Exemple de numere ntregi:
1221
0
-32
Un ntreg poate fi scris sub form de numr real; este interpretat ca fiind
echivalentul numrului real.
2.1.3. Valori hexa
MySQL suport valori hexazecimale. n context numr ele sunt referite ca fiind
ntregi cu precizie de 64 de bytes. n cadrul irurilor apar drept iruri binare n care
fiecare pereche de digii hexazecimali este convertit ntr-un caracter:
mysql> SELECT 0xa+0;
-> 10
mysql> select 0x5061756c;
-> Paul
irurile hexazecimale sunt foarte des utilizate de ODBC pentru asignarea de valori
coloanelor BLOB.
2.1.4. Valoarea NULL
Valoarea NULL nsemn "no data'' (fr date) i este diferit fa de valori precum
0 pentru tipurile numerice sau ir gol pentru tipurile string.
NULL poate fi reprezentat prin \N cnd se utilizeaz formatul de fiier de tip text
import sau export (LOAD DATA INFILE, SELECT ... INTO OUTFILE).
- 9-
Lungime maxim
Baz de date
64
Tabele
64
Coloane
Alias-uri
64
255
Caractere permise
Orice caracter care este permis
n numele unui director cu
excepia caracterelor:`/` sau `.`
Orice caracter care este permis
n numele unui fiier cu excepia
caracterelor:`/` sau `.`
Toate caracterele
Toate caracterele
- un nume poate ncepe cu orice caracter care este legal n cadrul unui nume. n
plus, un nume poate ncepe cu un numr (aceasta difer fa de alte sisteme de baze
de date!). Oricum, un nume nu poate conine doar numere.
- nu se poate utiliza caracterul `.` n cadrul numelor deoarece el se utilizeaz pentru
extinderea formatului prin care se pot referi coloanele.
Este recomandabil s nu se utilizeze nume precum 1e, deoarece o expresie precum
1e+1 este ambigu. Poate fi interpretat ca expresia 1e+1 sau ca numrul 1e+1.
- 10-
Specificaie
coloana col_name care aparine tabelului
utilizat n interogare i are numele acestei
coloane
coloana col_name din tabelul tbl_name
al bazei de date curente
coloana col_name din tabelul tbl_name
al bazei de date db_name
o coloan care are nume rezervat sau
conine caractere speciale
Nu este neaprat nevoie s fie specificate tbl_name sau db_name pentru referirea
unei coloane dac ele sunt implicite doar dac referirea ar prea ambigu.
De exemplu, presupunem c avem tabelele t1 i t2 i fiecare conine o coloan c,
i vrei s aflai valoarea coloanei c ntr-o interogare SELECT care utilizeaz i t1 i
t2. n acest caz, c este ambiguu deoarece nu este unic n timpul utilizrii celor
dou tabele din cadrul interogrii, deci trebuie indicat la care tabel se face referirea
scriind t1.c sau t2.c.
n mod similar, dac avem un tabel t din baza de date db1 i un tabel t din baza de
date db2, coloanele trebuie referite prin db1.t.col_name i db2.t.col_name.
Sintaxa .tbl_name specific tabelul tbl_name din baza de date curent. Aceast
sintax este acceptat pentru compatibilitate ODBC, deoarece unele programe
ODBC prefixeaz numele tabelelor prin caracterul `.`.
- 11-
(Se utilizeaz sintaxa `:=`, deoarece `=` este rezervat pentru comparri)
Variabilele utilizator pot fi folosite n locurile n care sunt permise expresii.
De observat c aceasta nu include utilizarea n contexte n care se cere un numr
explicit, cum ar fi clauza LIMIT din cadrul comenzii SELECT, sau clauza
IGNORE number LINES a comenzii LOAD DATA.
Observaie: ntr-o comand SELECT, fiecare expresie este doar evaluat cnd este
trimis ctre client. Aceasta nseamn c n clauza HAVING, GROUP BY sau
ORDER BY nu se poate face referire la o expresie care implic variabile care au
fost setate n poriunea SELECT. De exemplu, urmtoarea comand nu va avea
rezultatul ateptat:
SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
Comentariul prin '--' implic existena cel puin a unui spaiu dup '--'.
- 13-
Cu toate c serverul nelege sintaxa comentariu descris mai sus, exist cteva
limitri referitoare la modul n care mysql interpreteaz comentariile /* ... */ :
Apostroful i ghilimele sunt utilizate pentru a indica ncadrarea unui string,
chiar i n cadrul unui comentariu. Dac nu se nchid ghilimele n cadrul
comentariului, interpretorul nu realizeaz terminarea comentariului. Dac se
ruleaz mysql interactiv, se poate spune c apare o confuzie deoarece prompterul
se schimb din mysql> n '> sau ">.
Un caracter `;` este utilizat pentru a indica sfritul comenzii SQL i ceea e
urmeaz dup el indic nceputul comenzii urmtoare.
Limitrile se aplic atunci cnd se ruleaz mysql interactiv dar i atunci cnd se
scriu comenzile ntr-un fiier i se spune interpretorului mysql s citeasc
comenzile din acel fiier cu comanda mysql <nume_fiier.
- 14-
Cum toate operaiile aritmetice sunt realizate prin utilizarea tipurilor BIGINT
cu semn sau DOUBLE, nu ar trebui utilizate numere ntregi mai mari dect
9223372036854775807 (63 de octei) cu excepia funciilor pe bit, deoarece unii
dintre ultimii digii din rezultat pot fi greii datorit erorilor de rotunjire la
conversia din BIGINT n DOUBLE.
Se poate stoca o valoare integer exact ntr-o coloan de tip BIGINT prin
stocarea ei drept string i nu va fi nevoie de reprezentare intermediar double.
'-', '+', i '*' vor utiliza ca rezultat tipul BIGINT atunci cnd ambele argumente
sunt valori INTEGER! Aceasta nseamn c dac se nmulesc 2 ntregi mari s-ar
putea ca rezultatul s depeasc valoarea 9223372036854775807 iar rezultatul s
nu fie cel ateptat.
FLOAT(precision) [ZEROFILL]
Numr n virgul flotant. Nu poate fi fr semn, iar precision poate avea
valoarea <=24 pentru un numr flotant cu simpl precizie i ntre 25 i 53 pentru
unul n dubl precizie. Aceste tipuri sunt identice cu tipurile FLOAT i DOUBLE
descrise n continuare. FLOAT(X) are acelai interval de valori ca i tipurile
FLOAT i DOUBLE, dar mrimea numrului de zecimale afiate este nedefinit.
Aceasta este o adevrat valoare n virgul flotant, iar utilizarea tipului FLOAT
poate duce la apariia unor probleme neateptate deoarece toate calculele n
MySQL sunt fcute n dubl precizie.
FLOAT[(M,D)] [ZEROFILL]
Un numr n virgul flotant (simpl precizie). Nu poate fi fr semn. Valorile
permise sunt -3.402823466E+38 pn la -1.175494351E-38, 0, i 1.175494351E38 pn la 3.402823466E+38. M reprezint limea afirii i D numrul de
zecimale.
DOUBLE[(M,D)] [ZEROFILL]
DOUBLE PRECISION[(M,D)] [ZEROFILL]
REAL[(M,D)] [ZEROFILL]
A numr n virgul flotant (dubl precizie). Nu poate fi fr semn. Valorile
permise sunt -1.7976931348623157E+308 pn la -2.2250738585072014E-308, 0,
i 2.2250738585072014E-308 pn la 1.7976931348623157E+308. M reprezint
limea afirii i D numrul de zecimale. DOUBLE fr argument sau FLOAT(X)
unde 25 <= X <= 53 reprezint un numr n virgul flotant cu dubl precizie.
DECIMAL[(M[,D])] [ZEROFILL]
NUMERIC(M,D) [ZEROFILL]
Un numr n virgul flotant "unpacked". Nu poate fi fr semn. Se comport ca
o coloan de tip CHAR: "unpacked'' reprezint modul de stocare identic cu al unui
string, utiliznd un caracter pentru fiecare digit din valoare. Punctul zecimal i,
pentru numere negative, semnul minus '-', nu sunt numrate n M (dar spaiile
pentru acestea se rezerv). Dac D este 0, valorile nu vor avea punct zecimal sau
- 16-
parte fracionar. Intervalul maxim pentru valorile de tip DECIMAL este acelai ca
i pentru DOUBLE, dar intervalul pentru o anumit coloan de tip DECIMAL
poate fi forat prin alegerea lui M i a lui D. Dac D nu se scrie este setat la 0. Dac
M nu se scrie este setat la 10.
Tip MySQL
CHAR(NUM) BINARY
VARCHAR(NUM)
FLOAT
DOUBLE
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
MEDIUMBLOB
MEDIUMTEXT
MEDIUMINT
VARCHAR(NUM) BINARY
Maparea tipurilor de date are loc n momentul crerii tabelului. Dac de creeaz un
tabel cu tipurile utilizate de alte programe de baze de date i apoi se aplic o
comand DESCRIBE tbl_name, MySQL afieaz structura tabelului utiliznd
tipurile MySQL echivalente.
- 19-
Spaiu de stocare
1 byte
2 bytes
3 bytes
4 bytes
4 bytes
8 bytes
4 dac X <= 24 sau 8 dac 25 <= X <= 53
4 bytes
8 bytes
8 bytes
8 bytes
M+2 bytes dac D > 0,
M+1 bytes dac D = 0 (D+2, dac M < D)
Spaiu de stocare
3 bytes
8 bytes
4 bytes
3 bytes
1 byte
Spaiu de stocare
M bytes, 1 <= M <= 255
L+1 bytes, unde L<=M i 1<=M<=255
L+1 bytes, unde L < 2^8
L+2 bytes, unde L < 2^16
L+3 bytes, unde L < 2^24
L+4 bytes, unde L < 2^32
1 sau 2 bytes, depinznd de numrul de
valori enumerate
1, 2, 3, 4 sau 8 bytes, depinznd de
numrul de membri
- 20-
1 > '6x';
7 > '6x';
0 > 'x6';
0 = 'x6';
= Egal:
mysql> select
-> 0
mysql> select
-> 1
mysql> select
-> 1
mysql> select
-> 0
mysql> select
-> 1
1 = 0;
'0' = 0;
'0.0' = 0;
'0.01' = 0;
'.01' = 0.01;
- 22-
<>
!= Diferit (inegal) :
mysql> select '.01' <> '0.01';
-> 1
mysql> select .01 <> '0.01';
-> 0
mysql> select 'zapp' <> 'zappp';
-> 1
IS NULL
IS NOT NULL
Testeaz dac o valoare este sau nu NULL:
mysql> select 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0 0 1
mysql> select 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1 1 0
1 BETWEEN 2 AND 3;
'b' BETWEEN 'a' AND 'c';
2 BETWEEN 2 AND '3';
2 BETWEEN 2 AND 'x-3';
expr IN (value,...)
expr NOT IN (value,...)
Returneaz 1 dac expr este una dintre valorile din lista IN, altfel returneaz 0.
Dac toate valorile sunt constante, atunci toate valorile sunt evaluate n acord cu
tipul expresiei expr i sortate. Cutarea articolului este realizat apoi utiliznd o
cutare binar, ceea ce face ca funcia IN s fie foarte rapid dac valorile din list
sunt n totalitate constante. Dac expr este o expresie string n case-sensitive,
compararea irurilor este realizat n mod case-sensitive:
mysql> select 2 IN (0,3,5,'wefwf');
-> 0
mysql> select 'wefwf' IN (0,3,5,'wefwf');
-> 1
ISNULL(expr)
Dac expr este NULL, ISNULL() returneaz 1, altfel returneaz 0:
mysql> select ISNULL(1+1);
-> 0
mysql> select ISNULL(1/0);
-> 1
INTERVAL(N,N1,N2,N3,...)
Returneaz 0 dac N < N1, 1 dac N < N2 i aa mai departe. Toate
argumentele sunt tratate ca numere ntregi. Pentru ca funcia s lucreze corect
trebuie ndeplinit condiia N1 < N2 < N3 < ... < Nn:
mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3
mysql> select INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> select INTERVAL(22, 23, 30, 44, 200);
-> 0
mysql> select 0 || 0;
-> 0
mysql> select 1 || NULL;
-> 1
AND, &&
i Logic. Returneaz 0 dac oricare dintre argumente este 0 sau NULL, altfel
returneaz 1:
mysql> select 1 && NULL;
-> 0
mysql> select 1 && 0;
-> 0
NULLIF(expr1,expr2)
Dac relaia expr1 = expr2 este adevrat, returneaz NULL altfel returneaz
expr1. Aceasta este identic cu CASE WHEN x = y THEN NULL ELSE x END:
mysql> select NULLIF(1,1);
-> NULL
mysql> select NULLIF(1,2);
-> 1
expr1 este evaluat de dou ori n MySQL dac argumentele sunt egale.
IF(expr1,expr2,expr3)
Dac expr1 este TRUE (expr1 <> 0 i expr1 <> NULL) atunci IF() returneaz
expr2, altfel returneaz expr3. IF() returneaz o valoare numeric sau string
depinde de contextul n care este utilizat:
- 26-
n primul caz de mai sus, IF(0.1) returneaz 0 deoarece 0.1 este convertit la o
valoare ntreag, rezultnd ntr-o testare IF(0), iar n cel de-al doilea caz,
comparaia testeaz dac valoarea n virgul flotant este sau nu 0. Rezultatul
comparaiei este utilizat ca un ntreg. Tipul rezultatului funciei IF() returnat
implicit este calculat astfel:
Expresie
expr2 sau expr3 returneaz string
expr2 sau expr3 returneaz o valoare real
expr2 sau expr3 returneaz un ntreg
Valoare returnat
string
floating-point
integer
ORD(str)
Dac cel mai din stnga caracter al irului str este un caracter multi-byte,
returneaz codul caracterului multi-byte prin returnarea valorii codului ASCII n
formatul : ((first byte ASCII code)*256+(second byte ASCII code))[*256+third
byte ASCII code...]. Dac cel mai din stnga caracter nu este un caracter multibyte, returneaz aceeai valoare ca i funcia ASCII():
mysql> select ORD('2');
-> 50
CONV(N,from_base,to_base)
Convertete numere dintr-o baz n alta. Returneaz reprezentarea string a
numrului N, convertit din baza from_base n baza to_base.
Returneaz NULL dac oricare argument este NULL. Argumentul N este
interpretat ca integer, dar poate fi specificat ca integer sau ca string. Baza minim
de numeraie este 2 iar cea maxim 36. Dac baza to_base este un numr negativ,
N este privit ca numr cu semn. Altfel, N este tratat ca numr fr semn. CONV
lucreaz cu precizie de 64 bii:
mysql> select CONV("a",16,2);
-> '1010'
mysql> select CONV("6E",18,8);
-> '172'
mysql> select CONV(-17,10,-18);
-> '-H'
mysql> select CONV(10+"10"+'10'+0xa,10,10);
-> '40'
- 28-
BIN(N)
Returneaz o reprezentare string a valorii binare a lui N, unde N este un numr
foarte lung (BIGINT). Returneaz NULL dac N este NULL:
mysql> select BIN(12);
-> '1100'
OCT(N)
Returneaz o reprezentare string a valorii octale a lui N, unde N este un numr
foarte lung (BIGINT). Returneaz NULL dac N este NULL:
mysql> select OCT(12);
-> '14'
HEX(N)
Returneaz o reprezentare string a valorii hexazecimale a lui N, unde N este un
numr foarte lung (BIGINT). Returneaz NULL dac N este NULL:
mysql> select HEX(255);
-> 'FF'
CHAR(N,...)
CHAR() interpreteaz argumentele ca ntregi i returneaz un string constnd
din caracterele date prin valorile de cod ASCII ale acelor numere ntregi. Valorile
NULL sunt excluse:
mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'
CONCAT(str1,str2,...)
Returneaz irul rezultat din urma concatenrii argumentelor. Returneaz
NULL dac oricare argument este NULL. Poate aveam mai mult de 2 argumente.
Un argument numeric este convertit n forma string echivalent:
mysql> select CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> select CONCAT('My', NULL, 'QL');
-> NULL
mysql> select CONCAT(14.3);
-> '14.3'
NULL. Funcia va sri orice iruri vide sau NULL. Separatorul va fi adugat ntre
irurile care trebuie concatenate:
mysql> select
"Last Name");
-> 'First
mysql> select
-> 'First
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)
Returneaz lungimea irului str:
mysql> select LENGTH('text');
-> 4
mysql> select OCTET_LENGTH('text');
-> 4
LOCATE(substr,str,pos)
Returneaz poziia primei apariii a subirului substr n irul str ncepnd cu
poziia pos. Returneaz 0 dac substr nu exist n str:
mysql> select LOCATE('bar', 'foobarbar',5);
-> 7
INSTR(str,substr)
Returneaz poziia primei apariii a subirului substr n irul str. Este
asemntoare cu forma LOCATE(), cu excepia c argumentele sunt inversate:
mysql> select INSTR('foobarbar', 'bar');
-> 4
mysql> select INSTR('xbar', 'foobar');
-> 0
- 30-
LPAD(str,len,padstr)
Returneaz irul str, umplut la stnga cu irul padstr pn cnd str are lungimea len
de caractere. Dac str este mai lung dect len atunci el va fi scurtat la lungimea de
len caractere.
mysql> select LPAD('hi',4,'??');
-> '??hi'
RPAD(str,len,padstr)
Returneaz irul str, umplut la dreapta cu irul padstr pn cnd str are lungimea de
len caractere. Dac str este mai lung dect len atunci el va fi scurtat la lungimea de
len caractere.
mysql> select RPAD('hi',5,'?');
-> 'hi???'
LEFT(str,len)
Returneaz un numr de len caractere din partea stng a irului str:
mysql> select LEFT('foobarbar', 5);
-> 'fooba'
RIGHT(str,len)
Returneaz un numr de len caractere din partea dreapt a irului str:
mysql> select RIGHT('foobarbar', 4);
-> 'rbar'
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
Returneaz un subir de lungime len din irul str, ncepnd cu poziia pos.
Varianta care utilizeaz FROM este sintaxa ANSI SQL92:
mysql> select SUBSTRING('Quadratically',5,6);
-> 'ratica'
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
Returneaz un subir din irul str ncepnd cu poziia pos:
mysql> select SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> select SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
- 31-
SUBSTRING_INDEX(str,delim,count)
Returneaz subirul din irul str nainte de apariia delimitatorului delim cu
numrul de apariie count. Dac count este pozitiv, se returneaz tot ce apare n
stnga delimitatorului final (numrare de la stnga). Dac count este negativ, se
returneaz tot ce apare n dreapta delimitatorului final (numrare de la dreapta).
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
LTRIM(str)
Returneaz irul str fr spaiile care-l preced:
mysql> select LTRIM('
-> 'barbar'
barbar');
RTRIM(str)
Returneaz irul str fr spaiile care-l urmeaz:
mysql> select RTRIM('barbar
-> 'barbar'
');
SPACE(N)
Returneaz un ir constnd n N spaii:
mysql> select SPACE(6);
-> '
'
REPLACE(str,from_str,to_str)
Returneaz irul str cu toate apariiile irului from_str nlocuit cu irul to_str:
mysql> select REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'
- 32-
REPEAT(str,count)
Returneaz un ir constnd din irul str repetat de un numr de ori egal cu
count. Dac count <= 0, returneaz un ir gol. Returneaz NULL dac str sau count
sunt NULL:
mysql> select REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'
REVERSE(str)
Returneaz irul str inversat:
mysql> select REVERSE('abc');
-> 'cba'
INSERT(str,pos,len,newstr)
Returneaz irul str n care se nlocuiete subirul de la poziia pos i de
lungimea len cu noul subir newstr:
mysql> select INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'
ELT(N,str1,str2,str3,...)
Returneaz str1 dac N = 1, str2 dac N = 2, i aa mai departe. Returneaz
NULL dac N este mai mic dect 1 sau mai mare dect numrul de argumente.
mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'
FIELD(str,str1,str2,str3,...)
Returneaz indexul irului str n lista str1, str2, str3, ... . Returneaz 0 dac str
nu este gsit. FIELD() este complementul funciei ELT():
mysql>
->
mysql>
->
FIND_IN_SET(str,strlist)
Returneaz o valoare de la 1 la N dac irul str se afl n lista strlist ca are N
subiruri. O list de iruri este o list compus din subiruri separate prin virgul.
Dac primul argument este un ir constant i cel de-al doilea este o coloan de tip
SET, funcia FIND_IN_SET() este optimizat s utilizeze bit aritmetic. Returneaz
0 dac str nu exist n strlist sau dac strlist este un ir gol. Returneaz NULL dac
- 33-
oricare dintre argumente este NULL. Funcia nu va lucra corect dac primul
argument va conine caracterul virgul:
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
MAKE_SET(bits,str1,str2,...)
Returneaz un set constnd n iruri care au biii setai corespunztor pentru
fiecare ir din set. str1 corespunde pentru bitul 0, str2 pentru bitul 1, etc (5=0101
va selecta irurile str1 i str3). irurile NULL dintre str1, str2, ... nu sunt adugate
la rezultat:
mysql> SELECT MAKE_SET(1,'a','b','c');
-> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
-> 'hello,world'
mysql> SELECT MAKE_SET(0,'a','b','c');
-> ''
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
Returneaz un ir unde pentru fiecare bit setat din 'bits', se primete un ir 'on'
iar pentru fiecare bit de reset se primete un ir 'off'. Fiecare ir este separat cu
separatorul 'separator' (implicit ',') i doar numrul de bii 'number_of_bits'
(implicit 64) este utilizat:
mysql> select EXPORT_SET(5,'Y','N',',',4)
-> Y,N,Y,N
LCASE(str)
LOWER(str)
Returneaz irul str cu toate caracterele schimbate n caractere mici n acord cu
setul de caractere curent (implicit ISO-8859-1 Latin1):
mysql> select LCASE('QUADRATICALLY');
-> 'quadratically'
UCASE(str)
UPPER(str)
Returneaz irul str cu toate caracterele schimbate n caractere mari n acord cu
setul de caractere curent (implicit ISO-8859-1 Latin1):
mysql> select UCASE('Hej');
-> 'HEJ'
LOAD_FILE(file_name)
Citete fiierul i returneaz coninutul fiierului ca un ir de caractere. Fiierul
trebuie s fie pe server, trebuie specificat calea complet a fiierului i trebuie s
- 34-
existe drepturi de citire a fiierului. Dac fiierul nu exist sau nu poate fi citit din
unul din motivele de mai sus, funcia returneaz NULL:
mysql> UPDATE table_name
SET blob_column=LOAD_FILE("/tmp/picture")
WHERE id=1;
***
MySQL convertete automat numerele n iruri i invers dup necesitate:
mysql> SELECT 1+"1";
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'
Dac se dorete convertirea unui numr ntr-un string n mod explicit, se poate
trece drept argument al funciei CONCAT().
Dac unei funcii i se d un ir binar ca argument, irul rezultat este tot un ir binar.
Un numr convertit n ir este tratat ca ir binar. Aceasta afecteaz doar comparaia.
4.2.1 Funcii de comparare a irurilor
n mod normal, dac orice expresie dintr-o comparaie string este n caz senzitiv,
comparaia este efectuat n mod senzitiv.
expr LIKE pattern [ESCAPE 'escape-char']
expr NOT LIKE pattern [ESCAPE 'escape-char']
Funcia LIKE realizeaz testarea potrivirii de caractere din cadrul expresie expr
conform modelului pattern. Returneaz 1 (TRUE) sau 0 (FALSE). n funcia LIKE
se pot utiliza dou caractere wild-card pentru modelul pattern:
'%' - Semnific o potrivire de orice numr de caractere;
'_' - Potrivirea unui singur caracter.
mysql> select 'David!' LIKE 'David_';
-> 1
mysql> select 'David!' LIKE '%D%v%';
-> 1
-> 0
mysql> select 'David_' LIKE 'David\_';
-> 1
Dac se dorete compararea unui BLOB n caz insenzitiv se poate converti acesta
n caractere mari naintea realizrii comparaiei:
SELECT 'A' LIKE UPPER(blob_col) FROM table_name;
- 37-
- Scdere:
mysql> select 3-5;
-> -2
* nmulire :
mysql> select 3*5;
-> 15
mysql> select 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql> select 18014398509481984*18014398509481984;
-> 0
- 38-
ABS(X)
Returneaz valoarea absolut (modulul) a lui X:
mysql> select ABS(2);
-> 2
mysql> select ABS(-32);
-> 32
SIGN(X)
Returneaz semnul argumentului ca -1, 0, sau 1, depinznd de ct este X:
negativ, zero sau pozitiv:
mysql> select SIGN(-32);
-> -1
mysql> select SIGN(0);
-> 0
mysql> select SIGN(234);
-> 1
MOD(N,M)
% - Modulo
Returneaz restul mpririi lui N la M:
mysql> select MOD(234, 10);
-> 4
mysql> select 253 % 7;
-> 1
mysql> select MOD(29,9);
-> 2
FLOOR(X)
Returneaz valoarea ntreag mai mic dect X:
mysql> select FLOOR(1.23);
-> 1
mysql> select FLOOR(-1.23);
-> -2
- 39-
CEILING(X)
Returneaz valoarea ntreag imediat mai mare dect X:
mysql> select CEILING(1.23);
-> 2
mysql> select CEILING(-1.23);
-> -1
ROUND(X)
Returneaz argumentul X, rotunjit la cea mai apropiat valoare ntreag:
mysql> select ROUND(-1.23);
-> -1
mysql> select ROUND(-1.58);
-> -2
mysql> select ROUND(1.58);
-> 2
EXP(X)
Returneaz valoarea lui e (baza logaritmului natural) ridicat la puterea X:
mysql> select EXP(2);
-> 7.389056
mysql> select EXP(-2);
-> 0.135335
LOG(X)
Returneaz logaritmul natural al lui X:
mysql> select LOG(2);
-> 0.693147
mysql> select LOG(-2);
-> NULL
- 40-
Dac se dorete logaritmul unui numr X ntr-o baz oarecare B, se poate utiliza
formula LOG(X)/LOG(B).
LOG10(X)
Returneaz logaritmul zecimal al lui X:
mysql> select LOG10(2);
-> 0.301030
mysql> select LOG10(100);
-> 2.000000
mysql> select LOG10(-100);
-> NULL
POW(X,Y)
POWER(X,Y)
Returneaz valoarea lui X ridicat la puterea Y:
mysql> select POW(2,2);
-> 4.000000
mysql> select POW(2,-2);
-> 0.250000
SQRT(X)
Returneaz rdcina ptrat a lui X:
mysql> select SQRT(4);
-> 2.000000
mysql> select SQRT(20);
-> 4.472136
PI()
Returneaz valoare lui PI. Implicit, numrul de zecimale artate sunt 6, dar
intern MySQL utilizeaz dubl precizie pentru PI.
mysql> select PI();
-> 3.141593
mysql> SELECT PI()+0.000000000000000000;
-> 3.141592653589793116
COS(X)
Returneaz cosinus de X, unde X este n radiani:
mysql> select COS(PI());
-> -1.000000
SIN(X)
Returneaz sinus de X, unde X este n radiani:
- 41-
TAN(X)
Returneaz tangent de X, unde X este n radiani:
mysql> select TAN(PI()+1);
-> 1.557408
COT(X)
Returneaz cotangent de X:
mysql> select COT(12);
-> -1.57267341
mysql> select COT(0);
-> NULL
ACOS(X)
Returneaz arc cosinus de X, care este valoarea a crui cosinus este X.
Returneaz NULL dac X nu este n intervalul -1, 1:
mysql> select ACOS(1);
-> 0.000000
mysql> select ACOS(1.0001);
-> NULL
mysql> select ACOS(0);
-> 1.570796
ASIN(X)
Returneaz arc sinus de X, valoarea a crui sinus este X. Returneaz NULL
dac X nu este n intervalul -1, 1:
mysql> select ASIN(0.2);
-> 0.201358
mysql> select ASIN('foo');
-> 0.000000
ATAN(X)
Returneaz arc tangent de X:
mysql> select ATAN(2);
-> 1.107149
mysql> select ATAN(-2);
-> -1.107149
ATAN(Y,X)
ATAN2(Y,X)
- 42-
RAND()
RAND(N)
Returneaz o valoare aleatoare real ntre 0 i 1.0. Dac se specific un
argument N ntreg, el va fi folosit ca rdcin a valorii:
mysql> select RAND();
-> 0.5925
mysql> select RAND(20);
-> 0.1811
mysql> select RAND(20);
-> 0.1811
mysql> select RAND();
-> 0.2079
mysql> select RAND();
-> 0.7888
- 43-
RADIANS(X)
Returneaz argumentul X, convertit din grade n radiani:
mysql> select RADIANS(90);
-> 1.570796
TRUNCATE(X,D)
Returneaz numrul X, trunchiat la D zecimale. Dac D este 0, rezultatul nu va
avea punct zecimal sau parte fracionar:
mysql> select TRUNCATE(1.223,1);
-> 1.2
mysql> select TRUNCATE(1.999,1);
-> 1.9
mysql> select TRUNCATE(1.999,0);
-> 1
- 44-
DAYOFWEEK(date)
Returneaz indicele zilei de sptmn pentru data date (1 = Duminic, 2 =
Luni, ... 7 = Smbt). Aceste valori corespund standardului ODBC:
mysql> select DAYOFWEEK('1998-02-03');
-> 3
WEEKDAY(date)
Returneaz indicele zilei de sptmn pentru data date (0 = Luni, 1 = Mari, ...
6 = Duminic):
mysql> select WEEKDAY('1997-10-04 22:23:00');
-> 5
mysql> select WEEKDAY('1997-11-05');
-> 2
DAYOFMONTH(date)
Returneaz ziua din lun pentru data date, n intervalul 1 - 31:
mysql> select DAYOFMONTH('1998-02-03');
-> 3
DAYOFYEAR(date)
Returneaz ziua din an pentru data date, n intervalul 1 - 366:
mysql> select DAYOFYEAR('1998-02-03');
-> 34
MONTH(date)
Returneaz indicele lunii pentru data date, n intervalul 1 - 12:
mysql> select MONTH('1998-02-03');
-> 2
DAYNAME(date)
Returneaz numele zilei din sptmn pentru data date:
mysql> select DAYNAME("1998-02-05");
- 45-
-> 'Thursday'
MONTHNAME(date)
Returneaz numele lunii pentru data date:
mysql> select MONTHNAME("1998-02-05");
-> 'February'
QUARTER(date)
Returneaz semestrul din an pentru data date, n intervalul 1 - 4:
mysql> select QUARTER('98-04-01');
-> 2
WEEK(date)
WEEK(date,first)
Cu un singur argument, returneaz numrul sptmnii pentru data date, n
intervalul 0 - 53, (exist i a 53-a sptmn) pentru locaii n care ziua de
duminic (Sunday) este prima zi a sptmnii. Forma funciei WEEK() cu dou
argumente permite specificarea zilei cu care se ncepe sptmna: duminic
(Sunday) sau luni (Monday). Sptmna ncepe duminic dac al doilea argument
este 0, sau luni dac al doilea argument este 1:
mysql> select
-> 7
mysql> select
-> 7
mysql> select
-> 8
mysql> select
-> 53
WEEK('1998-02-20');
WEEK('1998-02-20',0);
WEEK('1998-02-20',1);
WEEK('1998-12-31',1);
YEAR(date)
Returneaz anul pentru data date, n intervalul 1000 - 9999:
mysql> select YEAR('98-02-03');
-> 1998
YEARWEEK(date)
YEARWEEK(date,first)
Returneaz anul i sptmna pentru data date. Al doilea argument lucreaz
exact ca al doilea argument al funciei WEEK(). Trebuie tiut c anul poate fi
diferit de cel din argumentul date pentru prima i ultima sptmn din an:
mysql> select YEARWEEK('1987-01-01');
-> 198653
- 46-
HOUR(time)
Returneaz ora pentru timpul time, n intervalul 0 - 23:
mysql> select HOUR('10:05:03');
-> 10
MINUTE(time)
Returneaz minutele pentru time, n intervalul 0 - 59:
mysql> select MINUTE('98-02-03 10:05:03');
-> 5
SECOND(time)
Returneaz secundele pentru time, n intervalul 0 - 59:
mysql> select SECOND('10:05:03');
-> 3
PERIOD_ADD(P,N)
Adaug N luni la perioada P (n formatul YYMM sau YYYYMM). Returneaz
o valoare n format YYYYMM. Argument P nu este valoare de tip dat:
mysql> select PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
Returneaz numrul de luni ntre perioadele P1 i P2. P1 i P2 ar trebui s fie n
format YYMM sau YYYYMM. Argumentele P1 i P2 nu sunt valori de tip dat:
mysql> select PERIOD_DIFF(9802,199703);
-> 11
- 47-
DAY_SECOND
Dac se specific o valoare interval care e prea scurt (nu include toate prile de
interval care ar trebui s apar conform tipului cuvntului cheie), MySQL
presupune c acestea au fost lsate. De exemplu, dac se specific un tip
DAY_SECOND, valoarea expresie ar trebui s aib zile, ore, minute i secunde.
Dac se specific o valoare de genul "1:10", MySQL presupune c zilele i orele
lipsesc i valoarea reprezint minute i secunde. Cu alte cuvinte, "1:10"
DAY_SECOND este interpretat n aa fel nct este echivalent cu "1:10"
MINUTE_SECOND.
Observaie: Dac se adun sau se scade o valoare dat fa de o expresie ce
conine ora, valoarea de tip dat va fi convertit automat la tipul DATETIME:
mysql> select date_add("1999-01-01", interval 1 day);
-> 1999-01-02
mysql> select date_add("1999-01-01", interval 1 hour);
-> 1999-01-01 01:00:00
TO_DAYS(date)
Dndu-se o dat date, funcia returneaz un numrul de zile de la anul 0:
mysql> select TO_DAYS(950501);
-> 728779
mysql> select TO_DAYS('1997-10-07');
-> 729669
- 49-
FROM_DAYS(N)
Dndu-se un numr N, funcia returneaz valoarea DATE echivalent:
mysql> select FROM_DAYS(729669);
-> '1997-10-07'
DATE_FORMAT(date,format)
Afieaz valoarea date dup irul format. Urmtorii specificatori pot fi utilizai
n irul format:
%M
%W
%D
%Y
%y
%X
%x
%a
%d
%e
%m
%c
%b
%j
%H
%k
%h
%I
%l
%i
%r
%T
%S
%s
%p
%w
%U
%u
%V
%v
%%
TIME_FORMAT(time,format)
Aceast funcie este utilizat la fel ca funcia DATE_FORMAT(), dar irul de
format poate conine doar acei specificatori de format care trateaz ore, minute sau
secunde. Ali specificatori dau valoarea NULL sau 0.
CURDATE()
CURRENT_DATE
Returneaz data zilei curente n format 'YYYY-MM-DD' sau YYYYMMDD,
depinznd de contextul n care este utilizat funcia: numeric sau string:
mysql> select CURDATE();
-> '1997-12-15'
mysql> select CURDATE() + 0;
-> 19971215
CURTIME()
CURRENT_TIME
Returneaz ora curent n format 'HH:MM:SS' sau HHMMSS, depinznd de
contextul n care este utilizat funcia: numeric sau string:
mysql> select CURTIME();
-> '23:50:26'
mysql> select CURTIME() + 0;
-> 235026
NOW(), SYSDATE(),
CURRENT_TIMESTAMP
Returneaz data i ora curent n format 'YYYY-MM-DD HH:MM:SS' sau
YYYYMMDDHHMMSS, depinznd de contextul n care este utilizat funcia:
numeric sau string:
mysql> select NOW();
-> '1997-12-15 23:50:26'
mysql> select NOW() + 0;
-> 19971215235026
- 51-
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)
Dac se apeleaz funcia fr argument, returneaz numrul de secunde trecute
din data '1970-01-01 00:00:00' GMT pn n prezent. Dac UNIX_TIMESTAMP()
este apelat cu argumentul date, returneaz valoarea argumentului ca numrul de
secunde din '1970-01-01 00:00:00' GMT. date poate fi un ir DATE, unul
DATETIME, TIMESTAMP, sau un numr n format YYMMDD, YYYYMMDD:
mysql> select UNIX_TIMESTAMP();
-> 882226357
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
FROM_UNIXTIME(unix_timestamp)
FROM_UNIXTIME(unix_timestamp,format)
Returneaz o reprezentare a argumentului unix_timestamp ca o valoare n
format 'YYYY-MM-DD HH:MM:SS' sau YYYYMMDDHHMMSS, depinznd de
contextul n care este utilizat funcia: numeric sau string:
mysql> select FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00'
mysql> select FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
A doua funcie formateaz rezultatul dup irul format. format poate conine
aceeai specificatori ca i cei utilizai pentru funcia DATE_FORMAT():
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
'%Y %D %M %h:%i:%s %x');
-> '1997 23rd December 03:43:30 x'
SEC_TO_TIME(seconds)
Returneaz argumentul seconds, convertit n ore, minute i secunde, ca o
valoare n format 'HH:MM:SS' (string) sau HHMMSS (numeric):
mysql> select SEC_TO_TIME(2378);
-> '00:39:38'
mysql> select SEC_TO_TIME(2378) + 0;
-> 3938
TIME_TO_SEC(time)
Returneaz argumentul time, convertit n secunde:
mysql> select TIME_TO_SEC('22:23:00');
-> 80580
mysql> select TIME_TO_SEC('00:39:38');
-> 2378
- 52-
BIT_COUNT(N)
Returneaz numrul de bii care sunt setai n argumentul N:
mysql> select BIT_COUNT(29);
-> 4
- 53-
PASSWORD(str)
Calculeaz un ir parol pentru irul parol str. Aceasta este o funcie care este
utilizat pentru encriptarea parolelor MySQL i permite stocarea lor n coloana
Password a tabelei de drepturi ale utilizatorilor:
mysql> select PASSWORD('badpwd');
-> '7f84554057dd964b'
MD5(string)
Calculeaz o sum de control MD5 (Message-Digest Algorithm) pentru irul
string. Valoarea este returnat ca un numr hexa pe 32 de bii care poate, de
exemplu, s fie utilizat ca o cheie de cod:
mysql> select MD5("testing");
-> 'ae2b1fca515949e5d54fb22b8ed95575'
LAST_INSERT_ID([expr])
Returneaz ultima valoare generat automat care a fost inserat ntr-o coloan
AUTO_INCREMENT.
mysql> select LAST_INSERT_ID();
-> 195
VERSION()
Returneaz un ir care indic versiunea de server MySQL:
mysql> select VERSION();
-> '3.23.13-log'
CONNECTION_ID()
Returneaz identificatorul conectrii (identificatorul firului de execuie).
Fiecare conectare are un identificator unic:
mysql> select CONNECTION_ID();
-> 1
BENCHMARK(count,expr)
Funcia BENCHMARK() execut expresia expr n mod repetat de un numr de
ori egal cu count. Poate fi utilizat pentru a verifica rapiditatea procesrii unei
- 55-
INET_ATON(expr)
Returneaz un ntreg care reprezint valoarea numeric a unei adrese de reea.
Adresele pot fi adrese pe 4 sau 8 bytes:
mysql> select INET_ATON("209.207.224.40");
-> 3520061480
COUNT(DISTINCT expr,[expr...])
Returneaz numrul de elemente distincte cu valori diferite de NULL:
mysql> select COUNT(DISTINCT results) from student;
AVG(expr)
Returneaz media valorilor expr:
mysql> select student_name, AVG(test_score)
from student
GROUP BY student_name;
MIN(expr)
MAX(expr)
Returneaz valoarea minim sau maxim dintre expresiile expr.
MIN() i MAX() pot avea argument i un ir, n acest caz returnnd valoarea string
minim sau maxim.
mysql> select student_name, MIN(test_score), MAX(test_score)
from student
GROUP BY student_name;
SUM(expr)
Returneaz suma expresiilor expr. Dac setul selectat nu conine nici o linie,
rezultatul returnat va fi NULL!
STD(expr)
STDDEV(expr)
Returneaz deviaia standard a expresiilor expr. Aceasta este o extensie ANSI
SQL. Forma STDDEV() este prevzut pentru compatibilitate cu Oracle.
BIT_OR(expr)
Returneaz rezultatul operaiei OR pe bit pe toate expresiile expr. Calculul este
realizat cu precizie 64-bit (BIGINT).
BIT_AND(expr)
Returneaz rezultatul operaiei AND pe bit pe toate expresiile expr. Calculul
este realizat cu precizie 64-bit (BIGINT).
- 57-
Fcnd curent o anumit baz de date prin utilizarea comenzii USE nu mpiedic
utilizarea tabelelor altor baze de date. Urmtorul exemplu ne arat modul cum se
acceseaz tabelul author din baza de date db1 i tabelul editor al bazei de date db2.
mysql> USE db1;
mysql> SELECT author_name,editor_name FROM author,db2.editor
WHERE author.editor_id = db2.editor.editor_id;
- 58-
.DAT
.ISM
.db
.HSH
.MRG
.frm
.ISD
.MYD
index_col_name:
col_name [(length)]
reference_definition:
REFERENCES tbl_name [(index_col_name,...)]
[MATCH FULL | MATCH PARTIAL]
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
- 60-
table_options:
TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MYISAM }
sau
AUTO_INCREMENT = #
sau
AVG_ROW_LENGTH = #
sau
CHECKSUM = {0 | 1}
sau
COMMENT = "string"
sau
MAX_ROWS = #
sau
MIN_ROWS = #
sau
PACK_KEYS = {0 | 1}
sau
PASSWORD = "string"
sau
DELAY_KEY_WRITE = {0 | 1}
sau
ROW_FORMAT= { default | dynamic | fixed | compressed }
sau
RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=#
RAID_CHUNKSIZE=#
sau
UNION = (table_name,[table_name...])
sau
DATA DIRECTORY="directory"
sau
INDEX DIRECTORY="directory"
select_statement:
[IGNORE | REPLACE] SELECT ...
Purpose
Fiierul de definire al tabelului
Fiierul de date
Fiierul de index
Dac nu se specific nici NULL nici NOT NULL, coloana este tratat ca i cum sar fi specificat NULL.
O coloan de tip ntreg (integer) poate avea atributul adiional
AUTO_INCREMENT. Dac se introduce o valoare NULL sau 0 ntr-o coloan de
tip AUTO_INCREMENT, coloana este setat la valoare+1, unde valoare este cea
mai mare valoare pentru coloan n tabel. Secvenele AUTO_INCREMENT ncep
cu 1. Dac se terge linia care conine valoarea maxim a coloanei
AUTO_INCREMENT, valoarea va fi reutilizat cu tabelele de tip ISAM sau BDB
dar nu va mai fi utilizat pentru un tabel MyISAM sau InnoDB. Dac se terg toate
liniile din tabel cu DELETE FROM table_name (fr clauz WHERE) n mod
AUTOCOMMIT, secvena rencepe de la 1 pentru toate tipurile de tabele.
Observaie: Poate exista doar o singur coloan AUTO_INCREMENT pe tabel, i
aceasta trebuie s fie indexat. MySQL lucreaz corespunztor dac coloana
auto_increment are doar valori pozitive. Pentru compatibilitatea mediului MySQL
cu alte aplicaii ODBC, se poat gsi ultima linie inserat cu urmtoarea
interogare:
SELECT * FROM tbl_name WHERE auto_col IS NULL
Pentru tipurile string altele dect ENUM, valoarea implicit este irul gol.
Pentru ENUM, valoarea implicit este prima valoare a enumeraiei.
Valorile implicite trebuie s fie constante. Aceasta nsemn, de exemplu, c nu se
poate seta valoarea implicit pentru o coloan de tip DATE ca fiind valoarea unei
funcii cum ar fi NOW() sau CURRENT_DATE.
KEY este sinonim pentru INDEX.
O cheie PRIMARY KEY este o cheie unic cu condiia suplimentar ca toate
coloanele cheie trebuie definite ca NOT NULL. n MySQL cheia este numit
PRIMARY. Un tabel poate avea o singur cheie primar. Dac nu exist o cheie
primar - PRIMARY KEY i unele aplicaii cer o astfel de cheie, MySQL va
returna prima cheie unic (UNIQUE), care nu are nici o coloan NULL, ca fiind
cheia primar.
O cheie PRIMARY poate fi un index pe mai multe coloane. Oricum, nu se poate
crea un index pe mai multe coloane utiliznd atributul PRIMARY KEY n
specificarea unei coloane. Fcnd acest lucru se va marca doar acea coloan ca
fiind primar. Trebuie utilizat sintaxa PRIMARY KEY(index_col_name, ...).
Dac cheia PRIMARY sau UNIQUE const dintr-o singur coloan i aceasta este
de tip integer, se poate referi ca fiind _rowid.
n MySQL, o cheie UNIQUE poate avea doar valori distincte. Apare o eroare dac
se ncearc adugarea unei noi linii cu valorii cheii egal cu a uneia deja existente
n tabel.
Dac nu se atribuie un nume unui index, indexului i se va atribui acelai nume cu
al primului index index_col_name, cu un sufix opional (_2, _3, ...) pentru a-l face
unic. Se pot vizualiza numele indecilor unui tabel cu:
SHOW INDEX FROM tbl_name.
Doar tabelele de tip MyISAM suport indeci pe coloane care pot avea valori
NULL. n alte cazuri trebuie s declari astfel de coloane NOT NULL sau apare
eroare.
Cu sintaxa col_name(length), se poate specifica un index care utilizeaz doar o
parte a unei coloane de tip CHAR sau VARCHAR. Aceasta poate face fiierul de
indeci mult mai mic.
Doar tabelele de tip MyISAM suport indexare pe coloane BLOB sau TEXT. Cnd
se pune un index pe o coloan de tip BLOB sau TEXT trebuie ntotdeauna
specificat lungimea indexului:
- 63-
Dac se specific tipul unui tabel i respectivul tip nu este disponibil, MySQL va
alege cel mai apropiat tip de tabel fa de cel specificat. De exemplu, dac se
specific TYPE = BDB, i pachetul de distribuie MySQL nu suport tabelele
BDB, tabelul va fi creat de tip MyISAM n loc.
Celelalte opiuni de tabel sunt utilizate pentru optimizarea comportamentului
tabelului. n cele mai multe cazuri, nu trebuie specificat nici unul dintre ele.
Opiunile funcioneaz pentru toate tipurile de tabele, doar dac nu specific altfel:
AUTO_INCREMENT
AVG_ROW_LENGTH
CHECKSUM
COMMENT
MAX_ROWS
MIN_ROWS
PACK_KEYS
PASSWORD
DELAY_KEY_WRITE
ROW_FORMAT
Pentru fiecare linie din tabelul foo, se insereaz o linie n tabelul bar cu valorile din
tabelul foo i valorile implicite pentru noile coloane.
CREATE TABLE ... SELECT nu va crea automat nici un index. Acest lucru este
fcut intenionat pentru a face comanda ct mai flexibil. Pentru a avea indeci n
noul tabel creat, acetia ar trebui specificai nainte de instruciunea SELECT:
mysql> create table bar (unique (n)) select n from foo;
Dac apar erori n timp ce se copie datele n tabel, acesta va fi ters automat.
Pentru a asigura recrearea tabelelor originale, MySQL nu va permite inserri
concurente n timpul comenzii CREATE TABLE .... SELECT.
Opiunea RAID_TYPE ajut la ridicarea limitei de 2G/4G pentru tabelele de date
MyISAM pe sistemele de operare care nu suport fiiere mari.
UNION este utilizat cnd se dorete utilizarea unei colecii de tabele identice drept
unul singur. Acest lucru este posibil cu tabelele de tip MERGE. Toate tabelele
mapate pentru MERGE trebuie s fie n aceeai baz de date ca i tabelul MERGE.
n tabelul creat cheia PRIMARY va fi poziionat prima, urmat de toate cheile
unice i apoi cheile normale. Acest lucru ajut optimizatorul MySQL la selectarea
prioritilor de utilizare a cheilor i pentru detectarea mai eficient a dublurilor
cheilor unice.
Prin utilizarea opiunilor DATA DIRECTORY = "directory" sau INDEX
DIRECTORY = "directory" se poate specifica handlerului de tabel unde s pun
fiierele de tabel i cele de index.
- 66-
Comanda ALTER TABLE permite schimbarea structurii unui tabel deja existent.
De exemplu, se pot aduga sau terge coloane, se pot crea sau terge indeci, se
poate schimba tipul coloanelor existente, se pot redenumi coloanele i chiar
numele tabelului.
Dac utilizai ALTER TABLE pentru schimbarea specificaiei coloanelor dar
comanda DESCRIBE tbl_name indic nemodificarea coloanei, este posibil ca
MySQL s ignore modificarea fcut dintr-un anumit motiv. De exemplu, dac
ncercai s schimbai o coloan VARCHAR n CHAR, MySQL va utiliza tot
VARCHAR dac tabelul conine alte coloane cu lungime variabil.
ALTER TABLE lucreaz prin scrierea unei copii temporare a tabelului original.
Alterarea se produce la copiere, apoi tabelul original se terge i noul tabel se
redenumete. Aceti trei pai se produc cu o aa rapiditate nct toate actualizrile
sunt redirectate automat ctre noul table fr apariia unor erori de actualizare. n
timp ce comanda ALTER TABLE se execut, tabelul original este accesibil
celorlali clieni. Actualizrile i scrierile n tabel sunt blocate pn cnd noul tabel
este gata.
Dac utilizai orice alt opiune cu ALTER TABLE dect RENAME, MySQL va
crea ntotdeauna un tabel temporar, chiar dac datele nu au nevoie strict de
copiere (de exemplu cnd se modific numele unei coloane).
- 67-
Pentru a face acest lucru, se specific numele vechi i cel nou al coloanei i tipul
pe care-l ia coloana prin atribuirea de fa.
De exemplu, pentru a redenumi o coloan INTEGER din a n b, se poate scrie:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Dac se utilizeaz CHANGE sau MODIFY pentru a scurta mrimea unei coloane
pentru care exist un index pe o anumit parte a coloanei (de exemplu, dac exist
- 68-
- 70-
Atta timp ct dou baze de date se afl pe acelai disc se pot redenumi tabele
dintr-o baz de date ntr-alta:
RENAME TABLE current_db.table_name TO other_db. table_name;
DROP TABLE terge unul sau mai multe tabele. Toate datele i definiiile de tabel
sunt terse.
Se poate utiliza cuvntul cheie IF EXISTS pentru a preveni apariia unei erori
pentru tabelele care nu exist.
RESTRICT i CASCADE sunt permise pentru o mai uoar portan.
- 71-
CREATE INDEX este mapat ctre o comand ALTER TABLE pentru a crea
indeci. n mod normal, toi indecii se creeaz pentru un tabel n momentul n care
se creeaz acel tabel cu comanda CREATE TABLE. Comanda CREATE INDEX
permite adugarea unor indeci pentru tabele existente.
O list de coloane de forma (col1,col2,...) creeaz un index pentru mai multe
coloane. Valorile indecilor sunt concatenate din valorilor coloanelor date.
Pentru coloanele de tip CHAR i VARCHAR, indecii pot fi creai astfel nct s
utilizeze doar o parte din coloan, prin utilizarea sintaxei col_name(length).
(Pentru coloanele BLOB i TEXT lungimea length este cerut). Instruciunea
urmtoare creeaz un index utiliznd primele 10 caractere din coloan:
mysql> CREATE INDEX part_of_name ON customer (name(10));
- 72-
7. Manipularea datelor:
SELECT, INSERT, UPDATE, DELETE
7.1. Sintaxa SELECT
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT]
[SQL_BUFFER_RESULT][HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula}
[ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula}
[ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name]
[FOR UPDATE | LOCK IN SHARE MODE]]
Comanda SELECT este utilizat pentru afiarea liniilor selectate dintr-unul sau
mai multe tabele. Expresia select_expression indic coloanele din cadrul
tabelului care se doresc afiate. Dac se dorete selectarea tuturor coloanelor se
utilizeaz operatorul " * ".
Comanda SELECT poate fi utilizat i pentru calcularea unor linii fr referire la
nici un tabel. De exemplu:
mysql> SELECT 1 + 1;
-> 2
Toate cuvintele cheie utilizate trebuie date exact n ordinea indicat de sintax. De
exemplu, o clauz HAVING trebuie s apar dup o clauz GROUP BY i nainte
de orice clauz ORDER BY.
Unei expresii SELECT i se poate da un alias utiliznd AS. Aliasul este utilizat
drept un nume de coloan al expresiei i poate fi utilizat de clauzele ORDER BY i
HAVING. De exemplu:
mysql> select concat(last_name,', ',first_name) AS full_name
from mytable ORDER BY full_name;
Clauza FROM table_references indic tabelele din care se vor selecta linii. Dac se
atribuie mai multe tabele, se efectueaz o legtur (join).
- 73-
Referirea la o coloan se poate face fie prin numele coloanei col_name, sau prin
tbl_name.col_name, sau db_name.tbl_name.col_name. Nu este nevoie s fie
specificat prefixul tbl_name sau db_name.tbl_name pentru o coloan n cadrul
clauzei SELECT dect dac referirea ar fi ambigu.
Referinei unui tabel i se poate atribui un alias utiliznd tbl_name [AS] alias_name:
mysql> select t1.name,
where t1.name =
mysql> select t1.name,
where t1.name =
Sciei n loc:
SQL_SMALL_RESULT,
SQL_BIG_RESULT,
SQL_BUFFER_RESULT,
STRAIGHT_JOIN, i HIGH_PRIORITY sunt extensii MySQL pentru ANSI
SQL92.
HIGH_PRIORITY va da clauzei SELECT o prioritate mai mare dect unei
comenzi care actualizeaz tabelul. Opiunea ar trebui folosit doar pentru interogri
care sunt foarte rapide i trebuie rezolvate pe loc. O interogare SELECT
HIGH_PRIORITY va rula dac tabelul este blocat pentru citire chiar dac exist o
comand de actualizare care ateapt ca tabelul s fie disponibil.
Opiunea SQL_BIG_RESULT poate fi utilizat mpreun cu GROUP BY sau
DISTINCT i spune optimizatorului c setul de rezultate va avea multe linii. n
acest caz, MySQL va utiliza dac va fi nevoie tabelele temporare de disc. MySQL
va prefera s sorteze prin realizarea unui tabel temporar cu o cheie pe elementele
GROUP BY.
Opiunea SQL_BUFFER_RESULT va fora punerea rezultatului ntr-un tabel
temporar. Aceasta ajut programul s deschid tabelele mai repede i va ajuta n
cazurile n care ia mult timp trimiterea setului de rezultate ctre client.
Opiunea SQL_SMALL_RESULT poate fi utilizat mpreun cu GROUP BY sau
DISTINCT i spune optimizatorului c setul de rezultate va avea puine linii. n
acest caz, MySQL va utiliza tabele temporare rapide pentru stocarea tabelului
rezultant n loc de utilizarea sortrii.
Dac folosii clauza GROUP BY, liniile rezultate vor fi sortate dup condiia
stabilit n GROUP BY ca i cum ai avea o clauza ORDER BY peste toate
cmpurile din GROUP BY.
MySQL a extins sintaxa clauzei GROUP BY i se pot specifica de asemenea
cuvintele cheie ASC i DESC pentru GROUP BY:
SELECT a,COUNT(b) FROM test_table GROUP BY a DESC
scrie liniile selectate ntr-un fiier. Fiierul este creat pe serverul host i nu poate fi
deja existent (printre altele previne ca baze de date i tabele precum `/etc/passwd'
s fie distruse). Trebuie s avei drepturi de scriere de fiiere pe server pentru a
putea utiliza aceast form de SELECT.
SELECT ... INTO OUTFILE este utilizat n principal pentru a descrca rapid un
tabel pe server. Dac dorii s creai fiierul rezultant pe un alt host dect host-ul
server nu putei folosi comanda.
n acest caz va trebui s folosii cteva programe client precum
mysqldump --tab or mysql -e "SELECT ..." > outfile
FROM test_table;
sau
sau
Comanda INSERT insereaz linii noi ntr-un tabel existent. Forma INSERT ...
VALUES a comenzii insereaz linii bazate pe valori explicite.
Forma INSERT ... SELECT insereaz linii selectate dintr-un alt tabel sau din mai
multe tabele. Forma INSERT ... VALUES poate avea o list de valori multiple .
tbl_name este tabelul n care se insereaz liniile de valori. Lista de nume de
coloane sau clauza SET indic care coloane iau valorile specificate de comand:
Dac nu se specific lista coloanelor pentru care se introduc valori n cadrul
comenzilor INSERT ... VALUES sau INSERT ... SELECT, valorile tuturor
coloanelor trebuie scrise n lista VALUES() sau n comanda SELECT. Dac nu tii
ordinea coloanelor n tabel, utilizai comanda DESCRIBE tbl_name.
Fiecare coloan pentru care nu s-a dat explicit o valoare va primi valoarea ei
implicit. Atribuirea valorilor implicite este descris n seciunea CREATE
TABLE.
Fiecare expresie poate referi orice coloan care a fost anterior n lista de valori.
De exemplu, putei utiliza:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
comanda INSERT genereaz o eroare doar dac se specific explicit valori pentru
toate coloanele care necesit o valoare diferit de NULL.
Se poate afla valoarea utilizat pentru o coloan AUTO_INCREMENT cu
ajutorul funciei mysql_insert_id().
Dac se utilizeaz o comand INSERT ... SELECT sau una INSERT ... VALUES
cu liste de valori multiple, se poate folosi funcia C API mysql_info() pentru a afla
informaii referitoare la interogare. Formatul informaiei furnizate este urmtorul:
Records: 100 Duplicates: 0 Warnings: 0
- Setnd o coloan numeric la o valoare cum ar fi '10.34 a'. Caracterele non numerice sunt eliminate iar partea numeric rmas este inserat. Dac valoarea nu
are sens ca numr, coloana este setat la valoarea 0.
- Insernd un string ntr-o coloan CHAR, VARCHAR, TEXT, sau BLOB care
depete lungimea maxim a coloanei. Valoarea este trunchiat la lungimea
maxim a coloanei.
- Insernd o valoare ntr-o coloan de tip date sau time care este ilegal pentru
tipul coloanei. Coloana este setat la o valoare zero potrivit tipului coloanei.
Cu ajutorul comenzii INSERT ... SELECT se pot insera cu rapiditate ntr-un tabel
foarte multe linii din alte mai multe tabele.
INSERT INTO tblTemp2 (fldID)
SELECT tblTemp1.fldOrder_ID FROM tblTemp1
WHERE tblTemp1.fldOrder_ID > 100;
Comanda DELETE terge liniile din tabelul tbl_name, care satisfac condiia
where_definition a clauzei WHERE, and returneaz numrul de nregistrri terse.
Dac se utilizeaz comanda DELETE fr clauza WHERE, toate liniile vor fi
terse. Dac se realizeaz acest lucru n mod AUTOCOMMIT, comanda lucreaz
asemenea comenzi TRUNCATE. Totui, n acest mod numrul returnat de linii
afectate este 0.
Dac se dorete aflarea numrului de nregistrri care sunt terse cnd se terg toate
liniile, se poate utiliza o comand DELETE de forma:
mysql> DELETE FROM tbl_name WHERE 1>0;
Se observ ca aceast comand este mai lent dect DELETE FROM tbl_name
fr clauza WHERE, deoarece terge liniile pe rnd.
Dac se specific cuvntul cheie LOW_PRIORITY, execuia comenzii DELETE
este amnat pn cnd nici un alt client nu mai realizeaz citiri din tabel.
nregistrrile terse sunt meninute ntr-o list de referine iar operaiile INSERT
subsecvente reutilizeaz poziiile vechilor nregistrri.
Opiunea specific MySQL LIMIT rows a comenzii DELETE transmite serverului
numrul maxim de linii care trebuie terse nainte de returnarea controlului ctre
client. Aceasta poate fi utilizat pentru a asigura c o anumit comand DELETE
nu ia prea mult timp. Se poate repeta comanda DELETE command pn cnd
numrul de linii afectate este mai mic dect valoarea dat de LIMIT.
- 83-
Comanda LOAD DATA INFILE citete linii dintr-un fiier text i le scrie ntr-un
tabel cu foarte mare rapiditate. Dac se specific cuvntul cheie LOCAL, fiierul
este citit de pe sistemul clientului, altfel acesta trebuie s existe pe server.
Din motive de securitate fiirele text localizate pe server trebuie s fie n directorul
bazei de date sau s aib drepturi de citire pentru toi.
Dac se specific cuvntul cheie LOW_PRIORITY, execuia comenzii LOAD
DATA este amnat pn cnd nici un alt client nu mai utzilizeaz tabelul.
Dac se specific cuvntul cheie CONCURRENT cu tabele de tip MyISAM,
atunci ali utilizatori pot citi date din tabel n timp ce se execut LOAD DATA.
Utiliznd cuvntul cheie LOCAL execuia va fi mai nceat dect prin lsarea
serverului s acceseze fiierele direct, deoarece coninutul fiierelor trebuie s
treac prin host-ul clientului ctre server.
Exemplu: Comanda LOAD DATA urmtoare citete fiierul 'data.txt' din
directorul bazei de date db1 deoarece db1 de baza de date curent, chiar dac n
instruciune se ncarc fiierul explicit n tabelul tabele al bazei de date db2:
mysql> USE db1;
mysql> LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table;
comenzi. Ambele clauze sunt opionale, dar FIELDS trebuie s precead LINES
dac se specific amndou.
Dac se specific clauza FIELDS, fiecare dintre subclauze (TERMINATED BY,
[OPTIONALLY] ENCLOSED BY, i ESCAPED BY) este opional, dar trebuie
specificat cel puin una dintre ele.
Dac nu se specific clauza FIELDS, valorile implicite sunt considerate ca i cum
s-ar fi scris instruciunea:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
Dac nu se specific clauza LINES, valorile implicite sunt considerate ca i cum sar fi scris instruciunea:
LINES TERMINATED BY '\n'
Dac s-ar fi ncercat citirea fiierului cu instruciunea de mai jos, LOAD DATA
INFILE ar cuta pentru caractere tab ntre cmpuri:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
FIELDS TERMINATED BY '\t';
LOAD DATA INFILE poate fi utilizat pentru a citi fiiere obinute din surse
externe. De exemplu, un fiier n format dBASE va avea cmpurile separate prin
virgule i ncadrate cu ghilimele. Dac liniile n fiier sunt ncheiate cu "\n",
comanda unrmtoare arat opiunile de manipulare a cmpurilor care ar trebui
folosite pentru ncrcarea fiierului:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Oricare dintre opiunile de FIELDS sau LINES pot specifica un ir gol (''). Dac nu
este gol, valorile FIELDS [OPTIONALLY] ENCLOSED BY i FIELDS
ESCAPED BY trebuie s aib doar un singur caracter.
Valorile pentru FIELDS TERMINATED BY i LINES TERMINATED BY pot
avea mai mult de un caracter. de exemplu, pentru a scrie linii care sunt terminate
prin perechi carriage return-linefeed (CR-LF), sau pentru a citi un fiier care
conine astfel de linii, se specific o clauz LINES TERMINATED BY '\r\n'.
De exemplu, pentru a citi un fiier de glume, care sunt separate printr-o linie care
conine %%, ntr-un tabel SQL se poate scrie:
create table jokes (a int not null auto_increment primary key,
joke text not null);
load data infile "/tmp/jokes.txt" into table jokes
fields terminated by ""
lines terminated by "\n%%\n" (joke);
string","100.20"
string containing a , comma","102.20"
string containing a \" quote","102.20"
string containing a \", quote and comma","102.20"
string",100.20
string containing a , comma",102.20
string containing a \" quote",102.20
string containing a \", quote and comma",102.20
- 86-
Apariia unui caracter stabilit prin ENCLOSED BY n cadrul valorii unui cmp
trebuie realizat prin prefixarea lui de ctre caracterul stabilit n opiunea
ESCAPED BY. Dac se specific o valoare goal ('') pentru caracterul ESCAPED
BY, este posibil s se genereze o ieire care nu va putea fi bine citit cu comanda
LOAD DATA INFILE. De exemplu, rezultatul pentru caracterul ESCAPE BY ir
gol va da arat astfel:
1,"a
2,"a
3,"a
4,"a
string",100.20
string containing a , comma",102.20
string containing a " quote",102.20
string containing a ", quote and comma",102.20
Al doilea cmp al ultimei linii conine o virgul care urmeaz dup ghilimele, care
n mod eronat produce ncheierea seleciei cmpului.
Apariia caracterului ENCLOSED BY precedat de caracterul ESCAPED BY este
interpretat ca parte a valorii cmpului curent. n plus, caracterele duble
ENCLOSED BY care apar n cadrul cmpurilor sunt interpretate drept caractere
simple ENCLOSED BY chiar dac acest cmp ncepe cu caracterul respectiv. De
exemplu, dac se specific ENCLOSED BY '"', ghilimele sunt interpretate astfel:
"The ""BIG"" boss"
The "BIG" boss
The ""BIG"" boss
Dac FIELDS ESCAPED BY este gol, un valoarea unui cmp care conine o
apariie a caracterului FIELDS ENCLOSED BY sau LINES TERMINATED BY
urmat de valoarea FIELDS TERMINATED BY va determina LOAD DATA
INFILE s se opresc la citirea unui cmp mai repede. Aceasta se ntmpl
deoarece LOAD DATA INFILE nu poate determina n mod convenabil unde se
termin valoarea cmpului sau a liniei.
Urmtorul exemplu ncarc toate coloanele ale tabelului persondata:
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
8. Comenzi tranzacionale
8.1. Sintaxa BEGIN/COMMIT/ROLLBACK
- 88-
BEGIN
DROP TABLE
CREATE INDEX
RENAME TABLE
READ
Seteaz nivelul de izolare (isolation level) pentru sesiunea global, ntreaga sesiune
sau urmtoarea tranzacie.
n mod normal se seteaz nivelul izolare pentru urmtoarea tranzacie (nenceput
nc).
Dac se seteaz privilegiul GLOBAL, aceasta va afecta toate firele de execuie noi
create. Va fi nevoie de drepturile PROCESS pentru a face acest lucru.
Setnd privilegiul SESSION, vor fi afectate toate tranzaciile urmtoare.
Se poate de asemenea seta nivelul de izolare implicit pentru mysqld cu opiunea
--transaction-isolation=...
- 90-