Kapitel 8. Använda databasservern

Innehållsförteckning
Skapa databasen (CREATE DATABASE)
Skapa en tabell (CREATE TABLE)
Lagra data (INSERT)
Ställa frågor (SELECT)
Ändra data (UPDATE)
Ta bort poster (DELETE)
Summa av fält (SUM)

I detta kapitel går vi igenom de vanligaste kommandona i SQL. Jag använder MySQL och kommandona kan skilja sig lite åt om du använder en annan SQL-server.

MySQL utvecklas av MySQL AB som är ett svenskt företag och de erbjuder MySQL fritt under LGPL-licensen. Klart värt att titta på om du vill lära dig SQL. MySQL finns tillgänglig till nästan alla plattformer, varav Linux, FreeBSD och Microsoft Windows är några.

Databashanteraren för MySQL heter mysql och du ansluter till din MySQL-server genom att skriva:


mysql -u jonas -p

Där jonas är användarnamnet du har i databasservern och -p betyder att du vill ange ett lösenord.

Nu kan du visa alla databaser som finns i din server genom att skriva:


SHOW DATABASES;
+------------+
| Database   |
+------------+
| mysql      |
| test       |
+------------+

Skapa databasen (CREATE DATABASE)

För att kunna hämta data måste vi ha data att hämta, så vi skapar en databas i vår MySQL-server:


CREATE DATABASE medlemsreg;
Query OK, 1 row affected (0.00 sec)

Du skall få svaret Query OK, annars har något gått fel. Se efter i felmeddelandet vad som kan vara fel, ofta får man fel för att man saknar rättigheter att skapa databaser eller att man stavar kommandon fel.

Innan vi fortsätter med att arbeta mot vår nya databas måste vi berätta för databashanteraren att vi vill använda databasen medlemsreg som vi precis skapade. För att arbeta mot din nya databas skriver du:


USE medlemsreg;
Database changed

Skapa en tabell (CREATE TABLE)

Innan vi börjar lagra data i vår databas skall vi skapa ett databasschema. Det gör vi med kommandot CREATE TABLE. När vi skapar ett databasschema anger vi vilka fält vi vill ha och vilken typ av data fälten skall innehålla. Nu kan vi skapa en tabell i vår nya databas.


CREATE TABLE medlem (id INT AUTO_INCREMENT PRIMARY KEY, fnamn CHAR(50), enamn CHAR(50), address CHAR(50), postnr INT, ort CHAR(50), telefon CHAR(15) );
Query OK, 0 rows affected (0.05 sec)

Här skapar vi tabellen medlem som kommer att ha fälten id, fnamn, enamn, address, postnr, ort och telefon. Datatyperna vi anger är INT som är ett heltal och CHAR som är ett tecken. Till char anger vi också hur många tecken som skall kunna lagras, det gör vi inom paranteserna.

Till fältet id sätter vi också egenskaperna AUTO_INCREMENT och PRIMARY KEY. De egenskaperna gör att fältet automatiskt räknas upp för varje post som skapas och att fältet är primärnyckel.

Fler datatyper hittar du i appendix A i slutet av denna bok.

Lagra data (INSERT)

Med kommandot INSERT kan vi lagra data i vår tabell. Vi lägger in lite medlemmar i vårt register.


INSERT INTO medlem(id, fnamn, enamn, adress, postnr, ort, telefon) VALUES
('','Kalle','Svensson','Storgatan 42','12345','Storstad','011-121212');
Query OK, 1 row affected (0.07 sec)

Här berättar vi för SQL-servern att vi vill lägga till data i tabellen medlem och i fälten id, fnamn, enamn, adress, postnr, ort och telefon. VALUES anger vilka värden vi vill lagra i dessa fält. Att vi lägger in tomma data ('') i fältet id beror på att den räknas upp automatiskt av databashanteraren (fältet har egenskapen AUTO_INCREMENT).

Vi kan välja att inte ange fälten som datat skall lagras i och skriva så här:


INSERT INTO medlem VALUES ('','Kalle','Svensson','Storgatan 42','12345','Storstad','011-121212');
Query OK, 1 row affected (0.00 sec)

Nackdelen med att inte ange fältnamn är att om vi ändrar databasschemat får vi problem med frågorna. Data kommer att lagras i fel fält.

Ibland vill vi bara lagra data i ett par av fälten, då skriver vi så här:


INSERT INTO medlem(fnamn, enamn, ort) VALUES ('Kurt','Bengtsson','Örkelljunga');
Query OK, 1 row affected (0.00 sec)

Skapa nu ett par fiktiva medlemar i din databas.


INSERT INTO medlem(id, fnamn, enamn, adress, postnr, ort, telefon) VALUES
('','Johan','Andersson','Lillåstigen 3','23423','Lillby','012-123344');
Query OK, 1 row affected (0.00 sec)
INSERT INTO medlem(id, fnamn, enamn, adress, postnr, ort, telefon) VALUES
('','Jill','Jonsson','Sommarvägen 72','54333','österberg','043-156789');
Query OK, 1 row affected (0.00 sec)

Nu kan du titta på dina data genom att skriva:


SELECT * FROM medlem;
+----+-------+-----------+----------------+--------+-------------+------------+
| id | fnamn | enamn     | address        | postnr | ort         | telefon    |
+----+-------+-----------+----------------+--------+-------------+------------+
|  1 | Kalle | Svensson  | Storgatan 42   |  12345 | Storstad    | 011-121212 |
|  2 | Kurt  | Bengtsson | NULL           |   NULL | Örkelljunga | NULL       |
|  3 | Johan | Andersson | Lillåstigen 3  |  23423 | Lillby      | 012-123344 |
|  4 | Jill  | Jonsson   | Sommarvägen 72 |  54333 | Österberg   | 043-156789 |
+----+-------+-----------+----------------+--------+-------------+------------+
4 rows in set (0.46 sec)

Vi använder en stjärna (*) som fältnamn i selectsatsen. Stjärnan betyder alla fält. Som du ser ovanför har raden med id 2 tre fält som har värdet NULL. NULL innebär att det inte finns någon data lagrad i fältet.

Ställa frågor (SELECT)

När vi använder select för att hämta data måste vi ange minst två saker. Först vad man vill välja (vilket fält) och sedan varifrån vi vill välja det (vilken tabell).

Nu kan vi se alla avgifter genom att skriva:


SELECT datum FROM avgifter;

Selectsatsen ovanför hämtar fältet datum från tabellen avgifter. Fältnamnet anges direkt efter SELECT och namnet på tabellen som vi vill hämta data från anges efter FROM.

Det är kanske inte så användbart, men trots allt -- det är data. Lite mer användbart för oss är denna fråga:


SELECT fnamn,enamn,datum FROM medlem,avgift WHERE id=medlem;
+-------+-----------+------------+
| fnamn | enamn     | datum      |
+-------+-----------+------------+
| Kalle | Svensson  | 2003-05-29 |
| Kurt  | Bengtsson | 2003-06-19 |
| Johan | Andersson | 2003-08-02 |
| Jill  | Jonsson   | 2003-12-02 |
+-------+-----------+------------+
4 rows in set (0.00 sec)

Lite mer användbart. Vad vi gör i frågan är att vi säger att vi vill ha data från fälten fnamn, enamn och datum från tabellerna medlem och avgift, men bara där fältet id är det samma som fältet medlem.

Skall man vara riktigt korrekt bör man skriva frågan så här:


SELECT medlem.fnamn,medlem.enamn,avgifter.datum FROM medlem,avgifter WHERE
medlem.id=avgifter.medlem;

Här anger vi vilken tabell fältet tillhör också.

Vilka har inte betalat sin medlemsavgift? Det får vi reda på genom att skriva:


SELECT fnamn,enamn,datum FROM medlem,avgifter WHERE id=medlem and datum < '2003-08-11';

I ovanstående fråga hämtar vi data från två tabeller, medlem och avgifter.

Svaret vi får fram är:


+-------+----------+------------+
| fnamn | enamn    | datum      |
+-------+----------+------------+
| Kalle | Svensson | 2003-05-29 |
+-------+----------+------------+

Ändra data (UPDATE)

Kalle betalar sin medlemsavgift och vi måste ändra datumet i databasen. Det gör vi genom att skriva:


UPDATE avgifter SET datum='2004-08-30' WHERE medlem='1';

Vill du uppdatera flera fält i en post skriver du:


UPDATE tabell SET fält1='data', fält2='merdata' WHERE medlem='1';

Ta bort poster (DELETE)

Varning

Kommandot DELETE är ett destruktivt kommando! Om du tar bort en post med delete kommer den försvinna för alltid!

Om du vill ta bort poster från din databas använder du kommandot DELETE. Säg att medlem 2 (Johan Andersson) inte hade betalat sin medlemsavgift. Vi måste ta bort denna uppgift från databasen och skriver:


DELETE FROM avgifter WHERE id='2';

Summa av fält (SUM)

En sista fråga då, hur mycket medlemsavgifter har vi fått in?


SELECT SUM(avgift) FROM avgifter;

Databasen berättar för oss att vi fått in 600 kronor i medlemsavgifter.