Formateur SQL MySQL

Collez une requête MySQL — y compris une copiée directement depuis les logs de l'application avec les marqueurs ? encore dedans — et obtenez du SQL lisible et formaté de façon cohérente. Les identifiants entre accents graves et les fonctions propres à MySQL sont préservés.

Une requête MySQL, avant et après

La requête non formatée ci-dessous est l'exemple chargé dans l'éditeur plus haut, et la sortie est exactement ce que ce formateur en renvoie avec les options par défaut. Rien n'a été retouché à la main.

Collé
SELECT `u`.`id`, `u`.`name`, count(o.id) AS orders, sum(o.total) AS revenue FROM `users` `u` LEFT JOIN `orders` `o` ON o.user_id = u.id WHERE u.created_at >= ? AND u.status = ? AND o.region IN (?) GROUP BY u.id, u.name HAVING sum(o.total) > ? ORDER BY revenue DESC LIMIT 50
Sortie formatée
SELECT
  `u`.`id`,
  `u`.`name`,
  count(o.id) AS orders,
  sum(o.total) AS revenue
FROM
  `users` `u`
  LEFT JOIN `orders` `o` ON o.user_id = u.id
WHERE
  u.created_at >= ?
  AND u.status = ?
  AND o.region IN (?)
GROUP BY
  u.id,
  u.name
HAVING
  sum(o.total) > ?
ORDER BY
  revenue DESC
LIMIT
  50

La syntaxe MySQL qu'il gère

Un formateur générique massacre la syntaxe propre au dialecte ou la refuse tout net. Voici les constructions MySQL contre lesquelles ce formateur est testé.

?

Les marqueurs positionnels sont regroupés par la colonne et l'opérateur auxquels ils se rattachent, si bien qu'une colonne comparée deux fois n'est remplie qu'une seule fois.

`identifier`

Les identifiants entre accents graves conservent leurs quotes et leur casse.

ON DUPLICATE KEY UPDATE

Les clauses d'instruction propres à MySQL sont formatées au lieu d'être transmises comme un bloc opaque.

STRAIGHT_JOIN

Les hints de jointure et d'index MySQL sont préservés à leur place.

FAQ du formateur MySQL

Puis-je coller une requête avec des marqueurs ? directement depuis mes logs ?

Oui. C'est le cas courant. Les marqueurs ? sont détectés et regroupés par la colonne à laquelle ils sont comparés, si bien qu'une colonne répétée n'est remplie qu'une fois. Vous pouvez ensuite basculer la sortie en SQL rempli pour obtenir une requête exécutable.

Est-ce que ça marche aussi pour MariaDB ?

Oui — choisissez MariaDB dans la liste des dialectes pour les mots-clés propres à MariaDB, ou utilisez MySQL, qui couvre la syntaxe commune.

La casse des identifiants entre accents graves est-elle préservée ?

Oui. La casse des mots-clés et celle des identifiants sont deux options distinctes : vous pouvez mettre SELECT et JOIN en majuscules pendant qu'une colonne comme userProfile garde son camelCase. Cela compte davantage sous MySQL qu'ailleurs, car la sensibilité à la casse des noms de tables dépend du système de fichiers du serveur.

Peut-il minifier une requête MySQL sur une seule ligne ?

Oui. La minification compacte la requête pour la recoller dans le code applicatif, et elle ne réécrit jamais les espaces à l'intérieur d'un littéral de chaîne — une comparaison avec une valeur contenant deux espaces renvoie toujours les mêmes lignes après minification.

Formate-t-il un fragment tiré d'une ligne de log ?

Oui. Une requête partielle — ou un simple WHERE u.created_at >= ? AND u.status = ? — est formatée et rendue modifiable sans le SELECT qui l'entoure. C'est la forme habituelle des sorties du slow query log et du log général de MySQL, donc précisément le cas pour lequel ce formateur est conçu.

ON DUPLICATE KEY UPDATE et les indications d'index sont-ils gérés ?

Oui. Les clauses propres à MySQL sont formatées comme de vraies clauses au lieu d'être recopiées en bloc non formaté, et les indications de jointure ou d'index comme STRAIGHT_JOIN et FORCE INDEX restent collées à la table qu'elles qualifient.