\documentclass[10pt,a4paper]{article} \usepackage[latin1]{inputenc} \usepackage[swedish]{babel} \renewcommand{\sfdefault}{cmss} \usepackage{fancyhdr} \pagestyle{fancy} \lhead{Maths Göthe} \chead{} \rhead{MySQL} \lfoot{} \cfoot{\thepage} \rfoot{} \renewcommand{\headrulewidth}{0.4pt} \renewcommand{\footrulewidth}{0.4pt} \usepackage[ colorlinks=true, linkcolor=blue, urlcolor=blue ] {hyperref} \title{ MySQL \\ \begin{small} -- En liten introduktion \end{small} } \author{Maths Göthe\\ \texttt{\begin{small}maths57gothe(AT)yahoo(PUNKT)se\end{small}}} \date{\today} \begin{document} \maketitle \tableofcontents \newpage \section{Inledning} Sedan några år tillbaka händer det någon gång varje år någonting som gör att jag ägnar mig en lite sund åt databashanteraren MySQL. Anledningen brukar vara att jag installerat program som behöver en databas för att lagra information. Problemet är bara att jag inte kommer ihåg så mycket mellan varven. Så nu har jag tagit reda på lite grunder och skrivit ner mina anteckningar här. Jag är inte på något sätt kunnig i det här ämnet. Den här texten har för mig varit en inlärningsprocess för att få vissa grundläggande kunskaper. Det är bara dessa grunder jag behöver. Ta alltså inte det som står här för hela sanningen. Det kan finnas direkta felaktighter, även om jag har testat det mesta och sett att det fungerar i praktiken. När jag meckade med det här använde jag mig av Ubuntu 9.04 serverversionen. I paketförrådet hittade man då version 5.0 av MySQL. \subsection{Några konventioner} Jag kommer, när jag skriver kommandon för MySQL att ange vissa ord med versaler. Det är inte nödvändigt när man sitter och meckar, men det är ett traditionellt sätt att visa kommandona på. Likaså kan jag ibland använda dubbla eller enkla citattecken. För MySQL spelar det här ingen roll. Du kan använda vilket sätt du vill och i många fall behövs de inte alls. Framför allt verkar det vara nödvändigt att använda citattecken när man söker efter något som innehåller text. Programmerar du i PHP kan det dock spela roll eftersom du då även måste ta hänsyn till hur PHP vill ha det. Man behöver också tänka på, att varje kommando avslutas med ett semikolon. Det är något som är speciellt för MySQL. Det här gör att man kan skriva flera kommandon på samma rad, om man vill eller behöver det. \begin{verbatim} KOMMANDO något_som_ska_göras; \end{verbatim} Det kan också vara bra att veta, att om man har börjat skiva in ett kommando, kan man avbryta genom att skriva \verb/\c/. \subsection{Licens} Detta verk är licensierat under Creative Commons Erkännande-Dela Lika 2.5 Sverige licens. För att se en kopia av denna licens, besök \\http://creativecommons.org/licenses/by-sa/2.5/se/ eller skicka ett brev till \\Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. \section{Installera} Jag har den här gången kört MySQL på serverversionen av Ubuntu 9.04 Jaunty Jackalope. Under installationen av Ubuntu får man välja vilka typer av serverprogram man vill installera. Jag valde då att kör en s k LAMP-server, Linux Apache MySQL PHP. Det enda jag behövde göra under själva installationen, var att ange ett lösenord för root-konto. Efter installationen var allt uppe med en gång. Om du kör skrivbordsversionen av Ubuntu eller någon annan Linuxdistribution, borde du hitta MySQL i paketförrådet för din distribution. \subsection{Starta och stanna} Som sagt så körde MySQL igång direkt för mig, men det kan vara bra att veta hur man startar och stannar server. Kör du Ubuntu startar du så här. \begin{verbatim} sudo /etc/init.d/mysql start \end{verbatim} För att stanna skriver man så här. \begin{verbatim} sudo /etc/init.d/mysql stop \end{verbatim} \subsection{Logga in} På nätet har jag sett lite olika sätt att logga in. Men det här sättet är det som har funkat för mig. Ordet 'användare' byter man ut med den som man vill logga in som. \begin{verbatim} mysql -u användare -p Enter Password: \end{verbatim} I början är det kanske så att man mest loggar in som administratör. Man använder då kontot 'root'. Har man angett ett lösenord under installationen, så krävs det att man talar om att man vill ange ett lösenord. Det gör man med växlen 'p'. \begin{verbatim} mysql -u root -p \end{verbatim} Det du möts av när du loggar in, är mysql-prompten. \begin{verbatim} mysql> \end{verbatim} Annars är det en god regel att man skapar en användare för varje databas. Vill man då mecka med just den databasen, loggar man in som den användaren. Man kan då inte se eller göra något åt andra databaser och inte heller administrera servern. När man är klar med meckandet, loggar man ut genom att skriva 'quite', 'exit' eller på Linux genom att trycka \verb|Ctrl+d|. \section{Databaser} Grunden i MySQL är databasen\footnote{Ska man vara strikt, så är MySQL en databashanterare. Även en kartong med kort som innehåller information är en databashanterare. Databasen är den information man har samlat in och kan vara en enkelt tabell i ett exel- eller kalkylark eller kort med information.} och det finns ett antal kommandon för att hantera och skapa sådana. \subsection{Visa databaser} För att se vilka databaser som finns, kör man följande kommando. \begin{verbatim} show databases; \end{verbatim} Man får då upp en lista som ser ut något i den här stilen. \begin{verbatim} +--------------------+ | Database | +--------------------+ | information_schema | | mysql | +--------------------+ 5 rows in set (0.02 sec) \end{verbatim} \subsection{Välja en databas} Man måste välja en databas för att kunna jobba med den, om du inte loggat in som den användare som har rättigheter till den. \begin{verbatim} use databas; \end{verbatim} \subsection{Skapa en databas} För att skapa en egen ny databas har man följande kommando. \begin{verbatim} CREATE DATABAS databas; \end{verbatim} Vill man vara säker på att man inte skapar en databas med ett namn som redan finns, då lägger man till 'IF NOT EXISTS'. \begin{verbatim} CREATE DATABAS IF NOT EXISTS databas; \end{verbatim} \subsection{Ta bort databas} Vill man av någon anledning ta bort en databas man har skapat använder man följande kommando. \begin{verbatim} DROP DATABASE databas; \end{verbatim} %\begin{verbatim} %DROP DATABASE IF EXISTS databas; %\end{verbatim} \section{Tabeller} En databas byggs upp av en eller flera tabeller. Det är i tabellerna som informationen lagras. Rent strikt så är innehållet i tabellerna själva databasen, men man använder i det här sammanhanget ordet för att beskriva "behållaren" för tabellerna. \subsection{Visa tabeller} När man har valt en databas, kan man se om det finns tabeller och i så fall vilka tabeller som finns i databasen. \begin{verbatim} show tables; \end{verbatim} En lista över tabellerna i databasen mysql ser ut så här. \begin{verbatim} +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | func | | help_category | | help_keyword | | help_relation | | help_topic | | host | | proc | | procs_priv | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+ 17 rows in set (0.00 sec) \end{verbatim} Vill man visa tabeller från en viss databas, kan man också ange databasen. \begin{verbatim} show tables from databas; \end{verbatim} Man kan också visa kolumner, status och index m m. \begin{verbatim} show columns from tabell; show table status; show table status from databas; show index from tabell; \end{verbatim} När man har en tabell, kan man kontrollera strukturen på den för att se om man gjorde rätt när man skapade den. \begin{verbatim} DESCRIBE tabell; \end{verbatim} \subsection{Skapa en tabell} När man har skapat en databas, är det dags att skapa den eller de tabeller som ska ingå i den. Tabellen är en \textbf{lista} där varje rad är en \textbf{post}. Varje post har ett antal egenskaper, vilka delas in i \textbf{fält} eller kolumner (jag använder båda begreppen). Varje fält har ett \textbf{fältnamn} som är en rubrik för för just den kolumnen. \begin{verbatim} CREATE TABLE tabell ( fältnamn1 datatyp, fältnamn2 datatyp, fältnamn3 datatyp ); \end{verbatim} För att undvika att man försöker skapa en tabell med ett namn som redan finns, lägger man till 'IF NOT EXISTS'. \begin{verbatim} CREATE TABLE IF NOT EXISTS tabell ( fältnamn1 datatyp, fältnamn2 datatyp, fältnamn3 datatyp ); \end{verbatim} När man skapar tabeller gäller det att tänka över vilka kolumner man egentligen behöver. Kanske ska dessutom innehållet i vissa kolumner utgöra egna tabeller, för att man ska slippa ange samma värde flera gånger. Det finns sätt att ''sammanfoga'' flera enskilda tabeller, men det har jag ännu inte lärt mig, så det får du söka på nätet för att se hur det funkar. \subsubsection*{Datatyper och begränsningar} Det svåra, tycker jag, är att ange vilken datatyp man ska använda. Man har nämligen många att välja på och det känns inte helt klart hur de används, eftersom de kan gripa in i varandra eller bara kan hålla en större eller mindre mängd data. En del hanterar text, andra siffor och åter andra binära data. Titta bland resuserserna sist i den här texten, så hittar du en länk till en plats där de finns beskrivna. \begin{table}[h] \caption{MySQL textdata} \label{textdata} \begin{tabular}{|l|l|l|l|} \hline \textbf{Datatyp} & \textbf{Typ} & \textbf{Storlek} & \textbf{Antal} \\ \hline CHAR(storlek) & Text & fast & 255 tecken \\ \hline VARCHAR(storlek) & Text & variabel & 255 tecken \\ \hline TINYTEXT & Text & max & 255 tecken \\ \hline TEXT & Text & max & 65.535 tecken \\ \hline BLOB & Binär & max & 65.535 byte data \\ \hline MEDIUMTEXT & Text & max & 16.777.215 tecken \\ \hline MEDIUMBLOB & Binär & max & 16.777.215 byte data \\ \hline LONGTEXT & Text & max & 4.294.967.295 tecken \\ \hline LONGBLOB & Binär & max & 4.294.967.295 byte data \\ \hline \end{tabular} \end{table} Det finns, vad jag förstår, tre typer av data: text (Se tabel \ref{textdata}), tal (siffror) (Se tabel \ref{taldata}) och datum/tid (Se tabel \ref{datum}). De har sedan ett antal undertyper. För text och tal verkar skillnaden bestå i hur långa texter och hur stora tal man kan lägga in. Här finns också en skillnad mellan ren text och binär data. När det gäller tal så är standard att värdet kan sträcka sig från ett negativt värde till ett positivt, t ex -128 och 127. Men det går att ange attributet UNSIGNED om man vill att fältet bara ska innehålla positiva värden. \begin{verbatim} CREATE TABLE tabell ( fält1 TINYINT UNSIGNED, fält2 INT, fält3 CHAR(50) ); \end{verbatim} \begin{table}[h] \caption{MySQL taldata} \label{taldata} \begin{tabular}{|l|p{6cm}|} \hline \textbf{Datatyp} & \textbf{Omfång} \\ \hline TINYINT(maxstorlek) & -128 till 127; 0 till 255 UNSIGNED \\ \hline SMALLINT(maxstorlek) & -32768 till 32767; 0 till 65535 UNSIGNED \\ \hline MEDIUMINT(maxstorlek) & -8388608 till 8388607; 0 till 16777215 UNSIGNED \\ \hline INT(maxstorlek) & -2147483648 till 2147483647; 0 till 4294967295 UNSIGNED \\ \hline BIGINI(maxstorlek) & -9223372036854775808 till 9223372036854775807; 0 to 18446744073709551615 UNSIGNED \\ \hline FLOAT(maxstolek,decimaler) & Litet tal med decimaler \\ \hline DOUBLE(maxstorlek,decimaler) & Stort tal med decimaler \\ \hline \end{tabular} \end{table} När det gäller datum/tid så verkar det vara en skillnad i vad man ska ange, datum, tid eller både ock. Men man kan också ange att det ska läggas in en tidsstämpel. \begin{table}[h] \caption{MySQL datum och tid} \label{datum} \begin{tabular}{|l|l|l|} \hline \textbf{Datatyp} & \textbf{Anger} & \textbf{Format} \\ \hline DATE() & Datum & YYYY-MM-DD \\ \hline DATETIME() & Datum \& tid & YYYY-MM-DD HH:MM:SS \\ \hline TIMESTAMP() & Tidsstämpel & \\ \hline TIME() & Tid & HH:MM:SS \\ \hline YEAR() & År & YYYY \\ \hline \end{tabular} \end{table} \subsubsection*{Motorer} Här uppstår nu ett problem. Visa datatyper tillåter väldigt stora värden. Det finns något som kallas motorer och MySQL har stöd för flera stycken. Standard är MyISAM och den klarar inte av de stora värdena. Vill man använda t ex BLOB och TEXT eller större måste man välja en annan, om jag har förstått det hela rätt. Man skulle då kunna tänka sig att istället använda motorn InnoDB. Det skulle se ut så här när man skapar en tabell. Motorn läggs till precis innan det avslutande semikolonet. \begin{verbatim} CREATE TABLE tabell ( fält1 INT, fält2 MEDIUMTEXT ) ENGINE=InnoDB; \end{verbatim} Om man inte anger någon motor, är det MyISAM som kommer att användas. \subsubsection*{Attribut} Det finns också några speciella egenskaper som ett fält och dess värden kan ha. (Se tabel \ref{special}) \begin{table}[h] \caption{Speciella egenskaper} \label{special} \begin{tabular}{|l|p{7cm}|} \hline \textbf{Egenskap} & \textbf{Förklaring} \\ \hline NOT NULL & Fältet får inte vara tomt, utan måste innehålla ett värd av något slag. \\ \hline UNIQUE & Varje värde i fältet måste vara unikt. \\ \hline PRIMARY KEY & Ett unikt id för just det fälter. Man måste här även ange NOT NULL. \\ \hline FOREIGN KEY & ID för en PRIMARY KEY i en annan tabell \\ \hline CHECK & Begränsar värdet för fältet \\ \hline DEFAULT & Anger ett standardvärde för kolumnen \\ \hline \end{tabular} \end{table} \begin{verbatim} CREATE TABLE IF NOT EXISTS tabell ( fältnamn1 datatyp NOT NULL PRIMARY KEY, fältnamn2 datatyp UNIQUE, fältnamn3 datatyp ); \end{verbatim} \subsection{Importera en fil} För att få in ett innehåll i tabellen kan man göra som beskrivs i avsnitt \ref{infoga}. Men har man en textfil med data, kan man importera den direkt i tabellen. Man ska då tänka efter vilka fält man ska använda, alltså vilken struktur tabellen ska ha. Filen skapar man genom att skriva in de poster man har och \textbf{skiljer de olika fälten åt genom tabbar}. \begin{verbatim} post1 fält1 fält2 fält3 post2 fält1 post3 fält1 \end{verbatim} fält2 fält2 fält3 fält3 När det är klart, går man in i MySQL och laddar filen in i tabellen. \begin{verbatim} LOAD DATA LOCAL INFILE "/sök/väg/infil.txt" INTO TABLE tabell; \end{verbatim} \subsection{Ändra i en tabell} Även om man bör tänka efter innan man skapar en databas och dess tabeller, så kan man komma i ett läge där man ändå behöver göra en ändring i strukturen. \subsubsection*{Lägg till kolumn} Missade man en kolumn, kan man lägga till den. \begin{verbatim} ALTER TABLE tabell ADD fältnamn datatyp; \end{verbatim} Man kan vara mer precis och ange att en kolumn ska hamna efter en annan existerande kolumn. \begin{verbatim} ALTER TABLE tabell ADD COLUMN fältnamn datatyp AFTER fältnamn; \end{verbatim} \subsubsection*{Ta bort kolumn} Det går även att ta bort en kolumn. Tänk på att innehållet i kolumnen försvinner om du tar bort den. \begin{verbatim} ALTER TABLE tabell DROP COLUMNE fältnamn; \end{verbatim} \subsubsection*{Ändra datatyp} Angav man fel datatyp, går det att ändra på. \begin{verbatim} ALTER TABLE tabell ALTER COLUMN fältnamn ny_datatyp; \end{verbatim} \subsubsection*{Ta bort tabell} Behöver man inte en tabell, tar man bort den. \begin{verbatim} DROP TABLE tabell; \end{verbatim} \subsection{Infoga, uppdatera och ta bort data}\label{infoga} \subsubsection*{Infoga värden} För att infoga nya uppgifter i en tabell efter det att man har skapat den, skriver man så här. \begin{verbatim} INSERT INTO tabell VALUES (värde1, värde2, värde3, ...) \end{verbatim} Är det bara i vissa kolumner man vill infoga något, gör man istället så här. \begin{verbatim} INSERT INTO tabell (fältnamn1, fältnamn2, fältnamn3, ...) VALUES (värde1, värde2, värde3, ...) \end{verbatim} \subsubsection*{Ändra värden} För att ändra ett värde i en tabell, skriver man så här. \begin{verbatim} UPDATE tabell SET fältnamn1=värde, fältnamn2=värde, ... WHERE fältnamn1=gammalt_värde, fältnamn2=nytt_värde; \end{verbatim} Tänk på att värden som inte är siffror ska ha enkla citattecken runt sig! \subsubsection*{Ta bort hela poster} Det går också att ta bort poster/rader. Alla värden för posten tas då bort. \begin{verbatim} DELETE FROM tabell WHERE fältnamn=värde; \end{verbatim} \subsubsection*{Rensa helt i en tabell} Det går även att ta bort allt från en tabell, att rensa den helt från data. \begin{verbatim} DELETE FROM tabell; \end{verbatim} eller \begin{verbatim} DELETE * FROM tabell; \end{verbatim} \section{Sökningar} En databas blir intressant när man kan söka i den. Här beskriver jag olika sätt att göra det på. Det mest grova sättet att söka på, är att visa precis allt som finns i tabellen. \begin{verbatim} SELECT * FROM tabell; \end{verbatim} Har man en stor tabell blir väl resultatet ganska ointressant. Man vill nog ha mer precisa sökningar och då behöver man förfina sin sökning. \subsection{Förfina sökningen} \subsubsection*{Visa bestämda fält} Men oftast vill man nog ha värdena bara för en eller flera fält. \begin{verbatim} SELECT fältnamn1,fältnamn2 FROM tabell; \end{verbatim} Har man en tabell där det kan dyka upp dubbletter, blir man av med dem så här. \begin{verbatim} SELECT DISTINCT * FROM tabell; \end{verbatim} \subsubsection*{Visa bestämda poster} Man kan också bara vilja se vissa poster i tabellen. Här är det viktigt att komma ihåg, att om en sökterm är en textsträng, då måste den omges av enkla citat tecken (tumtecken). \begin{verbatim} SELECT fältnamn1,fältnamn2 FROM tabell WHERE fältnamn1='text'; \end{verbatim} Om däremot söktermen är en siffra behövs inte det. \begin{verbatim} SELECT fältnamn1,fältnamn2 FROM tabell WHERE fältnamn1=siffra; \end{verbatim} \subsubsection*{Komplexa sökningar} Söka efter flera värden \begin{verbatim} SELECT fältnamn FROM tabell WHERE fältnamn IN (värde1,värde2,...); \end{verbatim} Vill man att sökningen ska matcha två söktermer, vilka dessutom finns i olika kolumner, skriver man så här. \begin{verbatim} SELECT * FROM tabell WHERE fältnamn1='a' AND fältnamn2=1; \end{verbatim} Gör man det ännu mer komplicerat, kan man i den ena kolumnen ange två söktermer. \begin{verbatim} SELECT * FROM tabell WHERE fältnamn1='a' AND (fältnamn2=1 OR fältnamn2=2); \end{verbatim} Söka värden i ett intervall \begin{verbatim} SELECT fältnamn FROM tabell WHERE fältnamn BETWEEN värde1 AND värde2; \end{verbatim} \subsection{Begränsa och sortera} Ibland vill man ha sorterade sökresultat. Sorteringen kan ske antingen stigande (ASC) eller sjunkande (DESC). \begin{verbatim} SELECT fältnamn FROM tabell ORDER BY fältnamn ASC|DESC; \end{verbatim} Begränsa antalet svar. \begin{verbatim} SELECT fältnamn FROM tabell LIMIT antal; \end{verbatim} \subsection{Hitta mönster} Sök efter mönster i en kolumn. \begin{verbatim} SELECT fältnamn FROM tabell WHERE fältnamn LIKE mönster; \end{verbatim} \subsubsection*{Operatorer} Operatorer är användbara när man ska söka efter mönster. Se tabell \ref{operatorer}. \begin{table}[h] \caption{Operatorer} \label{operatorer} \begin{tabular}{|l|l|} \hline \textbf{Operator} & \textbf{Beskrivning} \\ \hline = & Lika med \\ \hline \verb+<>+ & Inte lika med \\ \hline \verb+>+ & Större än \\ \hline \verb+>+ & Mindre än \\ \hline \verb+>=+ & Större eller lika med \\ \hline \verb+<=+ & Mindre eller lika med \\ \hline BETWEEN & Inom ett interval \\ \hline LIKE & Söka efter ett mönster \\ \hline IN & Om du vet det exakta värdet \\ & för en av kolumnerna \\ \hline \end{tabular} \end{table} För att kunna filtrera med mer än ett vilkor, kan man använda AND eller OR. Se tabell \ref{vilkor}. \begin{table}[h] \caption{Vilkor} \label{vilkor} \begin{tabular}{|l|l|} \hline \textbf{Vilkor} & \textbf{Beskrivning} \\ \hline AND & Om både första och andra värdet är sanna. \\ \hline OR & Om antingen det ena eller andra värdet är sant. \\ \hline \end{tabular} \end{table} Man kan också använda s k jokertecken, t ex '\%' och '\_'. Se tabell \ref{jokertecken}. \begin{table}[h] \caption{Jokertecken} \label{jokertecken} \begin{tabular}{|l|l|} \hline \textbf{Jokertecken} & \textbf{Beskrivning} \\ \hline \% & Ersätter noll eller fler tecken \\ \hline \_ & Ersätter exakt ett tecken \\ %\hline [charlist] & Any single character in charlist \\ %\hline [\^charlist] & Any single character not in charlist \\ % [!charlist] & \\ \hline \end{tabular} \end{table} \subsection{Skapa en tabellvy} Jag kan inte riktigt förklara vad en vy är, men det gör att man kan välja ut vissa saker i en tabell vilka man sedan kan titta på dem i en egen tabell. När du gör ändringar i den "riktiga" tabellen, kommer dessa att även synas i vyn. \begin{verbatim} CREATE VIEW vy_namn AS SELECT fältnamn FROM tabell WHERE vilkor; \end{verbatim} Det här skapar en ny tabell med namnet vy\_namn. Man kan se den om man tittar efter vilka tabeller som finns i databasen. Här är det som en helt vanlig sökning i en tabell, men man är begränsad till de kolumner man valt ska ingå i vyn. \begin{verbatim} SELECT * FROM vy_namn; \end{verbatim} Vill man ta bort en vy, gör man så här. \begin{verbatim} DROP VIEW vy_namn; \end{verbatim} För mer info se \href{http://www.w3schools.com}{w3schools} sidor om \href{http://www.w3schools.com/sql/sql\_view.asp}{vyer i SQL}. \section{Användare} Man skapar en användare för att just den användaren ska ha hand om en specifik databas. Det här sker när man installerar vissa program, t ex bloggar och wiki, som använder sig av en databas för att lagra information. Dessa vill att man först skapar en användare med ett lösenord. Sedan används dessa till att sköta kontakten med databasen, t ex i ett PHP-skript. \subsection{Skapa och ta bort en användare} Så när man har skapat en databas, skapar man ett användarkonto till den databasen. \begin{verbatim} CREATE USER 'användare'@'localhost' IDENTIFIED BY 'lösen'; \end{verbatim} När man anger 'localhost' menas det att användaren bara kan logga in från den aktuella datorn. Måste personen logga in från en annan dator, kan man ange namnet eller adressen på den datorn istället. Ska personen kunna nå databasen från vilken dator som helst, skriver man in ett jokertecken: \textbf{'\%'}. 'lösen' är det lösenord som ska gälla för personen. Det anges alltså i klartext när man skapar användaren. Det går också att skapa en användare för en viss databas och ge alla rättigheter på en gång. \begin{verbatim} GRANT ALL PRIVILEGES ON databasen.* TO 'användare'@'localhost' IDENTIFIED BY 'lösen' WITH GRANT OPTION; \end{verbatim} För att ta bort en användare skriver man så här. \begin{verbatim} DROP USER 'användare'@'localhost'; \end{verbatim} \subsection{Ge användaren privilegier} Man behöver därefter ge användaren möjlighet att utföra vissa saker i databasen. Det finns ganska många privilegier. Det mest generösa är att man ger fullständiga rättigheter till en databas. \begin{verbatim} GRANT ALL PRIVILEGES ON databas.* TO 'användare'@'localhost'; \end{verbatim} För att kunna manipulera data, kan man ge användaren rättigheter till enbart följande kommandont: select, insert, update och delete. \begin{verbatim} GRANT select,insert,update,delete ON databas.* TO 'användare'@'localhost'; FLUSH PRIVILEGES; \end{verbatim} För att kunna skapa databaser och tabeller, samt kunna ändra strukturen på tabeller, kan man ge följande rättigheter: \textbf{create}, \textbf{alter} och \textbf{drop}. Om användaren behöver kunna skapa vyer, ger man också följande rättigheter: \textbf{create view} och \textbf{show view}. Vill man gå så långt att användaren själv ska kunna ge och ta privilegier till andra, ger man den här rättigheten: \textbf{grant}. När man nu har gett rättigheter, kan man se vilka som en viss användare har. \begin{verbatim} SHOW GRANTS FOR 'användare'@'localhost'; \end{verbatim} \subsection{Byta lösenord för root} Vill man byta lösenordet för root, kan man göra det utan att vara inloggad i MySQL. Man använder kommandot \textbf{mysqladmin}. \begin{verbatim} mysqladmin -u root aktuell_lösen 'ny-lösen' \end{verbatim} Är man däremot inloggad och vill ändra lösenordet, blir det lite mer komplicerat. \begin{verbatim} USE mysql; UPDATE user SET Password=PASSWORD('ny_lösen') WHERE user='root'; FLUSH PRIVILEGES; \end{verbatim} \section{Resurser} \begin{tabular}{ll} \href{http://dev.mysql.com/doc/refman/5.0/en/tutorial.html}{Manualen 5.0} & dev.mysql.com/doc/refman/5.0/en/tutorial.html \\ \href{http://dev.mysql.com/doc/refman/5.0/en/data-types.html}{Datatyper} & dev.mysql.com/doc/refman/5.0/en/data-types.html \\ \href{http://www.w3schools.com/sql/}{W3Schools kurs i SQL} & www.w3schools.com/sql \\ \end{tabular} \end{document}