MySQL: kommandoer og syntaks.

1 Februar 2015

MySQL-kommandoer blir delt i ulike typer. Sjå SQL Statement Syntax for ei fullstendig liste. Det som er relevant for oss er:

  1. Data Definition Statements   brukast for å oppretta, endra og sletta tabellar og andre databaseobjekt (VIEW osv). Eksempel ALTER tabell, CREATE tabell, DROP tabell og RENAME tabell.
  2. Data Manipulation Statements  blir brukt til å endra data i tabellane. Eksempel er INSERT, DELETE, UPDATE, SELECT og LOAD. (meir nedanfor)
  3. Database Administration Statements  blir brukt til å administrera brukarar og tilgangar til databasar og tabellar. Eksempel er CREATE USER som opprettar ein ny brukar, og GRANT som gir brukaren tilgang til databaser og tabellar. Her kan du også gjera backup av tabellar mm
  4. MySQL Utility Statements     Diverse nyttige (?) kommandoar. Eksempel er feks. DESCRIBE tabell som fortel korleis tabell er definert (attributtar, datatypar) og USE mindatabase som fortel at mindatabase er default database, dvs at du slepp å skriva 'mindatabase.mintabell'.

Når det gjeld å oppretta / endra på tabellar, så gjer vi det via datamodellen vår. Når vi utfører ein "Forward Engineer" så blir det generert ein SQL-spørring som er basert på vår modell, og som blir sendt til MySQL og utført. Hvis alt går bra får vi beskjed om det, og vi slepp å tenkja på syntaksen til slike kommandoar.

Dei viktigaste å kjenna til i særlig detalj er datamanipulerings-kommandoer. Så derfor litt meir om syntaksen her. Merk at det vi går gjennom her er ein minimumsvariant. Kvar kommando har ein mengde variantar for dei som skal bruka dette utover våre enkle eksempel. Hvis du vil (men det er ikkje pensum) så kan du følja lenkene og sjå den fullstendige syntaksen. Som alternativ til å disse kommandoane kan du også editera direkte i tabellen. Sjå nedanfor.

Vi skal igjen sjå på den enkle versjonen av Bibliotek-datamodellen der vi har ein-til-mange kobling mellom bok og forfattar:

bibliotek

INSERT

Sett inn ei eller fleire ny(e) rad(er) i tabellen.

Syntaks: INSERT INTO <tabellnavn> VALUES(verdi1,verdi2,verdi3.....);

Merk at her må antallet verdiar stemma med antallet kolonner i tabellen, og at formatet for kvar verdi må stemma med datatypane i tabellen. INT skal ha heiltal, CHAR() skal ha tekst inne i "fnuttar", og FLOAT skal ha desimaltal med punktum som desimalskilletegn. Her kan du også putta inn tall på med titallseksponent. Talet 6.41693E23 betyr 6.41693 * 1023.

Eksempel:

INSERT INTO mydb.forfattar VALUES(4,'Astrid','Lindgren','Svensk forfattar');

Hvis du ikkje har data for alle kolonnene i tabellen, må du spesifisera kva kolonner du har data for. Forutsetningen er då at alle dei som er definert ved NOT NULL må få data. Hvis du feks vil venta med å skriva inn data for den siste kolonnen, så kan du gjera det ved:

INSERT INTO mydb.forfattar (FNR, Fnavn, Enavn) VALUES(4,'Astrid','Lindgren');

Hvis du prøver ein INSERT på ein tabell som du allerede har data i, så vil det feila dersom du prøver å setta inn ei rad med samme nøkkel som ei av dei gamle radene.

DELETE

Syntaks: DELETE FROM tabell WHERE <betingelse>

Eksempel:

DELETE FROM forfattar WHERE FNR = 4

Denne kommandoen slettar raden som har FNR lik 4, dvs den vi nettopp sette inn. Med andre ord kan vi oppnå det same med WHERE Enavn ='Lindgren', forutsett at det ikkje fins andre forfattarar med det etternavnet! 

NB! Hvis du utelet WHERE <betingelse> så vil alle radene bli sletta!

Hvis du vil erstatta ei rad må du enten først sletta den med DELETE før ny INSERT, eller du kan bruka kommandoen REPLACE (som i parentes bemerka tilsvarer INSERT med IGNORE, men det får vera grenser!)

UPDATE

Syntaks: UPDATE <tabellnavn> SET <kolonne> = verdi WHERE <betingelse>

Eksempel: Vi vil endra på diverse-kolonnen for Astrid Lindgren, kan vi gjera det slik:

UPDATE mydb.forfattar SET Diverse = 'Svensk forfattar av barnebøker' WHERE FNR= 4; 

SELECT

Eksempel:

Kobling mellom tabellar:

Litt av poenget (for ikkje å sei heile poenget) med relasjonsdatabasar er at vi kan kobla tabellar og data. Hvis vi kjenner FNR til Astrid Lindgren, så kan vi lista ut alle bøkene som Astrid Lindgren har skrive vha av følgande kommando SELECT * FROM bok WHERE Forfattarnr = 4; Men som oftast har ikkje vi som brukar peiling på kva forfattarnummeret er! Men det treng vi ikkje vita heller, så lenge vi kan finna det via Fnavn og Enavn på denne måten:


USE mydb;
SELECT * FROM bok, forfattar
WHERE forfattar.FNR = bok.forfattar_FNR AND Fnavn = 'Astrid' AND Enavn = 'Lindgren';

Her har vi altså kobla tabellane forfattar og bok og forlangt at FNR i forfattar-tabellen skal vera identisk med forfattar_FNR i bok-tabellen. Med andre ord skal fremmednøkkelen i bok vera lik nøkkel i forfattar, og det er jo det disse to kolonnene er til for.

LOAD

Vha kommandoen LOAD kan vi lasta data direkte frå ei fil inn i ein tabell. Dette er nyttig hvis vi skal lasta inn store datamengder som vi har i ei datafil. Hvis du har data i ei excel-regneark kan du først eksportera disse til ei tekstfil, og så importera disse vha. LOAD.

Syntaks: LOAD DATA INFILE <innfilnavn> INTO TABLE <tabellnavn> FIELDS TERMINATED BY '<skilletegn>';

Eksempel:


LOAD DATA INFILE 'C:/IT1/databaser/bibliotek/forfattar.txt'
INTO TABLE mydb.forfattar
FIELDS TERMINATED BY ',';

Her hentar vi data frå fila forfattar.txt inn i tabellen forfattar. Vi forutset at data i fila ser omtrent slik ut:

1,Henrik,Ibsen,Norsk forfattar osv.

Med andre ord at kolonnene er separert med komma. Her kan du velja andre separatorar, feks kan vi skriva FIELDS TERMINATED BY '\t' hvis det er tab mellom.
(som før, antall felt må passa med slik du har definert tabellen din!) Merk at her treng vi ikkje setja tekstfelt mellom fnuttar.

Direkte editering i tabellen

Det meste (alt?) det som er vist over kan du gjera "direkte" i tabellen vha. Workbench. Det som egentlig skjer er at Workbench gir oss ein kopi av tabellen som er skrivbar, og ut frå dei endringane du gjer i denne kopien, så blir det generert ei SQL-spørring, som utfører det du vil ha gjort, og sender det til MySQL. Så får du svar tilbake korleis det har gått. Dette svarer til det som skjer når vi lager tabellar via Workbench, som nevnt over.

Til venstre i SQL-editoren i Workbench finn du ein boks som heiter Object Browser, og under SCHEMAS skal du då kunna finna databasen din, som hos meg heiter 'mydb'. Klikkar du den så skal du vidare finna 'Tables' og derunder tabellane dine. Hvis du feks. høyreklikkar på tabellen planet (eller tilsvarande) og veljer Edit Table Data, så får du opp heile tabellen i ei ny fane i hovedvinduet midt på. Her kan du bare endra det du vil, før du trykkjer "Apply". Då får du opp eit bilde med eit SQL-spørring som du kan senda til serveren. (eller du kan endra) Hvis vi feks. endrar i raden for Mars og kolonnen for grav, og flytter markøren ut av cella, så blir Apply-knappen trykkbar. Trykkjer du Apply får du opp ein UPDATE-spørring som tilsvarer den vi har beskrive over. Hvis du trykkjer Apply igjen, så blir denne spørringen utført, på same måte som om du sendte den gjennom Query.