SQL语言分类

SQL命令综述

        总的来说,SQL语法可以划分为几大块:


        1. 数据定义语言DDL:用于具体实现关系,以及关系附带的一些结构,如索引等;

        2. 数据查询语言DML:用于操作数据库,包括增删改查;

        3. 数据控制语言DCL:用来帮助实现数据库的存取控制;

        4. 事务控制语言TCL:用于数据库中的事务管理;

        接下来本文将对几大类的SQL进行讲解,采用回顾总结型的讲解方式,不会涉及过多细节。

DDL

        数据定义语言DDL(Data Definition Language)的组成部分并不多,主要涉及到的关键字有:CREATE, ALTER, DROP这三个。

        1. CREATE

        用于创建数据库,创建关系表,创建视图等。需要注意的是在建表的时候除了表本身,还要定义主外键约束,以及一些附带结构,如索引等。

        2. ALTER

        用于调整数据库/表/视图的结构信息。

        3. DROP

        用于删除数据库/表/视图。要注意删除的时候必须先删除外码所在关系,然后再删除被外码参照的主码的关系。

DML

        数据查询语言DML(Data Manipulation Language)是SQL的主体成分,SQL的编写工作绝大部分都是在这一块。该部分知识比较杂而多,故本文选择从整体角度,以经验总结的形式进行讲解,相关语法细节请读者查询有关函数手册。

        总的来说,DML有以下功能(底层项为功能所涉及关键字):

        1. 基本检索

        SELECT+WHERE+GROUP BY(聚集函数)+HAVING+ORDER BY是最常用的查询组合,要注意的是如果SELECT搭配了GROUP BY,那么GROUP BY后列也要是SELECT的一部分,这样查询结果才能清楚展示数据是按什么分组的。另一方面,如果使用了GROUP BY,那么出现在SELECT后不使用聚集函数的列必须也出现在GROUP BY里否则系统提示异常。新手常会犯这个错误,如以下代码:

       因此请意识到GROUP BY后面跟了什么列,SELECT后面就单写什么列(不使用聚合函数),出现的其他列则必须使用聚合函数。

        此外,HAVING后面跟着的约束对象必须是聚合函数列。虽然感觉是有点重复(聚合函数列写了两次),而且WHERE子句和HAVING子句中都不允许使用列别名...但若不满足这些约束,查询结果会混乱。

        2. 高级检索

                a) 嵌套查询:嵌套查询的层数尽量不要太高,否则会影响查询效率;

                b) 连接查询:注意区分几种JOIN的不同含义;

                c) 集合运算:集合运算的本质在于合并多条能"相融"的SQL语句;
        3. 插入语句

        插入语句的标准形式是INSERT INTO 表名 VALUES(表内容),没有外码的关系要优先执行插入。

        4. 更新语句

        更新语句的标准形式是UPDATE 表名 SET 列值='XX' WHERE 条件。

        5. 删除语句

        删除语句的标准形式DELETE FROM 表名 WHERE 条件。注意不要和删除表的命令DROP搞混。

        6. 其他关键字

        没啥好说的。

DCL & TCL

        数据控制语言DCL(Data Control Language)主要是管理数据库权限,负责数据的安全。最常用的是GRANT和ROVOKE命令。

        事务控制语言TCL(Transaction Control Language)则主要面向数据库的备份和恢复两大主题,常用命令为COMMIT和ROLLBACK。

小结

        SQL的学习并不难,但是如果要在具体环境下写出高质量的SQL,则未必是一件容易的事情。不论是对于传统的关系型数据库,还是分布式仓储系统如Hive、Spark SQL,SQL的优化都可以再单独写一本书了。最好在明确了要长期使用的数据分析平台后,再深入针对性地学习专有SQL。比如选定了用Hive,那么就要狠下功夫研究怎么写SQL才能避免"数据倾斜"问题。

        最后,一个优秀的厨师,基本刀功不会差;一个卓越的数据分析师,SQL功底也不会含糊。

posted @ 2018-12-29 15:40  周家飞少  阅读(411)  评论(0编辑  收藏  举报