Outils pour utilisateurs

Outils du site


informatique:databases:mysql:requetes_amusantes

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 '
informatique/databases/mysql/requetes_amusantes.txt · Dernière modification : 2024/11/21 18:54 de alexis