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:
SELECT "värden som ska visas"
	FROM "tabeller"
	WHERE "uttryck"
	GROUP BY "grupperingskolumner"
	HAVING "uttryck"
	ORDER BY "sorteringskolumner"
	LIMIT "antal rader"
De olika nyckelorden har följande innebörd:

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:
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)
    -> );
Nu är det dags att fylla tabellerna med data:
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:
SELECT name, weight 
FROM animal
WHERE owner_id=(SELECT id 
                FROM owner 
		WHERE phone_nr='22 22 22');    
I MySQL måste denna fråga måste formas om till:
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:

  • %, detta tecken motsvarar en godtycklig sträng, alltså inget eller flera tecken.
  • _ (understrykning) motsvarar ett enskilt tecken, vilket som helst.
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:
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 |
+-------+--------+
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 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:
mysql> SELECT name, weight FROM animal ORDER BY weight LIMIT 3;
+-------+--------+
| name  | weight |
+-------+--------+
| Hasse |  0.011 |
| Fishy |  0.014 |
| Göran |  0.123 |
+-------+--------+
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,6;
+-------+--------+
| name  | weight |
+-------+--------+
| Stina |  0.144 |
| Selma |    8.2 |
+-------+--------+
2 rows in set (0.00 sec)
Anledningen till att endast 2 rader visas är att tabellen bara har 5 rader.

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]]