精华内容
下载资源
问答
  • Oracle select语句执行顺序

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

    最近在公司实习刚好需要用到oracle,作为之前没有碰过oracle的我经常碰壁,而其中一个就是不是很了解其执行语句的顺序,导致经常出现以下“灵异”的现象,比如用group by进行分组,结果出现多个相同的组,最后才发现是因为我在select里使用了别名,而oracle的执行顺序是先执行group by再执行select,所以分完组的结果又被做了一次处理导致原本不同的组最后展现出来变成一样的。为了避免这种情况再次发生,查了些做了,并用自己的话写处理以使自己能够更好的理解相关的东西。

    在oracle中select语句的基本结构如下:

    [ WITH <common_table_expression>]
    SELECT [DISTINCT] [TOP_SEPCIFICATION] <select_list> 
    [ INTO new_table ]
    FROM 
    <table_source| 
    <table_left> [JOIN_TYPE] JOIN <table_right> 
    ON <join_condition> >
    [ WHERE <search_condition> ]
    [ GROUP BY <group_by_list> ]
    [ HAVING <search_condition> ]
    [ ORDER BY order_expression [ ASC | DESC ] ]
    

    其中[]中的部分为可选内容,另外其中的
    [ WITH <common_table_expression>]
    语句是用于添加其他sql行为的,例如你可以写成
    create <newtablename> as
    来创建一个以之后的select语句检索到的内容为表内容的新表。
    而除此之外其他部分的执行顺序如下所示:
    (1)执行FROM语句,如果FROM之后接的是一个表则执行步骤(4),如果接的是一个JOIN语句则执行步骤(2);
    (2)执行ON语句对ON之前的JOIN语句中两个表进行裁剪(这样可以避免直接进行JOIN得到全表的笛卡尔积而造成空间和时间的浪费);
    (3)对(2)中裁剪得到的两张表进行JOIN操作,得到一张联合的表.如果之后还有其他JOIN语句则将得到的表作为table_left继续进行步骤(2)的操作,否则进行步骤(4);
    (4)执行WHERE语句,根据search_condition对之前步骤得到的表进行筛选;
    (5)执行GROUP BY语句按照group_by_list对数据进行分组;
    (6)执行HAVING语句对用GROUP BY 分组后的数据进行筛选,HAVING跟WHERE语句的区别在于WHERE一般用于对FROM语句得到的数据进行筛选,其中的筛选条件不能是聚合函数,而HAVING一般用于对GROUP BY语句处理后的数据进行筛选,可以使用聚合函数作为判断条件;
    (7)执行SELECT语句,对查询到的字段进行组织;
    (8)使用DISTINCT对结果去重;
    (9)使用ORDER BY 语句对结果进行排序;
    (10)使用TOP指定要顺畅前几行的数据。

    展开全文
  • 如果是对MySQL整个表数据导出,可以参照文章:http://www.crazyant.net/1355.html然而也会遇到的场景是,需要执行一个SQL语句,然后将SQL语句结果输出到文件;方法一:使用MySQL的select * into outfile ‘/tmp/rs...

    如果是对MySQL整个表数据导出,可以参照文章:http://www.crazyant.net/1355.html

    然而也会遇到的场景是,需要执行一个SQL语句,然后将SQL语句的结果输出到文件;

    方法一:使用MySQL的select * into outfile ‘/tmp/rs.txt’ from tb_name句型

    这是个不可行的方法;

    举个例子,执行以下的SQL语句:

    这个SQL总会报出下面的错误:

    原因是这个语句并不是在MySQL客户端,而是在MySQL的服务器上执行的,通常用于服务器管理员在服务器机器上进行数据备份使用,由于MySQL客户端账号并没有访问服务器机器本身的权限,所以这个SQL执行不会成功。

    方法2:直接将SQL执行的结果重定向到文件即可

    执行下面的命令,能够将SQL语句执行的结果输出到文件:

    其中-Ne是执行这个SQL语句的选项,-N代表输出SQL语句执行结果中不带第一行的字段名称,-e表示要执行SQL语句;

    执行下面的命令,则可以执行SQL文件,并把结果输出到文件:

    新建一个文件,名称为runsql.sql,内容为:

    然后这样执行命令:

    其中-N命令仍然表示不输出表头字段说明(第一行),小于号表示输入重定向,runsql.sql的文件内容会被发送给mysql的命令,大于号则表示输出重定向,会将命令执行的结果输出到文件;


    导出csv文件,逗号分隔符:

    1
    mysql - h10 . 10.10.10 - ucrazyant - p123456 - P3306 - N < runsql . sql | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > / tmp / rs . txt

    总结:

    • select into outfile只能在MySQL服务器上执行,客户端上无法执行;
    • mysql -Ne “sql” > rs.txt可以将SQL语句执行后输出为文件
    • mysql -N < runsql.sql > rs.txt可以执行sql文件中的内容,然后将结果输出到文件;
    • mysql -N的选项,表示输出时不带表头
    展开全文
  • 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,并返回给调用者。
    
    展开全文
  • mysql_query()执行select语句,无论能否查询到结果,好像返回值是一样的。如果这样的话,我怎样才能知道有没有查询到结果呢?
  • 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 = '陈哈哈'


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

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

    展开全文
  • MySQL中一条SELECT语句是如何执行

    千次阅读 2019-08-06 09:50:25
    查询操作是关系数据库中使用最为频繁的操作,也是构成其他SQL语句(如DELETE、UPDATE)的基础。 SELECT语法如下 (5)SELECT DISTINCT <select_list> (1)FROM <left_table> <join_type> JOIN <...
  • C# 使用MySQL 执行SELECT语句时没有数据,但是语句拷贝到NaviCat执行可以查出来,什么原因。 语句为: SELECT * FROM TABLE1 WHERE NAME = "小红" C#选不出来但是进NAVIcat里面执行是有的 有些值能选...
  • PHP PDO select语句结果行数计算

    千次阅读 2014-08-09 20:23:11
    PHP PDO select语句结果行数计算 November 12, 2012PHPPHPopenwares PDO有一个函数PDOStatement::rowCount返回上一个SQL语句影响的行数。...rowCount函数对于DELETE, INSERT, ...有些数据库在执行select语句时会
  • select语句执行流程(MySql)

    千次阅读 2019-08-16 00:42:13
    以一条select语句为例:select * from T where ID=4 ,梳理下执行的流程 一条sql语句在执行过程中需要经过连接器、分析器、优化器、执行器等,也有可能会经过查询缓存,如图所示 连接器 想要连接数据库那么必须是...
  • 一文搞懂MySQL的分层架构和select语句在MySQL中的执行流程!
  • SQL的select语句完整的执行顺序

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

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

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

    千次阅读 2015-07-07 11:51:03
    问题:oracle执行select语句需要commit吗?  只要不是对数据库数据的更新修改操作,一般情况下不要commit。 但是在dblink的情况下,如果没有commit,有可能会造成ora-1000错误,open cursor too many.   --答案...
  • SQL 的select 语句完整的执行顺序

    千次阅读 2018-08-05 18:34:28
    SQL Select 语句完整的执行顺序:  1、from 子句组装来自不同数据源的数据;  2、where 子句基于指定的条件对记录行进行筛选;  3、group by 子句将数据划分为多个分组;  4、使用聚集函数进行计算;  5、使用...
  • 今天把这几天做的练习复习了一下,不知道自己写得代码执行的效率如何以及要如何提高,于是乎上网开始研究一些材料,现整理如下: ...以下是sql语句执行步骤:  1)语法分析,分析语句的语法是
  • SQL Select语句完整的执行顺序:

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

    千次阅读 2012-04-13 09:38:42
    用ExecuteScalar()方法执行SELECT语句,返回单个值,并且忽略其他的任何读取的结果。ExecuteScalar()方法返回的结果是一个object对象。 ExecuteScalar()主要是用来执行SELECT语句,或者执行包括聚合函数的SQL语句。...
  • 1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户...那它们是按什么顺序执行呢?分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字
  • mysql中使用execute语句如下 prepare stmt from 'select sum(cig_cnt) ...而直接执行select sum(cig_cnt) from cigstrinf where cig_type = '红南京'; 能够得到正确的结果22 不明白为什么会出现如此的情况,请赐教!
  • 关于sql和MySQL的语句执行顺序(必看!!!)

    万次阅读 多人点赞 2016-03-29 12:15:09
    目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序: sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。 一、sql执行顺序 (1)from (3)...
  • UNION 操作符用于合并两个或多个 SELECT 语句结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。 SQL UNION 语法 ...
  • SELECT语句逻辑执行顺序,你知道吗?

    千次阅读 多人点赞 2014-04-23 00:29:51
    这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的SQL编写,排忧及优化上会有很大的帮助。它不是一个复杂的知识点,但是一个非常基础的SQL...
  • UNION 操作符用于合并两个或多个 SELECT 语句结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。 SQL UNION 语法 ...
  • 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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 762,774
精华内容 305,109
关键字:

select语句执行结果是什么