|
Tabelul pet tine evidenta animalelor pe care le ai. Daca doresti sa inregistrezi alte informatii despre ele, cum ar fi evenimente din viata lor, precum vizitele la veterinar sau data la care li se nasc puii, foloseste un alt tabel. Cum ar trebui sa arate acest tabel? El va trebui sa:
• Contina numele animalului de casa caruia ii corespunde fiecare eveniment.
• O data, pentru a sti cand s-a petrecut evenimentul.
• Un camp pentru a descrie evenimentul.
• Un camp care sa desemneze tipul evenimentului, daca doresti sa poti clasifica evenimentele.
Avand in vedere toate aceste considerente, instructiunea CREATE TABLE pentru tabelul event ar putea arata astfel:
mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
-> type VARCHAR(15), remark VARCHAR(255));
Ca si in cazul tabelului pet, cel mai convenabil este sa incarci datele initiale creand un fisier text tab-delimited care sa cuprinda urmatoarele informatii:
name |
date |
type |
remark |
Fluffy |
1995-05-15 |
litter |
4 kittens, 3 female, 1 male |
Buffy |
1993-06-23 |
litter |
5 puppies, 2 female, 3 male |
Buffy |
1994-06-19 |
litter |
3 puppies, 3 female |
Chirpy |
1999-03-21 |
vet |
needed beak straightened |
Slim |
1997-08-03 |
vet |
broken rib |
Bowser |
1991-10-12 |
kennel |
|
Fang |
1991-10-12 |
kennel |
|
Fang |
1998-08-28 |
birthday |
Gave him a new chew toy |
Claws |
1998-03-17 |
birthday |
Gave him a new flea collar |
Whistler |
1998-12-09 |
birthday |
First birthday |
Incarca inregistrarile astfel:
mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;
Bazandu-te pe ceea ce ai invatat din interogarile pe care le-ai rulat pe tabelul pet, ar trebui sa fii capabil sa efectuezi extrageri de date din tabelul event; principiile de baza raman aceleasi. Dar care sunt cazurile in care tabelul event, de unul singur, este insuficient pentru a raspunde intrebarilor pe care i le-ai putea adresa?
Sa presupunem ca doresti sa afli varstele la care fiecare animal de casa si-a fatat puii. Am vazut mai devreme modul in care se calculeaza varstele pornind de la data nasterii. Data la care mama si-a fatat puii se afla in tabelul event, insa, pentru a calcula varsta pe care o avea la acea data, ai nevoie de ziua ei de nastere, care este stocata in tabelul pet. Acest lucru inseamna ca interogarea necesita ambele tabele:
mysql> SELECT pet.name,
-> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
-> remark
-> FROM pet INNER JOIN event
-> ON pet.name = event.name
-> WHERE event.type = 'litter';
+--------+------+-----------------------------+
| name | age | remark |
+--------+------+-----------------------------+
| Fluffy | 2 | 4 kittens, 3 female, 1 male |
| Buffy | 4 | 5 puppies, 2 female, 3 male |
| Buffy | 5 | 3 puppies, 3 female |
+--------+------+-----------------------------+
Ar fi mai multe lucruri care trebuie aduse in atentie in legatura cu acesta interogare:
• Clauza FROM uneste cele doua tabele, intrucat interogarea are nevoie sa isi extraga informatii din ambele.
• In momentul combinarii informatiilor apartinand mai multor tabele, trebuie sa specifici modul in care inregistrarile dintr-un tabel pot fi asociate inregistrarilor din celalalt. Acest lucru este simplu, deoarece ambele au cate o coloana name. Interogarea foloseste o clauza ON pentru a face o corespondenta intre inregistrarile din cele doua tabele care se bazeaza pe valorile name.
Interogarea foloseste un INNER JOIN pentru a uni tabelele. Un INNER JOIN permite randurilor din oricare tabel sa apara in rezultat daca si numai daca ambele tabele intrunesc conditiile specificate in clauza ON. In exemplul de fata, clauza ON impune coloanei name din tabelul pet sa corespunda coloanei name din tabelul event. Daca un nume apare intr-un tabel dar nu si in celalalt, randul respectiv nu va aparea in rezultat, deoarece conditia din clauza ON esueaza.
• Intrucat coloana name apare in ambele tabele, trebuie sa precizezi cu exactitate la care tabel te raportezi atunci cand mentionezi coloana. Acest lucru se realizeaza antepunand numele tabelului numelui coloanei.
Nu ai neaparat nevoie de doua tabele pentru a efectua o combinare. Uneori este util sa unesti un tabel cu el insusi, in cazul in care doresti sa compari inregistrarile dintr-un tabel cu alte inregistrari, din acelasi tabel. De exemplu, pentru a gasi perechi care sa dea nastere la pui printre animalele de casa, poti uni tabelul pet cu sine insusi pentru a returna perechi mascul-femela apartinand unor specii similare:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
-> FROM pet AS p1 INNER JOIN pet AS p2
-> ON p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';
+--------+------+--------+------+---------+
| name | sex | name | sex | species |
+--------+------+--------+------+---------+
| Fluffy | f | Claws | m | cat |
| Buffy | f | Fang | m | dog |
| Buffy | f | Bowser | m | dog |
+--------+------+--------+------+---------+
In aceasta interogare, vom specifica un alias pentru numele tabelului pentru a ne referi la coloane si pentru a afla exact carui element din tabel ii este asociata fiecare referinta din coloana.
|