Opérateurs arithmétiques et chaînes de caractères
Opérations arithmétiques
On peut effectuer des opérations arithmétiques lors des requêtes.
Opérateur | Symbole |
---|---|
Addition | + |
Soustraction | - |
Multiplication | * |
Division | / |
Modulo | % |
On veut sélectionner le nombre d’heures par semaine de chaque cours, sachant qu'une session dure 15 semaines.
SELECT duree / 15 FROM Cours;
On peut utiliser des noms de colonne des deux côtés de l'opérateur.
erDiagram
cours {
INTEGER cours_id PK
NUMERIC(8) enseignant FK
CHAR(11) sigle
TINYINT duree "=60"
VARCHAR(255) nom
}
Recherche sur les chaînes de caractères
Pour rechercher simplement sur des chaînes de caractères (CHAR, VARCHAR) on utilise l’opérateur LIKE et les patterns de recherche.
Les patterns disposes de 3 caractères spéciaux :
- % : correspond à 0, 1 ou plusieurs caractères
- _ : correspond à 1 unique caractère
- \ : permet d’échapper les caractères % ou _
Attention
Rechercher sur un objet TEXT risque de prendre énormément de temps. C'est le type d'opération qu'on évite à moins d'y être contraint.
Rechercher tous les mots qui commencent par des:
- Pattern : des%
Rechercher des mots de 2 lettres terminant par e:
- Pattern : _e
Rechercher des mots terminant par le symbole %:
- Pattern : %\%
Exemple LIKE
On veut sélectionner les pondérations et le titre de toutes les évaluation comportant le mot « final » ou « finale »
SELECT ponderation, titre FROM evaluation
WHERE titre LIKE '%final%';
On peut utiliser des noms de colonne des deux côtés de l'opérateur.
erDiagram
evaluations {
INTEGER evaluation_id PK
INTEGER groupe_id FK
VARCHAR(64) titre
NUMERIC(4_1) ponderation
DATETIME date_passage
}
Expressions régulières (Regex)
Les patterns sont simples à utiliser, mais aussi limités. Pour faire une recherche plus avancée, on utilise les REGEX (Regular Expression).
Notez que l'utilisation des Regex peut devenir rapidement complexe. Pour vous aider à vous former, utilisez le site https://regexone.com/.
Pour introduire une REGEX en MySQL, on utilise la syntaxe suivante :
SELECT colonne FROM Table WHERE colonne RLIKE 'regex';
Rechercher un caractère
À moins qu'il s'agisse d'un caractère spécial, indiquez une lettre dans une REGEX permet de chercher celle-ci, n'importe où dans la chaîne.
Chaîne | Regex | Trouvé |
---|---|---|
abc | a | Oui |
cba | a | Oui |
abc | ab | Oui |
cba | ab | Non |
cba | ba | Oui |
abc | d | Non |
Début et fin
Pour indiquer le début d'une chaîne, on utilise le symbole ^, et pour la fin, le symbole $.
Chaîne | Regex | Trouvé |
---|---|---|
abc | ^a | Oui |
cba | a$ | Oui |
abc | ^bc | Non |
abc | ^ab$ | Non |
abc | ab$ | Non |
Répétitions
Les REGEX offrent 3 différents caractères spéciaux pour la répétition :
* : indique que le caractère peut s'y trouver 0, 1 ou plusieurs fois
? : indique que le caractère peut s'y trouver 0 ou 1 fois
+ : indique que le caractère doit s'y trouver au moins une fois (1 ou plusieurs)
Chaîne | Regex | Trouvé |
---|---|---|
abc | a* | Oui |
cba | a+ | Oui |
abc | b*c | Oui |
aac | b*c | Oui |
aac | a?c | Non |
Chaîne | Regex | Trouvé |
---|---|---|
aac | a+c | Oui |
bbc | a+c | Non |
aaaaaaaaaaaa | a* | Oui |
aaaaaaaaaaaa | a? | Non |
aaaaaaaaaaaa | a+ | Oui |
--- Exercice 2.3.1 ---
Écrivez les REGEX pour trouver les informations suivantes parmis les mots suivants :
chat
chaton
chatte
carotte
chalet
valet
animal
Utilisez le site Regex 101 pour vous aider.
A. Les mots contenant « chat » (3 mots)
B. Les mots commençant par « ch » (4 mots)
C. Les mots contenant un ou deux 2 « t » (6 mots)
D. Les mots finissant par « et » ou « e » (4 mots)
E. Les mots contenant « a » suivis de 1 ou plusieurs « t » (3 mots)
Répétitions (suite)
On peut aussi spécifier le nombre exacte de répétition recherché ou les mettre dans un intervalle. On utilise la notation {min, max} ou {nombre}. On peut omettre le max si l'on cherche au moins x caractères et omettre le min si l'on cherche au plus x caractères
Intervalle | Signification |
---|---|
{1, 3} | Entre 1 et 3 répétitions |
{4} | Exactement 4 répétitions |
{5,} | 5 répétitions et plus |
{,2} | Pas plus de 2 répétitions (équivalent à {0, 2}) |
{3,1} | Provoque une erreur |
Classes de caractères
On peut sélectionner tous les caractères compris entre deux caractères (au sens du code ASCII), dans un ordre quelconque avec les classes de caractères.
On indique une classe avec [min-max]. On peut juxtaposé des intervalles pour augmenter la portée de la classe.
Classe | Signification |
---|---|
[a-z] | N'importe quelle lettre minuscule |
[02468] | N'importe quel nombre pair |
[a-zA-Z] | N'importe quelle lettre majuscule ou minuscule |
[a-z-] | N'importe quelle lettre minuscule et le trait d'union (toujours à la fin !) |
[a-zA-Z0-9] | N'importe quelle lettre ou nombre |
[à-ÿ] | N'importe quelle lettre accentuée |
[à-ÿÀ-Ÿ] | N'importe quelle lettre accentuée majuscule ou minuscule |
[a-zà-ÿA-ZÀ-Ÿ0-9] | N'importe quelle lettre, nombre ou lettre accentuée |
Énoncé | REGEX |
---|---|
Un numéro de téléphone | [0-9]{3}-[0-9]{3}-[0-9]{4} |
Une séquence contenant entre 3 et 8 lettres | [a-zA-Z]{3,8} |
Un mot de 6 lettres commençant par h | ^h[a-z]{5}$ |
--- Exercice 2.3.2 ---
Écrivez les REGEX pour trouver les informations suivantes parmis les mots suivants :
chat
chaton
chatte
carotte
août
chalet
valet
animal
école
Utilisez le site Regex 101 pour vous aider.
A. Les mots de 4 lettres sans accent (1 mot)
B. Les mots débutant par « cha » et ayant au moins 5 lettres sans accent (3 mots)
C. Les mots qui contiennent au moins 3 voyelles sans accent. (2 mots)
D. Les mots qui contiennent un caractère accentué (2 mots)
Classes spéciales
Les REGEX définissent un certains nombres de classes et de caractères spéciaux.
Classe | Signification |
---|---|
\w | Tout caractère de mot (lettre et nombres) [a-zA-Z0-9_] |
\d | Tout nombre [0-9] |
\s | Espaces [\n\r\t ] |
\W \D \S | La négation de la classe associé à la minuscule |
Classes spéciales MySQL
Les REGEX dans MySQL définissent des classes spéciales qui leur sont propres. Pour les utiliser on les écrits entre crochets en utilisant la syntaxe suivante :
[:classe de caractere:]
Nom de la classe | Contenu |
---|---|
alnum | Caractères alphanumériques (comme \w sauf _) |
alpha | Caractères de l'alphabet |
space | Caractères d'espacement (semblable à \s) |
cntrl | Caractères de contrôles (comme tabulation ou retour à la ligne) |
digit | Caractères numériques (comme \d) |
lower, upper | Caractères alphabétiques minuscules ou majuscules |
Plus de classes : https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-syntax
Caractère spéciaux
Classe | Signification |
---|---|
. | N'importe quel caractère |
| | Opérateur ou |
^ | Opérateur de négation |
- | Trait d'union, doit toujours être à la fin d'une classe |
Par exemple [^ab] vérifie que ni « a » ni « b » apparaîssent.