如何以及何时在我的 SQL 语句中使用别名

Man*_*265 5 mysql alias

我有一个查询,我在其中进行了一些计算,然后为该列指定了别名。在下一列中,我想在 IF 语句中使用该计算的结果。当我将别名用作条件时,MySQL 无法识别它,而是要求我重写整个查询,在它周围放置一些括号,然后执行条件检查。
这是 SQL 查询:

SELECT StudentId
    ,SubjectID
    , (COUNT(StudentId) / (
        SELECT COUNT(SubjectID) 
        FROM lectureattendancein 
        WHERE SubjectID ='MIS4' ) * 100) AS Percentage
    , IF((COUNT(StudentId) / (
        SELECT  COUNT(SubjectID) 
        FROM lectureattendancein  
        WHERE SubjectID ='MIS4' 
        )* 100) >= 80, 'ALLOWED', 'NOT ALLOWED') AS ExamAdmit
FROM attendancein 
GROUP BY StudentId, SubjectID 
HAVING SubjectID='MIS4' 
ORDER BY StudentId ASC
Run Code Online (Sandbox Code Playgroud)

我想在 IF 语句中使用名为Percentage的列别名

Han*_*non 5

结构化查询语言是一种声明性语言。声明性语言不告诉计算机如何运行,它们只是描述了所需的结果。这里的含义是别名只对结果很重要,对查询的执行并不重要。

由于 MySQL(和大多数其他 RDBMS)仅在查询完成应用别名,如果您尝试在另一列中使用别名,MySQL 会抱怨,因为它在查询完成之前实际上并不理解别名代表什么。


Len*_*art 5

除了@Max Vernons 的回答之外,SQL 查询评估的逻辑顺序是:

1. FROM / JOIN clause
2. WHERE clause
3. GROUP BY clause
4. HAVING clause
5a. SELECT clause
5b. Renamning (i.e. alias)
6. ORDER BY clause
Run Code Online (Sandbox Code Playgroud)

例如,您可以在子句中引用别名ORDER BY,但不能在GROUP BYorSELECT子句中引用别名。

一种可能性是嵌套您的查询:

SELECT StudentId
     , SubjectId
     , Percentage
     , CASE WHEN Percentage > 80 
            THEN 'ALLOWED' 
            ELSE 'NOT ALLOWED'
       END AS ExamAdmit
FROM (
    SELECT StudentId
         , SubjectID
         , (COUNT(StudentId) / (SELECT COUNT(SubjectID) 
                                FROM lectureattendancein 
                                WHERE SubjectID ='MIS4' ) * 100
           ) AS Percentage
    FROM attendancein 
    GROUP BY StudentId, SubjectID 
    HAVING SubjectID='MIS4'
) as t
ORDER BY StudentId ASC
Run Code Online (Sandbox Code Playgroud)

附带说明一下,DBMS 可以按照它认为合适的任何顺序评估查询,只要它保留逻辑评估的语义即可。