一直想写这篇来着,但一直不知道从何下笔,怕写的太教科书话,那样大家直接看书就好了,又怕词不达意,(总是在拖也有工作的问题等等借口太多,但是写出来应该会对别人有帮助吧,我就继续献丑),可能很多时候就是灵感的一次迸发,想到了一点就表达出来慢慢完善吧。我想将事情说的简单,原理简单,先从原理上理解,然后再进行实操尝试。虽然实践是检验真理的标准,但是不知道真理,你都不知道要怎么检验又要检验什么,是吧!

上一篇我们说了数据库的意义以及服务形式、存储位置,这次想说说我们怎么来使用、操作这个工具。数据库的使用(个人理解)大致分为这样两种情况,1.数据库二次开发,需要了解计算机,算法,调度,逻辑等。2.数据库的纯使用,也分为两种,一种是数据分析型数据抽取:纯检索,数据转换:做个字段清洗、规范化、分类统计、指标类计算等;另一种是数据库管理员,负责数据库的管理维护,可以理解为根据数据库和使用特性进行规范化设计和实现,注重使用效率和管理的有效性。比如:建库,建表,权限管理,数据备份,资源负载,集群管理,监控,部分运维工作,以及规范化文档输出等。
一般情况下,我们的角色是第二种情况,数据的使用者。工作中如果不是职业的数据库管理员,那就是偏重数据分析型,同时也会兼顾一些数据库管理员的权限和职责但都不会很深入。比如我们自己在电脑上装了一个数据库服务,那自己就是数据库的管理员。实际看使用情况进行学习就好了。更多时候是对数据的使用,比如做个etl,统计分析,出份报表,指标计算等。
SQL是一种专业领域语句DSL,也是编程语言的一种。SQL是有其独有的关键字的,数据库中有SQL语句的解释器,通过识别关键字理解指令。只要接触过SQL语句的一定都会知道select [columns] from [table] 其中SELECT FROM 就是SQL语句的关键字,但不用担心,关键字不多,而且在使用数据库的时候最后使用一些可视化的数据库连接工具,比如Navicat,他会把关键字识别出来,并进行词补全提示,也会进行错误提示。
下面简单介绍下SQL语句的大致分类,如下:
数据查询DQL:SELECT (查询出数据,也可用于变量赋值)
数据定义(表/视图/查询/存储过程/自定义函数/索引/触发器等)DDL:CREATE (创建)、DROP(删除)、ALTER(修改)、RENAME(重命名)、TRUNCATE(清空表)
数据操作DML:INSERT(插入)、UPDATE(更新)、DELETE(删除)
数据控制DCL:Grant(授权)、revoke(回收权限)
日常用到最多的就是DQL和DML也就是常说的,增删改查。为了数据安全考虑,在删除的时候请千万谨慎,尽量不要做删除操作。而基于sql的etl和各种数据处理也是基于DQL进行的,很多数据处理的函数会减少数据处理的复杂程度,比如时间处理函数,数值处理函数,窗口函数,聚合函数。每个数据库可能部分语法或者函数参数使用会有所不同,具体的需要根据实际情况进行调整,今天说DQL。
还是回到这个简单的语句select [columns] from [table]
此句中含有两个关键字,select、from。Select后是要查询的字段,叫做投影是从数据表中筛选符合检索条件的数据进行展示的意思;from是从什么表中查询。此句表达含义:从(from)[table]这张表查询(select)[columns]。 从语句书写顺序可知,sql语句重结果(结果型展示)、先把需要的结果展示出来,语句的执行顺序和书写顺序不同,执行是从from开始的。
DQL常用关键字,按照执行顺序: from、join、where、group by、having、select、distinct、union、order by、offset fetch(limit)。这个是sql的标准,所以理解并记住,理解了会用了也就记住了。
From 执行开始的位置,其实很好理解,就是你的数据要从哪里进行查找不知道数据在哪里再多的处理也是白瞎。这里的表可以是单表,子查询的表,或者通过逗号相连的笛卡尔积的表,也可以是有关联条件的join连接表(这些不用着急,先知道单表查询,等用的多了自然而然就知道了,这里提一下以后遇到就不会觉得陌生了)。
Join 因为join是表关联连接所以会在from之后执行,先from一张表再看它是否同别的表有连接。先来说一下连接的意思,通常教材都用学生、成绩、课程作为例子,咱们也就拿来用吧,理解这个关系,别的也就一样的理解。比如一个学生,会有很多数据信息(学号、姓名、出生日期、住址、联系方式、所选课程、课程成绩、课程时间等等)这些信息中可以进行归类,(学号、姓名、出生日期、住址等)这些信息对已一个学生来说,一段时间就是一条,且变化不大,把这样的信息放一起组成学生表(基本信息表)。同样的课程也会有(课程名称,课程简介,上课教师等)这个叫做课程表(基本信息表)。我们不可能把学生和课程直接放一张表(设计不合理),但是学生会去上课,这两者之间有联系,而且学期末会有对应的成绩,所以就可以通过这种联系将表组合起来。这就是join要做的事情。当然用“,”也可以实现,但是不建议这样做,两张表直接笛卡尔积不合适。
现在join就很好理解了,是对数据表的一个连接组合操作。分为内连接inner join,外连接out join,左连接 left join和右连接right join。连接可以按照集合的角度进行理解。

Where 对待查询表中的数据进行条件筛选。这里有大小比较(>、<、>=、<=、<>、!=、=)存在包含(in、not in、exist、not exist)逻辑关系与或非空(and、or、not、null)以及内嵌公式的使用。Select a from table1 where a =’15’
Group by分组聚合,相当于excel中的透视表的功能。需要将同一组数据进行计算处理,这里通常会用到聚合函数:Sum avg count max min first 等。
Having 用来做分组后的条件筛选,跟在group by之后会配合聚合函数使用。 select a from table1 group by a having count(a)>1
Select 就是将需要的数据字段进行展示(可以添加多种函数处理)、distinct 作用于字段内值的排重(相当于excel中删除重复项)用于select后。 select distinct a from table1
Union 前面说了join是将两张表做左右的连接拼接,这个关键字是将两张表做上下拼接,通常用于两个查询结果的拼接。直接使用union还有排重的功效,建议使用union all,这样可以减少排重时间提高效率。Select a from table1 union all select a from table2
Order by 对指定字段进行排序,可以多个。desc为降序,asc为升序。 order by column1 desc, column2 asc
Offset fetch(limit)就是对结果的限制,是多少行多少页,为了能快速展示数据减少加载量。 select a from table1 limit 10

相信了解了这些结构后,你就能写一些简单的DQL了,写sql语句的关键点在于,1语句无语法错误、包括书写规范、拼写、顺序,这些是最基本的保证语句能通过解释。2搞清楚你想要的结果是什么,梳理清楚表、字段、筛选条件、分组聚合等之间的逻辑,梳理好先后顺序,每一步都要有确定的结果以及对结果的确认。明确这种逻辑关系需要仔细明白问题,以及现有数据之间的关系,梳理清楚已知条件和所求结果。3剩下的就是不断的练习,其实实践是检验真理的标准这话真的没错。多练习尝试,不是一个语句重复写很多次,而是一个逻辑要经过仔细琢磨、演练、思考,最后再进行验证。多尝试不同的逻辑,其实总结来说就是表的处理,数据字段的筛选,以及对字段的处理和分组聚合等。
Ok就先说这么多,对于数据还有一些基础,比如字段类型,长度,精度等,后续咱们再聊。如果觉得这些有帮助就点个赞吧,欢迎评论指正。