精华内容
下载资源
问答
  • SELECT语句定义: 一个完成的SELECT语句包含可选的几个子句。SELECT语句的定义如下:   <SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>]...

    SELECT语句定义:

     一个完成的SELECT语句包含可选的几个子句。SELECT语句的定义如下:
     
    <SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>]
    
     [<ORDER BY clause>] [<LIMIT clause>]   
    
     SELECT子句是必选的,其它子句如WHERE子句、GROUP BY子句等是可选的。
    
     一个SELECT语句中,子句的顺序是固定的。例如GROUP BY子句不会位于WHERE子句的前面。
    

    SELECT语句执行顺序

      SELECT语句中子句的执行顺序与SELECT语句中子句的输入顺序是不一样的,所以并不是从SELECT子句开始执行的,而是按照下面的顺序执行:
      
      开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果
    
      每个子句执行后都会产生一个中间结果,供接下来的子句使用,如果不存在某个子句,就跳过
    

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

    1、from子句组装来自不同数据源的数据; 
    
    2、where子句基于指定的条件对记录行进行筛选; 
    
    3、group by子句将数据划分为多个分组; 
    
    4、使用聚集函数进行计算; 
    
    5、使用having子句筛选分组; 
    
    6、计算所有的表达式; 
    
    7、select 的字段;
    
    8、使用order by对结果集进行排序。
    

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

    (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>
    
    (8) SELECT
    
    (9) DISTINCT
    
    (9) ORDER BY <order_by_list>
    
    (10) <TOP_specification> <select_list>
    

    以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

    逻辑查询处理阶段简介:

      1、 FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。
    
      2、 ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。
    
      3、 OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2,
          生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的
          表位置。
    
      4、 WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。
    
      5、 GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。
    
      6、 CUTE|ROLLUP:把超组插入VT5,生成VT6。
    
      7、 HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。
    
      8、 SELECT:处理SELECT列表,产生VT8。
    
      9、 DISTINCT:将重复的行从VT8中删除,产品VT9。
    
      10、ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10)。
    
        11、TOP:从VC10的开始处选择指定数量或比例的行,生成表TV11,并返回给调用者。
    
    展开全文
  • SQL 查询语句先执行 SELECT?兄弟你认真的么?

    万次阅读 多人点赞 2020-05-02 19:57:21
    SQL 查询的执行顺序是怎样的? 好像这个问题应该很好回答,毕竟自己已经写了无数个 SQL ...言归正传,SELECT语句的完整语法如下: 1. SELECT 2. DISTINCT <select_list> 3. FROM <left_table> 4....

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里

    SQL 查询的执行顺序是怎样的?

    好像这个问题应该很好回答,毕竟自己已经写了无数个 SQL 查询了,有一些还很复杂的。还装不了这个逼了?!

    但事实是,我仍然很难确切地说出它的顺序是怎样的。

    言归正传,SELECT语句的完整语法如下:

    1. SELECT 
    2. DISTINCT <select_list>
    3. FROM <left_table>
    4. <join_type> JOIN <right_table>
    5. ON <join_condition>
    6. WHERE <where_condition>
    7. GROUP BY <group_by_list>
    8. HAVING <having_condition>
    9. ORDER BY <order_by_condition>
    10.LIMIT <limit_number>

     

     

    然而其执行顺序却是:

    FROM
    <表名> # 笛卡尔积
    ON
    <筛选条件> # 对笛卡尔积的虚表进行筛选
    JOIN <join, left join, right join...> 
    <join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中
    WHERE
    <where条件> # 对上述虚表进行筛选
    GROUP BY
    <分组条件> # 分组
    <SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的
    HAVING
    <分组筛选> # 对分组后的结果进行聚合筛选
    SELECT
    <返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外
    DISTINCT
    # 数据除重
    ORDER BY
    <排序条件> # 排序
    LIMIT
    <行数限制>

    • 其实,引擎在执行上述每一步时,都会在内存中形成一张虚拟表,然后对虚拟表进行后续操作,并释放没用的虚拟表的内存,以此类推。

    具体解释:(注:下面“VT”表示 → 虚拟表 virtual )

    1.  from:select * from table_1, table_2; 与 select * from table_1 join table_2; 的结果一致,都是表示求笛卡尔积;用于直接计算两个表笛卡尔积,得到虚拟表VT1,这是所有select语句最先执行的操作,其他操作时在这个表上进行的,也就是from操作所完成的内容
    2. on: 从VT1表中筛选符合条件的数据,形成VT2表;
    3. join: 将该 join 类型的数据补充到VT2表中,例如 left join 会将左表的剩余数据添加到虚表VT2中,形成VT3表;若表的数量大于2,则会重复1-3步
    4. where: 执行筛选,(不能使用聚合函数)得到VT4表;
    5. group by: 对VT4表进行分组,得到VT5表;其后处理的语句,如select,having,所用到的列必须包含在group by条件中,没有出现的需要用聚合函数;
    6. having: 筛选分组后的数据,得到VT6表;
    7. select: 返回列得到VT7表;
    8. distinct: 用于去重得到VT8表;
    9. order by: 用于排序得到VT9表;
    10. limit: 返回需要的行数,得到VT10;

    需要注意的是:

    • group by条件中,每个列必须是有效列,不能是聚合函数;
    • null值也会作为一个分组返回;
    • 除了聚合函数,select子句中的列必须在group by条件中;


    上述内容让我们知道一个查询会返回什么,同时,也回答了以下这些问题:

    • 可以在 GRROUP BY 之后使用 WHERE 吗?(不行,GROUP BY 是在 WHERE 之后!)
    • 可以对窗口函数返回的结果进行过滤吗?(不行,窗口函数是 SELECT 语句里,而 SELECT 是在 WHERE 和 GROUP BY 之后)
    • 可以基于 GROUP BY 里的东西进行 ORDER BY 吗?(可以,ORDER BY 基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY)
    • LIMIT 是在什么时候执行?(在最后!)

    但是,数据库引擎并不一定严格按照这个顺序执行 SQL 查询,因为为了更快地执行查询,它们会做出一些优化,这些问题会在下方进行解释↓↓↓。


    SQL中的别名会影响SQL执行顺序么?

    如下方SQL所示:

    SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*)
    FROM table
    GROUP BY full_name

    从这个语句来看,好像 GROUP BY 是在 SELECT 之后执行的,因为它引用了 SELECT 中的一个别名。但实际上不一定要这样,数据库引擎会把查询重写成这样↓↓↓

    SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*)
    FROM table
    GROUP BY CONCAT(first_name, ' ', last_name)

    所以,这样 GROUP BY 仍然先执行。

    另外,数据库引擎还会做一系列检查,确保 SELECT 和 GROUP BY 中的东西是有效的,所以会在生成执行计划之前对查询做一次整体检查。

     

    数据库很可能不按正常顺序执行查询(优化)


    在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。

    这个查询说明了为什么需要以不同的顺序执行查询:

    SELECT * FROM
    dept d LEFT JOIN student s ON d.student_id = s.id
    WHERE s.name = '陈哈哈'


    如果只需要找出名字叫“陈哈哈”的学生信息,那就没必要对两张表的所有数据执行左连接,在连接之前先进行过滤,这样查询会快得多,而且对于这个查询来说,先执行过滤并不会改变查询结果。
     

    能看到这里的朋友都是有缘人了,为你的学习力点赞!希望大佬也能为小弟点赞支持一下哦!

    展开全文
  • SQL的select语句完整的执行顺序

    千次阅读 多人点赞 2020-07-15 10:17:49
    SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选...

    SQL Select语句完整的执行顺序:
    1、from子句组装来自不同数据源的数据;
    2、where子句基于指定的条件对记录行进行筛选;
    3、group by子句将数据划分为多个分组;
    4、使用聚集函数进行计算;
    5、使用having子句筛选分组;
    6、计算所有的表达式;
    7、select 的字段;
    8、使用order by对结果集进行排序。
    SQL 语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在 SQL 语句中,第一个被处理的子句式 FROM,而不是第一出现的 SELECT。SQL 查询处理的步骤序号:

    (1) FROM <left_table>
    (2) <join_type> JOIN <right_table>
    (3) ON <join_condition>
    (4) WHERE <where_condition>
    (5) GROUP BY <group_by_list>
    (6) WITH {CUBE | ROLLUP}
    (7) HAVING <having_condition>
    (8) SELECT
    (9) DISTINCT
    (9) ORDER BY <order_by_list>
    (10) <TOP_specification> <select_list>
    以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应
    用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,
    将跳过相应的步骤。
    逻辑查询处理阶段简介:
    1、 FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。
    2、 ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。
    3、 OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到
    匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的
    结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表位置。
    4、 WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。
    5、 GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。
    6、 CUTE|ROLLUP:把超组插入VT5,生成VT6。
    7、 HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。
    8、 SELECT:处理SELECT列表,产生VT8。
    9、 DISTINCT:将重复的行从VT8中删除,产品VT9。

    展开全文
  • SQL Select语句完整的执行顺序

    千次阅读 2018-01-14 14:34:20
    SQL Select语句完整的执行顺序:  1、from子句组装来自不同数据源的数据;  2、where子句基于指定的条件对记录行进行筛选;  3、group by子句将数据划分为多个分组;  4、使用聚集函数进行计算;  ...

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

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

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

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

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

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

    6、计算所有的表达式; 

    7、select 的字段;

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

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

    (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>

    (8) SELECT

    (9) DISTINCT

    (9) ORDER BY <order_by_list>

    (10) <TOP_specification> <select_list>

      以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

      逻辑查询处理阶段简介:

      1、 FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。

      2、 ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。

      3、 OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表位置。

      4、 WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。

      5、 GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。

      6、 CUTE|ROLLUP:把超组插入VT5,生成VT6。

      7、 HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。

      8、 SELECT:处理SELECT列表,产生VT8。

      9、 DISTINCT:将重复的行从VT8中删除,产品VT9。

      10、ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10)。

    11、TOP:从VC10的开始处选择指定数量或比例的行,生成表TV11,并返回给调用者。

    where子句中的条件书写顺序


    展开全文
  • SQL 的select 语句完整的执行顺序

    千次阅读 2018-08-05 18:34:28
    SQL Select 语句完整的执行顺序:  1、from 子句组装来自不同数据源的数据;  2、where 子句基于指定的条件对记录行进行筛选;  3、group by 子句将数据划分为多个分组;  4、使用聚集函数进行计算;  5、使用...
  • Oracle select语句执行顺序

    千次阅读 2016-08-21 20:34:35
    oracle select语句执行顺序及各部分功能详解
  • SQL Select语句完整的执行顺序:

    千次阅读 2016-02-04 15:40:08
    SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选...
  • MySQL中一条SELECT语句是如何执行

    千次阅读 2019-08-06 09:50:25
    查询操作是关系数据库中使用最为频繁的操作,也是构成其他SQL语句(如DELETE、UPDATE)的基础。 SELECT语法如下 (5)SELECT DISTINCT <select_list> (1)FROM <left_table> <join_type> JOIN <...
  • select语句完整语法及执行流程

    千次阅读 2018-10-24 22:58:54
    select语句完整语法及执行流程 select 目标表的列名或列表达式序列  from 基本表名和(或)视图序列  [where 行条件表达式]  [group by 列名序列]  [having 组条件表达式]  [order by 列名[asc | ...
  • select语句执行流程(MySql)

    千次阅读 2019-08-16 00:42:13
    以一条select语句为例:select * from T where ID=4 ,梳理下执行的流程 一条sql语句在执行过程中需要经过连接器、分析器、优化器、执行器等,也有可能会经过查询缓存,如图所示 连接器 想要连接数据库那么必须是...
  • 下面的语句无法正常执行 ``` select * from dev_work_time_table dwtt where dwtt.dates_type in (select initcap(to_char(to_date('2015-06-18 00:00:00','yyyy-mm-dd hh24:mi:ss'),'day','NLS_DATE_LANGUAGE = ...
  • select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚合函数返回每一个组的汇总信息。//分组一般都和聚合函数连用。 GROUP BY子句必须放到WHERE语句的之后 ,Group By与Order By都是对筛选后...
  • oracle执行select语句需要commit吗

    千次阅读 2015-07-07 11:51:03
    问题:oracle执行select语句需要commit吗?  只要不是对数据库数据的更新修改操作,一般情况下不要commit。 但是在dblink的情况下,如果没有commit,有可能会造成ora-1000错误,open cursor too many.   --答案...
  • C# 使用MySQL 执行SELECT语句时没有数据,但是语句拷贝到NaviCat执行可以查出来,什么原因。 语句为: SELECT * FROM TABLE1 WHERE NAME = "小红" C#选不出来但是进NAVIcat里面执行是有的 有些值能选...
  • 用ExecuteScalar()方法执行SELECT语句

    千次阅读 2012-04-13 09:38:42
    用ExecuteScalar()方法执行SELECT语句,返回单个值,并且忽略其他的任何读取的结果。ExecuteScalar()方法返回的结果是一个object对象。 ExecuteScalar()主要是用来执行SELECT语句,或者执行包括聚合函数的SQL语句。...
  • 一文搞懂MySQL的分层架构和select语句在MySQL中的执行流程!
  • SELECT语句逻辑执行顺序,你知道吗?

    千次阅读 多人点赞 2014-04-23 00:29:51
    MICROSOFT指出,SELECT语句的实际物理执行顺序可能会由于查询处理器的不同而与这个顺序有所出入。 几个示例 示例一 SELECT ID,COUNT(ID) AS TOTAL FROM STUDENT GROUP BY ID ...
  • 1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1或者:Insert into Table2 select * from Table1注意: (1)要求目标表Table2必须存在,并且字段...
  • 1.select 语句的语法顺序(数字为执行顺序) 5. select [字段列表] 1.from [表名] 2. where [条件] 3.group by [列] 4. having [筛选条件] 6.order by [列] 注: order by可以跟列的别名,其他子句不可以...
  • MySQL无法直接执行select into语句

    千次阅读 2017-09-11 18:06:41
     SQL语句select into语句在MySQL中执行是报错的。  SQL语句如下: select * into order_new from orders 报错如下: [SQL]select * into order_new from orders [Err] 1327 - Undeclar
  • ORCLE-Select 语句执行顺序以及如何提高Oracle 基本查询效率  今天把这几天做的练习复习了一下,不知道自己写得代码执行的效率如何以及要如何提高,于是乎上网开始研究一些材料,现整理如下:  ...
  • SELECT code, (SELECT company FROM apprai_code WHERE sj_code='sj_code1') FROM apprai_code_record WHERE code='code1' 这句代码的意思是查询apprai_code_record 表里当code='code1’的code值,同时查询apprai...
  • 如果是对MySQL整个表数据导出,可以参照文章:http://www.crazyant.net/1355.html然而也会遇到的场景是,需要执行一个SQL语句,然后将SQL语句的结果输出到文件;...举个例子,执行以下的SQL语句:1mysql -h10.10....
  • Oracle之SELECT语句

    千次阅读 2016-10-16 17:26:01
    1.SELECT语句select * from t_c11_dxmb;(1)SELECT关键字后面需要跟要查询的列名,如果要查询该表中的所有列,可以使用*来代替所有的列名,然后跟着FROM关键字,FROM关键字后面紧跟着要查找字段所在的表的表名,...
  • Mysql同时执行多个select语句——union

    万次阅读 热门讨论 2016-08-08 12:53:59
     今天小编在改bug的时候遇到一个既简单又让人头疼的问题,由于底层封装的执行sql语句的方法中没有合适我的,所以我只能在我的D层动手脚了…… 经验 下面来说说我今天的情况:  我们新建一个抽奖活动的时候需要...
  • SQL Select 语句 Select 和 Order by执行顺序是怎样的? 网上查了些,都说先执行Select 那为什么 Order by 可以对非Select 字段进行排序???? 栗子:select id,name from tb_student order by age
  • 1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);...分析器会语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字
  • mysql_query()执行select语句,无论能否查询到结果,好像返回值是一样的。如果这样的话,我怎样才能知道有没有查询到结果呢?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 761,882
精华内容 304,752
关键字:

select语句哪个先执行