Documente Academic
Documente Profesional
Documente Cultură
• Conectarea la server
• Privilegiile utilizatorilor
• Crearea bazelor de date si a tabelelor
• Tipuri de campuri
• Inserarea de inregistrari
• Actualizarea inregistrarilor
• Extragerea inregistrarilor cu SELECT
• Join-uri intre tabele
• Stergerea inregistrarilor si a tabelelor
• Crearea indecsilor
• Modificarea tabelelor
Acest ultim prompt insemna ca MySQL mai asteapta sa fie introdus ceva (asteapta ';').
Alta caracteristica de notat este ca declaratiile SQL (Structured Query Language - un limbaj de
interogare a bazelor de date) nu sunt case sensitive
Daca vrei sa nu mai executi o comanda pe care ai scris-o partial, o poti anula cu '\c':
mysql> SELECT
-> USER()
-> \c
mysql>
Ce insemna prompt-urile
mysql> Gata pentru o noua comanda.
-> Asteapta urmatoarea linie dintr-o comanda. multi-linie.
'> Astepta continuarea unui sir de caractere care incepe cu '.
"> Astepta continuarea unui sir de caractere care incepe cu ".
Este important de stiut ce inseamna prompt-urile '> and "> , deoarece daca din greseala introduci un
sir neterminat, orice altceva ce vei tasta (chiar si quit) nu va fi luat in seama.
Pentru a te conecta la server, de obicei esti nevoit sa dai numele de utilizator si parola:
shell> mysql -h host -u user -p
Enter password: ********
Comanda mysql invoca programul-monitor MySQL, un program client care te conecteaza la server. -
h specifica numele gazdei (host) la care te vei conecta (doar daca te conectezi pe alta statie de lucru). -
u specifica numele tau de utilizator ('root' daca ai MySQL pe propria statie, sau alt nume dat de
administrator..). -p spune server-ului ca te vei conecta folosind o parola.
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
mysql>
In functie de cum ai instalat si configurat MySQL, ai putea fi lasat sa te conectezi la server fara nume
de utilizator sau parola:
shell> mysql
Dupa ce te-ai conectat cu succes la server te poti deconecta cu comanda QUIT sau apasand CTRL+D
mysql> QUIT
Crearea utilizatorilor
Una dinte cele mai bune caracteristici ale MySQL este ca suporta un sistem de privilegii (dreptul de a
face o anumita actiune asupra unui obiect) pentru utilizatori foarte sofisticat. Cand vei crea un
utilizator, ii vei da acces la un set de privilegii pentru a specifica ce anume poate sa faca si ce nu poate
sa faca un utilizator. Un utilizator ar trebui sa aiba cel mai mic nivel de privilegii necesar pentru a-si
indeplini sarcina.
Crearea drepturilor pentru utilizatori se face cu comanda GRANT, iar retragerea drepturilor cu
REVOKE
Pentru a crea un administrator:
mysql> grant all
-> on *
-> to fred identified by ‘mnb123’
-> with grant option;
Crearea tabelelor
Vom crea o baza de date angajati pe care o vom folosi si in alte ocazii:
Pe Windws:
create database angajati;
Sa vedem cate baze de date sunt in sistem:
show databases;
+----------------+
| Database |
+----------------+
| angajati |
| mysql |
| test |
+----------------+
3 rows in set (0.00 sec)
Sub Linux:
Trebuie sa devii superuser si sa tastezi parola de root:
create database angajati;
GRANT ALL ON angajati.* TO marius@localhost IDENTIFIED BY "eagle"
Ultima conanda acorda toate drepturile asupra tabelei angajati utilizatorului Marius.
Iesi cu QUIT si intra din nou cu nume de utilizator de aceasta data:
mysql -u user_name -p
Ar trebui sa apara ca in continuare:
[marius@localhost marius]$ mysql -u marius -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is X to server version: 3.XX.XX
mysql>\u angajati;
CREATE TABLE e urmata de numele tabelei si poia de numele si tipul de date al campurilor din baza
de date. 'varchar' inseamna caractere de lungime variabile. Numarul din paranteza este lungimea
maxima de caractere admise.'not null' specifica ca nu avem voie sa avem valori nule pe acel camp in
inregistrari. 'int' inseamna numar inreg, iar 'unsigned' numar pozitiv. 'auto_increment' specifica pentru
MySQL sa atribuie o valoare automat la o noua adaugare de inregistrare cu o valoare mai mare cu 1
decat cea mai mare valoare din acel camp (necesar pentru un camp ID). 'primary key' speciofica ca acel
camp va fi indexat (fiecare valoare va fi unicat).
Tipuri de campuri
Cele trei tipuri de baza pentru campuri sunt: numeric, data si timp si sir de caractere(string). Cand alegi
un anumit tip sau subtip, poti specifica si lungimea maxima admisa (M, maxim 255).
Tipurile de date numerice
Pentru numerele in virgula flotanta (float), poti specifica cu D numarul de cifre dupa puctul zecimal.
Pentru numerele intregi poti sa specifici daca vor fi doar pozitive cu 'unsigned'.
Tipuri de date intregi
Tip Interval (Bytes) Descriere
TINYINT[(M)] -127..128 1 Foarte mic integers
or 0..255
SMALLINT[(M)] -32768..32767 2 Intregi mici
or 0..65535
MEDIUMINT[(M)] -8388608.. 3 Marime medie
8388607
or 0..16777215
INT[(M)] -231..231-1 4 Intregi normali
or 0..232-1
INTEGER[(M)] Sinonim cu INT
BIGINT[(M)] -263..263-1 8 Intregi mari
or 0..264-1
TIMESTAMP-uri
Type Specified Display
TIMESTAMP YYYYMMDDHHMMSS
TIMESTAMP(14) YYYYMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY
Exemplu:
create table _tabela1 (
id int auto_increment primary key,
answer enum (‘da’, ‘nu’) default ‘nu’
);
Exemplu:
mysql> INSERT INTO angajati_data
-> (f_name, l_name, title, age, yos, salary, perks, email)
-> values
-> ("Manish", "Sharma", "CEO", 28, 4, 200000,
-> 50000, "manish@bignet.com");
Query OK, 1 row affected (0.00 sec)
Daca vrei sa inserezi unul dintre urmatoarele caractere intr-un camp de tip text, trebui sa-i adaugi
inainte un caracter backslash(\):
‘ (apostrof) :\'
“ (ghilimele):\"
\ (backslash) :\\
% (procent) :\%
_ (liniuta de subliniere) :\_
Pentru a afisa intreaga tabela, in loc sa specificam toate campurile vom folosi simbolul '*':
SELECT * from angajati_data;
Selectia conditionala Puterea SGBD-ului sta in permiterea de a extrage informatii dupa anumite
conditii specificate
SELECT f_name, l_name from angajati_data where f_name = 'John';
+--------+------------+
| f_name | l_name |
+--------+------------+
| John | Hagan |
| John | MacFarland |
+--------+------------+
2 rows in set (0.00 sec)
Comparatiile MySQL sunt case insensitive ceea ca inseamna ca "john", "John" sau "JoHn" ar merge in
exemplul de mai sus.
Operatori de comparatie
Operator Nume Exemplu
= eqalitate customerid = 3
> mai mare amount>60.00
+--------+------------+
| f_name | l_name |
+--------+------------+
| John | Hagan |
| John | MacFarland |
| Joseph | Irvine |
+--------+------------+
3 rows in set (0.00 sec)
Conditiile SQL pot contine si operatorii logici: AND, OR si NOT. Sa afisam numele angajatilor care au
numele incepand cu 'S' sau 'A':
SELECT l_name from angajati_data where
l_name like 'S%' OR l_name like 'A%';
+----------+
| l_name |
+----------+
| Sharma |
| Anchor |
| Sakamuro |
| Simon |
| Sehgal |
| Simlai |
| Ali |
+----------+
7 rows in set (0.00 sec)
Alte exemple:
SELECT f_name, l_name, title from
-> angajati_data where title
-> IN ('Web Designer', 'System Administrator');
+---------+--------+----------------------+
| f_name | l_name | title |
+---------+--------+----------------------+
| Anamika | Pandit | Web Designer |
| Mary | Anchor | Web Designer |
| Roger | Lewis | System Administrator |
| Danny | Gibson | System Administrator |
+---------+--------+----------------------+
4 rows in set (0.00 sec)
+---------+------------+------+
| f_name | l_name | age |
+---------+------------+------+
| John | Hagan | 32 |
| Ganesh | Pillai | 32 |
| John | MacFarland | 34 |
| Alok | Nanda | 32 |
| Hassan | Rajabi | 33 |
| Arthur | Hoopla | 32 |
| Kim | Hunter | 32 |
| Roger | Lewis | 35 |
| Danny | Gibson | 34 |
| Mike | Harper | 36 |
| Shahida | Ali | 32 |
| Peter | Champion | 36 |
+---------+------------+------+
12 rows in set (0.00 sec)
+---------+------------+--------+
| f_name | l_name | salary |
+---------+------------+--------+
| Manish | Sharma | 200000 |
| Mary | Anchor | 85000 |
| Fred | Kruger | 75000 |
| John | MacFarland | 80000 |
| Edward | Sakamuro | 75000 |
| Alok | Nanda | 70000 |
| Paul | Simon | 85000 |
| Arthur | Hoopla | 75000 |
| Hal | Simlai | 70000 |
| Joseph | Irvine | 72000 |
| Shahida | Ali | 70000 |
+---------+------------+--------+
11 rows in set (0.00 sec)
Sortarea datelor
Inregistrarile extraswe anterior au fost afisate in rodinea in care erau stocate in tabela. Pentru a le sorta
folosim clauza ORDER BY a comenzii SELECT.
SELECT l_name, f_name from
angajati_data ORDER BY l_name;
+------------+---------+
| l_name | f_name |
+------------+---------+
| Ali | Shahida |
| Anchor | Mary |
| Champion | Peter |
| Gibson | Danny |
| Hagan | John |
| Harper | Mike |
| Hoopla | Arthur |
| Hunter | Kim |
| Irvine | Joseph |
| Kruger | Fred |
| Lewis | Roger |
| MacFarland | John |
| Nanda | Alok |
| Pandit | Anamika |
| Pillai | Ganesh |
| Rajabi | Hassan |
| Sakamuro | Edward |
| Sehgal | Monica |
| Sharma | Manish |
| Simlai | Hal |
| Simon | Paul |
+------------+---------+
21 rows in set (0.00 sec)
+---------+--------+
| f_name | l_name |
+---------+--------+
| Manish | Sharma |
| John | Hagan |
| Ganesh | Pillai |
| Anamika | Pandit |
| Mary | Anchor |
+---------+--------+
5 rows in set (0.01 sec)
+--------+----------+------+
| f_name | l_name | age |
+--------+----------+------+
| Edward | Sakamuro | 25 |
| Mary | Anchor | 26 |
+--------+----------+------+
2 rows in set (0.01 sec)
Forma generala a clauzei LIMIT este:
SELECT (...) from tabela LIMIT nr_rand_incepere, nr_inreg_extrase;
+--------+------------+
| f_name | l_name |
+--------+------------+
| John | MacFarland |
| Edward | Sakamuro |
| Alok | Nanda |
+--------+------------+
3 rows in set (0.00 sec)
+-------------+
| MIN(salary) |
+-------------+
| 70000 |
+-------------+
1 row in set (0.00 sec)
+-------------+
| MAX(salary) |
+-------------+
| 200000 |
+-------------+
1 row in set (0.00 sec)
+-------------+
| SUM(salary) |
+-------------+
| 1997000 |
+-------------+
1 row in set (0.00 sec)
+----------+
| COUNT(*) |
+----------+
| 21 |
+----------+
1 row in set (0.00 sec)
Denumirea campurilor in SELECT MySQL permite sa denumesti campurile extrase cu termeni mai
descriptivi pentru datele extrase.
select avg(salary) AS
'Salariu mediu' from
angajati_data;
+----------------+
| Salariu mediu |
+----------------+
| 95095.2381 |
+----------------+
1 row in set (0.00 sec)
Clauza GROUP BY permite gruparea informatiilor similare. Deci, pentru a lista toate functiile unice
din tabela:
select title from angajati_data GROUP BY title;
+----------------------------+
| title |
+----------------------------+
| CEO |
| Customer Service Manager |
| Finance Manager |
| Marketing Executive |
| Multimedia Programmer |
| Programmer |
| Senior Marketing Executive |
| Senior Programmer |
| Senior Web Designer |
| System Administrator |
| Web Designer |
+----------------------------+
11 rows in set (0.01 sec)
+----------------------------+-------------+
| title | AVG(salary) |
+----------------------------+-------------+
| CEO | 200000.0000 |
| Finance Manager | 120000.0000 |
| Senior Marketing Executive | 120000.0000 |
| Senior Programmer | 115000.0000 |
| Senior Web Designer | 110000.0000 |
+----------------------------+-------------+
5 rows in set (0.00 sec)
Extragerea inregistrarilor din mai multe tabele (JOIN-uri)
De multe ori, ca sa raspunzi la o intrebare trebui sa extragi date din mai multe tabele. De exemplu,
pentru a afla ce clienti au facut comenzi luna asta trebuie sa folosesti tabela clienti si tabela comenzi.
Pentru acest lucru in SQL trebuie realizata o relatie intre tabele (JOIN) pe baza unor informatii comune
(un camp de ID).
In exemplul nostru campul care relationeaza tabela 'angajati_data' este emp_id, iar pentru
'angajati_per 'e_id. Sa extragem numele angajatilor casatoriti din angajati_data si numele sotiei din
angajati_per (vom folosi functia CONCAT pentru a alipi doua siruri de caractere):
select CONCAT(f_name, " ", l_name) AS Name,
s_name as 'Spouse Name' from
angajati_data, angajati_per
where m_status = 'Y' AND
emp_id = e_id;
+-----------------+-----------------+
| Name | Spouse Name |
+-----------------+-----------------+
| Manish Sharma | Anamika Sharma |
| John Hagan | Jane Donner |
| Ganesh Pillai | Sandhya Pillai |
| Anamika Sharma | Manish Sharma |
| John MacFarland | Mary Shelly |
| Alok Nanda | Manika Nanda |
| Paul Simon | Muriel Lovelace |
| Arthur Hoopla | Rina Brighton |
| Kim Hunter | Matt Shikari |
| Danny Gibson | Betty Cudly |
| Mike Harper | Stella Stevens |
| Monica Sehgal | Edgar Alan |
| Peter Champion | Ruby Richer |
+-----------------+-----------------+
13 rows in set (0.00 sec)
Crearea indecsilor
Se poate face cu comanda INDEX sau specificand la crearea unui tabel un camp ca PRIMARY KEY.
index nume_index (nume_coloana_indexata)
create table my_table ( id_col int unsigned auto_increment primary key, another_col
text );
MySQL ofera 3 tipuri de tabele: ISAM, MyISAM (implicit), BDB, and Heap alese dupa sintaxa:
create table nume type=tip_tabela( nume_col coloana attribut );
Heap-urile sunt tabele hash temporare rezidente in memorie. Tabelele BDB sunt folosite la tranzactii,
iar tabelele ISAM nu mai sunt recomandate. Deci alegerea implicita MyISAM este cea mai buna si nu
trebuie sa-ti faci grji ca trebui sa specifici vreodata un tip de tabela.
Sintaxe ALTER:
(Redenumire tabela:)alter table nume_vechi rename nume_nou
(Modificare camp:)alter table my_table add column my_column text not null