Maison >base de données >tutoriel mysql >Pourquoi ne puis-je pas utiliser d'alias de colonne dans la même instruction SELECT ?

Pourquoi ne puis-je pas utiliser d'alias de colonne dans la même instruction SELECT ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-14 08:16:43672parcourir

Why Can't I Use Column Aliases in the Same SELECT Statement?

Explication selon laquelle les alias de colonnes dans les requêtes SQL ne peuvent pas être réutilisés dans la même instruction SELECT

Dans la requête SQL donnée, essayez d'utiliser des alias de colonne (avg_time et cnt) dans une expression (ROUND(avg_time * cnt, 2)) après l'instruction SELECT. Cependant, cela génère une erreur car l'alias de colonne n'est pas accessible dans les expressions SELECT suivantes.

Cette limitation résulte de l'ordre dans lequel le moteur SQL traite les requêtes. L'instruction SELECT est exécutée en premier et des alias sont créés au cours de cette phase. Cependant, les expressions suivantes sont traitées ultérieurement, auquel cas l'alias n'est pas encore défini.

Solution : Utiliser la sous-requête

Pour contourner cette limitation, des sous-requêtes peuvent être utilisées. Une sous-requête est une requête distincte intégrée dans une autre requête. Dans ce cas, vous pouvez utiliser des sous-requêtes pour créer des alias, puis y accéder dans la requête externe.

La requête suivante utilise une sous-requête pour encapsuler la requête d'origine et rendre les alias de colonnes disponibles dans la couche externe :

<code class="language-sql">SELECT stddev_time, max_time, avg_time, min_time, cnt, ROUND(avg_time * cnt, 2) as slowdown
FROM (
        SELECT 
            COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
            MAX(time) as max_time, 
            ROUND(AVG(time), 2) as avg_time, 
            MIN(time) as min_time, 
            COUNT(path) as cnt, 
            path
        FROM 
            loadtime
        GROUP BY
            path
        ORDER BY
            avg_time DESC
        LIMIT 10
   ) X;</code>

Dans cette requête, la sous-requête (entre parenthèses) crée les alias de colonne stddev_time, max_time, avg_time, min_time et cnt. La requête externe sélectionne ensuite les colonnes de la sous-requête, y compris l'alias avg_time, qui est utilisé dans l'expression ROUND(avg_time * cnt, 2) sans rencontrer d'erreurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn