\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}