如何成为一名合格的CRUD工程师?(文末送书)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 如何成为一名合格的CRUD工程师?(文末送书)

一九七零年,那是一个夏天。

有一位来自IBM圣约瑟研究实验室的高级研究员Edgar Frank Codd在Communications of ACM上发表了名为A Relational Model of Data for Large Shared Data Banks的文章,从而创建了关系数据模型。时至今日,基于该模型的关系数据库仍然是企业存储和处理数据的主要方式。甚至可以说,绝大多数IT系统都是围绕着数据库执行数据增删改查操作的。

目前主流的关系型数据库包括MySQL、Oracle、Microsoft SQL Server、PostgreSQL以及SQLite等。虽然这些数据库管理系统的具体实现有所不同,但它们都使用SQL(Structured Query Language,结构化查询语言)作为访问和操作数据库的标准语言。

1、SQL

1974年,同样是来自IBM的Donald D. Chamberlin和Raymond F. Boyce基于关系模型开发了SQL的初始版本:SEQUEL(Structured English Query Language)。SEQUEL被设计用于IBM最初的准关系数据库管理系统SystemR。

1986年,美国国家标准学会(ANSI)首先发布了SQL标准;随后ISO标准组织于1987年创建了“数据库语言SQL”标准。在经历了1989、1992、1996、1999、2003、2006、2008、2011、2016以及2019年的多次修订之后,如今的SQL标准包含了大量的功能,内容多达数千页。以下是SQL发展过程中的一些关键节点

SQL是关系模式的第一个商业实现,同时也是最成功的一个实现。SQL是访问和操作关系型数据库的标准语言,所有的关系型数据库都可以使用SQL语句进行数据访问和控制,许多大数据平台(包括Flink、Spark、Hive等)也都提供的SQL支持。

SQL语句非常接近自然语言(英语),我们只需要掌握几个简单英文单词的作用,例如SELECT、INSERT、UPDATE、DELETE等,就可以完成绝大部分的数据库操作。例如,以下是一个简单的查询语句:

SELECT emp_id, emp_name, salary
FROM employee
WHERE salary >= 10000
ORDER BY emp_id;

即便对于没有学过SQL的初学者,我们只要知道几个英文单词的意思就不难理解该语句的作用。该语句查找员工表(employee)中月薪(salary)大于等于10000的员工,返回了员工的工号(emp_id)、姓名(emp_name)以及月薪(salary),并且按照工号进行排序显示。

可以看出,SQL语句非常简单直观,全部都是由简单的英语单词组成,因为它在设计之初就考虑了非技术人员的使用需求。主要的SQL语句只有几个,很多时候甚至只需要使用一个SELECT语句。

也许正是由于它的简单易用,很多人都认为SQL就是简单的增删改查。但实际上,早在1999年SQL就支持了通用表表达式(WITH语句)和递归查询、用户定义类型以及许多在线分析功能,随后它又增加了窗口函数、MERGE语句、XML数据类型、JSON文档存储(SQL/JSON)、复杂事件和流数据处理(MATCH_RECOGNIZE子句)以及多维数组(SQL/MDA)等,最新的SQL标准正在定制图形存储(SQL/PGQ)相关的功能。

2、通用表表达式

我们以通用表表达式(WITH语句)为例,介绍如何使用SQL语句分析社交网络(微信、Facebook等)中的好友关系。以下是一个简单的好友关系网络:

在接下来的案例分析中,我们使用t_user表存储用户信息:

user_id|user_name
-------|---------
      1|刘一       
      2|陈二       
      3|张三
...

其中,user_id是用户编号,user_name是用户姓名。

t_friend表中存储了好友关系,每个好友关系存储两条记录。例如:

user_id|friend_id
-------|---------
      1|        2
      2|        1
      4|        1
...

其中,user_id是用户编号,friend_id是好友的用户编号。

我们首先介绍如何查看共同好友,以下语句查找“张三”和“李四”的共同好友:

WITH f1(friend_id) AS (
  SELECT f.friend_id
  FROM t_user u
  JOIN t_friend f ON (u.user_id = f.friend_id AND f.user_id = 3)
),
f2(friend_id) AS (
  SELECT f.friend_id
  FROM t_user u
  JOIN t_friend f ON (u.user_id = f.friend_id AND f.user_id = 4)
)
SELECT u.user_id AS "好友编号", u.user_name AS "好友姓名"
FROM t_user u
JOIN f1 ON (u.user_id = f1.friend_id)
JOIN f2 ON (u.user_id = f2.friend_id);

我们在查询中定义了两个CTE,f1代表“张三”的好友,f2代表“李四”的好友,主查询语句通过连接这两个结果集返回了他们的共同好友。查询返回的结果如下:

好友编号|好友姓名
-------|-------
    1|刘一

社交软件通常实现了推荐好友的功能。一方面它们可能是读取了用户的手机通讯录,找到已经在系统中注册但不属于该用户好友的用户进行推荐。另一方面系统可以找出和用户不是好友,但是有共同好友的用户进行推荐。

例如,以下语句返回了可以推荐给“陈二”的用户:

WITH friend(id) AS (
  SELECT f.friend_id
  FROM t_user u
  JOIN t_friend f ON (u.user_id = f.friend_id AND f.user_id = 2)
),
fof(id) AS (
  SELECT f.friend_id
  FROM t_user u
  JOIN t_friend f ON (u.user_id = f.friend_id)
  JOIN friend ON (f.user_id = friend.id AND f.friend_id != 2)
)
SELECT u.user_id AS "用户编号", u.user_name AS "用户姓名",
       count(*) AS "共同好友"
FROM t_user u
JOIN fof ON (u.user_id = fof.id)
WHERE fof.id NOT IN (SELECT id FROM friend)
GROUP BY u.user_id, u.user_name;

我们在查询中定义了两个CTE,friend代表了“陈二”的好友,fof代表了“陈二”好友的好友(排除了“陈二”自己)。主查询语句通过WHERE条件排除了fof中已经是“陈二”好友的用户,并且统计了被推荐的用户和“陈二”的共同好友数量。查询返回的结果如下:

用户编号|用户姓名|共同好友
-------|--------|-------
      4|李四    |   2
      7|孙七    |   1
      8|周八    |   2

基于查询结果,我们可以向“陈二”推3个可能认识的人,并且告诉他和这些用户有几位共同好友。

在社会学中存在一个六度关系理论(Six Degrees of Separation),指地球上任何两个人都可以通过六层以内的关系链联系起来。2011年Facebook以一个月内访问的7.21亿活跃用户为研究对象,计算出其中任何两个独立的用户之间平均间隔的人数为4.74。

我们以“赵六”和“孙七”为例,查找他们之间的好友关系链:

-- MySQL
WITH RECURSIVE relation(uid, fid, hops, path) AS (
  SELECT user_id, friend_id, 0, CONCAT(',', user_id , ',', friend_id)
  FROM t_friend
  WHERE user_id = 6
  UNION ALL
  SELECT r.uid, f.friend_id, hops+1, CONCAT(r.path, ',', f.friend_id)
  FROM relation r
  JOIN t_friend f
  ON (r.fid = f.user_id)
  AND (INSTR(r.path, CONCAT(',',f.friend_id,',')) = 0)
  AND hops < 6
)
SELECT uid, fid, hops, substr(path, 2) AS path
FROM relation
WHERE fid = 7
ORDER BY hops;

其中,relation是一个递归CTE。初始化语句用于查找“赵六”的好友,第1次递归返回了“赵六”好友的好友,然后以此类推。我们将关系层数hops限制为小于6,path字段中存储了使用逗号分隔的关系链,INSTR函数用于防止形成A->B->A的环路。

查询返回的结果如下。

uid|fid|hops|path           
---|---|----|---------------
  6|   7|   2|6,4,1,7        
  6|   7|   3|6,4,1,8,7      
  6|   7|   3|6,4,3,1,7      
  6|   7|   4|6,4,3,1,8,7    
  6|   7|   4|6,4,3,2,1,7    
  6|   7|   5|6,4,1,2,5,8,7  
  6|   7|   5|6,4,3,2,1,8,7  
  6|   7|   5|6,4,3,2,5,8,7  
  6|   7|   6|6,4,1,3,2,5,8,7
  6|   7|   6|6,4,3,1,2,5,8,7
  6|   7|   6|6,4,3,2,5,8,1,7

“赵六”和“孙七”之间最近的关系是通过“李四”和“刘一”两个人进行联系。

另外,我们也可以统计任何两个用户之间平均最少间隔的人数:

-- MySQL
WITH RECURSIVE relation(uid, fid, hops, path) AS (
  SELECT user_id, friend_id, 0, CONCAT(',', user_id , ',', friend_id)
  FROM t_friend
  UNION ALL
  SELECT r.uid, f.friend_id, hops+1, CONCAT(r.path, ',', f.friend_id)
  FROM relation r
  JOIN t_friend f
  ON (r.fid = f.user_id)
  AND (INSTR(r.PATH, CONCAT(',',f.friend_id,',')) = 0)
)
SELECT AVG(min_hops)
FROM (
  SELECT uid, fid, MIN(hops) min_hops
  FROM relation
  GROUP BY uid, fid
) mh;

查询返回的结果如下。

avg(min_hops)
-------------
       0.8214

我们提供的测试数据集很小,任何两个人之间平均间隔0.8个人。

除了好友关系之外,通用表表达式也可以用于分析微博、知乎等软件中的粉丝关注关系。其他常用的案例包括生成数字序列、遍历组织关系图以及查询地铁、航班换乘路线图等。

3、SQL编程思想

如果你认为SQL就是简单的增删改查,那已经是40年前的概念了。虽然SQL是基于关系模型开发的语言,但是在经过几十年的发展之后,它早就不再局限于关系模型了。为了能够帮助大家了解并学习现代化的SQL语言和编程思想,而不仅仅局限于传统SQL提供的简单功能,《SQL编程思想》这本书应运而生。

本书基于作者十多年的工作经验和知识分享,全面覆盖了从SQL基础查询到高级分析、从数据库设计到查询优化等内容,通过循序渐进的方式和简单易懂的案例分析,透彻讲解了每个SQL知识点。本书采用了全新的SQL:2019标准,紧跟产业发展趋势,帮助读者解锁最前沿的SQL技能,同时提供了5种主流数据库的实现和差异。最后,本书还介绍了全新的SQL:2019标准对文档存储(JSON)、行模式识别(MATCH_RECOGNIZE)、多维数组(SQL/MDA)以及图形存储(SQL/PGQ)的支持。

本书适合需要在日常工作中完成数据处理的IT从业人员,包括SQL初学者、拥有一定基础的中高级工程师,甚至精通某种数据库产品的专家阅读。

可以直接在京东抢:


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
8月前
|
SQL 存储 数据库
华为数据库工程师面试题目
华为数据库工程师面试题目
64 0
|
10月前
|
存储 运维 监控
数据库运维工程师的职责
数据库作为IT核心业务模块,其重要性不言而喻,能否持续、稳定高效地运行越来越受企业和用户的关注。Greenplum不仅具备前面几部分介绍的丰富功能和强大性能,而且在可用性、稳定性以及管理和优化的易用性上也日趋成熟。
93 0
|
12月前
|
数据采集 监控 NoSQL
数据工程师妹子养成手记——数据库篇
数据工程师妹子养成手记——数据库篇
62 0
|
SQL 人工智能 运维
ChatGPT4高分通过数据库系统工程师(DBA)认证
ChatGPT 已经通过了美国MBA、法律和医学考试,**ChatGPT 又通过了数据库系统工程师考试。** 这次考试使用了2021年的真实试卷,上午的笔试题全部为选择题,总分75分(45分通过)。
401 2
ChatGPT4高分通过数据库系统工程师(DBA)认证
|
SQL 存储 消息中间件
工程师误删了公司生产数据库,如何看待数据安全架构的脆弱性?
工程师误删了公司生产数据库,如何看待数据安全架构的脆弱性?
工程师误删了公司生产数据库,如何看待数据安全架构的脆弱性?
|
存储 关系型数据库 MySQL
10+年数据库开发工程师带你深入理解MySQL索引
我们都是知道数据库的数据都是存储在磁盘上的,当我们程序启动起来的时候,就相当于一个进程运行在了机器的内存当中。所以当我们程序要查询数据时,必须要从内存出来到磁盘里面去查找数据,然后将数据写回到内存当中。但是磁盘的io效率是远不如内存的,所有查找数据的快慢直接影响程序运行的效率。
198 0
|
SQL 存储 消息中间件
工程师误删了公司生产数据库,如何看待数据安全架构的脆弱性?
这个事情发生在两年前,是某丰的工程师,根据网上披露的信息,大体情况是这样:首先工程师接到了需求变更的任务工单,需要进行数据库SQL执行操作,并事先准备好了SQL的脚本。接下来通过登陆跳板机就进入到了生产数据库的管理端,然后运行Navicat-MySQL的客户端管理工具。这时候问题出现了,他发现自己选择错了数据库,但是SQL脚本已经粘贴上准备执行了,所以他的目的是按delete键删除选定的执行SQL语句,可是万万没想到鼠标光标跳到了数据库实例上面,这时候的delete键就是删除数据库实例了,结果这位工程师还不看弹出框的提醒,直接按了回车键。最后的结果那就是运营监控管控平台挂了!故障持续了10小时
工程师误删了公司生产数据库,如何看待数据安全架构的脆弱性?
|
存储 SQL 架构师
为了让你搞定数据库选型,这些工程师重写了 26 万行代码
无论多么有主见的架构师,在做数据库选型的时候,也可能会犯难。
130 0
为了让你搞定数据库选型,这些工程师重写了 26 万行代码
|
XML 存储 安全
Java工程师必知词汇:数据库
数据库又称为数据管理系统,是一个长期存储磁盘、磁带以及其他裸设备上的、有组织的、有共享的、统一管理的数据集合,简而言之可视为电子化的文件柜——存储数据信息的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
|
Cloud Native 数据库 容器
工程师笔记:我对数据库系统云原生化的一些思考
目前在安全生产团队从事上云稳定性相关工作。曾在阿里数据库团队,先后主导完成数据库异地多活架构设计,容器化建设及弹性大促,同时也参与过阿里数据库产品和服务体系的商业化输出。
1683 0