# select



La commande SELECT est utilisée pour récupérer des informations à partir d'une table. 

La forme usuelle est : `SELECT colonne FROM table WHERE condition;`



#### Sélectionner toutes les colonnes d'une table:

`SELECT * FROM table;`

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal;
+----------+--------+---------+------+------------+------------+
| nom      | maitre | espece  | sexe | naissance  | mort       |
+----------+--------+---------+------+------------+------------+
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
| Slim     | Benny  | serpent | f    | 1996-03-30 | NULL       |
| Chirpy   | Gwen   | oiseau  | m    | 1996-03-10 | NULL       |
| Fluffy   | Harold | chat    | m    | 1984-11-10 | NULL       |
| Bowser   | Diane  | chien   | m    | 1998-08-31 | 1995-07-29 |
+----------+--------+---------+------+------------+------------+
5 rows in set (0.001 sec)
```



#### Sélectionner certaines colonnes d'une table:

`SELECT col1, col4 FROM table;`

```mariadb
MariaDB [mydatabase]> SELECT nom,sexe FROM animal;
+----------+------+
| nom      | sexe |
+----------+------+
| Puffball | f    |
| Slim     | f    |
| Chirpy   | m    |
| Fluffy   | m    |
| Bowser   | m    |
+----------+------+
```



#### Sélectionner certaines lignes:

`SELECT col1, col4 FROM table WHERE col5="x";`

```mariadb
MariaDB [mydatabase]> SELECT nom,sexe FROM animal WHERE sexe="m";
+--------+------+
| nom    | sexe |
+--------+------+
| Chirpy | m    |
| Fluffy | m    |
| Bowser | m    |
+--------+------+
```

Conditions WHERE:

- **=** : `WHERE sexe ="m"`
- **>=** ; **>** : `WHERE naissance >= "1998-1-1"`
- **<=** ; **<** : `WHERE naissance < "2000-1-1"`
- **AND** : `WHERE naissance >= "1998-1-1" AND naissance < "2000-1-1"`
- **OR** : `WHERE naissance >= "2000-1-1" OR naissance < "1998-1-1"`
- 



#### Afficher un résultat unique:

`SELECT DISTINCT col1 FROM table;`

```mariadb
MariaDB [mydatabase]> SELECT DISTINCT sexe FROM animal;
+------+
| sexe |
+------+
| f    |
| m    |
+------+
```



#### Trier les résultats:

`SELECT col1, col2 FROM table ORDER BY col2;`

`SELECT col1, col2 FROM table ORDER BY col2 DESC;`

```mariadb
MariaDB [mydatabase]> SELECT nom, naissance FROM animal ORDER BY naissance DESC;
+----------+------------+
| nom      | naissance  |
+----------+------------+
| Puffball | 1999-03-30 |
| Slim     | 1996-03-30 |
| Chirpy   | 1996-03-10 |
| Bowser   | 1989-08-31 |
| Fluffy   | 1984-11-10 |
+----------+------------+

```

!!! Tri sur plusieurs colonnes



#### Calcul sur les dates:

Alias: `AS`

```mariadb
MariaDB [mydatabase]> SELECT nom, naissance, CURRENT_DATE,(YEAR(CURRENT_DATE)-YEAR(naissance)) - (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5)) AS age FROM animal ORDER BY nom;
+----------+------------+--------------+------+
| nom      | naissance  | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Bowser   | 1989-08-31 | 2021-09-04   |   32 |
| Chirpy   | 1996-03-10 | 2021-09-04   |   25 |
| Fluffy   | 1984-11-10 | 2021-09-04   |   36 |
| Puffball | 1999-03-30 | 2021-09-04   |   22 |
| Slim     | 1996-03-30 | 2021-09-04   |   25 |
+----------+------------+--------------+------+
```

```mariadb
MariaDB [mydatabase]> SELECT nom, naissance, MONTH(naissance) AS 'mois de naissance' FROM animal;
+----------+------------+-------------------+
| nom      | naissance  | mois de naissance |
+----------+------------+-------------------+
| Puffball | 1999-03-30 |                 3 |
| Slim     | 1996-03-30 |                 3 |
| Chirpy   | 1996-03-10 |                 3 |
| Fluffy   | 1984-11-10 |                11 |
| Bowser   | 1989-08-31 |                 8 |
+----------+------------+-------------------+
```



#### Valeur NULL:

Conceptuellement, NULL représente une valeur qui manque, ou une valeur inconnue. Utilisez les opérateurs IS NULL et IS NOT NULL.

Avec MySQL, 0 et NULL représentent le booléen faux, et tout le reste représente le booléen vrai. La valeur par défaut du booléen vrai issue d'une comparaison est 1.

 Lorsque vous utilisez la clause ORDER BY, les valeurs NULL sont toujours triées en premier, même si vous utilisez l'attribut DESC.

Chercher les animaux morts:

```mariadb
MariaDB [mydatabase]> SELECT nom, naissance, mort FROM animal WHERE mort IS NOT NULL;
+--------+------------+------------+
| nom    | naissance  | mort       |
+--------+------------+------------+
| Bowser | 1989-08-31 | 1995-07-29 |
+--------+------------+------------+
```



#### Recherche de modèles:

`LIKE '_a'`: _ remplace n'importe quel caractère 

`LIKE '___'`: trouve les noms de 3 caractères

`LIKE '%y'`: se termine par 'y'

`LIKE 'f%'`: commence par 'f'

`LIKE '%b%'`: contenant un 'b'

`NOT LIKE '%y'`: ne se termine pas par 'y'

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal WHERE nom LIKE "%y";
+--------+--------+--------+------+------------+------+
| nom    | maitre | espece | sexe | naissance  | mort |
+--------+--------+--------+------+------------+------+
| Chirpy | Gwen   | oiseau | m    | 1996-03-10 | NULL |
| Fluffy | Harold | chat   | m    | 1984-11-10 | NULL |
+--------+--------+--------+------+------------+------+
```

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal WHERE nom LIKE "f%";
+--------+--------+--------+------+------------+------+
| nom    | maitre | espece | sexe | naissance  | mort |
+--------+--------+--------+------+------------+------+
| Fluffy | Harold | chat   | m    | 1984-11-10 | NULL |
+--------+--------+--------+------+------------+------+
```

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal WHERE nom LIKE "%b%";
+----------+--------+---------+------+------------+------------+
| nom      | maitre | espece  | sexe | naissance  | mort       |
+----------+--------+---------+------+------------+------------+
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
| Bowser   | Diane  | chien   | m    | 1989-08-31 | 1995-07-29 |
+----------+--------+---------+------+------------+------------+
```

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal WHERE nom LIKE "______";
+--------+--------+--------+------+------------+------------+
| nom    | maitre | espece | sexe | naissance  | mort       |
+--------+--------+--------+------+------------+------------+
| Chirpy | Gwen   | oiseau | m    | 1996-03-10 | NULL       |
| Fluffy | Harold | chat   | m    | 1984-11-10 | NULL       |
| Bowser | Diane  | chien  | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+--------+------+------------+------------+
```



#### Regex:

`REGEXP`

`NOT REGEXP`

Quelques caractéristiques des expressions régulières étendues sont :

- Le caractère ‘.’ trouve n'importe quel caractère.
- Une classe de caractères ‘[...]’ trouve n'importe quel caractère contenu entre les crochets. Par exemple, la classe de caractères ‘[abc]’ trouve le caractère ‘a’, ‘b’, ou ‘c’. Pour définir un intervalle de caractères, utilisez un trait d'union. La classe de caractères ‘[a-z]’ trouvera n'importe quel caractère minuscule, tout comme la classe ‘[0-9]’ trouvera n'importe quel nombre.
- Le caractère ‘*’ trouvera aucune ou plus d'instances du caractère qui le précède. Par exemple, ‘x*’ trouvera n'importe quel nombre de fois le caractère ‘x’, ‘[0-9]*’ trouvera n'importe quel nombre et ‘.*’ trouvera n'importe quel nombre de fois n'importe quel caractère.
- Le modèle est trouvé s'il se produit n'importe où dans la valeur testée. (Les modèles SQL ne sont trouvés que s'ils sont présents en valeur entière.)
- Pour ancrer un modèle de sorte qu'il soit trouvé au début ou à la fin de valeur testée, utilisez ‘^’ au début ou bien ‘$’ à la fin du modèle.

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal WHERE nom REGEXP "y$";
+--------+--------+--------+------+------------+------+
| nom    | maitre | espece | sexe | naissance  | mort |
+--------+--------+--------+------+------------+------+
| Chirpy | Gwen   | oiseau | m    | 1996-03-10 | NULL |
| Fluffy | Harold | chat   | m    | 1984-11-10 | NULL |
+--------+--------+--------+------+------------+------+

```

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal WHERE nom REGEXP "^f";
+--------+--------+--------+------+------------+------+
| nom    | maitre | espece | sexe | naissance  | mort |
+--------+--------+--------+------+------------+------+
| Fluffy | Harold | chat   | m    | 1984-11-10 | NULL |
+--------+--------+--------+------+------------+------+
```

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal WHERE nom REGEXP "b";
+----------+--------+---------+------+------------+------------+
| nom      | maitre | espece  | sexe | naissance  | mort       |
+----------+--------+---------+------+------------+------------+
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
| Bowser   | Diane  | chien   | m    | 1989-08-31 | 1995-07-29 |
+----------+--------+---------+------+------------+------------+
```

```mariadb
MariaDB [mydatabase]> SELECT * FROM animal WHERE nom REGEXP "^......$";
+--------+--------+--------+------+------------+------------+
| nom    | maitre | espece | sexe | naissance  | mort       |
+--------+--------+--------+------+------------+------------+
| Chirpy | Gwen   | oiseau | m    | 1996-03-10 | NULL       |
| Fluffy | Harold | chat   | m    | 1984-11-10 | NULL       |
| Bowser | Diane  | chien  | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+--------+------+------------+------------+
```



#### Compter les lignes:

`COUNT()`

La fonction COUNT() compte le nombre de résultats non NULL

```mariadb
MariaDB [mydatabase]> SELECT COUNT(*) FROM animal;
+----------+
| COUNT(*) |
+----------+
|        5 |
+----------+
```

```mariadb
MariaDB [mydatabase]> SELECT maitre, COUNT(*) FROM animal GROUP BY maitre;
+--------+----------+
| maitre | COUNT(*) |
+--------+----------+
| Benny  |        1 |
| Diane  |        2 |
| Gwen   |        1 |
| Harold |        1 |
+--------+----------+
```



#### Modifier une donnée:

`UPDATE table SET colonne1="x" WHERE colonne2="y";`

```mariadb
MariaDB [mydatabase]> UPDATE animal SET naissance = "1989-08-31" WHERE nom = "Bowser";
Query OK, 1 row affected (0.006 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```

