美文网首页
十步完全理解SQL

十步完全理解SQL

作者: 姜小明同学 | 来源:发表于2016-08-22 18:57 被阅读410次

1 SQL是一种声明式语言

SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。
学好SQL要改变传统函数式编程思想,例如用变量传参、使用循环语句、迭代、调用函数等等,都是这种命令式编程的思维惯式。

2 SQL的语句并不按照语法顺序执行

  • SQL的语法为

      SELECT [DISTINCT]
      FROM
      WHERE
      GROUP BY
      HAVING
      UNION
      ORDER BY
    
  • SQL的语句执行顺序为

      FROM
      WHERE
      GROUP BY
      HAVING
      SELECT
      DISTINCT
      UNION
      ORDER BY
    

理解:

  1. FROM才是SQL语句执行的第一步,而并非SELECT。数据库在执行SQL的第一步是将数据从硬盘加载到缓冲区中,以便对这些数据进行操作。

  2. SELECT是在大部分语句(FROM、WHERE、GROUP BY、HAVING)执行之后才执行的。这也就是不能在WHERE中使用SELECT中设定别名的字段作为判断条件的原因。

  3. 无论在语法上还是在执行顺序上, UNION 总是排在在 ORDER BY 之前。(hive中cluster=distribute+sort,这些语句都不用被动式,sort hive专有,用于局部排序,order全局排序)

3 SQL的核心是对表的引用

“FROM a, b”语句输出的是一张联合表,联合了表a和表b。如果a表有三个字段,b表有5个字段,那么这个“输出表”就有5+3个字段。这个表里的数据是a和b的笛卡尔积。这个联合表有3*5条数据。
FROM 输出的结果被 WHERE 语句筛选后要经过 GROUP BY 语句处理,从而形成新的输出结果。

4 灵活引用表能使SQL语句变得更强大

    <table reference> ::=
        <table name>
      | <derived table>
      | <joined table>

三表的表连接不会生产a+b+c各字段。

5 SQL语句中推荐使用JOIN而不是逗号‘,’进行表连接

使用JOIN的好处:

  • 安全,不会漏掉连接条件
  • 表达能力更强,可限定LEFT JOIN、FULL JOIN等。

6 SQL的JOIN操作

  • EQUI JOIN
  • INNER JOIN
    or just JOIN
  • OUTER JOIN
    LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN
  • SEMI JOIN
    只讨论连接的存在性,如想要知道有书的作者。
    常见解法是使用IN或EXISTS。
    -- Using IN
    FROM author
    WHERE author.id IN (SELECT book.author_id FROM book)

      -- Using EXISTS
      FROM author
      WHERE EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)
    

需要说明,IN和EXISTS只在并没有明显的优劣(分大小表情况),IN简洁易懂,EXISTS表达力强。

  • ANTI JOIN
    和SEMI JOIN相反,加一个NOT就行。
    -- Using IN
    FROM author
    WHERE author.id NOT IN (SELECT book.author_id FROM book)

      -- Using EXISTS
      FROM author
      WHERE NOT EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)
    
  • CROSS JOIN
    求笛卡尔积,可使用逗号‘,’分割两表,或者使用 CROSS JOIN显式实现。

  • DIVISION
    JOIN的反操作。这里未介绍。

7 衍生表

也就是子查询。

    -- A derived table with an alias
    FROM (SELECT * FROM author) a

子查询可以解决SQL执行逻辑顺序带来的问题,如:

    -- Get authors' first and last names, and their age in days
    SELECT first_name, last_name, age
    FROM (
      SELECT first_name, last_name, current_date - date_of_birth age
      FROM author
    )
    -- If the age is greater than 10000 days
    WHERE age > 10000

衍生表可以进化为common table expressions通用数据表达式(WITH a AS SELECT)。

子查询(嵌套SELECT,查询结果作为另一个查询语句的输入,最常用于IN、EXISTS、HAVING等中),视图(CREATE VIEW AS不能进行索引,内联视图区别于子查询带别名alies,可以进行后续的连接等操作),临时表(CREATE TEMPORARY TABLE vta_show AS SELECT,可以进行索引)

8 SQL GROUP BY对表引用进行转化

GROUP BY将创建一个只有GROUP BY中列的表引用,不过仍然可以在select中使用其它列作为聚集函数的参数。

9 SQL的SELECT在关系代数中被称为投影

在没有GROUP BY的查询中,SELECT不要同时包含聚集函数和非聚集函数。

其它语句都是对表引用(table reference)管道传输,而SELECT进行彻底地映射转化。

10 SQL中的DISTINCT、UNION、ORDER BY和OFFSET等都很简单

理解SELECT之后,再来看这些操作都很简单。

  • 集合操作
  • DISTINCT--去重
  • UNION--集合并,去重
  • UNION ALL--集合并,不去重,快速,推荐使用
  • EXCEPT--集合差
  • INTERSECT--集合交集
  • 排序操作
    ORDER BY.

自己的使用心得

表连接的时候可以把表看做线(关系),把关联的字段当做节点。

相关文章

  • 十步完全理解 SQL

    http://blog.jobbole.com/55086/

  • 十步完全理解 SQL

    摘自【十步完全理解 SQL】 很多程序员视 SQL 为洪水猛兽。SQL 是一种为数不多的声明性语言,它的运行方式完...

  • 十步完全理解SQL

    1 SQL是一种声明式语言 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉...

  • 超经典!十步完全理解 SQL

    超经典!十步完全理解 SQL 很多程序员视 SQL 为洪水猛兽。SQL 是一种为数不多的声明性语言,它的运行方式完...

  • 超经典!十步完全理解 SQL

    来源:水果泡腾片 链接:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水...

  • 9个简单步骤,完全理解SQL

    整理自网络,我也忘了从哪个网站了。 一、SQL是一种声明式语言 首先要把这个概念记在脑中:“声明”。 SQL 语言...

  • 【转】10个简单步骤,完全理解SQL

    很多程序员视 SQL 为洪水猛兽。SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言...

  • SQL理解

    首先花三分钟理清楚思路: 1、SQL语句的基本结构就是: select a,b,c,d,e from tableA...

  • SQL完全自学手册

    结构化查询语言(Structured Query Language),简称SQL,是一种特殊目的的编程语言,是一种...

  • SQL完全自学手册

    结构化查询语言(Structured Query Language),简称SQL,是一种特殊目的的编程语言,是一种...

网友评论

      本文标题:十步完全理解SQL

      本文链接:https://www.haomeiwen.com/subject/wvtprttx.html