Sunteți pe pagina 1din 90

My SQL Server - Introducere

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-

1. Conectarea la serverul MySQL


1.1. Startarea serverului MySQL sub Windows 95, 98 sau ME
MySQL utilizeaz protocolul TCP/IP pentru conectarea unui client la server
(aceasta permite oricrui sistem de pe reeaua proprie s se conecteze la serverul
MySQL). Din cauza acestui lucru, trebuie instalat acest protocol pe sistemul de
lucru nainte de startarea MySQL.
Dac utilizai un sistem mai vechi Win95 (de exemplu OSR2), este foarte probabil
s avei un pachet Winsock mai vechi! MySQL necesit Winsock 2! Se poate
obine o variant nou de la adresa http://www.microsoft.com/. Win98 are noua
librrie Winsock 2, deci nu apare aceast problem.
Pentru a porni serverul mysqld, sau mysqld-opt (optimizat) executai fiierul:
C:\> C:\mysql\bin\mysqld.exe

/sau mysqld-opt.exe

Acesta va porni serverul n background fr apariia vreunei ferestre.


Se poate nchide serverul MySQL prin comanda :
C:\> C:\mysql\bin\mysqladmin -u root shutdown

Dac mysqld nu pornete, verificai fiierul `\mysql\data\mysql.err' pentru a vedea


dac a aprut vreun mesaj care s indice cauza problemei. Se poate ncerca
pornirea serverului prin comanda mysqld --standalone. n acest caz, putei primi
cteva informaii utile care ar putea s v ajute s rezolvai problema.
O alt opiune ar fi mysqld --standalone --debug. n acest caz mysqld va scrie o
pagin de log `C:\mysqld.trace' care ar trebui s conin informaii despre motivul
de ce mysqld nu pornete.
1.2. Rularea MySQL sub Windows
MySQL suport protocolul TCP/IP pe toate platformele Windows.
Se poate testa rularea serverului MySQL prin execuia urmtoarelor comenzi:
C:\>
C:\>
C:\>
C:\>

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

sau prin secvena:


shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
WHERE user='root';
mysql> FLUSH PRIVILEGES;

Dup ce ai setat parola, se nchide serverul mysqld prin comanda urmtoare:


C:\> mysqladmin --user=root --password=parola shutdown

Se pot aduga cu uurin noi utilizatori cu comanda INSERT i se pot schimba


drepturile cu ajutorul comenzilor GRANT i REVOKE.
- 4-

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: ********

Dac ai introdus corect parola, va apare informaia de introducere de introducere


i prompter-ul MySQL:
shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 459 to server version: 3.22.20a-log
Type 'help' for help.
mysql>

Dup conectare, exist posibilitatea de deconectare n orice moment prin tastarea


comenzii quit sau \q.
Deconectarea se poate realiza de asemenea prin Ctrl-C.
1.4. Mesaje de eroare n limba romn
Serverul mysqld poate genera mesajele de eroare n mai multe limbi strine dintre
care i romna.
Pentru a porni mysqld cu o anumit limb, se utilizeaz opiunea:
--language=lang sau -L lang .
De exemplu:

shell> mysqld --language=romanian


- 5-

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

Dac este nevoie s se specifice parametri de conectare n linia de comand,


comanda ar arta n felul urmtor:
shell> mysql -h host -u user -p < 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

Se poate scrie rezultatul unei interogri ntr-un fiier:


shell> mysql < batch-file > mysql.out

Scriptul poate fi distribuit i altor persoane pentru a putea fi utilizat.


Exist situaii care nu permit utilizarea interactiv i se utilizeaz modul Batch.
Pentru a primi rezultatul n fiier ntr-un mod mai interactiv se utilizeaz mysql -t.
Ecoul comenzilor care sunt executate apar cu comanda mysql -vvv.

- 6-

2. Structura limbajului MySQL


MySQL are o interfa SQL foarte complex, dar intuitiv i foarte accesibil.
Modul de utilizare al variabilelor i al constantelor este asemntor cu al multor
alte limbaje de programare.

2.1. Modul de scriere al irurilor i numelor n MySQL


2.1.1. iruri
Un ir este o secven de caractere, ncadrat de apostrof (`'`) sau ghilimele (`"`).
n modul de lucru ANSI se utilizeaz doar apostroful.
Exemple:
'a string'
"another string"

n interiorul unui ir anumite secvene au semnificaie special. Fiecare dintre


aceste secvene ncepe cu un backslash (`\`), numit i caracter escape.
MySQL recunoate urmtoarele secvene:
Un caracter ASCII 0 (NUL).
Un caracter apostrof (`'`).
Un caracter ghilimele (`"`).
Un caracter backspace.
Un caracter newline (linie nou).
Un caracter CR - carriage return.
Un caracter tab.
ASCII(26) (Control-Z). Acest caracter poate fi codificat pentru a permite
rezolvarea problemei pe care ASCII(26) o aduce: END-OF-FILE pe o interfa
Windows. ASCII(26) va crea probleme dac se ncearc o utilizare:
\0\'\"\b\n\r\t\z-

mysql database < filename.


\\- Un caracter backslash (`\`).
\%- Un caracter `%`. Acesta este utilizat pentru cutri de tip literal `%` n

contexte unde `%` ar fi interpretat drept caracter wild-card.


\_- Un caracter `_`. Acesta este utilizat pentru cutri de tip literal `_` n
contexte unde `_` ar fi interpretat drept caracter wild-card.

- 7-

Exist cteva moduri de introducere a caracterelor de ncadrare (apostrof,


ghilimele):
- un apostrof `'` din interiorul unui ir ncadrat cu `'` poate fi scris ca `''`.
- ghilimelele `"` din interiorul unui ir ncadrat cu `"` pot fi scrise ca `""`.
- se poate precede caracterul de ncadrare cu un caracter escape (`\`).
- un apostrof din interiorul unui ir ncadrat cu ghilimele nu are nevoie scriere
special i nu are nevoie de dublare sau caracter escape. n acelai mod, ghilimele
dintre apostrofuri nu au nevoie de scriere special.
Ex.: Instruciunea SELECT urmtoare arat modul n care se utilizeaz caracterele
de ncadrare i caracterele escape:
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
lines |
+--------------------+

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()

pentru introducerea secvenelor escape n cadrul comenzii INSERT.


n Perl, putei folosi metoda quote din pachetul DBI pentru conversia caracterelor
speciale n secvene escape corespunztoare.

- 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

Exemple de numere reale:


294.42
-32032.6809e+10
148.00

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-

2.2. Numele bazelor de date, a tabelelor, a indecilor i a coloanelor


n MySQL
Bazele de date, tabelele, indecii, coloanele i aliasurile au nume care suport
aproximativ aceleai reguli n MySQL.
Exist i o modalitate de adresare a identificatorilor prin ncadrarea lor cu
apostrofuri sau ghilimele n cazul bazelor numelor de baze de date, tabele sau
nume de coloane.
Identificator

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

n plus fa de tabelul anterior trebuie tiut c nu se pot insera caracterele


ASCII(0), ASCII(255) sau caracterele de ncadrare n cadrul unui identificator.
Dac identificatorul este un cuvnt special sau conine caractere speciale trebuie
ncadrat cu apostrof cnd se utilizeaz:
SELECT * from `select` where `select`.id > 100;

Cteva dintre regulile referitoare la numele identificatorilor sunt:


- un nume poate conine orice caracter alfanumeric din setul de caractere curent i
de asemenea caracterele `_` i `$`. Setul de caractere implicit este ISO-8859-1
Latin1; care poate fi modificat prin opiunea:
mysqld --default-character-set.

- 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-

n MySQL o coloan poate fi referit utiliznd una dintre urmtoarele forme:


Referirea coloanei
col_name
tbl_name.col_name
db_name.tbl_name.col_name
`column_name`

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 `.`.

2.3. Senzitivitatea de caz n cadrul numelor


n MySQL, bazele de date i tabelele corespund directoarelor i fiierelor din acele
directoare. Prin urmare, senzitivitatea de caz a sistemului de operare curent
determin i senzitivitatea de caz a bazelor de date i a tabelelor. Aceasta nseamn
c numele bazelor de date i a tabelelor au caz senzitiv n Unix i caz insenzitiv n
Windows.
Observaie: Cu toate c numele bazelor de date i a tabelelor au caz insenzitiv n
Windows, nu trebuie fcut referirea la o anumit baz de date sau la un tabel
folosind denumiri cu mod diferit de scriere n cadrul unei aceleai interogri.

- 11-

Urmtoarea interogare nu va avea efect deoarece se refer la un tabel att prin


my_table ct i prin MY_TABLE:
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

Numele coloanelor au caz insenzitiv tot timpul.


Aliasurile tabelelor au caz senzitiv. Urmtoarea interogare nu funcioneaz
deoarece face referire la alias att prin a ct i prin A:
mysql> SELECT col_name FROM tbl_name AS a
WHERE a.col_name = 1 OR A.col_name = 2;

Aliasurile coloanelor au caz insenzitiv.


Se poate adopta o convenie cum ar fi crearea ntotdeauna a bazelor de date i a
tabelelor utiliznd nume scrise cu litere mici.
Un alt mod de a evita aceast problem este de a executa mysqld cu opiunea:
-O lower_case_table_names=1

Implicit aceast opiune este 1 n Windows i 0 n Unix.


Dac lower_case_table_names este 1 MySQL va converti toate numele tabelelor
n litere mici n momentul stocrilor sau interogrilor. Dac schimbai opiunea,
trebuie prima dat s convertii vechile nume n nume scrise cu litere mici nainte
de a porni mysqld.

2.4. Variabile utilizator


MySQL suport variabile specifice thread (fir de execuie) prin sintaxa
@variablename. Un nume de variabil poate conine caractere alfanumerice din
setul de caractere curent i de asemenea caracterele `_`, `$`, i `.` . Setul de
caractere implicit este ISO-8859-1 Latin1 i poate fi schimbat prin opiunea
--default-character-set din mysqld.
Variabilele nu trebuie s fie iniializate. Ele conin NULL implicit i pot stoca un
ntreg, un numr real sau un string. Toate variabilele unui thread sunt automat
eliberate n momentul n care se iese din procesul de execuie.
Se poate seta o variabil cu ajutorul instruciunii SET a crei sintax este:
SET @variable= { integer expression | real expression | string
expression } [,@variable= ...].
- 12-

Se poate, de asemenea, seta o variabil prin @variable:=expr_syntax:


select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
|
5 |
5 |
1 |
4 |
+----------------------+------+------+------+

(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;

Motivul este c @aa nu va conine valoarea liniei curente, ci valoarea


identificatorului id al liniei anterioare acceptate.

2.5. Sintaxa comentariu


MySQL server suport urmtoarele tipuri de comentarii: -- i # pn la sfrit de
linie, '/* */' n cadrul unei sau mai multor linii:
mysql> select 1+1;
# Comentariu pn la sfrit de linie
mysql> select 1+1;
-- Comentariu pn la sfrit de linie
mysql> select 1 /* comentariu in-line */ + 1;
mysql> select 1+
/*
comentariu pe
mai multe linii
*/
1;

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-

3. Tipul datelor n MySQL


MySQL suport un numr de tipuri de date (coloane), care pot fi grupate n trei
mari categorii: tipuri numerice, tipuri data calendaristic i or, i tipuri string sau
caracter.
n cadrul descrierii se utilizeaz urmtoarele litere de cod:
M - indic valoarea maxim de afiare care legal este 255.
D - apare la tipurile cu virgul flotant i indicat numrul de digii care urmeaz
dup punctul zecimal. Valoarea maxim posibil este 30,
Parantezele ptrate '[' i ']' indic prile de specificare ale tipului care sunt
opionale.
Dac se specific atributul ZEROFILL pentru o coloan, MySQL va aduga
automat atributul UNSIGNED acelei coloane.
Tipurile de coloane suportate de MySQL sunt descrise n continuare.

3.1. Tipuri numerice


TINYINT[(M)] [UNSIGNED] [ZEROFILL]
Un ntreg mic. Intervalul cu semn este -128 pn la 127, iar cel fr este 0 pn
la 255 (2^8).
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
Un ntreg mic. Intervalul cu semn este -32768 pn la 32767, iar cel fr este 0
pn la 65535 (2^16).
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
ntreg de mrime medie. Intervalul cu semn este -8388608 pn la 8388607, iar
cel fr semn este 0 pn la 16777215 (2^24).
INT[(M)] [UNSIGNED] [ZEROFILL]
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
Un ntreg cu intervalul ntre -2147483648 i 2147483647 cu semn i ntre 0 i
4294967295 (2^32) fr semn.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
Un ntreg mare. Intervalul cu semn este -9223372036854775808 pn la
9223372036854775807, iar cel fr semn este 0 pn la 18446744073709551615
(2^64).
Trebuie fcute anumite observaii referitoare la coloanele de tip BIGINT:
- 15-

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.

3.2. Tipuri dat i or


DATE
Tipul dat calendaristic. Intervalul permis este din '1000-01-01' pn n '999912-31'. MySQL afieaz valorile DATE n format 'YYYY-MM-DD' (an, lun, zi),
dar permite atribuiri pentru coloanele DATE utiliznd iruri sau numere.
DATETIME
O dat n combinaie cu timpul. Intervalul permis este din '1000-01-01
00:00:00' pn n '9999-12-31 23:59:59'. MySQL afieaz valorile DATETIME n
format 'YYYY-MM-DD HH:MM:SS', dar permite atribuiri pentru coloanele
DATETIME utiliznd iruri sau numere.
TIMESTAMP[(M)]
Tipul timestamp (data i ora curent) are intervalul permis din '1970-01-01
00:00:00' pn n anul 2037. MySQL afieaz valorile TIMESTAMP n formatele
YYMMDD, YYYYMMDD, YYMMDDHHMMSS, YYYYMMDDHHMMSS, fie
c M este 6, 8, 12, sau 14 (sau lipsete). O coloan TIMESTAMP este util pentru
nregistrarea datei i orei unei operaii INSERT sau UPDATE deoarece este setat
automat la data i ora operaiei celei mai recente dac nu se specific o valoare
explicit. Se poate de asemenea seta la data i ora curent prin atribuirea cu o
valoare NULL. O valoare de tip TIMESTAMP este stocat ntotdeauna pe 4 bytes.
Argumentul M afecteaz doar modul de afiare al valorii coloanei TIMESTAMP.
Coloanele de tip TIMESTAMP(X) unde X este 8 sau 14 sunt considerate ca fiind
numere n timp ce alte coloane TIMESTAMP(X) sunt considerate ca fiind iruri.
Acest lucru este realizat pentru a se putea descrca sau restaura cu ncredere un
tabel cu ajutorul acestor tipuri.
TIME
Tipul or (timp) are intervalul permis '-838:59:59' pn la '838:59:59'. MySQL
afieaz valorile de tip TIME n format 'HH:MM:SS', dar permite atribuiri pentru
coloanele de tip TIME utiliznd iruri sau numere
YEAR[(2|4)]
Tipul an poate fi selectat n formatele cu 2 sau 4 digii (implicit 4), iar valorile
permise sunt din 1901 pn n 2155, 0000 n formatul cu 4 digii, i 1970-2069
pentru cel cu 2 digii (70-69). MySQL afieaz valorile YEAR n format YYYY,
dar se permite atribuiri pentru coloanele de tip YEAR utiliznd iruri sau numere.
- 17-

3.4. Tipuri string sau caracter


[NATIONAL] CHAR(M) [BINARY]
Un string de lungime fix care este ntotdeauna completat cu spaii pn la
umplerea spaiului de lungime specificat M. Intervalul pentru M este de 1-255
caractere. Spaiile completate sunt nlturate la afiarea valorii. Valorile CHAR
sunt sortate i comparate n caz insenzitiv n acord cu setul de caractere implicit
doar dac nu se specific cuvntul cheie BINARY.
NATIONAL CHAR (forma scurt NCHAR) este modul ANSI SQL de a defini
utilizarea setul de caractere implicit de ctre coloana CHAR. Acesta este considerat
implicit n MySQL. Se permite crearea de coloane de tip CHAR(0). Aceasta este,
n principal, util atunci cnd trebuie s avem compatibilitate cu nite aplicaii mai
vechi care depind de existena unei coloane dar de fapt nu utilizeaz valoarea
acesteia. Aceasta este de asemenea util cnd avem nevoie de o coloan care poate
lua doar 2 valori. O coloan CHAR(0), care nu este definit drept NOT NULL, va
ocupa 1 bit i poate lua valorile: NULL or "".
BIT
BOOL
CHAR
Sinonime pentru CHAR(1).
[NATIONAL] VARCHAR(M) [BINARY]
Un string de lungime variabil. Spaiile de umplere sunt nlturate cnd se
stocheaz valoarea (difer de specificaiile ANSI SQL). Intervalul pentru M este de
1-255 caractere. Valorile VARCHAR sunt sortate i comparate n caz insenzitiv
doar dac nu se specific cuvntul cheie BINARY.
TINYBLOB
TINYTEXT
O coloan format BLOB (Binary Long Object - obiect de tip binar cu o anumit
lungime) sau TEXT cu lungimea maxim de 255 (2^8 - 1) caractere.
BLOB
TEXT
Un BLOB sau TEXT cu lungimea maxim de 65535 (2^16 - 1) caractere.
MEDIUMBLOB
MEDIUMTEXT
Un BLOB sau TEXT cu lungimea maxim de 16777215 (2^24 - 1) caractere.
LONGBLOB
LONGTEXT
Un BLOB sau TEXT cu lungimea maxim de 4294967295 (2^32 - 1) caractere.
- 18-

Observaie: Deoarece protocolul server/client i tabelele MyISAM au o limit


curent de 16MB pe pachetul de comunicaie/ linie de tabel, nu se poate utiliza
ntregul interval al acestui tip.
ENUM('value1','value2',...)
O enumerare. Un obiect string care poate avea doar o singur valoare, aleas
din lista de valori 'value1', 'value2', ..., NULL sau o valoare de eroare. O coloan
de tip ENUM poate avea doar 65535 de valori distincte.
SET('value1','value2',...)
Un set. Un obiect string care poate avea zero or mai multe valori, fiecare putnd
fi aleas din lista de valori 'value1', 'value2', ... . Un SET poate avea maxim 64 de
membri.

3.4. Utilizarea tipurilor de coloane ale altor programe de baze de


date
Pentru a face mai uoar utilizarea codului scris pentru implementare SQL de ali
productori, MySQL are echivalente urmtoarele tipuri de date:
Tipul altui program de BD
BINARY(NUM)
CHAR VARYING(NUM)
FLOAT4
FLOAT8
INT1
INT2
INT3
INT4
INT8
LONG VARBINARY
LONG VARCHAR
MIDDLEINT
VARBINARY(NUM)

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-

3.5. Cerinele de stocare pentru tipurile de coloane


3.5.1. Cerinele de stocare pentru tipurile numerice
Tipul coloanei
TINYINT
SMALLINT
MEDIUMINT
INT
INTEGER
BIGINT
FLOAT(X)
FLOAT
DOUBLE
DOUBLE PRECISION
REAL
DECIMAL(M,D)
NUMERIC(M,D)

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)

3.5.2. Cerinele de stocare pentru tipurile dat i or


Tipul coloanei
DATE
DATETIME
TIMESTAMP
TIME
YEAR

Spaiu de stocare
3 bytes
8 bytes
4 bytes
3 bytes
1 byte

3.5.3. Cerinele de stocare pentru tipurile string i caracter


Tipul coloanei
CHAR(M)
VARCHAR(M)
TINYBLOB, TINYTEXT
BLOB, TEXT
MEDIUMBLOB, MEDIUMTEXT
LONGBLOB, LONGTEXT
ENUM('value1','value2',...)
SET('value1','value2',...)

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-

4. Funcii care se utilizeaz n cadrul


clauzelor SELECT, WHERE i GROUP BY
O expresie din cadrul unei interogri SELECT sau a unei condiii WHERE din
comenzile SQL pot conine oricare dintre funciile descrise n continuare.
Observaie: Nu trebuie s existe spaii ntre numele funciei i paranteza deschis
care o urmeaz. Aceasta ajut interpretorul MySQL la distingerea dintre apelurile
de funcii i referirile la tabele sau coloane care s-ar putea s aib acelai nume cu
cel al funciei. Spaiile din jurul argumentelor sun totui permise.
Se poate fora interpretorul MySQL s accepte spaii dup numele funciilor prin
startarea
serverului
mysqld
cu
opiunea
--ansi
sau
utiliznd
CLIENT_IGNORE_SPACE pentru funcia mysql_connect(), dar n acest caz toate
numele de funcii devin cuvinte rezervate.
Pentru o mai bun concizie, modul de afiare al exemplelor care vor urma va fi
scris ntr-o form abreviat dup cum urmeaz:
mysql> select MOD(29,9);
1 rows in set (0.00 sec)
+-----------+
| mod(29,9) |
+-----------+
|
2 |
+-----------+

este afiat prescurtat astfel :


mysql> select MOD(29,9);
-> 2

4.1. Operatori i funcii fr tip specific


4.1.1. Paranteze ( ... )
Se utilizeaz pentru forarea ordinii evalurii n cadrul expresiilor.
mysql> select 1+2*3;
-> 7
mysql> select (1+2)*3;
-> 9
- 21-

4.1.2. Operatori de comparaie


Rezultatele operaiilor de comparaie iau trei valori posibile: 1 (TRUE), 0 (FALSE)
sau NULL. Aceste funcii lucreaz i cu numere i cu iruri de caractere, iar irurile
sunt automat convertite la numere i numerele la iruri dup nevoie.
MySQL realizeaz compariile utiliznd urmtoarele reguli:
Dac unul sau ambele argumente sunt NULL, rezultatul comparaiei este
NULL, cu excepia operatorului <=>.
Dac ambele argumente ale comparaiei sunt iruri string, ele sunt comparate
drept iruri de caractere.
Dac ambele argumente sunt ntregi, ele sunt comparate ca numere ntregi.
Valorile hexazecimale sunt are tratate ca iruri binare dac nu sunt comparate
cu numere.
Dac unul dintre argumente este TIMESTAMP sau DATETIME iar cellalt
este o constant, constanta este convertit n timestamp nainte de realizarea
comparaiei.
n toate celelate cazuri, argumentele sunt comparate ca numere reale.
Implicit, compararea irurilor string se face n mod independent de caz i utiliznd
setul de caractere curent (ISO-8859-1 Latin1).
Exemplele urmtoare ilustreaz conversia irurilor string la numere pentru
operaiile de comparare:
mysql> SELECT
-> 0
mysql> SELECT
-> 1
mysql> SELECT
-> 0
mysql> SELECT
-> 1

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

<= Mai mic sau egal:


mysql> select 0.1 <= 2;
-> 1

< Mai mic:


mysql> select 2 < 2;
-> 0

>=Mai mare sau egal:


mysql> select 2 >= 2;
-> 1

> Mai mare:


mysql> select 2 > 2;
-> 0

<=> Egalitate de siguran cu NULL:


mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0

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

expr BETWEEN min AND max


Dac expr este mai mare sau egal ca min i expr este mai mic sau egal ca max,
BETWEEN returneaz 1, altfel returneaz 0. Este echivalent cu expresia (min <=
expr AND expr <= max) dac toate argumente sunt de acelai tip.
- 23-

Primul argument (expr) determin modul de efectuare al comparaiei astfel:


Dac expr este de tip TIMESTAMP, DATE, sau DATETIME, min i max sunt
formatate la acelai tip dac sunt constante.
Dac expr este o expresie string case-insensitive, se realizeaz o comparaie
case-insensitive.
Dac expr este o expresie string case-sensitive, se realizeaz o comparaie
case-sensitive.
Dac expr este o expresie integer, se realizeaz o comparaie integer.
Altfel, se realizeaz o comparaie cu numere reale.
mysql> select
-> 0
mysql> select
-> 1
mysql> select
-> 1
mysql> select
-> 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

Trebuie de tiut c o comparaie a valorilor NULL utiliznd = va da ntotdeauna


rezultat fals!
COALESCE(list)
Returneaz primul element al listei diferit de NULL:
- 24-

mysql> select COALESCE(NULL,1);


-> 1
mysql> select COALESCE(NULL,NULL,NULL);
-> NULL

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

Dac se compar string-uri case sensitive cu unul dintre operatorii standard


( =, <>..., dar nu LIKE) spaiul de sfrit va fi ignorat.
mysql> select "a" ="A ";
-> 1

4.1.3. Operatori Logici


Toate funciile logice returneaz 1 (TRUE), 0 (FALSE) sau NULL:
NOT , !
Negaie logic. Returneaz 1 dac argumentul este 0, altfel returneaz 1.
Excepie: NOT NULL returneaz NULL:
mysql> select NOT 1;
-> 0
mysql> select NOT NULL;
-> NULL
mysql> select ! (1+1);
-> 0
mysql> select ! 1+1;
-> 1

Ultimul exemplu returneaz 1 deoarece expresia se evalueaz la fel ca (!1)+1.


OR, ||
Sau Logic. Returneaz 1 dac oricare dintre argumente este diferit de 0 sau NULL:
mysql> select 1 || 0;
-> 1
- 25-

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

4.1.4. Funcii de control


IFNULL(expr1,expr2)
Dac expr1 este diferit de NULL, IFNULL() returneaz expr1, altfel va returna
expr2. IFNULL() returneaz o valoare numeric sau string depinde de contextul n
care este utilizat:
mysql> select IFNULL(1,0);
-> 1
mysql> select IFNULL(NULL,10);
-> 10
mysql> select IFNULL(1/0,10);
-> 10
mysql> select IFNULL(1/0,'yes');
-> 'yes'

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-

mysql> select IF(1>2,2,3);


-> 3
mysql> select IF(1<2,'yes','no');
-> 'yes'
mysql> select IF(strcmp('test','test1'),'no','yes');
-> 'no'

expr1 este evaluat ca valoare ntreag, ceea ce nseamn c dac se testeaz


valori n virgul flotant sau valori string, va trebui utilizat un operator de
comparaie:
mysql> select IF(0.1,1,0);
-> 0
mysql> select IF(0.1<>0,1,0);
-> 1

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

CASE value WHEN [compare-value] THEN result [WHEN [compare-value]


THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...]
[ELSE result] END
Prima versiune returneaz rezultatul result unde value=compare-value. A doua
versiune returneaz rezultatul pentru prima condiie care este adevrat.
Dac nu exist rezultate identice, atunci se returneaz rezultatul result de dup
ELSE. Dac nu exist clauza ELSE atunci se returneaz NULL:
mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two"
ELSE "more" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
-> "true"
mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then
2 END;
-> NULL

Tipul valorii returnate (INTEGER, DOUBLE or STRING) este acelai cu tipul


primei valori returnate (expresia de dup primul THEN).
- 27-

4.2. Funcii String


Funciile cu valori string returneaz NULL dac lungimea rezultatului va fi mai
mare dect parametrul server care specific pachetul maxim permis.
Pentru funcii care opereaz cu poziii string, prima poziie este considerat 1.
ASCII(str)
Returneaz valoarea codului ASCII a celui mai din stnga caracter din str.
Returneaz 0 dac str este ir gol. Returneaz NULL dac str este NULL:
mysql> select ASCII('2');
-> 50
mysql> select ASCII(2);
-> 50
mysql> select ASCII('dx');
-> 100

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'

CONCAT_WS(separator, str1, str2,...)


CONCAT_WS() este o form special de CONCAT cu separator. Primul
argument este separatorul pentru restul argumentelor. Separatorul poate fi un string
la fel ca i restul argumentelor. Dac separatorul este NULL, rezultatul va fi
- 29-

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

CONCAT_WS(",","First name","Second name",


name,Second name,Last Name'
CONCAT_WS(",","First name",NULL,"Last Name");
name,Last Name'

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

Pentru CHAR_LENGTH(), caracterele multi-byte sunt numrate o singur dat.


LOCATE(substr,str)
POSITION(substr IN str)
Returneaz poziia primei apariii a subirului substr n irul str. Returneaz 0
dac substr nu exist n str:
mysql> select LOCATE('bar', 'foobarbar');
-> 4
mysql> select LOCATE('xbar', 'foobar');
-> 0

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'

');

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)


Returneaz irul str cu toate prefixele sau sufixele remstr eliminate. Dac nici
unul dintre specificatorii BOTH, LEADING sau TRAILING nu sunt dai, se
consider implicit BOTH. Dac remstr nu este specificat, se elimin spaiile:
mysql> select TRIM(' bar
');
-> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'

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>
->

select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');


2
select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
0

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

Pentru testarea apariiei unuia dintre caracterele wild-card, se precede caracterul


cu un caracter escape. Dac nu se specific caracterul ESCAPE, se consider
backslash ('\') implicit :
\% - potrivirea unui caracter %;
\_ - potrivirea unui caracter '_'.
mysql> select 'David!' LIKE 'David\_';
- 35-

-> 0
mysql> select 'David_' LIKE 'David\_';
-> 1

Pentru a specifica un caracter escape diferit, se utilizeaz clauza ESCAPE:


mysql> select 'David_' LIKE 'David|_' ESCAPE '|';
-> 1

Urmtoarele dou instruciuni arat c diferena de comparaie ntre operanzi cu


senzitivitate de caz i fr:
mysql> select 'abc' LIKE 'ABC';
-> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
-> 0

Funcia LIKE este permis i asupra expresiilor numerice!


mysql> select 10 LIKE '1%';
-> 1

Observaie: Deoarece MySQL utilizeaz modul preluat din C de utilizare a


caracterelor escape n cadrul irurilor (de exemplu, `\n'), trebuie dublat orice
caracter '\' care este folosit n irurile funciei LIKE. De exemplu, pentru cutarea
caracterului '\n', se specific `\\n'. Pentru cutarea lui '\', se specific `\\\\'
(caracterele backslash sunt eliminate (2) o dat de interpretor i nc o dat cnd se
realizeaz potrivirea dup model, lsnd un singur backslash pentru asemnare).
expr [NOT] REGEXP pattern
expr [NOT] RLIKE pattern
Realizeaz o testare de potrivire a irurilor date de expresia expr prin modelul
pattern. Modelul pattern poate fi o expresie extins. Returneaz 1 dac se gsesc
asemnri a expresie expr cu modelul pattern, altfel returneaz 0. RLIKE este un
sinonim pentru REGEXP, prevzut pentru compatibilitate mSQL.
Observaie: Deoarece MySQL utilizeaz sintaxa C pentru introducerea
caracterelor escape n cadrul irurilor, caracterele '\' trebuie dublate pentru a fi
utilizate n cadrul irurilor REGEXP. REGEXP este case-insensitive pentru iruri
normale.
mysql> select
-> 0
mysql> select
-> 1
mysql> select
-> 1
mysql> select
-> 1

'Monty!' REGEXP 'm%y%%';


'Monty!' REGEXP '.*';
'new*\n*line' REGEXP 'new\\*.\\*line';
"a" REGEXP "A", "a" REGEXP BINARY "A";
0
- 36-

mysql> select "a" REGEXP "^[a-d]";


-> 1
mysql> select "elna" REGEXP "na$";
-> 1

REGEXP i RLIKE utilizeaz setul de caractere curent (implicit ISO-8859-1


Latin1) atunci cnd decid tipul de caracter.
STRCMP(expr1,expr2)
STRCMP() returneaz 0 dac irurile sunt identice, -1 dac primul argument
este mai mic dect al doilea, i 1 altfel:
mysql> select STRCMP('text', 'text2');
-> -1
mysql> select STRCMP('text2', 'text');
-> 1
mysql> select STRCMP('text', 'text');
-> 0

MATCH (col1,col2,...) AGAINST (expr)


MATCH ... AGAINST() este utilizat pentru cutri full-text i returneaz
relevana - similaritile de mrime ntre coloanele(col1,col2,...) i expresia expr.
Relevana este un numr n virgul mobil. Valoarea 0 a acesteia semnific
inexistena unei similariti. Pentru ca MATCH ... AGAINST() s funcioneze,
trebuie creat mai nti un index FULLTEXT.
BINARY
Operatorul BINARY modific irul care-l urmeaz ntr-un ir binar. Este un
mod foarte simplu de a fora senzitivitatea de caz a unei comparaii chiar dac
coloana nu este definit ca BINARY sau BLOB:
mysql> select "a" = "A";
-> 1
mysql> select BINARY "a" = "A";
-> 0

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-

4.3. Funcii numerice


4.3.1. Operaii aritmetice
Sunt disponibili operatorii aritmetici normali. n cazul operatorilor '-', '+', i '*',
rezultatul este calculat cu precizie BIGINT (64-bit) cu ambele argumente fiind
numere ntregi.
+ Adunare:
mysql> select 3+5;
-> 8

- Scdere:
mysql> select 3-5;
-> -2
* nmulire :
mysql> select 3*5;
-> 15
mysql> select 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql> select 18014398509481984*18014398509481984;
-> 0

Rezultatul ultimei expresii este incorect deoarece rezultatul multiplicrii ntregi


depete intervalul tipului BIGINT de 64-bii.
/ mprire:
mysql> select 3/5;
-> 0.60

mprirea cu 0 d un rezultat NULL:


mysql> select 102/(1-1);
-> NULL

mprirea va fi calculat cu tipul BIGINT doar dac este realizat ntr-un


context n care rezultatul este convertit n numr ntreg!

- 38-

4.3.2. Funcii matematice


Toate funciile matematice returneaz NULL n caz de eroare.
- Minus unar. Schimb semnul unui argument:
mysql> select - 2;
-> -2

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

Comportamentul funciei ROUND() atunci cnd argumentul este la jumtatea


intervalului dintre doi ntregi depinde de implementarea din biblioteca C. Unele
rotunjesc la cel mai apropiat numr par, ntotdeauna mai mare, ntotdeauna mai
mic sau spre zero. Dac se dorete un anumit tip de rotunjire, ar trebui utilizat o
funcie de genul TRUNCATE() sau FLOOR().
ROUND(X,D)
Returneaz argumentul X, rotunjit la un numr cu D zecimale. Dac D este 0,
rezultatul nu va avea nici punct zecimal i nici parte fracionar:
mysql> select ROUND(1.298, 1);
-> 1.3
mysql> select ROUND(1.298, 0);
-> 1

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-

mysql> select SIN(PI());


-> 0.000000

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-

Returneaz arc tangent pentru dou variabile X i Y. Este similar cu a calcula


arc tangent de Y / X, cu excepia c semnele ambelor argumente sunt utilizate
pentru a determina cadranul n care se afl rezultatul:
mysql> select ATAN(-2,2);
-> -0.785398
mysql> select ATAN2(PI(),0);
-> 1.570796

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

Nu se poate utiliza o coloan cu valori RAND() ntr-o clauz ORDER BY,


deoarece ORDER BY va evalua coloana de mai multe ori.
LEAST(X,Y,...)
Are dou sau mai multe argumente i returneaz cea mai mic valoare dintre
argumente. Argumentele sunt comparate utiliznd urmtoarele reguli:
Dac valoarea de returnat este utilizat ntr-un context numeric ntreg sau toate
argumentele au valori ntregi, ele sunt comparate ca numere ntregi.
Dac valoarea de returnat este utilizat ntr-un context numeric real sau toate
argumentele au valori reale, ele sunt comparate ca numere reale.
Dac unul dintre argumente este un ir case-sensitive, argumentele sunt
comparate ca iruri case-sensitive.
n celelalte cazuri, argumentele sunt comparate ca iruri case-insensitive.
mysql> select LEAST(2,0);
-> 0
mysql> select LEAST(34.0,3.0,5.0,767.0);
-> 3.0
mysql> select LEAST("B","A","C");
-> "A"

- 43-

n versiunile MySQL nainte de versiunea 3.22.5, se poate utiliza funcia MIN()


n loc de LEAST().
GREATEST(X,Y,...)
Returneaz argumentul cu valoarea cea mai mare. Argumentele sunt comparate
folosind aceleai reguli ca i pentru funcia LEAST():
mysql> select GREATEST(2,0);
-> 2
mysql> select GREATEST(34.0,3.0,5.0,767.0);
-> 767.0
mysql> select GREATEST("B","A","C");
-> "C"

n versiunile MySQL nainte de versiunea 3.22.5, se poate utiliza funcia


MAX() n loc de GREATEST().
DEGREES(X)
Returneaz argumentul X, convertit din radiani n grade:
mysql> select DEGREES(PI());
-> 180.000000

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-

4.4. Funcii care returneaz data i ora


n urmtorul exemplu se observ modul de utilizare al funciilor dat. Interogarea
urmtoare selecteaz toate nregistrrile cu o dat date_col din ultimele 30 de zile:
mysql> SELECT something FROM table
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;

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

DATE_ADD(date,INTERVAL expr type)


DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
Aceste funcii realizeaz operaii aritmetice cu date. ADDDATE() i
SUBDATE() sunt sinonime pentru DATE_ADD() i DATE_SUB(). Se pot utiliza
de asemenea + i - n loc de DATE_ADD() i DATE_SUB() dac expresia din
partea dreapta este de tip DATE sau DATETIME.
date este o valoare de tip DATETIME sau DATE care specific data de start.
expr este o expresie care specific valoarea interval ce trebuie adunat sau sczut
din data date. expr este un ir care poate ncepe cu '-' pentru intervale negative.
type este un cuvnt cheie care indic modul n care ar trebui interpretat expresia.

- 47-

Urmtorul tabel arat modul n care se realizeaz legtura ntre argumentele


type i expr:
Valoarea tipului
SECOND
MINUTE
HOUR
DAY
MONTH
YEAR
MINUTE_SECOND
HOUR_MINUTE
DAY_HOUR
YEAR_MONTH
HOUR_SECOND
DAY_MINUTE

Formatul ateptat al expresiei expr


SECONDS
MINUTES
HOURS
DAYS
MONTHS
YEARS
"MINUTES:SECONDS"
"HOURS:MINUTES"
"DAYS HOURS"
"YEARS-MONTHS"
"HOURS:MINUTES:SECONDS"
"DAYS HOURS:MINUTES"
"DAYS HOURS :
MINUTES:SECONDS"

DAY_SECOND

MySQL permite orice delimitator de punctuaie n formatul expr. Delimitatorii


indicai sunt: '-', '/' i ':'. Dac argumentul date este o valoare de tip DATE iar
calculele implic doar funcii ca YEAR, MONTH sau DAY, rezultatul va fi o
valoare de tip DATE. Altfel rezultatul este o valoare de tip DATETIME:
mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
-> 1998-01-01
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
-> 1997-12-02
- 48-

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

Dac se utilizeaz date incorecte, rezultatul va fi NULL. Dac se adun


MONTH, YEAR_MONTH, sau YEAR i data rezultat are o zi care este mai mare
dect ziua maxim a lunii respective, ziua este ajustat la maximul permis pentru
noua lun:
mysql> select DATE_ADD('1998-01-30', Interval 1 month);
-> 1998-02-28

Cuvintele INTERVAL i cuvntul care specific tipul sunt interpretate n mod


case-sensitive.
EXTRACT(type FROM date)
Funcia EXTRACT() utilizeaz aceleai tipuri de identificatori de tip ca i
DATE_ADD() sau DATE_SUB(), dar doar extrage pri din expresii de tip dat.
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102

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
%%

Month - numele lunii (January..December)


Weekday - numele zilei (Sunday..Saturday)
Ziua din lun cu sufixe englezeti (1st, 2nd, 3rd, etc.)
Year - an, numeric, 4 digii
Year - an, numeric, 2 digii
Anul pentru sptmna n care duminica este prima zi din sptmn,
numeric, 4 digii, utilizat cu '%V'
Anul pentru sptmna n care luni este prima zi din sptmn,
numeric, 4 digii, utilizat cu '%v'
Numele zilei din sptmn abreviat (Sun..Sat)
Day - ziua din lun, numeric (00 31)
Day - ziua din lun, numeric (0 ... 31)
Month - luna, numeric (01..12)
Luna, numeric (1..12)
Numele lunii abreviat (Jan..Dec)
Ziua din an (001..366)
Hour - ora (00..23)
Ora (0..23)
Ora (01..12)
Ora (01..12)
Ora (1..12)
Minute, numeric (00..59)
Timpul, 12-ore (hh:mm:ss [A | P]M)
Time - timp, 24-ore (hh:mm:ss)
Secunde (00 ... 59)
Secunde (00 ... 59)
AM sau PM
Ziua din sptmn (0=Sunday..6=Saturday)
Sptmna (0..53), unde duminic este prima zi a sptmnii
Sptmna (0..53), unde luni este prima zi a sptmnii
Sptmna (1..53), unde duminic este prima zi a sptmnii.
Utilizat cu '%X'
Sptmna (1..53), unde luni este prima zi a sptmnii. Utilizat cu '%x'
Un semn '%'

Toate celelalte caractere sunt doar copiate n rezultat fr interpretare:


- 50-

mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');


-> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> select DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'

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-

4.5. Alte funcii


4.5.1. Funcii pe Bit
MySQL utilizeaz aritmetica BIGINT (64-bit) pentru operaiile pe bit, deci aceti
operatori au o valoare maxim de 64 de bii.
| - OR, SAU logic pe bit :
mysql> select 29 | 15;
-> 31

& - AND, I logic pe bit:


mysql> select 29 & 15;
-> 13

<< Shiftare la stnga a unui numr BIGINT:


mysql> select 1 << 2;
-> 4

>> Shiftare la dreapta a unui numr BIGINT:


mysql> select 4 >> 2;
-> 1

~ Inversarea tuturor biilor:


mysql> select 5 & ~1;
-> 4

BIT_COUNT(N)
Returneaz numrul de bii care sunt setai n argumentul N:
mysql> select BIT_COUNT(29);
-> 4

4.5.2. Funcii diverse


DATABASE()
Returneaz numele bazei de date curente:
mysql> select DATABASE();
-> 'test'

- 53-

Dac nu exist o baz de date curent, DATABASE() returneaz un ir gol.


USER()
SYSTEM_USER()
SESSION_USER()
Returneaz numele utilizatorului curent MySQL:
mysql> select USER();
-> 'davida@localhost'

Acesta include att numele host-ului ct i numele utilizatorului. Se poate


extrage doar numele utilizatorului n felul urmtor:
mysql> select substring_index(USER(),"@",1);
-> 'davida'

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'

Encriptarea cu funcia PASSWORD() nu este reversibil, iar encriptarea parolei


de utilizator MySQL se realizeaz diferit de encriptarea parolei de Unix.
ENCRYPT(str[,salt])
Encripteaz irul str utiliznd funcia din Unix crypt(). Argumentul salt
reprezint un ir.
mysql> select ENCRYPT("hello");
-> 'VxuFAJXVARROc'

Dac funcia crypt() nu este disponibil pe sistem, ENCRYPT() va returna


ntotdeauna NULL. ENCRYPT() ignor toate caracterele peste 8 din str, cel puin
pe unele sisteme.
ENCODE(str,pass_str)
Encripteaz irul str utiliznd parola pass_str. Rezultatul este un ir binar de
aceeai lungime cu a irului str. Dac se dorete salvarea lui ntr-o coloan, se
utilizeaz o coloan de tip BLOB.
DECODE(crypt_str,pass_str)
Decripteaz irul encriptat crypt_str utiliznd parola pass_str. crypt_str ar trebui
s fie un ir returnat de funcia ENCODE().
- 54-

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

Ultimul ID care a fost generat este meninut pe server i nu este schimbat de


ctre alt client.
FORMAT(X,D)
Formateaz afiarea numrului X la un format de genul '#,###,###.##', rotunjit
la D zecimale. Dac D este 0, rezultatul nu va avea punct zecimal sau parte
fracionar :
mysql> select FORMAT(12332.123456, 4);
-> '12,332.1235'
mysql> select FORMAT(12332.1,4);
-> '12,332.1000'
mysql> select FORMAT(12332.2,0);
-> '12,332'

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-

expresii. Rezultatul este ntotdeauna 0. Utilizarea este realizat pentru aflarea


timpului de execuie a interogrii:
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
+----------------------------------------------+
| BENCHMARK(1000000,encode("hello","goodbye")) |
+----------------------------------------------+
|
0 |
+----------------------------------------------+
1 row in set (4.74 sec)

Timpul raportat este timpul scurs pn la aflarea rezultatului de ctre client i nu


timpul utilizat de CPU pe server.
INET_NTOA(expr)
Returneaz adresa IP (4 sau 8 bytes) pentru o expresie numeric:
mysql> select INET_NTOA(3520061480);
-> "209.207.224.40"

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

Numrul generat este ntotdeauna n ordinea biilor de adres; de exemplu


numrul anterior este calculat ca 209*255^3 + 207*255^2 + 224*255 +40.

4.6. Funcii de agregare (utilizate cu SELECT i GROUP BY)


Se pot utiliza coloane sau calcule n expresiile SELECT care nu apar n clauza
GROUP BY. Dac se utilizeaz o funcie de grup ntr-o instruciune care nu
conine clauza GROUP BY, se consider gruparea tuturor liniilor.
COUNT(expr)
Returneaz numrul de elemente cu valori diferite de NULL selectate prin
comanda SELECT :
mysql> select student.student_name,COUNT(*)
from student,course
where student.student_id=course.student_id
GROUP BY student_name;
- 56-

COUNT(*) este oarecum diferit prin faptul c returneaz numrul de linii


selectate chiar dac unele conin valori NULL. COUNT(*) este optimizat s
returneze rezultatul foarte rapid dac se selecteaz dintr-un singur tabel, dac nu se
afieaz alte coloane i dac nu exist clauza WHERE. De exemplu:
mysql> select COUNT(*) from student;

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-

5. Comenzi utilitare de baz MySQL


5.1. Sintaxa USE
USE db_name
Comanda USE db_name spune limbajului MySQL s utilizeze baza de date
db_name ca baz de date curent (implicit) pentru interogrile care vor urma.
Baza de date curent rmne implicit pn la sfritul sesiunii sau pn se aplic o
alt comand USE.
mysql> USE db1;
mysql> SELECT count(*) FROM mytable;
# se selecteaz din db1.mytable
mysql> USE db2;
mysql> SELECT count(*) FROM mytable;
# se selecteaz din db2.mytable

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;

Comanda USE este prevzut pentru compatibilitate Sybase.

5.2. Sintaxa DESCRIBE (afieaz informaii despre coloane)


{DESCRIBE | DESC} tbl_name {col_name | wild}
DESCRIBE este o prescurtate pentru SHOW COLUMNS FROM.
DESCRIBE ofer informaii despre coloanele unui tabel. col_name poate fi
numele unei coloane sau un ir coninnd caracterele speciale `%` sau `_`.
Dac tipul coloanelor difer de cele la care v ateptai s fi fost create prin
comanda CREATE TABLE, este important s tii c MySQL schimb tipul
coloanelor uneori.
Aceast comand este oferit pentru compatibilitate cu Oracle.
Comanda SHOW ofer informaii similare.

- 58-

6. Definirea datelor: CREATE, DROP, ALTER


6.1. Sintaxa CREATE DATABASE
CREATE DATABASE [IF NOT EXISTS] db_name
CREATE DATABASE creeaz o baz de date cu numele db_name. Regulile
referitoare la numele permise pentru baze de date sunt date n seciunea 2.2.
Apare eroare dac baza de date exist deja i nu s-a specificat IF NOT EXISTS.
Bazele de date n MySQL sunt implementate ca directoare coninnd fiiere care
corespund tabelelor din baza de date. Deoarece nu exist tabele n baza de date
atunci cnd este creat, CREATE DATABASE creeaz doar un director n
directorul de date MySQL.

6.2. Sintaxa DROP DATABASE


DROP DATABASE [IF EXISTS] db_name
DROP DATABASE terge baza de date db_name i toate tabelele din cadrul ei.
Dac se execut DROP DATABASE pe o baz de date legat (linked database), se
vor terge att legtura ct i baza de date original. Avei grij cu aceast
comand!
DROP DATABASE returneaz numrul de fiiere care au fost terse din directorul
bazei de date. De obicei, acesta este de trei ori numrul de tabele deoarece fiecrui
tabel i corespund un fiier '.MYD' , unul '.MYI' i unul '.frm'.
Comanda DROP DATABASE terge din directorul bazei de date toate fiierele
care au urmtoarele extensii:
.BAK
.ISM
.MYI

.DAT
.ISM
.db

.HSH
.MRG
.frm

.ISD
.MYD

Toate subdirectoarele care constau n 2 digii (directoare RAID) sunt de asemenea


terse.
Se poate utiliza opiunea IF EXISTS pentru prevenirea unei erori n cazul n care
baza de date nu exist.
- 59-

6.3. Sintaxa CREATE TABLE


CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)][table_options] [select_statement]
create_definition:
col_name type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [PRIMARY KEY] [reference_definition]
sau
PRIMARY KEY (index_col_name,...)
sau
KEY [index_name] (index_col_name,...)
sau
INDEX [index_name] (index_col_name,...)
sau
UNIQUE [INDEX] [index_name] (index_col_name,...)
sau
FULLTEXT [INDEX] [index_name] (index_col_name,...)
sau
[CONSTRAINT symbol] FOREIGN KEY index_name
(index_col_name,...) [reference_definition]
sau
CHECK (expr)
type:
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau
sau

TINYINT[(length)] [UNSIGNED] [ZEROFILL]


SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
INT[(length)] [UNSIGNED] [ZEROFILL]
INTEGER[(length)] [UNSIGNED] [ZEROFILL]
BIGINT[(length)] [UNSIGNED] [ZEROFILL]
REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
CHAR(length) [BINARY]
VARCHAR(length) [BINARY]
DATE
TIME
TIMESTAMP
DATETIME
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
ENUM(value1,value2,value3,...)
SET(value1,value2,value3,...)

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 ...

(Comand Select legal)

Comanda CREATE TABLE creeaz un tabel cu numele tbl_name n baza de date


curent. Regulile referitoare la numele permise pentru tabele sunt prezentate n
seciunea 2.2. Apare o eroare dac nu s-a deschis o baz de date sau tabelul cu
numele specificat exist deja.
Exist posibilitatea de a specifica crea un tabel cu specificaia:
db_name.tbl_name.
care are efect chiar dac nu exist baz de date curent deschis.
Fiecare tabel tbl_name este reprezentat prin cteva fiiere n directorul baz de
date. n cazul tabelelor de tip MyISAM vom avea:
File
tbl_name.frm
tbl_name.MYD
tbl_name.MYI

Purpose
Fiierul de definire al tabelului
Fiierul de date
Fiierul de index

n versiunea 3.23 MySQL, se poate utiliza opiunea TEMPORARY la crearea unui


tabel. Un tabel temporar va automat ters dac conexiunea cade i numele este pe
conexiune. Aceasta nseamn c dou conexiuni diferite pot utiliza acelai nume
temporar pentru tabel fr a exista conflicte ntre ele sau cu un tabel deja existent
care are acelai nume. (Tabelul existent este ascuns pn cnd tabelul temporar este
ters).
Se poate, de asemenea, utiliza opiunea IF NOT EXISTS pentru a nu apare mesaj
de eroare dac tabelul exist deja. Nu exist verificare care s spun dac
structurile celor dou tabele sunt identice.
- 61-

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

Valorile NULL sunt manipulate n mod diferit pentru coloanele TIMESTAMP


dect alte tipuri de coloane. Nu se poate stoca ntr-o coloan de tip TIMESTAMP o
valoare NULL propriu-zis; setarea coloanei cu NULL nseamn setarea acesteia cu
data i ora curent. Deoarece coloanele TIMESTAMP se comport n acest mod,
atributele NULL i NOT NULL nu se aplic n mod normal i sunt ignorate dac
se specific. Pe de alt parte, pentru a face mai uoar utilizarea coloanelor de tip
TIMESTAMP, serverul raporteaz c acestor coloane s-ar putea s li se fi atribuit
valori NULL (ceea ce este adevrat), chiar dac TIMESTAMP nu va conine
niciodat o valoare NULL. Se poate vedea acest lucru cu DESCRIBE tbl_name
pentru a putea vedea descrierea tabelului. Setarea unei coloane TIMESTAMP cu 0
nu este echivalent cu setarea ei la NULL, deoarece 0 este o valoare TIMESTAMP
valid.
Dac nu se specific nici o valoare implicit (DEFAULT) pentru o coloan,
MySQL i atribuie una automat. Dac coloana poate lua valoarea NULL, valoarea
implicit este. Dac coloana este declarat ca fiind NOT NULL, valoarea implicit
depinde de tipul coloanei:
Pentru tipurile numerice altele dect cele declarate cu atributul
AUTO_INCREMENT, valoarea implicit este 0. Pentru o coloan
AUTO_INCREMENT, valoarea implicit este urmtoare valoare n secven.
Pentru tipurile dat i or altele dect TIMESTAMP, valoarea implicit este
valoarea 0 potrivit tipului respectiv. Pentru prima coloan din tabel de tip
TIMESTAMP, valoarea implicit este data i ora curent
- 62-

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-

CREATE TABLE test (blob_col BLOB, index(blob_col(10)));

Cnd se utilizeaz clauza ORDER BY sau GROUP BY cu o coloan TEXT sau


BLOB, se utilizeaz doar numrul de bytes specificai de max_sort_length.
Se pot crea indeci speciali FULLTEXT. Ei sunt utilizai pentru cutare full-text.
Doar tabelele de tip MyISAM suport indeci FULLTEXT. Ei pot fi creai doar din
coloanele VARCHAR sau TEXT.Indexarea se realizeaz adesea peste ntreaga
coloan, iar indexarea parial nu este suportat.
Fiecare coloan NULL ia un bit n plus, rotunjit pn la primul byte.
Lungimea maxim a unei nregistrri n bytes poate fi calculat astfel:
row length = 1
+ (sum of column lengths)
+ (number of NULL columns + 7)/8
+ (number of variable-length columns)

Opiunile SELECT i table_options sunt implementate doar n versiunile mai


noi de MySQL. Tipurile de tabele posibile sunt:
BDB sau
Berkeley_db
HEAP
ISAM
InnoDB
MERGE
MyISAM

Tabele tranzacionale sigure cu blocare pe pagin


Datele pentru acest tabel sunt doar stocate n memorie
Handler-ul original de tabel
Tabele tranzacionale sigure cu blocare pe linie
O colecie de tabele MyISAM utilizate ca un singur tabel
Noul tip de tabele binare portabile care nlocuiesc
tabelele de tip ISAM.

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

Urmtoarea valoare auto_increment care


se dorete setat pentru tabel (MyISAM).
O aproximare a mediei lungimii liniei pentru tabel.
Aceasta trebuie setat doar pentru tabele mari cu
mrime variabil a nregistrrilor.
- 64-

CHECKSUM
COMMENT
MAX_ROWS
MIN_ROWS
PACK_KEYS
PASSWORD
DELAY_KEY_WRITE
ROW_FORMAT

Se seteaz cu 1 dac se dorete meninerea de ctre


MySQL a unei sume de control pentru toate liniile
(ncetinete puin actualizarea tabelului dar ajut
atunci cnd se stric tabelele) (MyISAM).
Un comentariu de 60 de caractere pentru tabel.
Numrul maxim de linii care se plnuiesc
a fi stocate n tabel
Numrul minim de linii care se plnuiesc
a fi stocate n tabel
Se seteaz la 1 dac se dorete un index mai mic.
Aceasta ncetinete actualizrile dar citirile
devin mai rapide (MyISAM, ISAM)
Se encripteaz fiierul '.frm' cu o parol
Se seteaz la 1 dac se dorete amnarea actualizrii
cheilor pn cnd tabelul este nchis (MyISAM)
Definete modul de stocare al liniilor.
Se pot utiliza opiunile DYNAMIC sau STATIC pentru
tabelele de tip MyISAM

Cnd se utilizeaz un tabel MyISAM, MySQL utilizeaz produsul dintre


max_rows i avg_row_length pentru a decide ct de mare va fi tabelul rezultat.
Dac nu se specific nici una dintre opiunile anterioare, mrimea maxim a unui
tabel va fi de 4GB(2GB pentru sistemele care nu suport tabele de mrimea 4GB).
Motivul acestui lucru este de a ine o mrime mai mic pentru pointer, de a avea un
index mai mic i mai rapid n caz c nu e nevoie de tabele foarte mari.
Dac se specific o instruciune SELECT dup comanda CREATE, MySQL va
crea noi cmpuri pentru toate elementele din SELECT. De exemplu:
mysql> CREATE TABLE test
(a int not null auto_increment,
primary key (a),
key(b))
TYPE=MyISAM
SELECT b,c from test2;

Aceast secven va crea un tabel de tip MyISAM cu trei coloane: a, b i c.


Coloanele din instruciunea SELECT sunt adugate n partea dreapt a tabelului i
nu sunt suprapuse n el. De exemplu:
mysql> select * from foo;
+---+
| n |
+---+
| 1 |
+---+
- 65-

mysql> create table bar (m int) select n from foo;


Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from bar;
+------+---+
| m
| n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)

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-

6.4. Sintaxa ALTER TABLE


ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]
alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
sau ADD [COLUMN] (create_definition, create_definition,...)
sau ADD INDEX [index_name] (index_col_name,...)
sau ADD PRIMARY KEY (index_col_name,...)
sau ADD UNIQUE [index_name] (index_col_name,...)
sau ADD FULLTEXT [index_name] (index_col_name,...)
sau ADD [CONSTRAINT symbol] FOREIGN KEY index_name
(index_col_name,...) [reference_definition]
sau ALTER [COLUMN] col_name {SET DEFAULT literal| DROP DEFAULT}
sau CHANGE [COLUMN] old_col_name create_definition
sau MODIFY [COLUMN] create_definition
sau DROP [COLUMN] col_name
sau DROP PRIMARY KEY
sau DROP INDEX index_name
sau RENAME [TO] new_tbl_name
sau ORDER BY col
sau table_options

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 utiliza ALTER TABLE, este nevoie de drepturile ALTER, INSERT i


CREATE asupra tabelului.
IGNORE este o extensie MySQL fa de ANSI SQL92. Controleaz modul de
lucru al comenzii ALTER TABLE dac exist dubluri ale cheilor unice n noul
tabel. Dac nu se specific IGNORE, copierea este abandonat derulat n sens
invers. Dac se specific IGNORE, atunci pentru liniile cu dubluri pe chei unice,
se utilizeaz doar prima linie, iar celelalte sunt terse.
Se pot trata mai multe clauze ADD, ALTER, DROP sau CHANGE ntr-o singur
comand ALTER TABLE.
CHANGE col_name, DROP col_name i DROP INDEX sunt extensii MySQL
fa de ANSI SQL92. MODIFY este o extensie Oracle.
Cuvntul opional COLUMN este doar un cuvnt de legtur (semantic) fr
importan i poate fi omis.
Dac se utilizeaz ALTER TABLE tbl_name RENAME TO new_name fr alte
opiuni, MySQL redenumete fiierele corespunztoare numelui tbl_name. Nu este
nevoie de crearea unui tabel temporar.
Clauzele create_definition utilizeaz aceeai sintax pentru ADD i CHANGE ca
i pentru CREATE TABLE.
Se poate redenumi o coloan prin utilizarea clauzei:

CHANGE old_col_name create_definition.

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 dorete schimbarea tipului unei coloane dar nu i numele, sintaxa


CHANGE are nevoie tot de dou nume de coloane chiar dac sunt aceleai.
De exemplu:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

O alt metod ar fi utilizarea clauzei MODIFY pentru schimbarea tipului unei


coloane fr redenumirea ei:
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

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-

un index pe primele 10 caractere al unei coloane VARCHAR), nu se poate scurta


acea coloan mai puin dect numrul de caractere cu care se indexeaz.
Cnd se schimb tipul unei coloane utiliznd CHANGE sau MODIFY, MySQL
ncearc s converteasc datele la noul tip ct mai bine posibil.
Se poate utiliza FIRST sau ADD ... AFTER col_name pentru a aduga o coloan
ntr-o poziie specific n tabel. Poziia implicit este la sfrit.
ALTER COLUMN specific o nou valoare implicit pentru o coloan i terge
vechea valoare. Dac vechea valoare implicit este tears i coloana poate fi
NULL, noua valoare implicit este NULL. Dac coloana nu poate fi NULL,
MySQL atribuie o valoare implicit.
DROP INDEX terge un index (extensie MySQL fa de ANSI SQL92).
Dac se terg coloane dintr-un tabel, coloanele sunt terse de asemenea i din orice
index din care fceau parte. Dac toate coloanele care formeaz un index sunt
terse, indexul este ters de asemenea.
Dac un tabel conine doar o singur coloan, coloana nu poate fi tears. Dac se
dorete tergerea tabelului, se utilizeaz DROP TABLE.
DROP PRIMARY KEY terge indexul cheii primare. Dac nu exist un astfel de
index, va terge primul index unic din tabel (MySQL marcheaz prima cheie unic
ca fiind PRIMARY KEY dac nu s-a specificat o cheie primar explicit). Dac se
adaug un UNIQUE INDEX sau cheie PRIMARY KEY unui tabel, acesta este
stocat naintea oricrui index care nu este unic pentru ca MySQL s detecteze
dublurile de chei unice ct mai repede posibil.
ORDER BY permite creare noului tabel cu liniile specificate ntr-o anumit ordine.
Tabelul nu va rmne n aceast ordine dup mai multe inserri sau tergeri. n
unele cazuri, duce la o sortare mai uoar de ctre mediul MySQL dac tabelul
este ordonat dup o anumit coloan dup care se va reordona mai trziu.
Dac se utilizeaz ALTER TABLE pe un tabel MyISAM, toi indeci care nu sunt
unici sunt separai ntr-o grup diferit (ca n REPAIR). Aceasta ar trebui s fac
comanda ALTER TABLE s fie mai rapid atunci cnd exist mai muli indeci.
Cu funcia C API mysql_info(), se poate afla cte nregistrri au fost copiate, i
(cnd se utilizeaz IGNORE) cte nregistrri au fost terse datorit existenei de
dubluri ale valorilor pe chei unice.
Urmtoarele exemple arat cteva dintre utilizrile comenzii ALTER TABLE.
Avem un tabel t1 care este creat cu comanda de mai jos:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
- 69-

Pentru redenumirea tabelului din t1 n t2:


mysql> ALTER TABLE t1 RENAME t2;

Pentru schimbarea tipului coloanei a din INTEGER n TINYINT NOT NULL


(numele rmne acelai), i pentru schimbarea coloanei b din CHAR(10) n
CHAR(20) i redenumirea ei din b n c:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL,
CHANGE b c CHAR(20);

Pentru a aduga o nou coloan de tip TIMESTAMP numit d:


mysql> ALTER TABLE t2 ADD d TIMESTAMP;

Pentru a aduga un index pe coloana d i pentru a face coloana a cheie primar:


mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);

Pentru a terge coloana c:


mysql> ALTER TABLE t2 DROP COLUMN c;

Pentru a aduga o nou coloan c de tip integer AUTO_INCREMENT:


mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL
AUTO_INCREMENT, ADD INDEX (c);

Coloana c a fost indexat deoarece coloanele AUTO_INCREMENT trebuie


indexate, i a fost declarat ca fiind NOT NULL, deoarece coloanele indexate nu
pot fi NULL.
Cnd se adaug o coloan AUTO_INCREMENT, valorile coloanei sunt automat
umplute cu numere secveniale. Se poate seta primul numr din secven prin
executarea SET INSERT_ID=# nainte de ALTER TABLE sau prin utilizarea
opiunii AUTO_INCREMENT = # .
Cu tabelele MyISAM, dac nu se schimb coloana AUTO_INCREMENT,
numrul secvenial nu va fi afectat. Dac se terge o coloan de tip
AUTO_INCREMENT i apoi se adaug o alt coloan de tip
AUTO_INCREMENT, numerele vor ncepe din nou de la 1.

- 70-

6.5. Sintaxa RENAME TABLE


RENAME TABLE tbl_name TO new_table_name
[, tbl_name2 TO new_table_name2,...]
Redenumirea se realizeaz automat, ceea ce nseamn c nici un alt fir de execuie
nu poate accesa unul dintre tabelele care se redenumesc. Aceasta face posibil
nlocuirea unui tabel cu unul gol:
CREATE TABLE new_table (...);
RENAME TABLE old_table TO backup_table, new_table TO old_table;

Redenumirea se realizeaz de la stnga la dreapta, ceea ce nseamn c dac se


dorete inversarea numelor a dou tabele, trebuie apelat o instruciune de genul:
RENAME TABLE old_table
TO backup_table,
new_table
TO old_table,
backup_table TO new_table;

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;

Cnd se execut RENAME, nu trebuie s avem tabelele blocate sau tranzacii


active. Trebuie s existe i drepturi ALTER i DROP pentru tabelul original i
drepturile CREATE i INSERT pentru noul tabel.
Dac MySQL ntmpin nite erori ntr-o redenumire multipl de tabele, va realiza
o redenumire invers pentru toate tabelele redenumite pentru a lsa totul n starea
original.

6.6. Sintaxa DROP TABLE


DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
[RESTRICT | CASCADE]

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-

DROP TABLE nu este sigur n privina tranzaciilor deoarece induce o aciune


commit asupra tuturor tranzaciilor active.

6.7. Sintaxa CREATE INDEX


CREATE [UNIQUE|FULLTEXT] INDEX index_name
ON tbl_name (col_name[(length)],... )

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));

Deoarece majoritatea numelor difer n mod normal n primele 10 caractere, acest


index nu ar trebui s fie mai ncet dect un index creat cu ntregul nume al
coloanei. Utiliznd coloane pariale pentru indeci se poate face fiierul de indeci
mult mai mic care ar putea duce la o vitez mai mare a operaiilor INSERT.
Se poate aduga un index doar pentru o coloan care poate avea valori NULL sau
pentru o coloan BLOB/TEXT i doar pentru tabelele de tip MyISAM.
Indecii FULLTEXT pot indexa doar coloane de tip VARCHAR i TEXT i doar
pentru tabele MyISAM.

6.8. Sintaxa DROP INDEX


DROP INDEX index_name ON tbl_name

DROP INDEX terge indexul cu numele index_name din tabelul tbl_name.


Comanda DROP INDEX este mapat ctre o comand ALTER TABLE pentru a
terge un index.

- 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 =

t2.salary from employee AS t1, info AS t2


t2.name;
t2.salary from employee t1, info t2
t2.name;

Coloanele selectate pentru output pot fi referite n clauzele ORDER BY sau


GROUP BY utiliznd numele coloanelor, alias-urile coloanelor, sau poziia
coloanelor. Poziiile coloanelor ncep cu 1.
mysql> select college, region, seed from tournament
ORDER BY region, seed;
mysql> select college, region AS r, seed AS s from
tournament ORDER BY r, s;
mysql> select college, region, seed from tournament
ORDER BY 2, 3;

Pentru sortare n ordine descresctoare, adugai cuvntul cheie DESC


(descending) la numele coloanei n cadrul clauzei ORDER BY prin care sortai.
Implicit este considerat ordinea cresctoare; aceasta putnd fi explicit specificat
folosind cuvntul cheie ASC (ascending).
n cadrul clauzei WHERE se poate folosi oricare dintre funciile pe care le suport
MySQL (Seciunea 3 - Funcii utilizabile n clauzele SELECT i WHERE).
Clauza HAVING se poate referi la orice coloan sau alias din expresia
select_expression. Se aplic ultima, chiar nainte ca informaiile s fie transmise
ctre client, fr nici o optimizare. Nu utilizai HAVING pentru articole care ar
trebui s fie n clauza WHERE.
De exemplu, nu scriei:

mysql> select col_name from tbl_name HAVING col_name > 0;

Sciei n loc:

mysql> select col_name from tbl_name WHERE col_name > 0;

n versiunile mai noi de MySQL se pot scrie interogri de genul:


mysql> select user,max(salary) from users
group by user HAVING max(salary)>10;

n alte versiuni mai vechi, se poate scrie n loc urmtoarea interogare:


- 74-

mysql> select user,max(salary) AS sum from users


group by user HAVING sum>10;

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

MySQL a extins utilizarea clauzei GROUP BY pentru a permite selectarea


cmpurilor care nu sunt menionate n clauza GROUP BY. Dac nu primii
rezultatul dorit de la interogare, citii seciunea 3.3. Funcii utilizate cu clauzele
GROUP BY.
STRAIGHT_JOIN foreaz optimizatorul s uneasc tabelele n ordinea n care
sunt scrise n clauza FROM. Putei folosi aceast opiune pentru a grbi o
interogare n cazul n care optimizatorul unete tabelele ntr-o ordine neoptimal.
- 75-

Clauza LIMIT poate fi utilizat pentru a limita numrul de linii returnate de


comanda SELECT. LIMIT accept unul sau dou argumente numerice. Dac sunt
date dou, primul specific offset-ul (a cta linie rezultat s fie prima afiat)
primei linii returnate, iar al doilea specific numrul maxim de linii de returnat.
Offset-ul primei linii este 0 (i nu 1):
mysql> select * from table LIMIT 5,10;

#Returneaz liniile 6-15

Dac se specific un singur argument, el indic numrul maxim de linii de returnat.


mysql> select * from table LIMIT 5;

#Returneaz primele 5 linii

Cu alte cuvinte, LIMIT n este echivalent cu LIMIT 0,n.


Forma comenzi:

SELECT ... INTO OUTFILE 'file_name'

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

pentru a genera fiierul.


n fiierul text rezultant, doar urmtoare caractere escape sunt trimise ctre ieire
prin caracterul ESCAPED BY (`\`):
- caracterul ESCAPED BY;
- primul caracter din FIELDS TERMINATED BY;
- primul caracter din LINES TERMINATED BY.
Adiional, ASCII 0 este convertit n ESCAPED BY urmat de 0 (ASCII 48).
Motivul este acela c avem nevoie de caracterele escape FIELDS TERMINATED
BY, ESCAPED BY, sau LINES TERMINATED BY pentru ca fiierul s poat fi
citit. Cum fiierul rezultant nu trebuie s apar conform sintaxei SQL, nici un alt
caracter nu mai este necesar pentru a fi considerat caracter escape.
Urmtorul exemplu arat metoda de formatare a unui fiier dup modul de utilizare
a mai multor programe.
SELECT a,b,a+b INTO OUTFILE "/tmp/result.text"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n"
- 76-

FROM test_table;

Dac se utilizeaz INTO DUMPFILE n loc de INTO OUTFILE, MySQL va scrie


doar o singur linie n fiier, fr nici un terminator de coloan sau linie i fr nici
un caracter escape. Aceasta este folositoare atunci cnd se dorete stocarea unui
obiect BLOB n fiier.
Fiierele create cu INTO OUTFILE i INTO DUMPFILE vor fi accesibile tuturor
utilizatorilor. Fiierul trebuie s fie lizibil pentru a se putea extrage linii din el.
Dac utilizai clauza FOR UPDATE pe un handler de tabel cu lact pe pagin/linie,
liniile examinate vor blocate.

7.2. Sintaxa INSERT

sau
sau

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]


[INTO] tbl_name [(col_name,...)]
VALUES (expression,...),(...),...
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=expression, col_name=expression, ...

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);

dar nu putei utiliza comanda:


- 77-

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

Dac se specific cuvntul cheie LOW_PRIORITY, execuia comenzii


INSERT este amnat pn cnd nici un alt client nu mai efectueaz operaii de
citire din tabel. n acest caz clientul trebuie s atepte pn cnd s-a terminat
inserarea, care ar putea s ia cam mult timp dac tabelul este foarte utilizat. Acesta
este n contrast cu comanda INSERT DELAYED, care las clientul s continue
imediat dup aplicarea comenzii. (INSERT DELAYED). Comanda
LOW_PRIORITY nu ar trebui utilizat n mod normal cu tabele de tip MyISAM
deoarece se elimin inserrile concurente.
Dac se specific cuvntul cheie IGNORE n cadrul comenzii INSERT cu mai
multe valori de linii, orice linie care dubleaz o cheie PRIMAR i UNIC n
cadrul unui tabel este ignorat i nu se insereaz. Dac nu se specific IGNORE,
inserarea este abandonat n cazul n care exist linii care dubleaz o chie deja
existent n tabel. Cu ajutorul funciei API mysql_info() se poate afla cte linii au
fost inserate n tabel.
Dac MySQL a fost configurat utiliznd opiunea
DONT_USE_DEFAULT_FIELDS,

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

Duplicates indic numrul de linii care nu au fost inserate deoarece ar fi dublat o


cheie unic deja existent n tabel. Warnings (avertismente) indic numrul de
ncercri de inserare de coloane care au fost problematice ntr-un mod sau altul.
Avertismentele pot surveni n oricare dintre condiiile urmtoare:
- Insernd NULL ntr-o coloan care a fost declarat NOT NULL. Coloana
este setat la valoarea ei implicit.
- Setnd o coloan numeric la o valoare care iese din intervalul alocat
coloanei. Valoarea este trunchiat la o valoare potrivit intervalului.
- 78-

- 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.

7.2.1. Sintaxa INSERT ... SELECT


INSERT [LOW_PRIORITY] [IGNORE][INTO]tbl_name[(column list)]
SELECT ...

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;

Trebuie reinute urmtoarele condiii pentru o comand INSERT ... SELECT:


Tabelul int al comenzii INSERT nu poate apare n clauza FROM a comenzii
SELECT ca parte a interogrii deoarece este interzis n ANSI SQL s se selecteze
din acelai tabel n care se insereaz. (Problema este c SELECT poate gsi
nregistrri care au fost inserate n cadrul aceleai rulri a instruciuni. Cnd se
utilizeaz clauze sub-select, situaia poate fi foarte confuz).
Coloanele AUTO_INCREMENT columns lucreaz n mod normal.
Se poate utiliza funcia C API mysql_info() pentru a afla informaii referitoare la
interogare.
Pentru a asigura c jurnalul de actualizare sau cel binar pot fi utilizate la recrearea
tabelelor originale, MySQL nu va permite inserrile concurente n timpul
comenzii INSERT .... SELECT.
Se poate utiliza, de asemenea comanda REPLACE n loc de INSERT pentru
rescrierea liniilor vechi.

7.3. Sintaxa INSERT DELAYED


- 79-

INSERT DELAYED ...


Opiunea DELAYED a comenzii INSERT este o opiune specific MySQL care
este foarte util dac exist clieni care nu pot s atepte terminarea comenzii
INSERT. Aceasta este o problem ntlnit cnd se utilizeaz logarea pe MySQL
i se utilizeaz n mod periodic instruciuni SELECT sau UPDATE care dureaz
mai mult timp pn la terminare.
Opiunea DELAYED a fost introdus n MySQL de la versiunea 3.22.15. i este o
extensie MySQL la standardul ANSI SQL92.
INSERT DELAYED lucreaz doar cu tabele ISAM i MyISAM. De observat este
c tabele MyISAM suport instruciuni SELECT i INSERT concurente, iar adesea
este nevoie s se utilizeze INSERT DELAYED cu tabele MyISAM.
Cnd se utilizeaz INSERT DELAYED, clientul va primi confirmare imediat i
linia sau liniile vor fi inserate cnd tabelul nu este utilizat de ctre altcineva.
O alt beneficiu major al utilizrii comenzii INSERT DELAYED este c inserrile
mai multor clieni sunt transmise mpreun i scrise ntr-un singur bloc ceea ce este
mai rapid dect mai multe inserri pe rnd.
De observat este c liniile selectate pentru inserare sunt doar stocate n memorie
pn cnd sunt inserate n tabel. Aceasta nsemn c dac se nchide serverul
mysqld intenionat (kill -9) sau dac se ntmpl s pice inexplicabil, orice linii
care nu au fost stocate pe disc se pierd.
Comenzile INSERT DELAYED au prioritate mai mare dect comenzile INSERT
normale dac exist un handler INSERT DELAYED deja n execuie. Alte comenzi
de actualizare vor trebui s atepte pn cnd coada INSERT DELAYED is goal
sau se execut o comand de distrugere a firului de execuie thread
(KILL thread_id).
Urmtoarele variabile de stare specific informaii despre comenzile INSERT
DELAYED:
Variabila
Specificare
Delayed_insert_threads
Numrul de fire de execuie handler
Delayed_writes
Numrul de linii scrise cu INSERT DELAYED
Not_flushed_delayed_rows Numrul de linii care ateapt s fie scrise
Aceste variabile pot fi aflate prin utilizarea instruciunii SHOW STATUS sau prin
execuia unei comenzi mysqladmin extinse.

7.4. Sintaxa UPDATE


- 80-

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name


SET col_name1=expr1, [col_name2=expr2, ...]
[WHERE where_definition]
[LIMIT rows]

Comanda UPDATE actualizeaz valorile cmpurilor din cadrul liniilor existente n


tabel cu noi valori. Clauza SET indic care coloane trebuie modificate i valorile
care s li se atribuie. Clauza WHERE, dac este dat, specific care linii trebuie
actualizate. Altfel toate liniile vor fi actualizate. Dac se specific clauza ORDER
BY, liniile vor fi actualizate n ordinea specificat.
Dac se specific cuvntul cheie LOW_PRIORITY, execuia comenzii UPDATE
este amnat pn cnd nici un alt client nu mai realizeaz citiri din tabel.
Dac se specific IGNORE, comanda de actualizare nu va eua chiar dac se vor
gsi erori care s indice dublarea de chei primare. Liniile care cauzaeaz conflicte
nu vor fi actualizate.
Dac se acceseaz o coloan din tabelul tbl_name n cadrul unei expresii, comanda
UPDATE va folosi valoarea curent a coloanei. De exemplu, urmtoarea comand
incrementeaz coloana age cu unu fa de valoarea ei curent:
mysql> UPDATE persondata SET age=age+1;

Atribuirile UPDATE sunt evaluate de la stnga spre dreapta. De exemplu,


urmtoarea instruciune dubleaz valoarea coloanei age, i apoi o incrementeaz:
mysql> UPDATE persondata SET age=age*2, age=age+1;

Dac se seteaz o coloan la valoarea pe care o are deja, MySQL informeaz


utilizatorul i nu actualizeaz aceast valoare.
Comanda UPDATE returneaz numrul de linii care au fost modificate. Se poate
utiliza funcia C API mysql_info() care returneaz numrul de linii care au fost
actualizate i avertismentele care au aprut n timpul comenzii UPDATE.
Se poate utiliza clauza LIMIT rows pentru a asigura c doar un anumit numr de
linii sunt schimbate.

7.5. Sintaxa DELETE


- 81-

DELETE [LOW_PRIORITY] FROM tbl_name


[WHERE where_definition]
[LIMIT rows]

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.

7.6. Sintaxa TRUNCATE


TRUNCATE TABLE table_name

Este asemntoare cu DELETE FROM table_name, dar exist cteva diferene:


Este implementat prin tergerea tabelului i recrearea lui, ceea face comanda
s fie mai rapid cnd se terg multe linii.
Nu este sigur la tranzacii; TRUNCATE TABLE va nceta automat tranzacia
curent dac s-a formulat un apel de nscriere COMMIT.
Nu returneaz numrul de linii terse.
- 82-

Atta timp ct fiierul de definiie al tabelului `table_name.frm' este valid,


tabelul poate fi recreat n acest mod, chiar dac datele sau fiierele index sunt
stricate.
Comanda TRUNCATE este o extensie Oracle SQL.

7.7. Sintaxa REPLACE


REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES (expression,...),(...),...
sau REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT ...
sau REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name=expression, col_name=expression,...

Comanda REPLACE lucreaz exact ca INSERT, cu excepia ca dac un articol din


tabel are aceeai valoare cu cea a noii nregistrri pe un index unic, vechea
nregistrare este tears nainte ca cea nou s fie inserat.
Cu alte cuvinte, nu se pot pot accesa valorile liniei vechi din cadrul comenzii
REPLACE.
Cnd se utilizez comanda REPLACE, funcia mysql_affected_rows() va returna 2
dac noua linie a nlocuit una veche. Aceasta deoarece, n acest caz, o linie a fost
tears i nc una a fost inserat. n acest mod se poate observa foarte uor dac o
comand REPLACE a adugat sau a nlocuit o linie.

- 83-

7.8. Sintaxa LOAD DATA INFILE


LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES TERMINATED BY '\n']
[IGNORE number LINES]
[(col_name,...)]

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;

Cuvintele cheie REPLACE i IGNORE controleaz manipularea datelor de intrare


care dubleaz nregistrri existente pe chei unice. Dac se specific REPLACE,
noile linii nlocuiesc liniile existente care au aceeai valoare pentru o cheie unic.
Dac se specific IGNORE, noile linii care dubleaz nregistrri existente pe chei
unice sunt srite. Dac nu se specific niciuna dintre opiuni, apare o eroare cnd
se gsete o cheie identic iar restul fiierului text este ignorat.
Comanda LOAD DATA INFILE este complementul comenzii SELECT ... INTO
OUTFILE. Sintaxa pentru clauzele FIELDS i LINES sunt aceleai pentru ambele
- 84-

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'

Opiunea IGNORE number LINES poate fi utilizat pentru ignorarea capului de


tabel de la nceputul fiierului:
mysql> LOAD DATA INFILE "/tmp/file_name" into table test IGNORE
1 LINES;

Cnd se utilizeaz comanda SELECT ... INTO OUTFILE n tandem cu LOAD


DATA INFILE pentru a scrie date dintr-o baz de date ntr-un fiier i apoi pentru a
citi fiierul napoi n baza de date, opiunile de separare a cmpurilor i de trecere
la linie nou pentru ambele comenzi trebuie s fie identice. Altfel, LOAD DATA
INFILE nu va interpreta coninutul fiierului n mod corespunztor. Presupunem c
s-a utilizat SELECT ... INTO OUTFILE pentru a scrie un fiier cu cmpurile
delimitate prin virgule:
mysql> SELECT * INTO OUTFILE 'data.txt'
FIELDS TERMINATED BY ','
FROM ...;

Pentru a citi fiierul napoi cu delimitatorul pentru cmpuri ca fiind virgula,


instruciunea corect ar fi:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
FIELDS TERMINATED BY ',';

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';

Rezultatul posibil ar fi c fiecare linie ar fi considerat ca un singur cmp.


- 85-

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);

Opiunea FIELDS [OPTIONALLY] ENCLOSED BY controleaz modul de


ncadrare a cmpurilor. Pentru ieire (SELECT ... INTO OUTFILE), dac se omite
cuvntul OPTIONALLY, toate cmpurile sunt ncadrate prin caracterul selectat
prin ENCLOSED BY. Un astfel de exemplu cu utilizarea virgulei pe post de
delimitator este:
"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"

Dac se specific OPTIONALLY, caracterul stabilit de opiunea ENCLOSED BY


este utilizat pentru ncadrarea cmpurilor de tip CHAR i VARCHAR:
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

- 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

-> The "BIG" boss


-> The "BIG" boss
-> The ""BIG"" boss

Opiunea FIELDS ESCAPED BY controleaz modul de scriere i de citire al


caracterelor speciale. Dac caracterul FIELDS ESCAPED BY este diferit de ir
gol, este utilizat pentru prefixarea urmtoarelor caractere la ieire:
Caracterul FIELDS ESCAPED BY;
Caracterul FIELDS [OPTIONALLY] ENCLOSED BY;
Primul caracter al valorilor FIELDS TERMINATED BY i LINES
TERMINATED BY;
ASCII 0 (care este scris ca urmnd caracterul escape i nu semnific o valoare
zero a octetului).
Pentru intrare, dac caracterul FIELDS ESCAPED BY nu este gol, apariia acelui
caracter este eliminat i caracterul urmtor este preluat literal ca o parte a valorii
cmpului. Excepiile sunt un '0' sau 'N' (de exemplu, \0 or \N dac caracterul
escape este '\'). Aceste secvene sunt interpretate ca ASCII 0 (un byte de valoare
zero) i NULL.
Exist cteva cazuri care nu sunt suportate de LOAD DATA INFILE:
Liniile cu lungime fix (ambele opiuni FIELDS TERMINATED BY i
FIELDS ENCLOSED BY goale) pentru coloane de tip BLOB sau TEXT.
- 87-

Dac se specific un separator care este acelai sau l prefixeaz pe altul,


LOAD DATA INFILE nu va putea interpreta intrarea corect. De exemplu,
urmtoarea clauz FIELDS va cauza probleme:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'

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;

Nu se specific nici o list de cmpuri, deci LOAD DATA INFILE ateapt ca


liniile de intrare s conin valori de cmpuri pentru fiecare coloan a tabelului. Se
utilizeaz setrile implicite pentru FIELDS i LINES.
Dac se dorete ncrcarea doar a unor coloane ale tabelului, se specific i list de
cmpurit:
mysql> LOAD DATA INFILE 'persondata.txt'
INTO TABLE persondata (col1,col2,...);

Trebuie de asemenea specificat o list de cmpuri dac ordinea cmpurilor din


fiierul de intrare difer de ordinea coloanelor din tabel.
Dac o linie are prea puine cmpuri, coloanele pentru care nu exist valori de
cmp sunt setate la valori implicite.
O valoare de cmp goal este interpretat diferit de lipsa valorii unui cmp:
Pentru tipuri string, coloana este setat la ir gol ('').
Pentru tipuri numerice, coloana este setat la 0.
Pentru tipurile dat i or, coloana este setat la valoarea '0' potrivit tipului.
Dac o linie de intrare are prea multe cmpuri, cmpurile care apar n plus sunt
ignorate iar numrul de avertismente se incrementeaz. Acesta poate semnala dac
interogarea a decurs bine.

8. Comenzi tranzacionale
8.1. Sintaxa BEGIN/COMMIT/ROLLBACK
- 88-

Implicit, MySQL ruleaz n mod autocommit. Aceasta nseamn c pe ct de


repede se execut o actualizare, MySQL o va stoca pe disc.
Dac se utilizeaz tabele sigure la tranzacii (transactions safe tables) cum ar fi
BDB sau InnoDB, se poate seta MySQL n mod non-autocommit cu urmtoarea
comand:
SET AUTOCOMMIT=0

Dup aceasta trebuie utilizat comanda COMMIT pentru a stoca schimbrile pe


disc sau ROLLBACK dac se dorete ignorarea schimbrilor care au fost fcute de
la nceputul tranzaciei.
Dac se dorete comutarea din mod AUTOCOMMIT pentru o serie de instruciuni
se poate utiliza comanda BEGIN sau BEGIN WORK:
BEGIN;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

Dac nu se utilizeaz tabele sigure la tranzacii, schimbrile vor fi stocate imediat,


independent de starea modului autocommit.
Dac se alege ROLLBACK atunci cnd s-a actualizat un tabel non-tranzacional va
apare eroarea (ER_WARNING_NOT_COMPLETE_ROLLBACK) ca fiind un
avertisment. Toate tabelele tranzacionale vor fi restaurate dar cele nontranzacionale nu se vor schimba.
Dac se utilizeaz BEGIN sau SET AUTOCOMMIT=0, ar trebui utilizate jurnalul
binar MySQL (binary log) pentru back-up n loc de jurnalul vechi de actualizare
(update log). Tranzaciile sunt stocate n binary log ntr-o singur secven, n
timpul COMMIT, pentru a asigura c tranzaciile care sunt preluate de
ROLLBACK nu sunt stocate .
Urmtoarele comenzi ncheie automat o tranzacie (echivalent cu COMMIT):
ALTER TABLE
DROP DATABASE
TRUNCATE

BEGIN
DROP TABLE

CREATE INDEX
RENAME TABLE

8.1. Sintaxa SET TRANSACTION


SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED | READ COMMITTED | REPEATABLE
SERIALIZABLE]
- 89-

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-

S-ar putea să vă placă și