Table des matières
Requêtes amusantes
Multiplier le nombre de lignes d'une table
Cette requête permet de multiplier le nombre d'enregistrements d'une table en fonction d'un multiplicateur de cette même table. Dans l'exemple suivant, on ne pourra pas générer plus de 9 lignes. Il suffit d'augmenter le nombre de UNION pour pouvoir générer plus d'enregistrements.
SELECT id , multiplier FROM <table> , ( SELECT 0 AS `rank` UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) AS multiplier WHERE multiplier.`rank` < <table>.multiplier
Il est possible de se passer des UNION en remplaçant la sous-requête par une table contenant les nombres de 0 à n.
SELECT id , multiplier FROM <table> , multiplier WHERE multiplier.`rank` < <table>.multiplier
Trier des numéros de version
Cette requête permet de trier des numéros de versions (5, 4.1, 3.2.5, …) entre eux.
SELECT version , @version := IF(LOCATE('.',version) = 0, CONCAT(version, '.0.0'), version) -- Ajoute les versions mineure et hotfix quand on a qu'une version majeure , @version := IF(@version REGEXP '^.+\..+\..+$' = 1, @version , CONCAT(@version, '.0')) -- Ajoute la version hotfix quand on a qu'une version mineure , CONCAT( LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(@version, '.', 1), '.', -1), 10, '0'), -- Extrait la version majeure et la préfixe avec des 0 LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(@version, '.', 2), '.', -1), 10, '0'), -- Extrait la version mineure et la préfixe avec des 0 LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(@version, '.', 3), '.', -1), 10, '0') -- Extrait la version hotfix et la préfixe avec des 0 ) AS concat FROM docs ORDER BY concat DESC
Limitations :
- Cette requête ne permet de gérer que des versions dont le format correspond au versionnage sémantique.
- Seules les versions ne contenant que des chiffres sont supportées.
- Les sections du numéro de version ne peuvent pas excéder 10 caractères.
Récupération des "trous" dans une séquence
Récupération sous la forme de plages d'identifiants
Cette requête ne permet pas de récupérer le premier “trou” de séquence si celui-ci commence au premier identifiant.
SELECT range_start , range_end FROM ( SELECT @rownum1 := @rownum1 + 1 AS rownum_end , table1.id - 1 AS range_end FROM <table> AS table1 JOIN (SELECT @rownum1 := 0) AS dummy LEFT JOIN <table> AS table2 ON table2.id = table1.id - 1 WHERE table2.id IS NULL AND table1.id <> (SELECT MIN(id) FROM <table>) ) AS e , ( SELECT @rownum2 := @rownum2 + 1 AS rownum_start , table1.id + 1 AS range_start FROM <table> AS table1 JOIN (SELECT @rownum2 := 0) AS dummy LEFT JOIN <table> AS table2 ON table2.id = table1.id + 1 WHERE table2.id IS NULL AND table1.id <> (SELECT MAX(id) FROM <table>) ) AS s WHERE rownum_end = rownum_start
Récupération de la liste complète des identifiants
SELECT dummy.`row` FROM ( SELECT @ROW := @ROW + 1 AS `row` FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS dummy1, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS dummy2, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS dummy3, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS dummy4, (SELECT @ROW := 0) numbers WHERE @ROW <= (SELECT MAX(id) FROM <table>) ) dummy LEFT JOIN <table> AS table1 ON table1.id = dummy.`row` WHERE table1.id IS NULL
Générer une liste de 1000 dates
Cette méthode peut être étendue pour générer plus de dates ou au contraire restreinte pour en générer moins. Dans l'exemple suivant, la date de départ sera la plus petite date, mais il est possible qu'elle devienne la plus grande en changeant le signe de l'opération. Pour que les dates soient ordonnées, la requête units doit impérativement être avant la requête tens qui elle même doit impérativement être avant la requête hundreds.
SELECT '2013-04-01' + INTERVAL (hundreds.val + tens.val + units.val) DAY AS DAY FROM ( SELECT 0 AS val UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) AS units CROSS JOIN ( SELECT 0 AS val UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90 ) AS tens CROSS JOIN ( SELECT 0 AS val UNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300 UNION ALL SELECT 400 UNION ALL SELECT 500 UNION ALL SELECT 600 UNION ALL SELECT 700 UNION ALL SELECT 800 UNION ALL SELECT 900 ) AS hundreds
Générer une liste de nombre
Cette requête permet de générer une liste de 10000 valeurs consécutives. Pour avoir plus de valeur, il faut ajouter une ligne identique aux lignes dummy
existantes.
SELECT @ROW := @ROW + 1 AS `row` FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS dummy1, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS dummy2, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS dummy3, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS dummy4, (SELECT @ROW := 0) numbers
Quine
Une quine est un programme sans entrée qui génère son propre code source.
SELECT REPLACE(REPLACE('SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine',CHAR(34),CHAR(39)),CHAR(36),'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine') AS Quine
Code ASCII | Caractère |
---|---|
34 | “ |
36 | $ |
39 | ' |