Hittills har vi skapat en databas, lagt till två tabeller och infogat data i båda tabellerna. Nu ska vi titta på hur man hämtar den informationen. Men inte bara hämta data, men för att fråga databasen för det.
SQL står för Structured Query Language . Det är Frågan bit som gör SQL så kraftfullt. SQL är ett språk som gör att du kan köra frågor mot din databas. Det låter dig fråga databasen för de data du vill ha.
SQL SELECT
Uttalande
När det gäller att fråga din MySQL-databas, SQL SELECT
uttalande gör det hela möjligt. Detta är sannolikt din vanligaste SQL-sats när du arbetar med MySQL. SELECT
statement låter dig beskriva för MySQL exakt vilken data du vill att den ska hämta.
Tänk på följande SQL-sats:
SELECT * FROM Fruit;
Här är resultatet:
Detta är SELECT
uttalande när det är som enklast. Ovanstående SQL-sats hämtar alla poster från
Fruit
bord.
Asterisken (*
) säger till MySQL att returnera alla kolumner. Detta sparar oss tid och ansträngning. Utan detta skulle vi behöva skriva namnen på alla kolumner som vi skulle vilja ha returnerat.
Med det sagt kan du också säga till MySQL att endast returnera de kolumner som du vill returnera. Detta görs genom att bara namnge de kolumner som du vill ha returnerat. Så här:
SELECT FruitId, FruitName FROM Fruit;
Här är resultatet:
Ovanstående SQL-sats väljer FruitId och FruitName kolumner från Fruit bord.
Att göra detta kan minska röran så att du bara ser de kolumner som du är intresserad av. Det kan också öka prestandan, eftersom MySQL (och alla program du använder) inte behöver använda värdefulla resurser för att returnera onödiga data.
Återigen hämtar den här frågan alla poster från tabellen — MySQL kommer att returnera alla poster om inget annat anges.
VAR Klausul
Du kan lägga till WHERE
klausul för att begränsa resultatuppsättningen till endast de poster som du är intresserad av. Så här:
SELECT * FROM Fruit WHERE UnitId = 1;
Resultat:
Ovanstående fråga returnerar alla poster från
Fruit
tabell där
UnitId
kolumnen har värdet 1
.
Undersökningar — Kapslade SELECT
Uttalanden
Tänk om vi inte kände till
UnitId
? Tänk om vi bara visste att leta efter de poster med enhetsnamnet Piece
?
Lätt! Vi skulle kunna skriva om exemplet ovan för att använda en kapslad SELECT
uttalande (annan känd som en underfråga ) som frågar efter en annan tabell (
Enheterna
tabell). Om du gör detta kommer vi att kunna använda det faktiska enhetens namn (istället för dess ID) eftersom den andra tabellen innehåller detta i UnitName
fält:
SELECT * FROM Fruit WHERE UnitId = (SELECT UnitId FROM Units WHERE UnitName = 'Piece');
Resultat:
Här använder vi en kapslad SELECT
uttalande (dvs. en SELECT
sats i en SELECT
uttalande) för att fråga
Enheter
tabell för
UnitId
av posten som innehåller Piece
som dess
UnitName
värde. Vi kan göra detta eftersom
Fruit.UnitId
kolumnen är en främmande nyckel till
Units.UnitId
kolumn.
Här är fler exempel på underfrågor om du är intresserad.
Använda en SQL JOIN
Om vi tar det ett steg längre kan vi skriva om vår kapslade SELECT
uttalande till en INNER JOIN
.
I SQL, en JOIN
gör att du kan söka efter flera tabeller som delar data. I vårt fall delar båda tabellerna UnitId
så man kan säga att de är "anslutna" av detta fält.
Det finns olika typer av kopplingar i SQL, men vi är främst intresserade av INNER JOIN
för nu.
INNER JOIN
syntax går så här:
SELECT * FROM table_name_1 INNER JOIN table_name_2 ON table_name_1.column_name = table_name_2.column_name
Så vi skulle kunna skriva om vår underfråga från föregående exempel till följande:
SELECT Fruit.* FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Units.UnitName = 'Piece';
Resultat:
Vi angav Fruit.*
istället för bara *
eftersom vi bara ville returnera alla kolumner från
Fruit
tabell. Om vi hade använt *
, skulle frågan ha returnerat alla kolumner från båda tabellerna.
Kolla även in LEFT JOIN
och RIGHT JOIN
för att se hur du kan få olika data beroende på typen av koppling.
Subquery kontra JOIN
?
Nu när du har sett två metoder för att uppnå samma resultat, undrar du förmodligen vilken som är bättre?
Underfrågor tenderar att vara mer läsbara (och kanske lättare att förstå), vilket kan göra det lättare för nybörjare att förstå.
Men många SQL-programmerare hittar JOIN
är effektivare och presterar bättre. Om du stöter på prestandaproblem med dina frågor eller en applikation, försök konvertera eventuella underfrågor till JOIN
s eller vice versa (i vissa fall kan en underfråga fungera bättre).
Det kan också finnas fall där en underfråga är ditt enda alternativ, så detta är också ett övervägande.
Fler operatörer
Våra frågor hittills har alla innehållit ett likhetstecken (=
). Detta kallas en operatör . Mer specifikt är det en jämförelseoperator eftersom det jämför ett uttryck med ett annat.
Det finns många fler operatörer som du kan använda i dina frågor. Dessa kan i hög grad hjälpa till att begränsa resultatuppsättningen till endast de poster som du behöver. Det är inte ovanligt att en databas innehåller miljontals poster. Även om du bara har tusentals poster, skulle det vara en mycket skrämmande uppgift att försöka hitta en post (eller till och med bara en handfull) bland tusentals om du inte hade dessa operatörer till ditt förfogande.
Här är några av de vanligaste SQL-operatorerna.
> Operatör
Du kan använda
SELECT * FROM Fruit WHERE Inventory > 10;
< Operatör
Du kan använda <
operatör för att välja data som är mindre än ett givet värde.
SELECT * FROM Fruit WHERE Inventory < 10;
<> Operatör
Du kan använda
SELECT * FROM Fruit WHERE Inventory <> 10;
>=
Operatör
Du kan använda >=
operator för att välja data som är större än eller lika med ett givet värde.
SELECT * FROM Fruit WHERE Inventory >= 10;
<=
Operatör
Du kan använda <=
operator för att välja data som är mindre än eller lika med ett givet värde.
SELECT * FROM Fruit WHERE Inventory <= 10;
AND
Operatör
Du kan lägga till en AND
operatorn till WHERE
klausul för att begränsa ditt val till endast de poster som uppfyller två villkor (eller fler om du inkluderar fler OCH
operatörer).
Här är ett exempel:
SELECT * FROM Fruit WHERE Inventory > 10 AND DateEntered > '2015-01-15';
ELLER
Operatör
Du kan använda en ELLER
operatör för att bredda ditt urval till mer än ett kriterium. Som namnet antyder, ELLER
sats låter dig välja data där kriteriet antingen är detta ELLER det där. Så AND
operatörens gränser ditt val och ELLER
operatör breddas det.
Här är ett exempel:
SELECT * FROM Fruit WHERE UnitId = 1 OR UnitId = 2;
MELLAN Operatör
Använd BETWEEN
operatorn för att välja data som ligger mellan två givna värden.
SELECT * FROM Fruit WHERE DateEntered BETWEEN '2015-01-25' AND '2015-02-25';
NOT
Operatör
Använd NOT
operatör för att välja data som inte är motsvarande ett givet villkor.
SELECT * FROM Fruit WHERE NOT (FruitName = 'Apple');