您的当前位置:首页正文

SQL中关键字的执行顺序

2023-11-09 来源:骅佗教育

作为一个SQL新手,看到每种不熟悉的关键字时已经够迷茫了,可往往见到的语句关键字顺序还是各种各样,太难理解了。网上搜索了两篇文章,总结一下:

关于Sql关键字SELECT FROM GROUP ORDER 等的执行顺序问题的解释

SQL 中 SELECT 语句的执行顺序

以及 十步完全理解SQL 的第二步.

总结:

标准的 SQL 的解析顺序为:   (1).FROM 子句, 组装来自不同数据源的数据

  • 包括各种JOIN和ON
  •    (2).WHERE 子句, 基于指定的条件对记录进行筛选   (3).GROUP BY 子句, 将数据划分为多个分组

  •  包括使用聚合函数进行计算
  •    (4).使用 HAVING 子句筛选分组   (5).SELECT 选取最终结果的部分列   (6).使用 ORDER BY 对结果集进行排序

     

    SQL中关键字的执行顺序

    标签:

    小编还为您整理了以下内容,可能对您也有帮助:

    sql语句执行顺序 sql语言特点有哪些

    Sql语言,是结构化查询语言(Structured Query Language)的简称。Sql 语句的一个基本执行顺序,总结一下就是:from-where-groupby-having-select-orderby-limit。

    sql语句执行顺序

    Sql语言,是结构化查询语言(Structured Query Language)的简称。Sql 语句的一个基本执行顺序,总结一下就是:from-where-groupby-having-select-orderby-limit。

    SQL Select语句完整具体的执行顺序:

    from子句组装来自不同数据源的数据;

    where子句基于指定的条件对记录行进行筛选;

    group by子句将数据划分为多个分组;

    使用聚集函数进行计算;

    使用having子句筛选分组;

    计算所有的表达式;

    select 的字段;

    使用order by对结果集进行排序。

    SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在SQL语句中,第一个被处理的子句式FROM,而不是第一出现的SELECT。

    sql语言特点有哪些

    一体化:SQL集数据定义DDL、数据操纵DML和数据控制DCL于一体,可以完成数据库中的全部工作。

    使用方式灵活:它具有两种使用方式,即可以直接以命令方式交互使用;也可以嵌入使用,嵌入到C、C++、FORTRAN、COBOL、JAVA等主语言中使用。

    非过程化"只提操作要求,不必描述操作步骤,也不需要导航。使用时只需要告诉计算机“做什么”,而不需要告诉它“怎么做”。

    语言简洁,语法简单,好学好用.ANSI标准中,只包含了94个英文单词,核心功能只用6个动词,语法接近英语口语。

    sql执行顺序

    我们先执行from,join来确定表之间的连接关系,得到初步的数据where对数据进行普通的初步的筛选group by 分组各组。

    电脑:华为MateBook14

    系统:Windows10

    软件:本地设置1.0MySql数据库

    1、from

    先确定从哪个表中取数据,所以最先执行from tab。存在多表连接,from tab1,tab2。可以对表加别名,方便后面的引用。

    2、where

    where语句是对条件加以限定,如果没有需要限定的,那就写成where 1=1,表示总为true,无附加条件。

    3、group by……having

    分组语句,比如按照员工姓名分组,要就行分组的字段,必须出现在select中,否则就会报错。having是和group by配合使用的,用来作条件限定,下面写个例子。

    4、聚合函数

    常用的聚合函数有max,min,count,sum,聚合函数的执行在group by之后,having之前。如果在where中写聚合函数,就会出错。

    5、select语句

    选出要查找的字段,如果全选可以select *。这里选出员工姓名,所有月份的总工资数。

    6、order by

    排序语句,默认为升序排列。如果要降序排列,就写成order by  desc。order by语句在最后执行,只有select选出要查找的字段,才能进行排序。

    SQL执行顺序

    查询语句中select from where group by having order by的执行顺序

    1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 

    select--from--where--group by--having--order by 

    其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 

    与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行 

    from--where--group by--having--select--order by, 

    from:需要从哪个数据表检索数据 

    where:过滤表中数据的条件 

    group by:如何将上面过滤出的数据分组 

    having:对上面已经分组的数据进行过滤的条件  

    select:查看结果集中的哪个列,或列的计算结果 

    order by :按照什么样的顺序来查看返回的数据

    2.from后面的表关联,是自右向左解析的 

    而where条件的解析顺序是自下而上的。 

    也就是说,在写SQL文的时候,尽量把数据量大的表放在最右边来进行关联, 

    而把能筛选出大量数据的条件放在where语句的最下面。

    SQL Select语句完整的 执行顺序 【从DBMS使用者角度】:

    1、from子句组装来自不同数据源的数据;

    2、where子句基于指定的条件对记录行进行筛选;

    3、group by子句将数据划分为多个分组;

    4、使用聚集函数进行计算;

    5、使用having子句筛选分组;

    6、计算所有的表达式;

    7、使用order by对结果集进行排序 。

    from 子句--执行顺序为从后往前、从右到左

    表名(最后面的那个表名为驱动表,执行顺序为从后往前, 所以数据量较少的表尽量放后)

    oracle 的解析器按照从右到左的顺序处理,FROM 子句中的表名,FROM 子句中写在最后的表(基础表 driving

    table)将被最先处理,即最后的表为驱动表,在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3

    个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指被其他表所引用的表

    多表连接时,使用表的别名并把别名前缀于每个Column上。可以减少解析的时间并减少那些由Column 歧义引起的语法错误.

    where子句--执行顺序为自下而上、从右到左

    ORACLE 采用自下而上从右到左的顺序解析Where 子句,根据这个原理,表之间的连接必须写在其他Where 条件之前, 可以过滤掉最大数量记录的条件必须写在Where 子句的末尾。

    group by--执行顺序从左往右分组

    提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。即在GROUP BY前使用WHERE来过虑,而尽量避免GROUP BY后再HAVING过滤。

    having 子句----很耗资源,尽量少用

    避免使用HAVING 子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作.

    如果能通过Where 子句在GROUP BY前记录的数目,那就能减少这方面的开销.

    (非oracle 中)on、where、having 这三个都可以加条件的子句中,on 是最先执行,where 次之,having 最后,因为on 是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,

    where 也应该比having 快点的,因为它过滤数据后才进行sum,在两个表联接时才用on 的,所以在一个表的时候,就剩下where 跟having比较了。

    在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where 可以使用rushmore 技术,而having 就不能,在速度上后者要慢。

    如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,where 的作用时间是在计算之前就完成的,而having 就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。

    在多表联接查询时,on 比where 更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where 进行过滤,然后再计算,计算完后再由having 进行过滤。

    由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里。

    select子句--少用*号,尽量取字段名称 。

    ORACLE 在解析的过程中, 会将依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 使用列名意味着将减少消耗时间。

    sql 语句用大写的;因为 oracle 总是先解析 sql 语句,把小写的字母转换成大写的再执行

    order by子句--执行顺序为从左到右排序,很耗资源

    SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

    SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

    先进行分组处理。

    Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by。

    首先where将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数)

    然后通过Group By关键字后面指定的分组条件将筛选得到的检视进行分组

    接着系统根据Having关键字后面指定的筛选条件,将分组检视后不满足条件的记录筛选掉

    最后按照Order By语句对检视进行排序,这样最终的结果就产生了。

    在这四个关键字中,只有在Order By语句中才可以使用最终检视的列名,如:

    SELECT FruitName, ProctPlace, Price, ID AS IDE, Discount

    FROM T_TEST_FRUITINFO

    WHERE (ProctPlace = N'china')

    ORDER BY IDE

    这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE。

    SQL语句中,有group by 和order by两个语句,是先分组还是先排序?

    肯定是group by先

    order by优先顺序最低,在最后

    group by 语句执行后记录会按关键字自动升序?

    不一定,group by只负责分组。

    VF 中先排序order by还是先分组 group by

    这是需要看题上的要求,要求要分组才分组,要求要排序才排序的,并不是每道题两个都同时需要

    sql语句中 order by 排序原则

    ORDER BY这个指令来达到我们的目的。

    ORDER BY 的语法如下:

    SELECT "栏位名"

    FROM "表格名"

    [WHERE "条件"]

    ORDER BY "栏位名" [ASC, DESC]

    [] 代表 WHERE 是一定需要的。不过,如果 WHERE 子句存在的话,它是在 ORDER BY 子句之前。 ASC 代表结果会以由小往大的顺序列出,而 DESC 代表结果会以由大往小的顺序列出。如果两者皆没有被写出的话,那我们就会用 ASC。

    我们可以照好几个不同的栏位来排顺序。在这个情况下, ORDER BY 子句的语法如下(假设有两个栏位):

    ORDER BY "栏位一" [ASC, DESC], "栏位二" [ASC, DESC]

    若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据 "栏位一" 由小往大排。若有好几笔资料 "栏位一" 的值相等,那这几笔资料就依据 "栏位二" 由小往大排。

    select-sql 语句中,筛选用(?)子句,分组用group by 子句,排序用order by 子句

    筛选用

    where 子句

    比如

    select * from sutdent where 年龄=20

    这就是根据年龄这个条件进行筛选

    oracle sql语句中 先执行where还是order by

    where 里面条件 and 是先执行 and 前面 还是后面条件这个其实和你写的顺序不大,这个先后顺序,是资料库来根据表/索引的资讯来决定的。例如一个 学生表, 有学号,姓名,性别其中 学号是主键, 姓名上面有个索引。 找 名字叫 强妹 的女生: SELECT * FROM 学生 WHERE 姓名='强妹' AND 性别 = '女' 与 SELECT * FROM 学生 WHERE 性别 = '女' AND 姓名='强妹' 资料库在处理 SQL 以前,都会去分析, 发现 查询的条件中, 姓名上面有索引,而性别上面没有。 那么优先根据 姓名的条件, 去检索,然后再去把通过索引得到的资料,去筛选 性别=女的比如表里面共有10000行。姓名叫 '强妹' 的只有一个。那么通过索引,一步就定位到那一行。然后再判断这一行资料的 性别栏位, 是不是 = '女' 假如 姓名/性别 都没有索引呢?那就是执行 全表扫描。不分先后。什么意思呢?就是假如 表里面10000行资料。那就是从第一行开始, 检视 姓名与性别 条件。 满足的返回。 不满足的丢弃。 直到100行都处理完。并不是一口气把所有的资料,都放到记忆体里面,然后 姓名判断一次, 去掉部分, 性别判断一次,再去掉部分。 蓝屏

    sql语句中的where语句和order by语句,哪个语句先执行

    ④SELECT [DISTINCT] * | 列 [别名],列 [别名],……

    ①FROM 表名称 [别名],表名称 [别名],……

    ②[WHERE 限定条件]

    ③[GROUP BY 分组栏位,[分组栏位,分组栏位……]]

    ⑤[ORDER BY 排序列名 [ASC|DESC],排序列名 [ASC|DESC],……]

    where先执行:SQL语句执行顺序:SELECTFROM--1WHERE--2GROUPBY--3HAVING--4ORDERBY--5

    where先执行,然后对筛出来的结果再排序。

    如果不先按where查出来的结果再排序,那先排序出来的结果有什么意义呢。