SQL的全称是Structured Query Language(结构化查询语言),是一种古老而简洁的程序设计语言 。看似平平无奇,一直被各种吐槽,但却有着众多语言所难得的漫长寿命,并展现出极好的拓展性,在不同时期衍生出不同的子语言 。笔者作为腾讯TDW体系下的SQL现役运动员,对日常工作中常用的基础知识和展开的业务实践予以了总结,可供读者参考 。结构化查询语言,顾名思义,它的基础在于结构化的数据库表,最主要的应用场景在于数据查询,虽然SQL也可以像其它语言一样有一些高级的写法,但它的主战场并不在此,仍要回归到对数据库表的操作和处理中 。以下分为基础知识篇和业务实践篇展开介绍,其中基础知识篇盘点了一些常用的技能点,业务实践篇则总结了几点日常工作里的思考 。
第一部分 基础知识篇
围绕着数据库表,可以展开许多的主题工作,有些是比较专业性的领域,如事务处理和权限管控等,这些更多是面向底层的技术基础,部分属于DBA的工作范畴 。对于使用SQL的很大部分用户群体来说,则集中于对数据库表的增删查改,聚合汇总里,这些是面向业务的数据工作 。针对这一块的内容,继续将其细分到不同的子场景里,逐一展开介绍 。
1.库表基本操作
库表预览: SQL最基础和最核心的两个对象,便是数据库和数据表,基于一个业务场景,可以有N个数据库,在一个数据库里面,又可以有N张数据表 。数据库的连接与切换,数据表的创建与删除,是使用SQL进行库表预览的基本操作 。 这些基本操作,可以通过前端的可视化界面进行,也可以从后台直连数据库展开,需由使用者所拥有的权限级别来选择 。
数据增删: 除了一些常规的每日运行的计算任务外,很多时候我们只是单纯地想对一张表进行处理,比如插入几条数据,更新某个字段值,或者剔除几条数据 。这些操作往往是单次的,局部的,目的清晰,所以掌握几个关键字就可以实现,如INSERT/UPDATE/DELETE等 。
视图应用: 视图的引入,相当于在统计逻辑和实际库表之间提供了一种折中的方案 。完成这个功能,逻辑上是必须有这么几道工序的,但又不想在每一道工序里都落地一张实际的数据表,显得繁琐而臃肿,那就引入视图吧,把这些中间的工序用视图的形式去实现和替代 。
关键字: 其实SQL真的是一门很简洁的语言,市面上也不会有大本的书籍专门讲述SQL的书写方式,因为相对于其它语言来说,SQL归根到底,只是围绕着几个关键字的一些基础语句而已 。只要把这几个关键字掌握了,SQL的大部分内容其实就已经展开了 。
文章插图
2.数据查询语句
SQL作为面向数据库表的基础语言,用户群体具有多样性,从技术底层往业务层走,往往会有DBA,数据开发,数据分析,产品经理等这些用户角色 。不同用户群体对SQL的侧重点是有差异的,但无论是哪一个群体,基本都绕不开数据查询语句,是一块必要内容 。
简单查询: 能写一个简单查询语句,其实就已展开了和数据库表的对话过程 。不管是哪种SQL的拓展语言,简单查询里的语法基本都还是一致的 。比如用*代表全量查询,用distinct去重,用top和limit对数据条数做基本限制,以及用as对原表字段名进行替换更新等 。
过滤查询:在简单查询的基础上,添加一些约束条件,也就是过滤查询 。比如你可以用关键字where查看其中某天的数据,用between或者in来限制一个范围,用like或者relike来做正则匹配,也可以用and或者or这两个通配符对这些约束条件进行排列组合 。
排序查询: 排序查询可以细分为两个场景,一个是在查询内部的排序,即根据某个字段的属性值进行表内部分区,对分区进行排序查询后输出,可以用row_number的形式来实现;另一个是把整个查询当做一个整体,对结果表进行排序查询后输出,用order by来实现即可 。
3.数据聚合与连接
前面讲数据查询语句,不管怎么查询,其实并不影响原生的表结构,即原来的表是按照什么逻辑写的数据,查询结果里的数据也是基于这种逻辑,只是筛选了局部数据而已 。但数据聚合与连接就不一样了,聚合会在纵向上改变原生表结构,连接则在横向上拓展了表结构 。
数据聚合: 要对一张表做数据聚合,其实理解了两个概念即可,维度和指标 。维度是你要基于哪些字段来做聚合,指标是在这个维度之上,你想用什么汇总函数生成哪些指标 。数据聚合的关键字是group by,维度里的属性值仍来自于原生表,指标则是新生成的汇总值 。
推荐阅读
- 详解PostgreSQL数据库压测工具之pgbench-tools
- 搞懂 面向对象 的核心思想,JAVA中封装、包和访问权限的知识点
- MySQL查看连接数
- 一文搞懂队列
- 自动补全、回滚!介绍一款可视化 sql 诊断利器
- 一文了解数据仓库
- 我一直以为SQL先执行SELECT语句?一个窗口函数,我突然发现错了
- 两万字深度介绍分布式,一文入魂
- 一文带你弄懂 Java 动态代理
- Linux下的MySQL Proxy 读写分离该怎么操作?