programmera.net -> mysql -> normal     för utskrift      info@programmera.net

Matematiska funktioner

1. Matematiska funktioner
2. Numeriska operatorer
3. Avrundning
4. Plus och minusvärden
5. Jämförelse
6. Talbaser
7. RAND()

1. Matematiska funktioner

I MySQL finns mängder med matematiska funktioner, endast ett urval beskrivs på denna sida. En mer fullständig lista kan du se på:  http://dev.mysql.com/doc/mysql/en/Mathematical_functions.html .

2. Numeriska operatorer

De numeriska operatorerna är +,-,*,/,% (%=modulus):
mysql> SELECT 1+2, 2-3, 3*4, 4/5, 5%6, MOD(5,6), POW(6,3);
+-----+-----+-----+------+------+----------+------------+
| 1+2 | 2-3 | 3*4 | 4/5  | 5%6  | MOD(5,6) | POW(6,3)   |
+-----+-----+-----+------+------+----------+------------+
|   3 |  -1 |  12 | 0.80 |    5 |        5 | 216.000000 |
+-----+-----+-----+------+------+----------+------------+
1 row in set (0.00 sec)
MOD(x,y) gör samma sak som "x%y". POW(x,y) beräknar x upphöjt till y.

3. Avrundning

Nedan beskrivs olika funktioner som handlar om avrundning:

Funktion Beskrivning
CEILING(x)  Returnerar x avrundat uppåt.
FLOOR(x)  Returnerar x avrundat nedåt.
ROUND(x)  Returnerar x avrundat till närmaste heltal.
TRUNCATE(x,d)  Returnerar x trunkerat till d decimaler.
FORMAT(x,d)  Returnerar x trunkerat till d decimaler (som lättläst sträng).

Nedan ges några exempel på avrundning:
mysql> SELECT CEILING(11.23), FLOOR(11.23), ROUND(11.23);
+----------------+--------------+--------------+
| CEILING(11.23) | FLOOR(11.23) | ROUND(11.23) |
+----------------+--------------+--------------+
|             12 |           11 |           11 |
+----------------+--------------+--------------+
1 row in set (0.00 sec)

mysql> SELECT CEILING(-11.23), FLOOR(-11.23), ROUND(-11.23);
+-----------------+---------------+---------------+
| CEILING(-11.23) | FLOOR(-11.23) | ROUND(-11.23) |
+-----------------+---------------+---------------+
|             -11 |           -12 |           -11 |
+-----------------+---------------+---------------+
1 row in set (0.00 sec)
Skillnaden mellan FORMAT() och TRUNCATE() är att FORMAT() returnerar en sträng då TRUNCATE() returnerar ett tal. Format lägger dessutom in kommatecken för varje tusental:
mysql> SELECT FORMAT(12.34567,3), TRUNCATE(12.34567, 3);
+--------------------+-----------------------+
| FORMAT(12.34567,3) | TRUNCATE(12.34567, 3) |
+--------------------+-----------------------+
| 12.346             |                12.345 |
+--------------------+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT FORMAT(123456,3), TRUNCATE(123456,3);
+------------------+--------------------+
| FORMAT(123456,3) | TRUNCATE(123456,3) |
+------------------+--------------------+
| 123,456.000      |         123456.000 |
+------------------+--------------------+
1 row in set (0.00 sec)
Man kan se att det första svaret är en sträng på att texten är vänsterställd.

4. Plus och minusvärden

De funktioner som sköter plus och minusvärden är:

Funktion Beskrivning
ABS(x)  Returnerar absolutbeloppet av x.
SIGN(x)  Returnerar 1 om x är positivt, och -1 om x är negativt.

Ett exempel:
mysql> SELECT ABS(-3.2), ABS(3.2), SIGN(-3.2), SIGN(3.2);
+-----------+----------+------------+-----------+
| ABS(-3.2) | ABS(3.2) | SIGN(-3.2) | SIGN(3.2) |
+-----------+----------+------------+-----------+
|       3.2 |      3.2 |         -1 |         1 |
+-----------+----------+------------+-----------+
1 row in set (0.00 sec)

5. Jämförelse

Olika funktioner sköter jämförelse:

Funktion Beskrivning
GREATEST(x,y)  Returnerar det största värdet av x och y.
LEAST(x,y)  Returnerar det minsta värdet av x och y.
IF(expr,x,y)  Returnerar x om expr är sant, annars y.
CASE x WHEN expr1 THEN y1 .. END  Returnerar y1 om expr1=x.

Nedan ges några exempel:
mysql> SELECT LEAST(2, -4), GREATEST(2, -4);
+--------------+-----------------+
| LEAST(2, -4) | GREATEST(2, -4) |
+--------------+-----------------+
|           -4 |               2 |
+--------------+-----------------+
1 row in set (0.00 sec)
Nedan testar vi IF-funktionen:
mysql> SELECT IF(MOD(5,6)>4, "TRUE","FALSE");
+--------------------------------+
| IF(MOD(5,6)>4, "TRUE","FALSE") |
+--------------------------------+
| TRUE                           |
+--------------------------------+
1 row in set (0.00 sec)
Med CASE kan man utföra flera flera IF i ett svep. Ett smidigt sätt att använda CASE är som enkel översättare, se exemplet nedan:
mysql>  SELECT name, department, CASE department
    WHEN "Management" THEN "Ledning"
    WHEN "Sales" THEN "Försäljning"
    WHEN "Development" THEN "Utveckling"
    END AS Avdelning
    FROM employee;
+--------+-------------+-------------+
| name   | department  | Avdelning   |
+--------+-------------+-------------+
| Magnus | Management  | Ledning     |
| Lisa   | Management  | Ledning     |
| Jan    | Sales       | F÷rsõljning |
| Thomas | Sales       | F÷rsõljning |
| Marcus | Sales       | F÷rsõljning |
| Jurgen | Development | Utveckling  |
| Tobbe  | Development | Utveckling  |
| Olle   | Development | Utveckling  |
| Sven   | Development | Utveckling  |
| Jocke  | Development | Utveckling  |
+--------+-------------+-------------+
10 rows in set (0.00 sec)

6. Talbaser

Med dessa funktioner kan du omforma heltal mellan olika talbaser:

Funktion Beskrivning
BIN(x)  Returnerar x som binärsträng (bas=2).
OCT(x)  Returnerar x som en oktal sträng (bas=8).
HEX(x)  Returnerar x som en hexadecimal sträng (bas=16).
CONV(x,y,z)  Koverterar talet x från bas y till bas z.

Nedan ges några exempel:
mysql> SELECT BIN(43), OCT(43), HEX(43), CONV(43,10,2), CONV(101011,2,10);
+---------+---------+---------+---------------+-------------------+
| BIN(43) | OCT(43) | HEX(43) | CONV(43,10,2) | CONV(101011,2,10) |
+---------+---------+---------+---------------+-------------------+
| 101011  | 53      | 2B      | 101011        | 43                |
+---------+---------+---------+---------------+-------------------+
1 row in set (0.00 sec)

7. RAND()

Med denna funktion slumpas ett flyttal fram mellan 0 och 1.0.
mysql> SELECT RAND(), RAND();
+------------------+-------------------+
| RAND()           | RAND()            |
+------------------+-------------------+
| 0.60996076335196 | 0.069766132225996 |
+------------------+-------------------+
1 row in set (0.00 sec)
Om du vill kan du använda ett frö, och du får då samma slumptal varje gång du använder samma frö:
mysql> SELECT RAND(4), RAND(4);
+-----------------+-----------------+
| RAND(4)         | RAND(4)         |
+-----------------+-----------------+
| 0.1559528654031 | 0.1559528654031 |
+-----------------+-----------------+
1 row in set (0.00 sec)