SQL1d.LID - Opérateurs exotiques

SIO > S1_Commun > . > S1C8_Donnees > sql1d_lid4_avance.md

Opérateurs et fonctions par thème

Effectuer des calculs dans SELECT, WHERE ou HAVING, c'est déjà connu, mais il existe des fonctions assez sympa pour encore faire plus de calculs et de manipulations de chaînes et dates ...

Voici les principaux opérateurs et fonctions (que j'ai décidé de conserver ...).

Opérateurs de calcul numérique

nom définition usage
DIV division entière 7 DIV 3 (=2)
MOD Modulo : Retourne le reste de la division entière 7 MOD 3 (=1)

Principales fonctions mathématiques

nom définition usage
ABS() retourne la valeur absolue d'un nombre ABS(-5) (=5)
FLOOR(), TOP() Retourne l'arrondi inférieur et supérieur à une valeur FLOOR(5.55), TOP(5.55) (=5, 6)
POW() calcule la puissance d'un nombre POW(2,3) (=8)
RAND() retourne un nombre aléatoire

Principales fonctions circulaires (géométrie) et logarithmiques

nom définition usage
COS(), SIN(), TAN(), COT() cosinus, sinus, tangeante et cotangeante d'un angle
ACOS(), ASIN(), ATAN() Arc cosinus, arc sinus et arc tangeante d'une valeur, renvoie l'angle
EXP(), LOG() ou LN() Fonction logarithmes

voir les liens chez [[https://docs.oracle.com/cd/B19306_01/server.102/b14200/operators.htm#i1039607 | Oracle]]{.ext} ou MySQL

Principales fonctions de dates

nom définition usage
CURDATE(), CURTIME(), NOW() retourne la date, l'heure courante et la (date & heure) courante
DATE_ADD(), DATE_SUB() Ajoute, retranche un interval spécifié à une date DATE_ADD(date,INTERVAL expr type)
avec expr un nombre et type le type de nombre (SECOND, DAY, YEAR, etc. ...). Idem pour date_sub()
DATEDIFF() Retourne la différence entre deux dates DATEDIFF(date1, date2) (=nbre de jours de différence, en plu ou en moins)
DAYOFWEEK(), DAYOFYEAR() retourne le n° du jour dans la semaine, dans l'année /!\ 1=dimanche aux US !
WEEK() retourne le n° de la semaine dans l'année

Principales fonctions de chaines et caractères

nom définition usage
CONCAT() concatène, assemble des chaines de caractères CONCAT('abc', 'def', 5) (='abcdef5')
SUBSTR() retourne la partie de la chaîne de la position de départ et pour la longueur indiquées SUBSTR(chaine, depart, longueur)
SUBSTR('abcdef', 2, 3) (='bcd' ; on commence à 1)
TRIM() enlève les espaces inutiles ' aaa ' => 'aaa'
LOWER(), UPPER() converti la chaine en minuscules, majuscules 'AbCd' => respectivement : 'abcd' et 'ABCD'
LENGTH() retourne le nombre de caractères de la chaîne LENGTH('abcdef') (=6)
CHAR_LENGTH() retourne le (vrai) nombre de caractères de la chaîne CHAR_LENGTH('abcdef') (=6)
Attention, selon le nombre d'octets utilisés pour le codage des caractères, LENGTH() peut être faux
IS test booléen (champ IS NULL; champ IS NOT NULL) Voir aussi IS_IPV4, IS_IPV6, ... qui sont intéressantes

Autres fonctions de chaines, pour le fun

nom définition usage
ASCII() retourne le code ascii de la plus part des caractères ASCII("a") (=41)
CHAR() retourne le caracter du code ascii donné char(41) => 'a'
LEFT(), RIGHT() retourne la partie gauche et droite d'une chaîne jusqu'à la position indiquée similaire à substr, on indique juste la position à garder : LEFT('abcdefg', 3) (='abc')
LOCATE() donne la position d'une sous-chaîne LOCATE(recherche, chaîne)
LOCATE('na', 'ananas') (=2, la 1ère occurrence trouvée)
REPLACE() remplace une sous-chaine par un autre REPLACE('bibobu', 'b', 'B') (='BiBoBu')
REVERSE() inverse les caractères d'une chaîne ... nuf el ruop tnemiarv
SHA(), SHA1() chiffre une chaine selon l'algoithme SHA 160bits Utile pour les mots de passe si ce n'est pas fait dans le code du script.

Usage d'un IF dans SELECT, WHERE ou HAVING

Ce IF sert à faire des comparaison et produire un résultat qui ira, par exemple, dans une colonne.
Ca peut être sympa de faire des tests et de fournir une valeur conditionnée.
Il s'utilise comme si on était dans un tableur.
IF(expr1, expr2, expr3) : Si expr1 est vraie (TRUE) c'est à dire expr1 <> 0 et expr1 <> NULL, alors IF() retourne expr2. Sinon, elle retourne expr3.
IF() retourne une valeur numérique ou chaîne, selon le type de résultat de l'expression validée.
Voir aussi ce lien vers [[http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_if | MySQL]]{.ext}

 

Conclusion

Ca suffit, je crois. Mais nous sommes loin d'avoir épuisé toutes les possibilités du langage.
Pour preuve, voir les sites de tutos et références sur le SQL comme MySQL ou w3schools et encore bien d'autres (souvent en anglais - snif!).