Bygg ett forum – Del 3- Grundläggande databaskunskap

by Reager 25. September 2009 17:51

I denna del av serien tänkte jag gå igenom vad man i databassammanhang kallar för CRUD, Create, Read, Update & Delete. Vi ska även gå igenom grundläggande databasmodellering samt skapa några tabeller. Observera att det vi skapar här inte kommer att användas i själva forumet utan är bara en liten crash course så att du ska veta vad vi håller på med senare när vi bygger på forumet.

Jag kommer att utgå från att du har en databas att arbeta med. Börja med att koppla upp dig mot denna i MySQL Query Browser. Sedan ska vi börja med att skapa några tabeller som vi kan använda när vi ska lära oss de olika kommandona. Det är väldigt vanligt att man i exempel använder tabeller vid namn Employee & Department vilket jag tänkte att vi även skulle göra här. Det första man bör göra innan man skapar sina tabeller är att modellera upp hur dessa är tänkta att se ut samt eventuella relationer emellan dem. Vid modellering börjar man man att se vilka olika objekt som man ska representera och vilka egenskaper dessa har. Till exempel så har Employee-tabellen, som ska motsvara en anställd egenskaperna anställningsnummer, förnamn, efternamn, avdelning, anställningsdatum m.m.. Vår Department-tabell kan ha egenskaper som avdelningsid, avdelningsnamn. Redan nu ser vi att det finns en relation mellan dessa två tabeller. Båda innehåller nämligen avdelningsid. Det som identifierar varje rad i en tabell kallar Primary Key, PK eller på svenska primärnyckel. Det som i en tabell hänvisar till PK i en annan tabell kallas Foreign Key, FK eller på svenska främmande nyckel. PK används som jag sa tidigare för att identifiera varje rad i en tabell, vilket innebär att den automatiskt blir unik, och du kan inte lägga till två rader med samma PK. En FK däremot kan det finnas hur många rader som helst av, men varje FK pekar alltid på en rad i sin “föräldratabell”. Detta förhindrar oss från att t.ex. lägga till en anställd med en avdelning som inte existerar.

På varje kolumn i en tabell ska man även sätta en datatyp. En datatyp talar om vilken sorts data det är vi lagrar i just denna kolumn. T.ex. så talar vi om om vi lagrar det som tal, text, datum m.m. Att sätta rätt datatyp är viktigt då det underlättar vid utsökningar samt förbättrar prestandan.

Du bör heller aldrig lagra mer än en information i varje kolumn, t.ex. så ska förnamn och efternamn aldrig lagras tillsammans, likaså adresser ska delas upp. Gatunamn och gatunummer kan vara OK att lagra tillsammans om din lösning inte kräver att du måste särskilja även på dessa.

Jag hoppas det är möjligt att förstå detta och vi ska nu göra själva modellen av våra tabeller.

Employee Datatyp Övrigt
EmpID INT PK
Firstname VARCHAR(45) NOT NULL
Lastname VARCHAR(45) NOT NULL
HireDate DATETIME NOT NULL
DeptID INT FK (Department, DeptID)

 

Department Datatyp Övrigt
DeptID INT PK
DeptName VARCHAR(45) NOT NULL

 

Då har vi två tabeller i textform och ska nu skapa dessa i databasen. Öppna MySQL Query Browser. Högerklicka på din databas och välj “Create new table”. Tabelleditorn öppnas då och vi kan skapa våra tabeller. Då tabellen Employee innehåller en referens till tabellen Department så skapar vi tabellen Department först så vi kan skapa relationen direkt när vi sedan skapar tabellen Employee. Börja med att fyll i uppgifterna för tabellen Department.

image

Det vi har gjort här är att vi lagt till två kolumner, sett till Att DeptID är PK genom att verifiera att det är en nyckel bredvid kolumnnamnet och satt de rätta datatyper. VARCHAR(45) innebär att det är en sträng som max kan innehålla 45 tecken men tar inte upp mer plats än nödvändigt. Egenskapen NOT NULL talar om att det måste finnas ett värde i kolumnen, vi kan alltså inte spara tomma värden och AUTO INC betyder att det är en automatisk räknare. Vi behöver alltså inte manuellt ange vår key, utan denna kommer att börja på 1 och räknas upp med 1 för varje rad.

Spara din nya genom att klicka på “Apply Changes”. Du får du upp en ruta som ser ut som den nedan. Klicka bara på “Execute” och du har skapat en tabell.

Grattis, om inget har gått fel så ska du nu har en tabell vid namn Department. Vi ska nu se till att skapa även tabellen Employee. Högerklicka än en gång på din databas och välj “Create new table”. Namnge denna till “Employee” och fyll sedan i resten av datan enligt bilden nedan.

image

Klicka på fliken “Foreign Keys”.

image

och sedan på +-tecknet. Låt namnet vara som det är och klicka på “OK”

image

I “Ref table” väljer du tabellen “Department”

image

och du kommer att se att den automatiskt visar rätt kolumner. Skulle dessa av någon anledning vara fel så kan du ändra genom att klicka på kolumnnamnet och välja den rätta kolumnen. Klicka på “Apply Changes” och sedan “Execute” och vi har två tabeller med en FK satt emellan denna. I de kommanda avsnitten nedan ska vi gå igenom hur du gör för att lägga till, läsa, uppdatera samt ta bort information från tabellerna.

Create

För att lägga till information i en tabell använder du kommandot INSERT. För att lägga till en rad i kolumnen Department kan vi skicka in följande “query” till databasen.

INSERT INTO Department(DeptName) VALUES('Försäljning')

Kommandot är uppbygget i delarna “INSERT INTO” sedan följer tabellnamnet och inom parenteserna anges en kommaseparerad lista med de kolumner som du vill stoppa in data i. Låter du bli att ange några så måste du ange värden för alla kolumner i tabellen. Efter det kommer “VALUES” och inom parenteser anges de värden som skall matas in på tabellraden. Även dessa skall anges med ett komma (,) mellan varje om det är fler och olika datatyper ska vara omslutna av olika tecken. T.ex. så skall strängar och datum vara omslutna av enkelfnuttar (‘) och tal ska inte vara omslutet av något alls.

Om du i MySQL Query Browser dubbelklickar två gånger på tabellen Department så kommer innehållet att visas.

image 

Som du kan se så infogades “Försäljning” och min PK fick värdet 1 då det är ett tal och en räknare. Hade du själv velat ange ett värde för DeptID så hade SQL-frågan sett ut så här

INSERT INTO Department VALUES(5, 'PR')

Om du återigen dubbelklickar på tabellen Department så kommer du att se att en ny rad har infogats och att DeptID denna gång har värdet 5.

image

Som en liten övning kan du nu skapa 5st personer i tabellen Employee. Skulle du inte lyckas få till det så ser koden ut så här.

INSERT INTO Employee VALUES(null, 'Kalle', 'Anka', '2009-09-21', 1)
Upprepa denna sats men med olika namn och datum samt ändra DeptID på någon av dem så att du totalt har 5st personer i Employee-tabellen.  Anledningen till att jag använder null som första värde är att jag inte angett något kolumnlista utan vill ange ett värde för varje kolumn och null gör så att den använder räknaren för EmpID. Ett alternativt sätt hade varit
INSERT INTO Employee(Firstname, Lastname, HireDate, DeptID) 
VALUES('Kalle', 'Anka', '2009-09-21', 1)

Read

För att läsa från en tabell används kommandot SELECT. Det absolut enklaste sättet användningen är

SELECT * FROM TabellNamn

vilket ger oss alla rader och alla kolumner i tabellen TabellNamn. Så säg att vi skulle vilja hämta ut alla rader ur tabellen Employee. Detta gör vi genom kommandot

SELECT * FROM Employee

Detta ger oss resultatet

image

Säg att vi bara skulle vilja visa de tre första resultaten från SQL-satsen. Då skulle vi kunna använda nyckelordet LIMIT. LIMIT fungerar som så att anger du bara ett tal så visar den det antalet, men det går också att ange ett startvärde samt ett antal. För att visa de tre första så ser SQL-frågan ut så här

SELECT * FROM employee e LIMIT 3

Detta ger oss resultatet

image

Om vi istället skulle vilja hämta ut 3 rader, men börja på rad på skulle SQL-satsen se ut så här

SELECT * FROM employee e LIMIT 1,3

Resultatet av denna blir istället

image

Om vi vill sortera resultatet och bara hämta ut dem med efternamnet “Anka” så får vi lägga till nyckelordet WHERE. Vår sats skulle då se ut så här:

SELECT * FROM Employee WHERE Lastname='Anka'

och resultatet skulle bli

image

Skulle vi sedan även vilja ordna resultatet så att det sorteras på en viss kolumn så använder vi nyckelordet ORDER BY. Säg att vi vill sortera på förnamn i stigande ordning (a b c d osv). Då blir vår nya sats så här

SELECT * FROM Employee WHERE Lastname='Anka' ORDER BY Firstname ASC

Det sista, ASC är det som talar om att vi vill sortera förnamnet i stigande ordning. Detta är standard, så vi hade kunnat utelämna denna men för tydligenhetens skull så är det bra att alltid ange detta. Motsatsen till stigande ordning är fallande (ö ä å z y osv). Detta uppnår man genom att ange DESC istället för ASC. Så om vi vill hämta ut alla poster, men sortera på HireDate i fallande ordning skulle sql-frågan se ut så här

SELECT * FROM Employee ORDER BY HireDate DESC

och resultatet blir

image

I nästa exempel för utsökningar av data kommer jag att visa hur man tar fram data som ligger i ett intervall. Detta gör man genom att använda nyckelordet BETWEEN. Säg att vi vill hämta ut alla som blev anställda mellan 2004-2008. Då använder vi BETWEEN på följande sätt

SELECT * FROM Employee WHERE HireDate BETWEEN '2004-01-01' AND '2008-12-31'

och resultatet blir

image

Det sista exemplet kommer att visa hur du slår ihop data från flera olika tabeller, vilket i databassammanhang kallas att göra en JOIN. Det vi ska göra i exemplet är att ta fram förnamn, efternamn samt vilket avdelning personen arbetar för.

SELECT e.Firstname, e.Lastname, d.DeptName FROM Employee e, Department d 
WHERE e.DeptID = d.DeptID

Resultatet av ovanstående SQL-fråga blir

image

Som du ser så skiljer sig inte denna fråga så jättemycket från tidigare exempel, förutom att vi har data från flera tabeller som vi länkar ihop tack varje relationen som finns mellan dessa två tabeller. Som du ser har jag skrivit “e.Firstname” och det innebär att e är ett alias för Employee som jag definierar i FROM-satsen genom att skriva “Employee e”. Samma sak gör jag för Department. I WHERE-satsen länkar vi sedan ihop de båda tabellerna så att vi får en rad för varje användare.

Update

Att köra en Update mot databasen innebär att du uppdaterar ett eller flera värden i tabellen. En Update-sats ser i sin grundform ut på detta vis

UPDATE TabellNamn SET KolumnNamn=Värde

Ovanstående sats skulle uppdatera samtliga rader i tabellen vilket man så klart mycket sällan vill. För att specificera vilka rader som ska uppdateras kan du precis som här använda WHERE-villkoret. Säg att vi istället för “Kalle” vill ha dennes fulla namn, Karl Magnus, så skulle denna SQL-sats se ut på följande vis

UPDATE Employee SET Firstname='Karl Magnus' WHERE EmpID=1

Om vi nu kör en SELECT mot tabellen Employee kommer vi att se att värdet Firstname har ändrats från “Kalle” till “Karl Magnus”.

image

Delete

För att ta bort rader från tabeller så använder man kommandot DELETE. DELETE skrivs i sin grundform på följande vis

DELETE FROM TabellNamn

Detta skulle ta bort samtliga rader från tabellen “TabellNamn” men du kan precis som vid SELECT och UPDATE ange ett WHERE-villkor för att styra vilka rader som skall tas bort. Om vi från vårat exempel vill ta bort “Musse” så skulle denna sats se ut så här

DELETE FROM Employee WHERE EmpID=5

Resultatet av detta om vi kör ovanstående fråga är att raden med “Musse” försvinner ur tabellen.

image

 

Det var vad jag hade tänkt gå igenom när det gällde lite grundläggande databaskunskap. Det finns givetvis tonvis med fler saker att lära sig, men dessa är de som jag känner är de viktigaste.

Ses vid nästa artikel som kommer att handla om modellering av den riktiga databasen för forumet.

Tags: , , , , , , ,

MySQL | Databaser | Artikel

Comments

Add comment




  Country flag

biuquote
  • Comment
  • Preview
Loading



Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

RecentComments

Comment RSS