GuideDatabaseskolen – Del 2

Slik finner du den lille nålen i den enorme høystakken

Vi viser deg hvordan du faktisk finner informasjon i en database.

Databaser ligger i bunn av de fleste funksjoner på verdens nettsider. Skal du lagre informasjon og vise det til brukeren senere, som en artikkel, e-post-adresser og annen nytteinformasjon, er databaser det beste alternativet for å lagre denne informasjonen.

I forrige del av denne guiden lærte vi deg å opprette en database, og hvordan du endret en databasetabell. I dag skal vi tar for oss hvordan du filtrerer informasjonen fra denne på enkelt vis, slik at du får ut den informasjonen som faktisk er av interesse. Så langt ligger det dessverre ikke så mange rader i denne databasen, om du ikke har satt inn noen selv.

Prosessen med å legge inn rader i tabellen er dog ganske repetitiv, så for den som føler for å ta en liten snarvei og ikke gjøre hele jobben med å populere databasen sin selv, har vi laget en ferdig eksempeltabell som du kan laste ned og importere.

Bruk vår database

Via administrasjonsgrensesnittet i nettleseren kan du imortere databasefilen vår. Du kan også jobbe direkte i databasen herfra, men dette dekker ikke vi i denne guiden.

For å ta i bruk eksempeldatabasen, laster du ned denne fila for så å importere den til din egen database. Dette gjør du via localhost her. Om du har satt passord på databasen din må du oppgi dette for å komme inn i administrasjonsgrensesnittet, som har brukeren «root» som standard.

Vel inne finner du fanen som heter «Importer», og under denne laster du opp databasefilen som du nettopp lastet ned fra oss. Bekreft opplastingen med «Utfør»-knappen lenger ned på siden.

Det skulle være det hele, og eksempeldatabasen vår ligger nå pent og pyntelig i listen din over tilgjengelige databaser. Dette kan du selv se ved å starte MySQL-promptet med «Windows»-tast + R og kommandoen «c:\xampp\mysql\bin\mysql.exe -p -u root».

Videre viser du databasene du har tilgjengelig med kommandoen «show databases;». Eksempeldatabasen vår har vi døpt «mindatabase», og for å jobbe mot denne må du fortelle databasen dette med «use mindatabase;»-kommandoen.

Slik ser «mindatabase» ut i MySQL-prompten.

Du kan selvfølgelig bruke din egen database om du har jobbet hardt med å legge inn komponenter i denne, men resultatet fra spørringene vi foretar i denne guiden vil da naturligvis skille seg ut fra resultatene du får med dine data.

Hele mindatabase kan du se i bildet til høyre. Databasetabellen i denne heter «hardware» og inneholder 18 forskjellige datakomponenter som vi skal jobbe mot.

Millioner av rader

Her kan du med et øyekast skaffe deg overblikk over hele databasen vår, og da kan du kanskje se for deg nytteverdien av å filtrere informasjonen om databasetabellen vår hadde inneholdt flere hundretusen rader, noe som ofte er tilfelle. Store databaser som den Altinn henter dataene sine fra, består for eksempel av flere millioner rader.

Med utvalgspørringene nedenfor skal vi lære å filtrere bort alle rader og kolonner i tabellen som ikke er av interesse for oss, slik at vi kun sitter igjen med nyttige data.

Til nå har vi vist hele tabellen med alle sine rader og kolonner, med «select * from hardware;»-spørringen. Men vi har ikke interesse av all denne informasjon, spesielt ikke hvilken ID en komponent har, eller tilhørende dato og notat. Vi ønsker bare en liste som viser oss hvilke komponenter vi eier, hvem som har produsert de, type komponent samt pris og antall.

Ved å spesifikt velge kolonnene Navn, Produsent, Kategori, Pris og Antall, fra tabellen hardware, finner vi radene i tabellen vi er interessert i.

mysql> select Navn, Produsent, Kategori, Pris, Antall from hardware;
+----------------------------+-----------+------------+-------+--------+
| Navn | Produsent | Kategori | Pris | Antall |
+----------------------------+-----------+------------+-------+--------+
| SoundBlaster X-Fi | Creative | Lydkort | 799 | 1 |
| Radeon HD 5850 | ATI | Skjermkort | 2299 | 1 |
| Phenom II X4 965BE 3,4 GHz | AMD | Prosessor | 1499 | 1 |
: : : : : :
: : : : : :
18 rows in set

Etter nøkkelordet «select» komma-separerer vi altså kolonnenavnene vi vil hente data fra, før vi til slutt spesifiserer hvilken tabell disse kolonnene ligger i, med nøkkelordet «from».

I «Produsent»-kolonnen ligger det flere produsenter, og det kan fort bli uoversiktlig om vi skal finne informasjon som for eksempel hvor mange unike produsenter vi har datadeler fra. Heldigvis er det lett å sortere bort de som forekommer mer enn én gang. Vi ber bare databasen returnere en liste over unike produsenter, med nøkkelordet «distinct». Spørringen blir da som følger: «select distinct Produsent from hardware;».

mysql> select distinct Produsent from hardware;
+-------------+
| Produsent |
+-------------+
| Creative |
| ATI |
| AMD |
| OCZ |
| ASUS |
| Samsung |
| Corsair |
| WD |
| Intel |
+-------------+
9 rows in set

Listen ovenfor ble ganske pen og oversiktlig, men radene ligger fortsatt i den samme rekkefølgen som de ble lagt inn i databasen i. En alfabetisert liste er som regel å foretrekke, og i neste spørring sorterer vi de utvalgte kolonnene våre alfabetisk, først etter Kategori, og deretter Navn.

Nøkkelordet «order by» gjør susen og etterfølges av kolonnene det skal sorteres på, som igjen etterfølges av nøkkelordet «acs» eller «desc» for å styre sorteringen i henholdsvis synkende eller stigende rekkefølge. Merk at listen er kuttet på midten for å spare plass.

mysql> select Navn, Produsent, Kategori, Pris, Antall from hardware order by Kategori asc, Navn asc;
+-----------------------+-----------+-----------------+-------+--------+
| Navn | Produsent | Kategori | Pris | Antall |
+-----------------------+-----------+-----------------+-------+--------+
| Desktop Green 1 TB | WD | Harddisk | 599 | 2 |
| MyBook 1 TB | WD | Harddisk | 799 | 2 |
| Spinpoint F3 1 TB | Samsung | Harddisk | 699 | 2 |
: M4A79XTD-EVO 790X AM3 : ASUS : Hovedkort : 1099 : 1 :
: Radeon HD 5850 : ATI : Skjermkort : 2299 : 1 :
| Radeon HD 7990 6 GB | AMD | Skjermkort | 6199 | 1 |
| Vertex 4 | OCZ | SSD | 1399 | 1 |
| HX850 | Corsair | Strømforsyning | 1400 | 1 |
+-----------------------+-----------+-----------------+-------+--------+
18 rows in set

Gjør mer samtidig

Nå er tiden kommet for å stifte bekjentskap med operatorer, en funksjon som brukes for å kombinere to eller flere betingelser. Disse skal bi bruke i de kommende spørringene mot databasen vår. Operatorene finnes i tre grupper:

  1. Aritmetiske operatorer: +, -, *, /.
  2. Sammenligningsoperatorer: =, < (Mindre enn), > (Større enn), <= (Mindre eller lik), >= (Større eller lik), != (Ikke lik).
  3. Logiske operatorer: AND, OR, NOT

I spørringen «select * from hardware where Pris > 2000 AND Produsent != 'Intel';» finner databasen først alle komponenter som oppfyller betingelsen om at prisen må være over 2000. Deretter vil den andre betingelsen sørge for å fjerne Intel-komponenter fra resultatet.

Spørringer med operatoren AND returnerer rader som oppfyller alle betingelser som gis. En spørring med operatoren OR vil på en annen side returnere rader som oppfyller bare én eller alle betingelsene.

Vi skal bruke operatorer fra alle de tre gruppen i løpet av denne guiden, men vi starter med sammenligningsoperatorer.

Sammenligningsoperatorer

Til nå har vi filtrert ut uønskede kolonner, hva så med radene? Disse er minst like viktige å holde kontroll på, og ved hjelp av nøkkelordet «where» er dette en enkel oppgave.

Først velger vi som tidligere i select-delen av spørringen, hvilke kolonner vi vil ha med. Deretter spesifiseres hvilken tabell disse kolonnen ligger i, i spørringens «from»-del. Så kommer det nye nøkkelordet «where», hvor vi gir en regel for en eller flere kolonners innhold.

I spørringen nedenfor skriver vi ut Navn, Produsent og Pris til alle komponenter fra tabellen «hardware», som ligger i kategorien med navnet som er likt «Skjermkort», derav «=»-tegnet. Til slutt sorterer vi på kolonnen «Pris» slik at de dyreste skjermkortene kommer øverst i listen.

Legg merke til at ordet «Skjermkort» er omkranset av såkalte fnutter, som her: 'Fnutter'. Disse må omkranse alt tekstlig innhold i kolonnene. For som du kanskje husker av datatyper fra del 1, er kategorier lagret som en typisk varchar-datatype som består av variable mengder tegn av type tekst.

mysql> select Navn, Produsent, Pris from hardware where Kategori = 'Skjermkort' order by Pris desc;
+---------------------+-----------+------+
| Navn | Produsent | Pris |
+---------------------+-----------+------+
| Radeon HD 7990 6 GB | AMD | 6199 |
| Geforce 670 DCII | ASUS | 3399 |
| Radeon HD 5850 | ATI | 2299 |
+---------------------+-----------+------+
3 rows in set

Vi kan også filtrere ut rader basert på tallverdier. En oversikt over komponenter som koster over 3000 kroner kan fremskaffes ved å be databasen returnere rader hvor verdiene i kolonnen «Pris» er mer enn 3000.

Også her bruker vi nøkkelordet «where», men omkranser ikke tallet 3000 med fnutter, da denne verdien ikke er lagret som en tekst-datatype, men tall-datatype.

mysql> select Navn, Produsent, Pris from hardware where Pris > 3000 order by Pris desc;
+-----------------------+-----------+-------+
| Navn | Produsent | Pris |
+-----------------------+-----------+-------+
| Xeon E5-2690 2,9 GHz | Intel | 15999 |
| Core i7-3970X Extreme | Intel | 7449 |
| Radeon HD 7990 6 GB | AMD | 6199 |
| Geforce 670 DCII | ASUS | 3399 |
+-----------------------+-----------+-------+
4 rows in set

Noen ganger er det lettere å fortelle noen hva du ikke liker, enn hva du liker. Dette gjelder ofte også databasen. Tenk deg at vi ønsker å finne alle komponentene våre som ikke er en prosessor. Vi kunne spurt databasen om å returnere alle rader med kategori lik lydkort, skjermkort, minne, harddisk, SSD, hovedkort eller strømforsyning. Men i stedet bruker vi «!=», eller «ikke lik»-operatoren. Denne returnerer alle rader hvor kategori ikke er lik prosessor i spørringen under.

mysql> select Navn, Produsent, Kategori from hardware where Kategori != 'Prosessor' order by Kategori asc;
+----------------------------+-----------+-----------------+
| Navn | Produsent | Kategori |
+----------------------------+-----------+-----------------+
| Desktop Green 1 TB | WD | Harddisk |
| MyBook 1 TB | WD | Harddisk |
| Spinpoint F3 1 TB | Samsung | Harddisk |
| M4A79XTD-EVO 790X AM3 | ASUS | Hovedkort |
| Xonar D2X | ASUS | Lydkort |
| SoundBlaster X-Fi | Creative | Lydkort |
| Platinum XTC 4 GB 1600 MHz | OCZ | Minne |
| H50 | Corsair | Prosessorkjøler |
| Geforce 670 DCII | ASUS | Skjermkort |
| Radeon HD 5850 | ATI | Skjermkort |
| Radeon HD 7990 6 GB | AMD | Skjermkort |
| Vertex 4 | OCZ | SSD |
| HX850 | Corsair | Strømforsyning |
+----------------------------+-----------+-----------------+
13 rows in set

Logiske operatorer

I kommende spørringer må vi kombinere sammenligningsoperatorer og logiske operatorer for å oppnå ønsket resultat. Aller først er vi på jakt etter alle komponenter som koster over 1000 kroner, med unntak av Asus sine.

mysql> select Navn, Produsent, Pris from hardware where Produsent != 'ASUS' AND Pris < 1000 order by Produsent asc;
+--------------------+-----------+------+
| Navn | Produsent | Pris |
+--------------------+-----------+------+
| H50 | Corsair | 699 |
| SoundBlaster X-Fi | Creative | 799 |
| Spinpoint F3 1 TB | Samsung | 699 |
| MyBook 1 TB | WD | 799 |
| Desktop Green 1 TB | WD | 599 |
+--------------------+-----------+------+
5 rows in set

Pass på å ikke gå i «AND og OR-fellen» når du bruker logiske operatorer. Disse operatorene kan nemlig ikke alltid sammenlignes med ordene «og» og «eller». For å hente ut informasjon om både Harddisker og Lydkort må vi for eksempel bruke OR, og ikke AND som det kan være lett å tro.

«select * from hardware where Kategori = 'Harddisk' AND Kategori = 'Lydkort';» gir null rader i retur, da ingen komponenter ligger i begge disse kategoriene. Bytter vi ut AND med OR i spørringen, får vi derimot listet ut alle harddisk- og lydkortkomponentene våre.

Her lister vi ut alle komponentene som er laget av Asus og AMD, eller «enten Asus eller AMD», om du synes det er lettere å tenke på denne måten.

mysql> select Navn, Produsent, Pris from hardware where Produsent = 'ASUS' OR Produsent = 'AMD';
+----------------------------+-----------+------+
| Navn | Produsent | Pris |
+----------------------------+-----------+------+
| Phenom II X4 965BE 3,4 GHz | AMD | 1499 |
| Geforce 670 DCII | ASUS | 3399 |
| M4A79XTD-EVO 790X AM3 | ASUS | 1099 |
| FX-8350 4 GHz | AMD | 1479 |
| Xonar D2X | ASUS | 1049 |
| Radeon HD 7990 6 GB | AMD | 6199 |
+----------------------------+-----------+------+
6 rows in set

Finn en bestemt verdi

For å finne et resultat mellom ett bestemt verdiområde, kan man gi minimum- og maksimum-verdi. Dette gjør vi ved hjelp av «mindre enn»- og «større enn»-operatorene. Her finner vi alle komponenter i tabellen vår som koster mellom 1000 kroner og 1300 kroner.

mysql> select * from hardware where Pris >= 1000 AND Pris <= 1300;
+----+----------------------------+-----------+-----------+------+--------+------------+----------------+
| ID | Navn | Produsent | Kategori | Pris | Antall | Dato | Notat |
+----+----------------------------+-----------+-----------+------+--------+------------+----------------+
| 4 | Platinum XTC 4 GB 1600 MHz | OCZ | Minne | 1299 | 2 | 2009-05-27 | 7-7-7 1700 MHz |
| 8 | M4A79XTD-EVO 790X AM3 | ASUS | Hovedkort | 1099 | 1 | 2009-05-27 | BIOS v. 1.3 |
| 15 | Xonar D2X | ASUS | Lydkort | 1049 | 1 | 2013-08-27 | |
+----+----------------------------+-----------+-----------+------+--------+------------+----------------+
3 rows in set

Men siden intervallsøk er så vanlig er det innført en egen skriveform for denne spørringen. Operatoren «between» kan nemlig erstatter tegnene «>=» og «<=» på følgende måte:

mysql> select * from hardware where Pris between 1000 AND 1300;
+----+----------------------------+-----------+-----------+------+--------+------------+----------------+
| ID | Navn | Produsent | Kategori | Pris | Antall | Dato | Notat |
+----+----------------------------+-----------+-----------+------+--------+------------+----------------+
| 4 | Platinum XTC 4 GB 1600 MHz | OCZ | Minne | 1299 | 2 | 2009-05-27 | 7-7-7 1700 MHz |
| 8 | M4A79XTD-EVO 790X AM3 | ASUS | Hovedkort | 1099 | 1 | 2009-05-27 | BIOS v. 1.3 |
| 15 | Xonar D2X | ASUS | Lydkort | 1049 | 1 | 2013-08-27 | |
+----+----------------------------+-----------+-----------+------+--------+------------+----------------+
3 rows in set

Jokertegnet – prosent

La oss si at du vil fremskaffe alle harddisker på 1 TB. Vi har ikke en egen kapasitetskategori, men størrelsen er heldigvis angitt i navnet på komponentene, noe som er nok til å redde deg. Med jokertegnet kan du nemlig finne tegn som forekommer et hvilket som helst sted i en kolonne.

I spørringen under leter databasen for eksempel etter de nøyaktige tegnene «1 TB», og returnerer rader som har disse tegnene i slutten av sin navn-kolonne. Derfor står prosent-tegnet til venstre for den betegnelsen vi søker etter.

mysql> select * from hardware where Navn like '%1 TB';
+----+--------------------+-----------+----------+------+--------+------------+---------------+
| ID | Navn | Produsent | Kategori | Pris | Antall | Dato | Notat |
+----+--------------------+-----------+----------+------+--------+------------+---------------+
| 6 | Spinpoint F3 1 TB | Samsung | Harddisk | 699 | 2 | 2009-05-27 | For lagring |
| 11 | MyBook 1 TB | WD | Harddisk | 799 | 2 | 2011-08-14 | Lagring media |
| 13 | Desktop Green 1 TB | WD | Harddisk | 599 | 2 | 2011-09-30 | |
+----+--------------------+-----------+----------+------+--------+------------+---------------+
3 rows in set

Om «1 TB» hadde stått midt inne i en betegnelse, måtte jokertegnet omkranset informasjonen vi var ute etter, som «'%1 TB%'. Dette hadde tillatt at det sto hva som helst både før, og etter betegnelsen vi var ute etter.

Under ser vi at betegnelsen «Radeon» fremkommer først i kolonnen sin, dermed kan vi bruke jokertegnet til høyre for betegnelsen vi er ute etter for å finne alle komponenter som inneholder Radeon i navn-kolonnen.

mysql> select * from hardware where Navn like 'Radeon%';
+----+---------------------+-----------+------------+------+--------+------------+------------------------+
| ID | Navn | Produsent | Kategori | Pris | Antall | Dato | Notat |
+----+---------------------+-----------+------------+------+--------+------------+------------------------+
| 2 | Radeon HD 5850 | ATI | Skjermkort | 2299 | 1 | 2009-02-21 | Gjør fortsatt susen |
| 18 | Radeon HD 7990 6 GB | AMD | Skjermkort | 6199 | 1 | 2013-04-17 | For flerskjerm-oppsett |
+----+---------------------+-----------+------------+------+--------+------------+------------------------+
2 rows in set

I neste del av databaseguiden skal vi legge tabellen vi har laget ut på Internett ved hjelp av enkel PHP.

I mens du først er i læremodus, hva med å bli kongen av terminalen?
Slik får du full kontroll over operativsystemet på Mac og Linux >>

Les også
Uten denne teknologien kunne ingen nettsider vært som de er i dag
Les også
Det er skremmende lett å cracke trådløse nett
Les også
Dette er tidenes mest fryktede virus
Les også
Heldigvis ser ikke hjemmesider slik ut lenger
Les også
Slik blir du kongen i Linux
Les også
Disse maskinene leverer Tek-nettverket til deg
annonse