Gagnagrunnar: Töflualgebra 102 (Praxis) Þetta er framhald af greininni “Gagnagrunnar: Töflualgebra 101” og er dæmið í þeirri grein klárað hér.

Við búum til töflurnar 3 svona;

CREATE TABLE nemendur (
NemendurKenni integer unsigned default ‘0’ NOT NULL auto_increment,
Nafn varchar(35), #þurfum bara 35 stafi max
Heimilisfang varchar(40),
PRIMARY KEY(NemendurKenni)
);

CREATE TABLE fag (
FagKenni integer unsigned default ‘0’ NOT NULL auto_increment,
Fag varchar(35),
Athugasemdir blob, #Hér verður hægt að skrifa heila ritgerð
PRIMARY KEY(FagKenni)
);

CREATE TABLE einkunnir (
NemendurKenni integer unsigned default ‘0’ NOT NULL,
FagKenni TINYINT UNSIGNED , # tinyint, eins lítið og þarf
Einkunn TINYINT UNSIGNED,
PRIMARY KEY(NemendurKenni)
);

Skrifum í töflurnar svona

t.d. setjum inn fögin;
INSERT INTO fag VALUES(0,'Íslenska 103','Bókmenntir');
INSERT INTO fag VALUES(0,'Íslenska 203','Setningafræði');
INSERT INTO fag VALUES(0,'Efnafræði 103',NULL);
INSERT INTO fag VALUES(0,'Stærðfræði 103','Algebra I');
INSERT INTO fag VALUES(0,'Stærðfræði 203','Algebra II');

Ef við gerum SELECT * FROM fag; fáum við töfluna með öllum gildunum;

FagKenni | Fag | Athugasemdir
1 | Íslenska 103 | Bókmenntir
2 | Íslenska 203 | Setningafræði
3 | Efnafræði 103 |
4 | Stærðfræði 103 | Algebra I
5 | Stærðfræði 203 | Algebra II


setjum inn nemendur;
INSERT INTO nemendur VALUES(0,'Gunnar Eyjólfsson','Hagamel 21');
INSERT INTO nemendur VALUES(0,'Rúnar Friðriksson','Hverfisgötu 1');
INSERT INTO nemendur VALUES(0,'Sigrún Ragnarsdóttir','Laugvangi 9');
INSERT INTO nemendur VALUES(0,'Pétur Jónsson','Fjólugötu 2');
INSERT INTO nemendur VALUES(0,'Magnús Finnbogason','Geirsgötu 4');
INSERT INTO nemendur VALUES(0,'María Pétursdóttir','Grettisgötu 2');
INSERT INTO nemendur VALUES(0,'Runólfur Geirsson','Frakkastíg 3');

Ef við gerum SELECT * FROM nemendur; fáum við;
NemendurKenni | Nafn | Heimilisfang
1 | Gunnar Eyjólfsson | Hagamel 21
2 | Rúnar Friðriksson | Hverfisgötu 1
3 | Sigrún Ragnarsdóttir | Laugvangi 9
4 | Pétur Jónsson | Fjólugötu 2
5 | Magnús Finnbogason | Geirsgötu 4
6 | María Pétursdóttir | Grettisgötu 2
7 | Runólfur Geirsson | Frakkastíg 3

setjum inn í einkunnir
INSERT INTO einkunnir VALUES(1,1,10); #hér fær nemandi Gunnar Eyjólfsson 10 fyrir íslensku 103.
INSERT INTO einkunnir VALUES(2,1,5);
INSERT INTO einkunnir VALUES(3,1,6);
INSERT INTO einkunnir VALUES(4,1,8);
INSERT INTO einkunnir VALUES(5,1,5);
INSERT INTO einkunnir VALUES(1,2,4);
INSERT INTO einkunnir VALUES(2,2,4);
INSERT INTO einkunnir VALUES(3,2,5);
INSERT INTO einkunnir VALUES(4,2,4);
INSERT INTO einkunnir VALUES(5,2,8);
INSERT INTO einkunnir VALUES(1,3,4);
INSERT INTO einkunnir VALUES(2,3,4);
INSERT INTO einkunnir VALUES(3,3,5);
INSERT INTO einkunnir VALUES(4,3,4);
INSERT INTO einkunnir VALUES(5,3,8);

Ef við gerum SELECT * FROM einkunnir; fáum við;
FagKenni | NemendurKenni | Einkunn
1 | 1 | 10
2 | 1 | 5
3 | 1 | 6
4 | 1 | 8
5 | 1 | 5
1 | 2 | 4
2 | 2 | 4
3 | 2 | 5
4 | 2 | 4
5 | 2 | 8
1 | 3 | 4
2 | 3 | 4
3 | 3 | 5
4 | 3 | 4
5 | 3 | 8

Þessi tafla segir okkur lítið (bara eintómar tölur). Þess vegna þarf að tengja þær við viðeigandi gildi í hinum töflunum til að fá eitthvað vit í þær.
Það er hægt að nota svokallað JOIN (INNTER, OUTER osfr.) en í þessi tilfelli er stuðst við aðra aðferð.

SELECT f.Fag, n.Nafn, e.Einkunn FROM fag f, einkunnir e, nemendur n WHERE e.FagKenni = f.FagKenni AND e.NemendurKenni = n.NemendurKenni;
Það sem er í gangi hér í stuttu máli er að á eftir SELECT er tilgreint hvað á að birta. Eftir FROM er tilgreint úr hvaða töflum. Eftir WHERE hlutanum er tilgreint hvernig töflurnar tengjast og önnur skilyrði (síur ofl.)

Fag | Nafn | Einkunn
Íslenska 103 | Gunnar Eyjólfsson | 10
Íslenska 103 | Rúnar Friðriksson | 5
Íslenska 103 | Sigrún Ragnarsdóttir | 6
Íslenska 103 | Pétur Jónsson | 8
Íslenska 103 | Magnús Finnbogason | 5
Íslenska 203 | Gunnar Eyjólfsson | 4
Íslenska 203 | Rúnar Friðriksson | 4
Íslenska 203 | Sigrún Ragnarsdóttir | 5
Íslenska 203 | Pétur Jónsson | 4
Íslenska 203 | Magnús Finnbogason | 8
Efnafræði 103 | Gunnar Eyjólfsson | 4
Efnafræði 103 | Rúnar Friðriksson | 4
Efnafræði 103 | Sigrún Ragnarsdóttir | 5
Efnafræði 103 | Pétur Jónsson | 4
Efnafræði 103 | Magnús Finnbogason | 8

Það er hægt að raða þessu í stafrófsröð nafna með því að bæta við aftast ORDER BY n.Nafn.
n.Nafn vísar hér í nemendur n í FROM hluta SELECT skipunarinnar. Í staðin fyrir að segja alltaf nemendur hefur þeirri töflu verið gefið nafnið n. n.Nafn þýðir því sviðið Nafn í töflunni nemendur.

Til að skoða bara einkunnir úr Efnafræði gerum við svona;
SELECT f.Fag, n.Nafn, e.Einkunn FROM fag f, einkunnir e, nemendur n WHERE e.FagKenni = f.FagKenni AND e.NemendurKenni = n.NemendurKenni AND f.FagKenni = 3;


Fag | Nafn | Einkunn
Efnafræði 103 | Gunnar Eyjólfsson | 4
Efnafræði 103 | Rúnar Friðriksson | 4
Efnafræði 103 | Sigrún Ragnarsdóttir | 5
Efnafræði 103 | Pétur Jónsson | 4
Efnafræði 103 | Magnús Finnbogason | 8

Svona er hægt að leika sér með þetta fram og til baka. Töflurnar eru allar sjálfstæðar en í gegnum eina SELECT skipun verða þær allar sem ein heild.



Síðan eru misjafnar aðferðir við að tengjast grunninum eftir því hvaða forrit er notað (PHP, JPS osfr.) Ég nota EmbPerl og svona er það gert;
[-
use DBI;
$grunnur = DBI->connect('dbi:mysql:nafn_db','root','lykilorð') or die “Get ekki tengst”;
-]

[-
$fyrirspurn = $grunnur -> prepare (“SELECT n.Nafn FROM nemendur n WHERE n.NafnKenni = 7”) or die “Get ekki gert prepare”;
$fyrirspurn -> execute or die “Get ekki keyrt fyrirspurn”;
$nafn = $fyrirspurn -> fetchrow_array;
-]

Hérna er verið að sækja nafn þess einstaklings sem hefur kennið 7.
að er skrifað út í HTML kóðann sem [+ $nafn[0] +]

Þetta er þó alveg heill kafli út af fyrir sig og það er best að einhver kunnugur PHP sýni dæmi um notkunina á vefnum.

Senninha
himbrimi@yahoo.com