精华内容
下载资源
问答
  • 程序时,着就会发现,怎么整个项目的SQL语句都分散到了,各个程序里头.. 感觉要是了问题,或是做修改,维护等是不是会比较麻烦呢,不知道各位朋友是如何来处理这个问题的...指教...
    在写程序时,写着写着就会发现,怎么整个项目的SQL语句都分散到了,各个程序里头..

    感觉要是出了问题,或是做修改,维护等是不是会比较麻烦呢,不知道各位朋友是如何来处理这个问题的...指教
    展开全文
  • SQL 查询语句先执行 SELECT?兄弟你认真么?

    万次阅读 多人点赞 2020-05-02 19:57:21
    好像这个问题应该很回答,毕竟自己已经了无数个 SQL 查询了,有一些还很复杂。还装不了这个逼了?! 但事实是,我仍然很难确切地说顺序是怎样的。 言归正传,SELECT语句的完整语法如下: 1. ...

    小伙伴想精准查找自己想看的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 开始。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”...好像这个问题应该很回答,毕竟自己已经了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说...
    6a2eee3f827fda30e84caccc2bb4a500.png

    很多 SQL 查询都是以 SELECT 开始的。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题,得出的结论是”窗口函数必须在 WHERE 和 GROUP BY 之后,所以不能”。于是我又想到了另一个问题:SQL 查询的执行顺序是怎样的?

    好像这个问题应该很好回答,毕竟自己已经写了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说出它的顺序是怎样的。

    SQL 查询的执行顺序

    于是我研究了一下,发现顺序大概是这样的。SELECT 并不是最先执行的,而是在第五个。

    75d3e38cef6189defceaa7c4680a6509.png

    这张图回答了以下这些问题

    这张图与 SQL 查询的语义有关,让你知道一个查询会返回什么,并回答了以下这些问题:

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

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

    所以:

    • 如果你想要知道一个查询语句是否合法,或者想要知道一个查询语句会返回什么,可以参考这张图;
    • 在涉及查询性能或者与索引有关的东西时,这张图就不适用了。

    混合因素:列别名

    有很多 SQL 实现允许你使用这样的语法:

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

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

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

    这样 GROUP BY 仍然先执行。

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

    数据库可能不按照这个顺序执行查询(优化)

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

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

    SELECT * FROMowners LEFT JOIN cats ON owners.id = cats.ownerWHERE cats.name = 'mr darcy'

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

    数据库引擎还会做出其他很多优化,按照不同的顺序执行查询,不过我并不是这方面的专家,所以这里就不多说了。

    LINQ 的查询以 FROM 开头

    LINQ(C#和 VB.NET 中的查询语法)是按照 FROM…WHERE…SELECT 的顺序来的。这里有一个 LINQ 查询例子:

    var teenAgerStudent = from s in studentList where s.Age > 12 && s.Age < 20 select s;

    pandas 中的查询也基本上是这样的,不过你不一定要按照这个顺序。我通常会像下面这样写 pandas 代码:

    df = thing1.join(thing2) # JOINdf = df[df.created_at > 1000] # WHEREdf = df.groupby('something', num_yes = ('yes', 'sum')) # GROUP BYdf = df[df.num_yes > 2] # HAVING, 对 GROUP BY 结果进行过滤df = df[['num_yes', 'something1', 'something']] # SELECT, 选择要显示的列df.sort_values('sometthing', ascending=True)[:30] # ORDER BY 和 LIMITdf[:30]

    这样写并不是因为 pandas 规定了这些规则,而是按照 JOIN/WHERE/GROUP BY/HAVING 这样的顺序来写代码会更有意义些。不过我经常会先写 WHERE 来改进性能,而且我想大多数数据库引擎也会这么做。

    R 语言里的 dplyr 也允许开发人员使用不同的语法编写 SQL 查询语句,用来查询 Postgre、MySQL 和 SQLite。

    展开全文
  • 经典SQL语句大全

    热门讨论 2014-12-20 12:00:30
    10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1...
  • 很多 SQL 查询都是以 SELECT 开始。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”...好像这个问题应该很回答,毕竟自己已经了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说...
    687560f48f8b0efe69bd347438328b8b.png

    很多 SQL 查询都是以 SELECT 开始的。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题,得出的结论是”窗口函数必须在 WHERE 和 GROUP BY 之后,所以不能”。于是我又想到了另一个问题:SQL 查询的执行顺序是怎样的?

    好像这个问题应该很好回答,毕竟自己已经写了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说出它的顺序是怎样的。

    SQL 查询的执行顺序

    于是我研究了一下,发现顺序大概是这样的。SELECT 并不是最先执行的,而是在第五个。

    82a228e13a6071534ea25a8328987817.png

    这张图回答了以下这些问题

    这张图与 SQL 查询的语义有关,让你知道一个查询会返回什么,并回答了以下这些问题:

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

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

    所以:

    • 如果你想要知道一个查询语句是否合法,或者想要知道一个查询语句会返回什么,可以参考这张图;
    • 在涉及查询性能或者与索引有关的东西时,这张图就不适用了。

    混合因素:列别名

    有很多 SQL 实现允许你使用这样的语法:

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

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

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

    这样 GROUP BY 仍然先执行。

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

    数据库可能不按照这个顺序执行查询(优化)

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

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

    SELECT * FROMowners LEFT JOIN cats ON owners.id = cats.ownerWHERE cats.name = 'mr darcy'

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

    数据库引擎还会做出其他很多优化,按照不同的顺序执行查询,不过我并不是这方面的专家,所以这里就不多说了。

    LINQ 的查询以 FROM 开头

    LINQ(C#和 VB.NET 中的查询语法)是按照 FROM…WHERE…SELECT 的顺序来的。这里有一个 LINQ 查询例子:

    var teenAgerStudent = from s in studentList where s.Age > 12 && s.Age < 20 select s;

    pandas 中的查询也基本上是这样的,不过你不一定要按照这个顺序。我通常会像下面这样写 pandas 代码:

    df = thing1.join(thing2) # JOINdf = df[df.created_at > 1000] # WHEREdf = df.groupby('something', num_yes = ('yes', 'sum')) # GROUP BYdf = df[df.num_yes > 2] # HAVING, 对 GROUP BY 结果进行过滤df = df[['num_yes', 'something1', 'something']] # SELECT, 选择要显示的列df.sort_values('sometthing', ascending=True)[:30] # ORDER BY 和 LIMITdf[:30]

    这样写并不是因为 pandas 规定了这些规则,而是按照 JOIN/WHERE/GROUP BY/HAVING 这样的顺序来写代码会更有意义些。不过我经常会先写 WHERE 来改进性能,而且我想大多数数据库引擎也会这么做。

    R 语言里的 dplyr 也允许开发人员使用不同的语法编写 SQL 查询语句,用来查询 Postgre、MySQL 和 SQLite。

    展开全文
  • 好像这个问题应该很回答,毕竟自己已经了无数个 SQL 查询了,有一些还很复杂。还装不了这个逼了?!但事实是,我仍然很难确切地说顺序是怎样的。言归正传,SELECT语句的完整语法如下:1然而其执行顺序却...
  • 好像这个问题应该很回答,毕竟自己已经了无数个 SQL 查询了,有一些还很复杂。还装不了这个逼了?!但事实是,我仍然很难确切地说顺序是怎样的。全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你...
  • 好像这个问题应该很回答,毕竟自己已经了无数个 SQL 查询了,有一些还很复杂。还装不了这个逼了?!但事实是,我仍然很难确切地说顺序是怎样的。全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你...
  • 好像这个问题应该很回答,毕竟自己已经了无数个 SQL 查询了,有一些还很复杂。但事实是,这个问题小编很难确切地说顺序是怎样的。言归正传,SELECT语句的完整语法如下:SELECT DISTINCT <select_list...
  • 好像这个问题应该很回答,毕竟自己已经了无数个 SQL 查询了,有一些还很复杂。还装不了这个逼了?!但事实是,我仍然很难确切地说顺序是怎样的。言归正传,SELECT语句的完整语法如下:1. SELECT 2. ...
  • 好像这个问题应该很回答,毕竟自己已经了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说顺序是怎样的SQL 查询执行顺序 于是我研究了一下,发现顺序大概是这样。S...
  • 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1...
  • 好像这个问题应该很回答,毕竟自己已经了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说顺序是怎样的SQL 查询执行顺序 于是我研究了一下,发现顺序大概是这样。SELECT 并不是
  • 很多 SQL 查询都是以 SELECT 开始。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”...好像这个问题应该很回答,毕竟自己已经了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说...
  • 很多 SQL 查询都是以 SELECT 开始。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”...好像这个问题应该很回答,毕竟自己已经了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说...
  • 好像这个问题应该很回答,毕竟自己已经了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说顺序是怎样的SQL 查询执行顺序 于是我研究了一下,发现顺序大概是这样。SELECT 并不是最...
  • 很多 SQL 查询都是以 SELECT 开始。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”...好像这个问题应该很回答,毕竟自己已经了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说...
  • SQL学习

    2008-08-04 16:59:00
    几年前学了数据库原理,现在都不记得怎么写SQL语句了. 还有个实习机会,反复学习和练习,终于有点理解怎样设计才能满足第三范式了.网上可以找到学习SQL语句的这个网站不错,把它记录在这儿备忘:...
  • SQL语法大全

    2014-03-30 11:00:11
    rs.open SQL语句,conn,3,2 3. SQL常用命令使用方法: (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 like \'%字段值%\'...
  • 周末终于搬进出租房了,装了宽带。。。。才发现没网的日子。。。...只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的 索引都是单列索引。。。当然数据库不可能只认...

空空如也

空空如也

1 2 3 4
收藏数 66
精华内容 26
关键字:

怎样写出好的sql语句