Guide: PHP- & MySQL-innføring: Kapittel 8
Tid for databaser
Vi har til nå dekket svært mye av språket PHP; i dag tar vi tak i MySQL og introduserer begreper som relasjonsdatabase.
Mer uthenting
Til nå har vi bare sortert utdataene når vi henter data fra MySQL, men det er ofte mye nyttigere å bare hente ut den nøyaktige informasjonen vi trenger. Til dette bruker vi en såkalt WHERE-klausul, som lar deg velge bort rader ved hjelp av samme logikk som vi benytter i PHP.
Likhet
Sett at vi lurer på om det er noen som har bursdag i dag i databasen vår (det er det ikke, så vi får et tomt resultat);mysql> SELECT * FROM person WHERE fodselsdato = CURDATE(); Empty set (0.00 sec)
Selv om resultatet er tomt, illustrerer det to viktige ting; først og fremst at det finnes mange innebygde funksjoner i MySQL. Her bruker vi funksjonen CURDATE() til å hente ut dagens dato. For det andre benytter vi oss av en WHERE-klausul som sier at vi kun ser etter personer som har en gitt fødselsdato. Du kan også se at i MySQL bruker vi et enkelt likhetstegn for å sjekke om noe er likt, mens vi i PHP må benytte to likhetstegn.
Vi kan også se etter personer som har et gitt etternavn;
mysql> SELECT * FROM person WHERE etternavn = 'Olsen'; +---------+-----------+-------------+---------------------+ | fornavn | etternavn | fodselsdato | epost | +---------+-----------+-------------+---------------------+ | Per | Olsen | 2003-02-01 | per AT eksempel.no | | Knut | Olsen | 1943-10-12 | knut AT eksempel.no | +---------+-----------+-------------+---------------------+ 2 rows in set (0.00 sec)
Vi bruker også her likhetstegnet for å sjekke at innholdet i en kolonne er en gitt verdi, men denne gangen gjør vi det på en string-kolonne. Kanskje vi ønsker å finne alle som har et etternavn som begynner på bokstaven N? Da må vi bruke en annen sammenligning.
Strenglikhet
mysql> SELECT * FROM person WHERE etternavn LIKE 'N%'; +---------+------------+-------------+---------------------+ | fornavn | etternavn | fodselsdato | epost | +---------+------------+-------------+---------------------+ | Ola | Nordmann | 1974-04-12 | ola AT eksempel.no | | Kari | Nordkvinne | 1932-01-29 | kari AT eksempel.no | +---------+------------+-------------+---------------------+ 2 rows in set (0.00 sec)
Her bruker vi sammenligningen LIKE, og prosenttegnet angir da et såkalt wildcard for å spesifisere at her kan det komme en rekke på flere bokstaver. Du kan sette inn prosenttegn flere plasser i søkestrengen, og du kan også plassere det fremst. For å finne alle som har e-postadresse hos Hardware.no kan du bruke denne spørringen;
mysql> SELECT * FROM person WHERE epost LIKE '% AT hardware.no'; +---------+-----------+-------------+-----------------------+ | fornavn | etternavn | fodselsdato | epost | +---------+-----------+-------------+-----------------------+ | Vegard | Larsen | 1984-02-23 | vegard AT hardware.no | +---------+-----------+-------------+-----------------------+ 1 row in set (0.00 sec)
Du kan også søke etter ikke-treff; om du vil ha personer som ikke jobber for Hardware.no, kan du bruke denne spørringen;
mysql> SELECT * FROM person WHERE epost NOT LIKE '% AT hardware.no'; +---------+------------+-------------+---------------------+ | fornavn | etternavn | fodselsdato | epost | +---------+------------+-------------+---------------------+ | Ola | Nordmann | 1974-04-12 | ola AT eksempel.no | | Kari | Nordkvinne | 1932-01-29 | kari AT eksempel.no | | Per | Olsen | 2003-02-01 | per AT eksempel.no | | Knut | Olsen | 1943-10-12 | knut AT eksempel.no | +---------+------------+-------------+---------------------+ 4 rows in set (0.00 sec)
Den eneste forskjellen fra spørringen over er ordet NOT før LIKE, og meningen er selvsagt. Om du skal gjøre det samme når du bruker likhetstegnet til å sammenligne, må du bytte ut likhetstegnet med !=, som er det samme som i PHP.
Større enn/mindre enn
Hva om du vil ha alle som født i eller etter 1977 (som gjør at de er 30 år eller yngre i år);mysql> SELECT * FROM person WHERE fodselsdato >= '1977-01-01'; +---------+-----------+-------------+-----------------------+ | fornavn | etternavn | fodselsdato | epost | +---------+-----------+-------------+-----------------------+ | Vegard | Larsen | 1984-02-23 | vegard AT hardware.no | | Per | Olsen | 2003-02-01 | per AT eksempel.no | +---------+-----------+-------------+-----------------------+ 2 rows in set (0.00 sec)
Du kan her bruke en rekke av de samme sammenligningsoperatorene som i PHP, og de fungerer også på strenger. Om du vil ha alle som kommer etter Nordkvinne i telefonkatalogen, kan du bruke følgende spørring;
mysql> SELECT * FROM person WHERE etternavn > 'Nordkvinne'; +---------+-----------+-------------+---------------------+ | fornavn | etternavn | fodselsdato | epost | +---------+-----------+-------------+---------------------+ | Ola | Nordmann | 1974-04-12 | ola AT eksempel.no | | Per | Olsen | 2003-02-01 | per AT eksempel.no | | Knut | Olsen | 1943-10-12 | knut AT eksempel.no | +---------+-----------+-------------+---------------------+ 3 rows in set (0.00 sec)
Selv om vi har utelukket alle som har et etternavn som er alfatbetisk mindre enn Nordkvinne, ser du at resultatet likevel ikke er sortert korrekt på fornavn og etternavn. Dette må vi spesifisere om vi ønsker, og det gjør vil på følgende måte;
mysql> SELECT * FROM person
-> WHERE etternavn > 'Nordkvinne'
-> ORDER BY etternavn, fornavn;
+---------+-----------+-------------+---------------------+
| fornavn | etternavn | fodselsdato | epost |
+---------+-----------+-------------+---------------------+
| Ola | Nordmann | 1974-04-12 | ola AT eksempel.no |
| Knut | Olsen | 1943-10-12 | knut AT eksempel.no |
| Per | Olsen | 2003-02-01 | per AT eksempel.no |
+---------+-----------+-------------+---------------------+
3 rows in set (0.00 sec)
Det er viktig å bite seg merke i at WHERE alltid kommer før ORDER BY, men ellers er dette bare en sammenslåing av det du har lært til nå.