MySql

Úr Wikibókunum, frjálsa kennslubókasafninu
Jump to navigation Jump to search


MySql er opið, ókeypis gagnagrunnsforrit sem hentar vel til að byggja upp gagnagrunna til notkunar á vefnum. Hér er kennsluefni til að gefa notandanum innsýn í þetta forrit.

Kennsluefnið er í því formi að við búum til einfaldan gagnagrunn og náum í nauðsynlegar upplýsingar úr honum. Um leið og við gerum það kynnumst við ýmsum grundvallarhugmyndum í gagnagrunnsnotkun.

Að setja upp MySql Workbench[breyta]

Hér er gert ráð fyrir að notandinn sé búinn að setja um MySql Workbench. Til þess að gera það má t.d. fara á síðuna https://www.mysql.com/products/workbench/. Ef viðkomandi er ekki vanur að setja upp slík forrit væri gott ráð að fá einhvern til að setja það upp.


Að búa til gagnagrunn[breyta]

Til þess að búa til nýjan gagnagrunn opnar maður nýjan glugga í Workbench og skrifar:

create database Efni;

Núna er búið að búa til gagnagrunninn Efni og hægt er að búa til töflur í honum.

Við skulum segja að hópur í tölvuáfanga ákveði að læra grunnatriði forritunar með því að búa til vefsíðu um ensk knattspyrnulið og áhuga fólks á þeim. Á þessari síðu verða ýmsar upplýsingar um knattspyrnuliðin og fólk sem skráir sig inn á síðuna getur merkt hvert uppáhaldslið þeirra er og séð ýmsar upplýsingar um hver uppáhaldslið annarra eru.

Það sem við skulum gera fyrst er að búa til töflu með knattspyrnuliðunum.


Að búa til töflu[breyta]

CREATE TABLE Fotboltalid ( Lid VARCHAR(50) not null primary key );


CREATE TABLE Fotboltalid er skipun sem býr til nýja töflu með nafninu Fotboltalid. Inni í sviga kemur fram hvaða dálkar eiga að vera í töflunni.

Lid VARCHAR(50) not null primary key

Lid er nafnið á dálknum (þ.e. "Lið"). Það þarf alltaf að segja forritinu hvers konar upplýsingar við ætlum að setja inn í dálk. Þetta gætu verið tölur eða dagsetningar. Við ætlum hins vegar að setja inn texta og skrifum þessvegna VARCHAR.

VARCHAR merkir "variable characters". Það þýðir að við ætlum að setja í dálkinn characters, þ.e. stafi, með öðrum orðum texta.

(50) þýðir að við höldum að í þessum dálki verði í hvert skipti í mesta lagi 50 stafir.

not null merkir að við viljum ekki að þessi dálkur verði tómur.

primary key Þetta merkir að þessi dálkur er lykildálkurinn í töflunni.


Að setja upplýsingar inn í töflu[breyta]

Nú skulum við setja nokkur lið inn í töfluna.

Insert into Fotboltalid(Lid) Values('Liverpool');

Insert into Fotboltalid(Lid) Values('Chelsea');

Insert into Fotboltalid(Lid) Values('Manchester United');

Insert into Fotboltalid(Lid) Values('Everton');

Insert into Fotboltalid(Lid) Values('Aston Villa');

Insert into Fotboltalid(Lid) Values('Crystal Palace');

Insert into Fotboltalid(Lid) Values('Manchester City');

Insert into Fotboltalid(Lid) Values('Arsenal');

Insert into Fotboltalid(Lid) Values('Tottenham Hotspur');

Insert into Fotboltalid(Lid) Values('Leicester City');


Við viljum núna skoða hvað er í töflunni. Til þess notum við skipunina SELECT:

SELECT * FROM Fotboltalid;

Niðurstöður:

Arsenal Aston Villa Chelsea Crystal Palace Everton Leicester City Liverpool Manchester City Manchester United Tottenham Hotspur


Að bæta við dálki[breyta]

Nú ákveðum við að væri fínt að skrá í hvaða borg liðin eru staðsett. Þá þurfum við að bæta við dálki.

Alter table Fotboltalid Add Borg varchar(100); Alter table Fotboltalid er tilkynning um að við ætlum að breyta töflunni Fotboltalid. Add Borg varchar(50) merkir "ég ætla að bæta við dálki sem heitir "Borg", og ég ætla að setja inn textaupplýsingar, hámark 50 stafi í einu.


Nú skulum við skoða hvað er í töflunni:

SELECT * FROM Fotboltalid

Niðurstaða

Lid Borg Arsenal NULL Aston Villa NULL Chelsea NULL Crystal Palace NULL Everton NULL Leicester City NULL Liverpool NULL Manchester City NULL Manchester United NULL Tottenham Hotspur NULL



Að setja nýjar upplýsingar í dálk[breyta]

Áðan vorum við að skrá inn nýjar raðir, þ.e. ALVEG NÝJAR UPPLÝSINGAR, og þá notuðum við skipunina INSERT INTO Fotboltalid. En núna ætlum við ekki að bæta við nýjum röðum í töfluna, heldur ætlum við að setja upplýsingar inn í nýja dálkinn, Borg. Þá notum við skipunina UPDATE Fotboltalid. Ef við ætlum t.d. að setja inn upplýsingarnar að Borg sé London þar sem Lid er Chelsea, þá segjum við eftirfarandi:

UPDATE Fotboltalid SET Borg = 'London' WHERE Lid = 'Chelsea'


Við skulum núna setja inn þessar upplýsingar:

UPDATE Fotboltalid SET Borg = 'London' WHERE Lid = 'Tottenham Hotspur';

UPDATE Fotboltalid SET Borg = 'London' WHERE Lid = 'Arsenal';


UPDATE Fotboltalid SET Borg = 'Manchester' WHERE Lid = 'Manchester United';


UPDATE Fotboltalid SET Borg = 'Birmingham' WHERE Lid = 'Aston Villa';


UPDATE Fotboltalid SET Borg = 'Manchester' WHERE Lid = 'Manchester City';


UPDATE Fotboltalid SET Borg = 'London' WHERE Lid = 'Chelsea';

UPDATE Fotboltalid SET Borg = 'Liverpool' WHERE Lid = 'Liverpool';


UPDATE Fotboltalid SET Borg = 'London' WHERE Lid = 'Crystal Palace';


UPDATE Fotboltalid SET Borg = 'Leicester' WHERE Lid = 'Leicester City';


UPDATE Fotboltalid SET Borg = 'Liverpool' WHERE Lid = 'Everton';


Við skulum skoða hvernig taflan lítur nú út:

SELECT * FROM Fotboltalid


Arsenal London Aston Villa Birmingham Chelsea London Crystal Palace London Everton Liverpool Leicester City Leicester Liverpool Liverpool Manchester City Manchester Manchester United Manchester Tottenham Hotspur London



Núna viljum við flokka liðin eftir borgum. Þá notum við skipunina ORDER BY:

SELECT Lid FROM Fotboltalid ORDER BY Borg

Niðurstaða:

Aston Villa Birmingham Leicester City Leicester Liverpool Liverpool Everton Liverpool Arsenal London Crystal Palace London Chelsea London Tottenham Hotspur London Manchester City Manchester Manchester United Manchester


Við viljum vita hvaða borg er með flest lið í töflunni. Við notum þá skipunina GROUP BY:

SELECT Borg, count(Borg) AS Fjöldi FROM Fotboltalid GROUP BY Borg ORDER BY Fjöldi desc

Niðurstaða BORG Fjöldi London 4 Manchester 2 Liverpool 2 Birmingham 1 Leicester 1


Ef við viljum að einungis fjölmennasta borgin birtist notum við sama kóða, við bætum bara við "LIMIT 1" neðst. Það þýðir að það eigi bara að sýna efsta gildið:


SELECT Borg, count(Borg) as Fjöldi FROM Fotboltalid GROUP BY Borg ORDER BY Fjöldi DESC LIMIT 1

Niðurstaða: BORG Fjöldi London 4


Að búa til notenda-töflu[breyta]

Á vefsíðunni okkar viljum við að fólk geti skráð sig og valið uppáhaldsliðið sitt. Síðan getum við beðið fólk um allskyns upplýsingar og boðið því að bera sig saman við aðra notendur.


Á vefsíðunni okkar ætlum við búa til nýskráningarramma, þar sem notandinn skráir nafn sitt, netfang og lykilorð. Notandinn mun síðan nota netfangið sitt sem notandanafn. Nú ætlum við að búa til sql-kóðann sem verður notaður þegar notandinn skráir sig inn. Við ræðum ekki hér hverskonar kóði er á vefsíðunni, heldur gerum við ráð fyrir því að hann sé tilbúinn til að senda þessar upplýsingar.

Við búum til töflu sem heitir Notendur. CREATE TABLE Notendur ( Fullt_nafn VARCHAR(100) NOT NULL, Netfang VARCHAR(30) NOT NULL PRIMARY KEY, Lykilord VARCHAR(20) NOT NULL ) Nú byrja notendur að skrá sig á vefsíðuna. Það sem skráist þegar notandinn skráir sig á vefsíðunni og ýtir á senda-takkann er: Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Jón Magnason', 'jonm@somemail.com', 'jonniBest');

Þegar annar notandi, Vala Ragnarsdóttir, skráir sig á vefsíðunni er eftirfarandi sent inn í töfluna: Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Vala Ragnarsdóttir', 'valar@somemail.com', 'vala79');

Og nokkrir bætast við á sama hátt: Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Björg Jónsdóttir', 'bjorgj@somemail.com', 'bjorg1');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Sigurður Mínuson', 'siggim@somemail.com', 'minnSiggi');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Finnur Finnsson', 'finnurf@somemail.com', 'finnifinn');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Þorgerður Bjarnadóttir', 'thorgerdurb@somemail.com', 'thorgbj');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Grímur Grímsson', 'grimur@somemail.com', 'grimmi');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Flóra Jónsdóttir', 'floraj@somemail.com', 'florafl');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Jana Jönudóttir', 'janaj@somemail.com', 'jana123');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Jón Ragnarsson', 'jonr@somemail.com', 'jonr24');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Halla Hölludóttir', 'hallah@somemail.com', 'halla43');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Lárus Löruson', 'larusl@somemail.com', 'myLalli');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Muggur Muggs', 'mggurm@somemail.com', 'mgg90');

Insert into Notendur(Fullt_nafn, netfang, lykilord) Values('Karl Karlsson', 'karlk@somemail.com', 'kalli99');

Nú getum við skoðað töfluna:

select * from Notendur Niðurstaða:

Björg Jónsdóttir bjorgj@somemail.com bjorg1 Finnur Finnsson finnurf@somemail.com finnifinn Flóra Jónsdóttir floraj@somemail.com florafl Grímur Grímsson grimur@somemail.com grimmi Halla Hölludóttir hallah@somemail.com halla43 Jana Jönudóttir janaj@somemail.com jana123 Jón Magnason jonm@somemail.com jonniBest Jón Ragnarsson jonr@somemail.com jonr24 Karl Karlsson karlk@somemail.com kalli99 Lárus Löruson larusl@somemail.com myLalli Muggur Muggs mggurm@somemail.com mgg90 Sigurður Mínuson siggim@somemail.com minnSiggi Þorgerður Bjarnadóttir thorgerdurb@somemail.com thorgbj Vala Ragnarsdóttir valar@somemail.com vala79


Að búa til join-töflu[breyta]

Á vefsíðunni viljum við að notendur geti valið hvaða lið er uppáhaldsliðið þeirra. Í hvaða töflu eigum við að setja þessar upplýsingar? Eigum við að setja þær Notanda-töfluna? Svarið er nei. Grunnhugmynd í gagnagrunnsvinnslu er að í hverri töflu er ein meginhugmynd, sem kemur fram í lykildálki (sem er gjarnan svokallaður primary key dálkur) og allir dálkar eiga að geyma upplýsingar útfrá þessari meginhugmynd. Dæmi: Fotboltalid-taflan er með meginhugmyndina fótboltalið. Borg-dálkurinn í þeirri töflu gefur aukaupplýsingar um fótboltaliðin. Ef við ákveðum að setja inn nýjan dálk, Ar_Stofnad, sem skráir stofnár liðsins, gefur sá dálkur líka aukaupplýsingar um fótboltaliðin. Allir aukadálkar tengjast beint aðaldálknum.

Í Notanda-töflunni eiga bara að vera upplýsingar sem varða notendurna sjálfa, upplýsingar sem tengjast ekki neinum öðrum töflum. Þetta geta verið upplýsingar eins og fæðingarár og kyn. Það eru atriði sem varða notandann beint. Uppáhaldsfótboltalið notandans varðar hann ekki beint.

Hvar setjum við þá upplýsingarnar um uppáhaldslið hvers notanda? Við búum til töflu sem tengir þessar upplýsingar saman, stundum kallað join-tafla.

CREATE TABLE Notendur_Fotboltalid ( Notandi varchar(50) not null, Fotboltalid varchar(50) not null, PRIMARY KEY (Notandi, Fotboltalid) );

Á vefsíðunni setja notendur inn upplýsingar um uppáhaldsliðið sitt og það er skráð inn í töfluna:


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('thorgerdurb@somemail.com', 'Chelsea);


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('finnurf@somemail.com', 'Chelsea);


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('finnurf@somemail.com', 'Chelsea);


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('finnurf@somemail.com', 'Chelsea);


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('finnurf@somemail.com', 'Chelsea);


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('bjorgj@somemail.com', 'Arsenal');


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('valar@somemail.com', 'Manchester United');


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('karlk@somemail.com', 'Arsenal');


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('mggurm@somemail.com', 'Tottenham Hotspur');


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('janaj@somemail.com', 'Liverpool');


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('jonm@somemail.com', 'Liverpool');


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('floraj@somemail.com', 'Everton');


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('finnurf@somemail.com', 'Chelsea);


INSERT INTO Notendur_Fotboltalid(Notandi, Fotboltalid) Values('grimur@somemail.com', 'Chelsea);



Skoðum nú vinsældir liðanna meðal notenda. Hver er röðin?

SELECT COUNT(Lid) as Telja_Lid FROM Notendur_Fotboltalid ORDER BY Telja_Lid

Finnum vinsælasta liðið. SELECT COUNT(Lid) as Telja_Lid FROM Notendur_Fotboltalid ORDER BY Telja_Lid LIMIT 1


Finnum liðið sem hefur minnstar vinsældir af þeim sem hafa verið valin.

SELECT COUNT(Lid) as Telja_Lid FROM Notendur_Fotboltalid ORDER BY Telja_Lid desc LIMIT 1




Verkefni[breyta]

Hér koma verkefni til að æfa þau atriði sem komu fram hér að ofan. Lausnirnar eru fyrir neðan.


Verkefni 1 Bæta við nýjum dálki[breyta]

Einhver segir: setjum inn hvenær liðið var stofnað. Hvernig gerum við það? Fyrst þurfum við að bæta við nýjum dálk. Hvernig gerum við það?

Gerðu eftirfarandi:

settu nýjan dálk inn í töfluna Fotboltalid og kallaðu hann Ar_Stofnad. Þessi dálkur á ekki að vera VARCHAR, heldur INT (þ.e. tala).


Verkefni 2 Setja nýtt efni inn í dálk[breyta]

Settu núna inn upplýsingarnar um stofnárin. Vísbending: Það þarf að ákveða hvort maður notar hér INSERT INTO eða UPDATE?

Hér eru stofnárin: Arsenal 1886 Aston Villa 1874 Chelsea 1905 Crystal Palace 1905 Everton 1878 Leicester City 1884 Liverpool 1892 Manchester United 1878 Manchester City 1880 Tottenham Hotspur 1882



Verkefni 1 Bæta við nýjum dálki - lausn[breyta]

Lausn: Alter table Fotboltalid Add Ar_Stofnad INT;


Verkefni 2 Setja nýtt efni inn í dálk - lausn[breyta]

Lausn:

UPDATE Fotboltalid SET Ar_Stofnad = 1886 WHERE Lid = 'Arsenal';

UPDATE Fotboltalid SET Ar_Stofnad = 1874 WHERE Lid = 'Aston Villa';

UPDATE Fotboltalid SET Ar_Stofnad = 1905 WHERE Lid = 'Chelsea';

UPDATE Fotboltalid SET Ar_Stofnad = 1905 WHERE Lid = 'Crystal Palace';

UPDATE Fotboltalid SET Ar_Stofnad = 1878 WHERE Lid = 'Everton';

UPDATE Fotboltalid SET Ar_Stofnad = 1884 WHERE Lid = 'Leicester City';

UPDATE Fotboltalid SET Ar_Stofnad = 1892 WHERE Lid = 'Liverpool';

UPDATE Fotboltalid SET Ar_Stofnad = 1878 WHERE Lid = 'Manchester United';

UPDATE Fotboltalid SET Ar_Stofnad = 1880 WHERE Lid = 'Manchester City';

UPDATE Fotboltalid SET Ar_Stofnad = 1882 WHERE Lid = 'Tottenham Hotspur';


Dæmi um verkefni í kennslu[breyta]

Í sögukennslu búum við til verkefni þar sem allir nemendur eiga að velja 3 lönd. Þeir eiga síðan að velja þrjá atburði í sögu þessara landa til að fjalla um. Við ákveðum að búa til gagnagrunn til að halda utan um þessar upplýsingar. Hvaða töflur gætum við búið til?

Við þurfum eflaust töflu utan um löndin, töflu utan um nemendurna og töflu utan um atburðina. Þurfum við töflur til að tengja eitthvað saman? Já, við þurfum að tengja saman nemendur og lönd og síðan nemendur og atburði.


Create table Loend_Evropu ( Land varchar(50) not null primary key );

Insert into table Loend_Evropu (Land) Values('Danmörk');

Insert into table Loend_Evropu (Land) Values('Noregur');

Insert into table Loend_Evropu (Land) Values('Spánn');

Insert into table Loend_Evropu (Land) Values('Frakkland');

Insert into table Loend_Evropu (Land) Values('Þýskaland');


CREATE TABLE Nemendur ( Fullt_nafn varchar(100) not null, Netfang varchar(30) not null primary key, Lykilord varchar(20) not null )


CREATE TABLE Nemendur_Loend ( Netfang varchar(30) not null, Land varchar(50) not null, Primary key (Netfang, Land) )


Þegar nemandi velur land á vefsíðunni, hvað viljum við að gerist? Í hvaða töflu viljum við að upplýsingarnar skráist? Hvernig eru þær skráðar?

Insert into Nemendur_Loend(Netfang, Land) Values('margretp@somemail.com', 'Frakklandi');


Seinna meir er Margrét búin að ákveða hin tvö löndin og merkir við þau:

Insert into Nemendur_Loend(Netfang, Land) Values('margretp@somemail.com', 'Noregur');

Insert into Nemendur_Loend(Netfang, Land) Values('margretp@somemail.com', 'Þýskaland');


Við viljum að nemendurnir sjálfir skrái inn atburðina. Það er ekki staðlað hvernig atburðunum er lýst. Ef við vildum gætum við búið til langan lista yfir atburði, en hérna viljum við að nemendurnir sjálfir gefi atburðunum nafn. Nemandi sem velur frönsku byltinguna 1789 getur því lýst henni sem "Franska byltingin 1789" eða "1789-Franska byltingin' eða hvaða önnur útgáfa sem er. Á vefsíðunni er rammi þar sem nemandinn fyllir út viðeigandi upplýsingar. Hvaða upplýsingar væru það? Þær upplýsingar væru netfang nemandans (við þurfum að vita hver er að velja atburð), landið (við þurfum að vita landið, m.a. til að tryggja að hvert land hafi bara einn atburð) og svo atburðinn.


CREATE TABLE Atburdir_Loend_Nemendur ( Land VARCHAR(30) not null, Atburdur VARCHAR (10) not null, Netfang VARCHAR (30) not null, PRIMARY KEY (Land, Atburdur, Netfang) )

Þegar nemandinn ýtir á Senda-hnapp skráist eftirfarandi í töfluna:

INSERT INTO Atburdir_Loend_Nemendur(Netfang ,Land,Atburdur) VALUES ('magnusb@somemail.com' ,'Frakkland', 'Franska byltingin 1789')

INSERT INTO Atburdir_Loend_Nemendur(Netfang ,Land,Atburdur) VALUES ('joninam@somemail.com' ,'Þýskaland', 'Lok 30 ára stríðsins 1648')