programmera.net -> mysql -> normal för utskrift | info@programmera.net |
SELECT i MySQL
1. Hur fungerar SELECT? 2. Exempeltabeller 3. Främmande nycklar 4. OBS! Inga nästlade SELECT 5. DISTINCT 6. LIKE 7. ORDER BY 8. LIMIT 9. Syntax för SELECT |
1. Hur fungerar SELECT?
Med SELECT väljer man ut data ur databasen i så kallade frågor. Det enda sättet för dig att få se dina data är just genom att skapa frågor med SELECT-sater. SELECT-satsens flexibiltet är troligtvis det som har gjort relationsdatabaser till en så populär datalagringsmetod. En SELECT-sats byggs upp av följande element:
De olika nyckelorden har följande innebörd:
SELECT "värden som ska visas"
FROM "tabeller"
WHERE "uttryck"
GROUP BY "grupperingskolumner"
HAVING "uttryck"
ORDER BY "sorteringskolumner"
LIMIT "antal rader"
Del Beskrivning SELECT Efter detta nyckelord följer en lista på vilka koluner som ska visas av de valda raderna. FROM Efter detta nyckelord följer en lista på vilka tabeller som ska sökas i. WHERE Efter detta nyckelord följer de urvalskriterier som ska användas på radnivå. GROUP BY Efter detta nyckelord följer en lista på de kolumner som ska aggregeras. HAVING Efter detta nyckelord följer de urvalskriterier som ska användas på gruppnivå. ORDER BY Nyckelordet bestämmer vilken kolumn som resultatet ska sorteras efter. LIMIT Nyckelordet bestämmer det maximala antalet rader som ska returneras från resultatet.
På denna sida kommer nyckelorden att beskrivas i detalj, utom GROUP BY och HAVING som beskrivs på
Aggregering .
2. Exempeltabeller
De tabeller vi kommer att använda är animal,owner och species. Först skapar jag tabellerna:
Nu är det dags att fylla tabellerna med data:
mysql> CREATE TABLE owner (
-> id INT NOT NULL AUTO_INCREMENT,
-> name VARCHAR(50),
-> phone_nr VARCHAR(20),
-> timestamp TIMESTAMP,
-> PRIMARY KEY (id)
-> );
mysql> CREATE TABLE species (
-> id INT NOT NULL AUTO_INCREMENT,
-> name VARCHAR(50),
-> description TEXT,
-> timestamp TIMESTAMP,
-> PRIMARY KEY (id)
-> );
mysql> CREATE TABLE animal (
-> id INT NOT NULL AUTO_INCREMENT,
-> owner_id INT,
-> species_id INT,
-> name VARCHAR(50),
-> weight FLOAT,
-> birth DATE,
-> timestamp TIMESTAMP,
-> PRIMARY KEY (id)
-> );
mysql> INSERT INTO owner (name, phone_nr) VALUES
-> ('kalle', '11 11 11'),
-> ('victor','22 22 22'),
-> ('thomas','33 33 33');
mysql> SELECT * FROM owner;
+----+--------+----------+----------------+
| id | name | phone_nr | timestamp |
+----+--------+----------+----------------+
| 1 | kalle | 11 11 11 | 20020901160150 |
| 2 | victor | 22 22 22 | 20020901160150 |
| 3 | thomas | 33 33 33 | 20020901160150 |
+----+--------+----------+----------------+
mysql> INSERT INTO species (name, description) VALUES
-> ('leopardsalamander','Gul ödla med svarta fläckar c.a. 15 cm lång.' ),
-> ('staffordshire bullterrier', 'Liten grisliknande knubbig hund.\nGlad och vild.'),
-> ('guppie','Mindre akvariefisk.');
mysql> SELECT * FROM species;
+----+---------------------------+-------------------------------+----------------+
| id | name | description | timestamp |
+----+---------------------------+-------------------------------+----------------+
| 1 | leopardsalamander | Gul ödla med svarta fläckar. | 20020901161417 |
| 2 | staffordshire bullterrier | Liten glad grisliknande hund. | 20020901161417 |
| 3 | guppie | Mindre akvariefisk. | 20020901161417 |
+----+---------------------------+-------------------------------+----------------+
mysql> INSERT INTO animal (owner_id, species_id, name, weight, birth) VALUES
-> (1,2,'Selma',8.200, '2000-02-02'),
-> (2,3,'Hasse',0.011, '2002-05-12'),
-> (3,1,'Göran',0.123, '2001-02-19'),
-> (3,1,'Stina',0.144, '1999-11-03'),
-> (3,3,'Fishy',0.014, '2002-02-01');
mysql> SELECT * FROM animal;
+----+----------+------------+-------+--------+------------+----------------+
| id | owner_id | species_id | name | weight | birth | timestamp |
+----+----------+------------+-------+--------+------------+----------------+
| 1 | 1 | 2 | Selma | 8.2 | 2000-02-02 | 20020901164305 |
| 2 | 2 | 3 | Hasse | 0.011 | 2002-05-12 | 20020901164305 |
| 3 | 3 | 1 | Göran | 0.123 | 2001-02-19 | 20020901164305 |
| 4 | 3 | 1 | Stina | 0.144 | 1999-11-03 | 20020901164305 |
| 5 | 3 | 3 | Fishy | 0.014 | 2002-02-01 | 20020901164305 |
+----+----------+------------+-------+--------+------------+----------------+
3. Främmande nycklar
Som ni ser har alla tabeller ovan en kolumn som heter ID. Kolumnen ID är bra när man ska ha en referens i en annan tabell. En referens till en annan tabell brukar kallas för främmande nyckel (foreign key). Tabellen animal har två främmande nycklar som refererar till tabellerna owner och species via deras respektive ID. Med följande SELECT-sats söker man i tabellerna animal,species och owner för att se telefonnummret till varje djurs ägare och djurets art:
mysql> SELECT animal.name AS animal, species.name AS species,
-> owner.name AS owner, owner.phone_nr
-> FROM animal, owner, species
-> WHERE animal.owner_id=owner.id AND animal.species_id=species.id;
+--------+---------------------------+--------+----------+
| animal | species | owner | phone_nr |
+--------+---------------------------+--------+----------+
| Selma | staffordshire bullterrier | kalle | 11 11 11 |
| Hasse | guppie | victor | 22 22 22 |
| Göran | leopardsalamander | thomas | 33 33 33 |
| Stina | leopardsalamander | thomas | 33 33 33 |
| Fishy | guppie | thomas | 33 33 33 |
+--------+---------------------------+--------+----------+
4. OBS! Inga nästlade SELECT
Tyvärr stöder MySQL inte nästlade SELECT-satser, men oftast går en nästlad SELECT-sats att forma om till en enkel SELECT-sats. En nästlad SELECT-sats kan se ut såhär:
I MySQL måste denna fråga måste formas om till:
SELECT name, weight
FROM animal
WHERE owner_id=(SELECT id
FROM owner
WHERE phone_nr='22 22 22');
mysql> SELECT animal.name, animal.weight
FROM animal, owner
WHERE animal.owner_id=owner.id
AND owner.phone_nr='22 22 22';
+-------+--------+
| name | weight |
+-------+--------+
| Hasse | 0.011 |
+-------+--------+
5. DISTINCT
Med DISTINCT kan man välja ut alla unika värden ur en kolumn i resultattabellen.
mysql> SELECT DISTINCT(owner_id) FROM animal;
+----------+
| owner_id |
+----------+
| 1 |
| 2 |
| 3 |
+----------+
6. LIKE
Det finns möjlighet att leta efter ord eller delar av ord i en fråga. Detta gör man med LIKE. Det finns två specialtecken som används i denna typ av sökningar:
I följande exempel letar vi upp alla djurnamn som innehåller bokstaven e:
mysql> SELECT name, birth FROM animal WHERE name LIKE '%e%';
+-------+------------+
| name | birth |
+-------+------------+
| Selma | 2000-02-02 |
| Hasse | 2002-05-12 |
+-------+------------+
7. ORDER BY
Man sorterar resultattabellen med ORDER BY:
Om man hellre vill ha det högsta värdet först skriver man DESC på slutet:
mysql> SELECT name, weight FROM animal ORDER BY weight;
+-------+--------+
| name | weight |
+-------+--------+
| Hasse | 0.011 |
| Fishy | 0.014 |
| Göran | 0.123 |
| Stina | 0.144 |
| Selma | 8.2 |
+-------+--------+
mysql> SELECT name, weight FROM animal ORDER BY weight DESC;
+-------+--------+
| name | weight |
+-------+--------+
| Selma | 8.2 |
| Stina | 0.144 |
| Göran | 0.123 |
| Fishy | 0.014 |
| Hasse | 0.011 |
+-------+--------+
8. LIMIT
Ibland vill man inte se alla svar som finns i resultattabellen. Då kan man använda LIMIT NR där NR är en siffra som beskriver hur många rader man maximalt vill ha. I exemplet nedan visar vi de 3 lättast djuren:
Vi kan även bestämma ett intervall med LIMIT. Om vi till exempel är nyfikna på vilka de näst 3 lättaste djuren är ( alltså position 4,5,6 i resultatlistan ) blir SELECT-satsen:
mysql> SELECT name, weight FROM animal ORDER BY weight LIMIT 3;
+-------+--------+
| name | weight |
+-------+--------+
| Hasse | 0.011 |
| Fishy | 0.014 |
| Göran | 0.123 |
+-------+--------+
Anledningen till att endast 2 rader visas är att tabellen bara har 5 rader.
mysql> SELECT name, weight FROM animal ORDER BY weight LIMIT 3,6;
+-------+--------+
| name | weight |
+-------+--------+
| Stina | 0.144 |
| Selma | 8.2 |
+-------+--------+
2 rows in set (0.00 sec)
9. Syntax för SELECT
Med SELECT väljer du ut vilka data du vill visa. Texten visar syntaxen för en korrekt SELECT-sats.
SELECT [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name]
[FOR UPDATE | LOCK IN SHARE MODE]]