• Oracle-SQL语句的语法顺序和执行顺序


    SQL语句的语法顺序和执行顺序了,我们常见的SQL语法顺序如下:

    SELECT DISTINCT <Top Num> <select list>
    FROM [left_table]
    <join_type> JOIN <right_table>
    ON <join_condition>
    WHERE <where_condition>
    GROUP BY <group_by_list>
    WITH <CUBE | RollUP>
    HAVING <having_condition>
    ORDER BY <order_by_list>

     

    而数据库引擎在执行SQL语句并不是从SELECT开始执行,而是从FROM开始,具体执行顺序如下(关键字前面的数字代表SQL执行的顺序步骤):

     

    (8)SELECT (9)DISTINCT (11)<Top Num> <select list>
    (1)FROM [left_table]
    (3)<join_type> JOIN <right_table>
    (2) ON <join_condition>
    (4)WHERE <where_condition>
    (5)GROUP BY <group_by_list>
    (6)WITH <CUBE | RollUP>
    (7)HAVING <having_condition>
    (10)ORDER BY <order_by_list>

     

    从上面可以看到SELECT在HAVING后才开始执行,这个时候SELECT后面列的别名只对后续的步骤生效,而对SELECT前面的步骤是无效的。所以如果你在WHERE,GROUP BY,或HAVING后面使用列的别名均会报错。

    我们举例测试一下。

    示例表Customers结构及数据如下:

     

    1、WHERE后面不使用别名的情况

    SELECT 
    姓名 AS Name,
    地址 AS Address,
    城市 AS City
    FROM Customers
    WHERE 城市='广州'

    结果如下:

     

    2、WHERE后面使用列别名的情况

    SELECT 
    姓名 AS Name,
    地址 AS Address,
    城市 AS City
    FROM Customers
    WHERE City='广州'

     

    执行结果如下:

     

     

    从返回的消息中我们可以看到,重命名后的City并不能被WHERE识别,所以才会报“列名'City'无效”的提示。

     

    其他关键字大家也可以使用上述方法进行测试,下面我们测试GROUP BY和HAVING后面使用列别名的情况。

     

    3、测试GROUP BY后使用列别名

    SELECT 
    城市 AS City
    FROM Customers
    GROUP BY City

    结果如下:

     

    4、测试HAVING后使用列别名

    SELECT 
    城市 AS City
    FROM Customers
    GROUP BY 城市
    HAVING COUNT(City)>1

    结果如下:

     

     

    注意:本文是以标准SQL来测试的,MySQL的HAVING 能使用列别名,是因为对此做了扩展,必须开启ONLY_FULL_GROUP_BY才可以。

     

    5、测试ORDER BY后面使用列别名

    SELECT 
    姓名 AS Name,
    地址 AS Address,
    城市 AS City
    FROM Customers
    ORDER BY City

     

    结果如下:

     

     

    从上面的几个测试示例的结果中,可以得出我们的结论是正确的:ORDER BY子句是唯一能重用列别名的一步。

  • 相关阅读:
    文件拖拽上传
    30天自制操作系统笔记(第三天)
    PAT 1040到底有几个pat
    pat 1039 到底买不买
    pat 1038 统计同成绩学生
    pat 乙级1034
    pat 乙级1022
    pat 乙级1009
    pat 乙级1008
    pat 乙级1002
  • 原文地址:https://www.cnblogs.com/Formulate0303/p/12991344.html
Copyright © 2020-2023  润新知