MySQL har mange funktioner som du kan bruge, nogle eksempler er:
Eksempel fra Northwind
SELECT
OrderID,
OrderDate,
DAY(OrderDate) as Dag,
MONTH(OrderDate) as Måned,
YEAR(OrderDate) as År
FROM Orders;
Du kan finde en oversigt her Link
Du har også mulighed for at foretage beregninger på dine data, det kan være simple beregninger som det at gange to kolonner med hinanden, eller det kan være beregninger hvor du bruger funktioner.
SQL Beregninger
Eksempel fra Northwind
SELECT
OrderID,
ProductID,
UnitPrice,
Quantity,
Discount,
UnitPrice * Quantity as Pris_Uden_Rabat
FROM Order_Details;
Du kan bruge forskellige beregningsfunktioner på dine data.
-- AVG
SELECT AVG(UnitPrice)
FROM Products;
-- MIN
SELECT MIN(UnitPrice)
FROM Products;
-- MAX
SELECT MAX(UnitPrice)
FROM Products;
-- COUNT
SELECT COUNT(ProductID)
FROM Products;
-- SUM
SELECT
SUM((UnitPrice * Quantity) - (UnitPrice * Quantity * Discount)) AS Sale
FROM Order_Details;
GROUP BY-sætningen bruges ofte sammen med en beregningsfunktioner som fx AVG, MIN, MAX, COUNT og SUM til at gruppere dit resultat.
Det kan f.eks. være det totale salg på en kunde eller et produkt.
SELECT
Order_Details.OrderID,
COUNT(Order_Details.Quantity) AS Antal,
SUM((UnitPrice * Quantity) - (UnitPrice * Quantity * Discount)) AS Sale
FROM Order_Details
GROUP BY Order_Details.OrderID;
SELECT
Employees.LastName,
COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders INNER JOIN Employees
ON Orders.EmployeeID = Employees.EmployeeID
GROUP BY LastName:
Hvis du vil “udvælge” data på basis af en gruppering (GROUP BY) kan du IKKE bruge WHERE.
Dette eksempel fra Northwind vil ikke virke
SELECT
Country,
COUNT(CustomerID)
FROM Customers
GROUP BY Country
WHERE COUNT(CustomerID) > 5;
Når der er foretaget en gruppering på “CustomerID” skal du bruge SQL kommandoen HAVING for at det virker.
Samme eksempel fra Northwind, men med HAVING
SELECT
Country,
COUNT(CustomerID)
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
Det er muligt at bruge WHERE sammen med GROUP BY det skal bare være så du udvælger på data der ikke er grupperet på.
Eksampel fra Northwind
SELECT
Country,
COUNT(CustomerID)
FROM Customers
WHERE Country IN ('UK', 'USA', 'Italy')
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
Du kender et index fra en bog, hvor der typisk er et index bagerst i bogen. Det gør det nemmere og hurtigere at finde et bestemt ord/emne.
Det samme gælder når vi arbejder med index i SQL - index gør det hurtigere at finde data.
Som standard oprettes der et index når du opretter en primærnøgle. Dette index er et unikt index - det er jo en primær nøgle.
Du opretter et index med SQL kommandoen CREATE INDEX
CREATE INDEX index_navn
ON tabel_navn (felt_navn);
CREATE INDEX FK_CustomerID
ON Orders (CustomerID);
Brugeren kan ikke se de indexer der er oprettet, men du kan se dem under den enkelte tabel i mappen Indexes
Det er også muligt at oprette et index hvor du kombinerer flere kolonner.
Eksempel fra Northwind
CREATE INDEX Emp_name
ON Employees (LastName, FirstName);
Det er muligt at oprette et unikt index, ligesom det index der oprettes ved primærnøglen. Det kan fx bruges til at sikre at en kunde ikke oprettes to gange - kunne fx være kundens CVR-nummer.
CREATE UNIQUE INDEX index_navn
ON tabel_navn (felt_navn);
CREATE UNIQUE INDEX UniqProduct
ON Products (ProductName);
Du kan fjerne et index med kommandoen DROP INDEX kombineret med ALTER TABLE
ALTER TABLE tabel_navn
DROP INDEX index_navn;
ALTER TABLE Employees
DROP INDEX Emp_name;
Hvilke felter skal du så oprette indekser på?
Som udgangspunkt bliver der oprettet et unikt index på dine primærnøgle. Udover det vil det typisk være en fordel at oprette indekser på de felter der er fremmede nøgler.
Dernæst kan du med fordel oprette indekser på de felter hvor der søges meget. Det kan være svært at vide hvilke felter det er, en mulighed er at spørge brugerne eller bruge et analyse værktøj til at finde disse felter.
Der er dog en ulempe ved oprettelsen af indekser - Det at gemme data bliver langsommere. årsagen er, at indekserne skal opdateres med de nye data.
Hvis man skal indsætte eller opdatere store mængder data kan det være en fordel at slette dine indekser først og så oprette dem igen, når indsættelsen af data er færdig.
En CASE-sætning opsætter forskellige betingelser som data “holdes” op imod.
En CASE-sætning virker som en IF-THEN-ELSE sætning.
Når en værdi er SAND, falder indenfor en CASE, så returneres resultatet.
Hvis ingen betingelser er sande, returnerer den værdien i ELSE-klausulen.
CASE
WHEN betingelse_1 THEN resultat_1
WHEN betingelse_2 THEN resultat_2
WHEN betingelse_n THEN resultat_n
ELSE resultat
END;
Eksempel fra Northwind
SELECT
OrderID,
Quantity,
CASE
WHEN Quantity > 30 THEN 'Antal er større end 30'
WHEN Quantity = 30 THEN 'Antal er 30'
ELSE 'Antal er under 30'
END AS 'Antal ordre'
FROM Order_Details;
Biblioteksopgave - Link
Løsning til Opgave 4
Færdigt ER-diagram
Overvejelser i forhold til Indexer
Du kan hente opgave 4 her som PDF - Opgave 4
noter for dag 4 - noter dag 4
Løsning til opgave 4 - Løsning opgave 4