后端产品经理宝典:泛后台PM知识与实战一本通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 数据库相关知识

后端产品的很多功能都是围绕数据的存储、流转和运算等操作进行的。因此,对于后端产品经理而言,了解数据和数据库知识是非常有必要的。

2.2.1 数据

1.数据的概念

数据,就是能够被智能设备(计算机、智能手机等)识别、存储和加工处理的信息的载体。在计算机系统中,各种文本、数字、语音、图形、图像等,统称为数据。数据经过加工后就成为信息。数据是计算机世界的运算对象,也是输出产物。

2.数据类型

数据类型,就是一组性质相同的值的集合,以及定义在这个值集合上的一组操作的总称。我们也可以这样理解:数据类型就是对具体数据或变量的约束和归类。每一种数据都有唯一的一个数据类型(需注意,变量也可以被指定为缺省类型)。

数据类型的出现,一方面是为了把数据分成所需内存大小不同的种类(这样在编程的时候,只有在使用大的数据时才申请大内存,可以充分利用内存),另一方面是确定数据的属性(比如一个或一串字母可能代表不同的含义,需要对之加以定义,才可方便运用)。

不同编程语言规定的数据类型不同,常见的数据类型有整型、字符串型、浮点型、布尔型等。

(1)整型

整型变量表示的是整数类型的数据,其类型说明符一般为int。其常被分为长整型、短整型等。整形变量属于数字,因此是可以进行数学运算的,如下所示。

在该例子中,z等于3。

(2)字符串型

字符串型可以理解为文本型。该类型的值不能直接做数学运算,只能用于展示。字符串之间可以拼接。在Java语言中使用string表示字符串类型,在C语言中则使用char表示。字符串可以是任意内容,比如“12”。

(3)浮点型

浮点型就是小数类型的数据,一般用float或double表示浮点型。比如,1.2是浮点型数字,23e2是科学计数法形式的浮点型数字。

(4)布尔型

布尔型可以简单地理解为判断真假的类型,一般用bool或boolean表示。布尔型的值只有两个:false(假)和true(真)。

需要注意的是,在写与数据相关的需求文档的时候,产品经理可以对数据库中的数据类型进行定义。如表2-3所示,在该需求文档中对数据的定义就包括“字段类型”这一列。

表2-3 需求文档中对数据的定义

不过,如果产品经理在写需求文档时不确定相关数据的类型,或者不懂如何区分数据类型,那就最好不要明确定义,以免出错。在这种情况下,我们可以以备注的形式加以说明,比如备注“该字段为整数,范围为[-100,10000]”,程序员也就明白了。

2.2.2 数据结构

1.数据结构概念

数据结构,顾名思义,就是数据之间的结构关系。数据结构是对数据存储和组织方式的规范,是对现实中事件的运行结构或运行方式的模型化。在通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。比如,数据库的存入和读取就依赖数据结构。

2.数据结构的构成

数据结构包括三个方面的内容:数据逻辑结构、数据存储结构、数据运算,如图2-7所示。

图2-7 数据结构的三方面内容

(1)数据逻辑结构

数据逻辑结构,反映的是数据元素之间的逻辑关系,与数据在计算机中的存储位置无关。

数据逻辑结构,一般分为集合结构、线性结构、树状结构和图状结构四类。集合结构中的任何两个数据元素之间都没有逻辑关系,组织形式松散;线性结构中的结点按逻辑关系依次排列形成一个“锁链”,线性结构还可以划分为表、数组、队列、栈、串等结构;树形结构具有分支、层次特性,其形态有点类似于自然界中的树;图状结构中的结点按逻辑关系互相缠绕,任何两个结点都可以彼此邻接。

(2)数据存储结构

当我们处理数据之后,就需要存储数据,这涉及数据存储结构,即物理结构。数据存储结构有顺序、链接、索引、散列等多种。

(3)数据运算

数据运算就是基于数据结构进行的运算,其具体实现依赖于数据的存储结构。数据运算可以简单理解为,对已经存储好的数据进行增加、查找、编辑、删除等操作。数据运算是数据结构的一个重要方面。

(4)三者之间的关系

一种数据逻辑结构在计算机里可以用不同的数据存储结构实现,数据运算是基于数据逻辑结构和存储结构实现的,三者相辅相成。

3.常见的数据结构举例

(1)数组

所谓数组,就是有序的元素序列,即有限数量的类型相同的变量的集合。按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组等。

比如 char CHB[]={"1","2","3"}的结构,就是数组的表示方式,其含义就是定义CHB为字符串的一维数组,包含的值是字符串形式的“1”“2”“3”。这样就通过一个简单的组合形式,表达了一组有共性的数据。

二维数组是一种简单的数据结构,如图2-8所示。

图2-8 二维数组示例

这个二维数组的结构与一张有行有列的表很像:每一行代表一个对象,每一列代表对象的一个属性。尽管二维数组很适合存储表数据,但是当你需要根据某个条件从数组中查询数据时,就要遍历每一行数据,而当数据量大的时候,这将花费许多时间,服务器性能就会变差。这时候就需要考虑使用其他数据结构。

(2)树结构

树结构是另一种重要的非线性数据结构。直观地看,它是数据元素(在树中被称为结点)按分支关系组织起来的结构。一切具有层次关系的问题都可用树结构来描述,比如家庭成员关系、页面各级菜单关系等。

数据库索引是树结构的一个重要应用,索引可以提高数据库查询速度。常见的关系型数据库的索引使用的数据结构,多是 B+Tree 或者 B-Tree(二者都是树结构的一种),例如MySQL的索引使用的是B+Tree,Oracle和Sysbase的索引使用的是B-Tree。

我们来了解一下为什么索引要使用树结构的存储方式来实现。

我们都知道,数据库文件是存储在硬盘上的,每次读取数据库都需要在硬盘上搜索,而 B+Tree 数据结构的查询方式不是遍历,而是从树根部对比着向下递推做二分查找,查询次数不会高于树的层数,所以查询速度更快。

如图2-9所示,该树结构有15个节点。

图2-9 树结构示意图

如果在该树结构中查找“208”节点,那么该数据的查找过程是按照如下方式进行的。

①从根节点(也就是“136”节点)开始查找。

②判断出 136<208,所以在“136”节点的右子树中查找,找到“398”节点。

③判断出398>208,所以在“398”节点的左子树中继续查找,找到“250”节点。

④判断出250>208,所以在“250”节点的左子树中继续查找,找到“200”节点。

⑤判断出200<208,所以在“200”节点的右子树中继续查找,然而“200”节点没有右子树,因此不可能找到“208”节点(如果其存在的话,一定在“200”节点的右子树上)。

结论就是:查找完毕,不存在“208”节点。

那么,如何从图2-9中查找“40”节点呢?查找过程如下。

①从根节点“136”节点开始查找。

②判断出136>40,所以在“136”节点的左子树中查找,找到“80”节点。

③判断出80>40,所以在“80”节点的左子树中查找,找到“40”节点。

④判断出40=40,所以该节点找到了!

提取“40”节点中存储对象的对应数组行号索引。有了这个行号索引,想获得这行数据就能立即拿到(具体实现的方式此处不做讨论)。

需要注意的是,树结构还有很多变种,比如“堆”结构就是一种特殊的树形数据结构。

(3)栈

栈也是一种重要的数据结构。它最大的特点是只能在某一端插入和删除。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始读数据(即最后一个数据被第一个读出来),出栈的顺序与入栈的顺序相反。这就像是一摞蒸笼,一层一层放入小笼包,而当把小笼包拿出来的时候只能从上往下进行。因此凡是遇到有这样逻辑需求的数据,就可以套用该数据类型。栈结构如图2-10所示。

图2-10 栈结构示意图

(4)队列

队列也是一种特殊的线性表。队列与栈相反,是按照“先进先出”和“后进后出”的原则组织数据的。当队列中没有元素时,被称为空队列。队列的结构如图2-11所示。

图2-11 队列结构示意图

(5)其他数据结构

其他数据结构如散列表、图形结构等都是很重要的数据结构。单纯按照查询速度来看,在这几种数据结构中,数组和链表结构最慢,树结构较快,散列表最快。关于其他数据结构,本书不再具体介绍。

2.2.3 数据模型

1.数据模型的概念

数据模型,是为了更好地描述一组数据的概念和定义,而对现实世界数据特征进行的抽象和模拟。在数据库中数据的存储方式依赖于数据模型。要想更有序、安全地把数据保存到数据库,并从数据库中高效读取,必然要创建成熟有效的数据模型。因此,数据模型是数据库系统的理论核心和基础。数据模型所描述的内容包括三个部分:数据结构、数据操作、数据约束。

(1)数据结构

数据结构的有关概念笔者在前面讲解过了。理论上数据模型可以使用任意的数据结构,但考虑到性能问题,就要做出不同选择。比如使用数组结构,在进行遍历操作时速度会相当快,但是在进行新增与删除操作时速度就稍差了。相比之下,如果使用链表数据结构,在进行新增与删除操作时,速度就快很多。

(2)数据操作

数据操作主要定义了在相应的数据结构上的操作类型和操作方式。常见的数据操作是对数据库中的数据进行增加、删除、修改、查找等操作。删除和修改操作都是建立在查找操作的基础上的,所以完美的数据模型应该是具有较高的插入效率和查找效率的。

(3)数据约束

数据约束主要用来描述数据库中数据结构之间的语法、词义联系以及彼此之间的相互约束和制约关系(比如MySQL使用外键保证数据之间的数据完整性)。

2.数据模型的种类

按不同的应用层次,数据模型分成三种:概念数据模型、逻辑数据模型、物理数据模型。

(1)概念数据模型

概念数据模型(CDM)的抽象性最高,关注现实世界与数据世界的关系,不关注数据的底层细节,为构建逻辑数据模型奠定基础。概念数据模型必须换成逻辑数据模型,才能在数据库管理系统中实现。

在概念数据模型中,最常见的是E-R模型、扩充的E-R模型、面向对象模型,以及谓词模型。其中E-R模型图就是实体联系模型(Entity Relationship Diagram),如图2-12所示,是用矩形框表示实体(比如“产品”是一个实体),用椭圆图框表示实体的属性(比如“产品名称”是产品的一个属性),用实心线段将属性与相应关系的实体连接起来,用菱形框表示实体之间的联系成因,在菱形框内写明联系名(比如“上架”是连接产品与销售网站的成因),并用实心线段分别与有关实体连接起来,同时在实心线段旁标上联系的类型。

图2-12 E-R模型示例图

(2)逻辑数据模型

逻辑数据模型(LDM)是直接面向数据库的逻辑结构,涉及计算机系统和数据库管理系统。这种数据模型架起了用户和系统之间的桥梁。

在逻辑数据模型中,较常见的是层次模型、网状模型、关系模型,其中最常见的是关系模型,其对应的数据库被称为关系型数据库,如MySQL、DB2、Oracle等。

(3)物理数据模型

物理数据模型(PDM)是在逻辑数据模型的基础上,考虑各种具体的技术实现因素及硬件因素,进行数据库体系结构设计,真正实现数据在数据库中的存储。

因此物理数据模型的设计内容较为详细,包括数据库的存储过程、操作、触发、视图和索引表等。

2.2.4 数据库

1.数据库的概念

数据库是存储在计算机系统内的,结构化的、集成的、相关的、共享的、可控制的数据集合。数据库就是储存数据的仓库,只不过这个仓库的数据必须按照一定的格式存放,因为数据的存放必须便于数据的查找。可以这样理解:将数据按照一定的规则,结构化地储存在一个相当于磁盘的地方,这个地方就是数据库。

数据库由数据库管理系统管理。数据库管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。数据库管理系统具有存储、截取、安全保障、备份等基础功能。

在诸多数据库中,最常见的是关系型数据库和非关系型数据库。

2.关系型数据库

(1)关系型数据库的概念

关系型数据库,是一种基于实体联系模型(如E-R模型)的数据库。世间万物都是通过实体与属性、实体与实体之间的关系折射出的关系模型。关系型数据库定义的就是实体与属性的集合。比如人有年龄、姓名等属性。

关系型数据库有MySQL、Oracle、SQL Server、DB2、Informix等,其中最常见的是MySQL。由于MySQL使用类似二维表格的存储形式,因此其和页面报表的组合比较完美,搭配PHP和Apache可以组成良好的开发环境。

此外,比较常见的关系型数据库还有Oracle,在数据量很大的时候,其非常有用。比如拥有千万量级以上数据的数据库,通常会使用Oracle。

(2)范式

提到关系型数据库,就不得不说范式。范式是数据库设计规范方面的一个概念,是围绕着关系型数据库而形成的规则和约束。范式有很多条,前三条范式是关系型数据库创建的基础。

①第一范式:每一列不能有重复的属性值

第一范式(1NF)是指数据表中的每一列不能有多个值,换言之,每一列的属性的值都必须是不可再分的。如果实体中的某个属性有多个值,必须将之拆分为不同的属性。不满足第一范式的数据表示例,如表2-4所示。

表2-4 不满足第一范式的数据表示例

一个人的电话号码可能同时有座机号码和手机号码两种形式,因此应该将“电话号码”属性分为“座机号码”和“手机号码”两个属性才能满足第一范式,如表 2-5所示。

表2-5 满足第一范式的数据表示例

②第二范式:每个行的数据不重复

第二范式(2NF)和第三范式是容易混淆的。第二范式是在满足第一范式的前提下提出的,主要包含两点:其一,一个数据表必须有一个主键(主键是由一个或多个字段组成的,区分数据的唯一性,主键的概念会在下文继续讲到);其二,没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。如果不满足第二范式,容易产生冗余数据,如表2-6所示。

表2-6 不符合第二范式的数据表示例

一个订单中可以包括多种商品,所以在表2-6中,“订单编号”和“商品编号”才是主键,“折扣”“商品购买数量”等属性完全依赖于主键(即当主键确定下来时,这些属性就是明确的),但是“商品单价”“商品名称”等属性与“订单编号”没必然关系,它们只依赖于“商品编号”,所以该表不符合第二范式。这种情况造成的最直观的问题就是,如果有 50 万个订单都买了鼠标,那么鼠标的单价和名称就要在表中出现50万次,这就造成了数据冗余,因此应将“商品单价”“商品名称”从原表拆分出去,从而将一个表变为两个表,如表2-7、表2-8所示。

表2-7 将商品信息拆分出一个表

表2-8 修改后的订单详情表

③第三范式:即直接性,数据表的每一列都要和主键直接相关,而不能间接相关。

第三范式(3NF)要求数据表中不能存在“非主键列 A 依赖于非主键列 B,而非主键列 B 依赖于主键”的情况。比如,有一个“爸爸信息表”,里面的属性有:爸爸、儿子、女儿、女儿的小熊、女儿的气球,这就不符合第三范式,因为“爸爸”与“女儿的小熊”“女儿的气球”都不是直接的相关。在这种情况下,需要将其改成两个表。其一是“爸爸信息表”,包含属性:爸爸、儿子、女儿;其二是“女儿信息表”,包含属性:女儿、女儿的小熊、女儿的气球。该案例的修改前后示意图如图2-13所示。

图2-13 “爸爸信息表”修改前后示意图

3.非关系型数据库

对于大量的半结构化数据和非结构化数据,人们针对其存储、并发以及扩展能力而设计出了非关系型数据库,像Google的Bigtable、Amazon的Dynamo,以及Apache的Hbase等。

非关系型数据库是松散的、无严格结构规范的,被称为 NoSQL,是传统关系型数据库的有效补充,用于对存储要求高、并发处理较多的场合。常见的非关系型数据库有MongoDB、HBase等,它们以键值对(key-value)的形式存储,是类似JSON的格式,因此可以存储比较复杂的数据类型。非关系型数据库的存储形式如下。

在非关系型数据库中,MongoDB 是最著名的,其功能非常丰富,最大的特点是其支持的查询语言非常强大,有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

非关系型数据库都是针对某些特定的应用场景而设计的,因此该类数据库往往具有极高的选择性和强大的性能。

4.为什么要了解数据库

后端产品经理的很多工作都是围绕数据进行的。一方面,基础数据的维护和用户行为数据的采集本身就是后端产品的工作范畴;另一方面,后端产品的多数功能设计都是围绕数据的存取、运算、获取、推送等进行的。随着业务不断发展,数据库在扩大、数据量在增加,数据需求的调研和分析越来越复杂,如果后端产品经理不了解数据库,就会让自己的工作难以进展。比如,当后端产品经理要拉取数据做验证的时候,因为数据存储在不同的数据表中,就需要反复进行联表查询,在这种情况下,很难有程序员能够随时协助,如果后端产品经理自己掌握了数据的查询和分析方法,就可以更高效地开展工作。

那么,作为后端产品经理,要对数据库了解到什么程度呢?笔者认为达到以下两点即可。

(1)理解数据库的作用原理,以便更好地与开发人员互动沟通,理解开发人员的思路。

(2)会用基础的 SQL 查询,懂得数据表的创建、数据去重规则等知识,就可以更好地参与到数据问题的分析和数据方案的设计中。

2.2.5 常用的关系型数据库管理系统:MySQL

1.MySQL的简介

(1)MySQL的特点

MySQL 是最流行的关系型数据库管理系统之一,其将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了查询速度并提高了灵活性。MySQL 数据库的存在,使得变量的增加、删除、修改、查找操作只需在数据库层面完成即可,不用到代码层面处理,既安全又高效。

由于其体积小、速度快、总体拥有成本低,尤其是其开放源码,使得一般中小型网站的开发,都使用MySQL作为数据库管理系统。初学者学习数据库往往都是从学习MySQL开始的。

(2)MySQL的安装

MySQL的安装界面如图2-14所示。

图2-14 MySQL的安装界面

首先要在PC端安装MySQL服务器,然后通过公司的数据库地址、密码连接上数据库(具体可以找开发人员协助完成)。这样你就可以进入到数据库管理系统中,查看其中的数据库、数据库中的各个表,以及表里的数据。

2.MySQL的数据库、数据表、应用程序等之间的关系

(1)MySQL的结构关系

MySQL 数据库管理系统可以管理多个数据库,每个数据库可以创建很多个表,每个表描述一种实体与多个属性的关系,每个属性就是一个字段,每个字段有不同的取值。数据库管理系统、数据库、表、字段、值之间的关系如图2-15所示。

图2-15 数据库管理系统、数据库、表、字段、值之间的关系

(2)数据库与应用程序之间的关系

数据库与数据库之间可以交换信息,数据库与应用程序之间也可以交换信息。数据库与应用程序的对应关系如图2-16所示。

图2-16 数据库与应用程序信息交换对应关系示意图

3.MySQL拆表存储

理论上,每个实体至少对应一个数据表,表中的字段就是实体的属性或衍生属性,但是实际上一个实体的属性往往被拆分到多个数据表中存储。在这种情况下,一旦需要查询,就要通过联表才能完成。既然联表很麻烦,那么为什么非要拆表存储呢?其实这和前面提到的范式有很大关系。

在实际情况中,一个实体所具有的属性会有很多,如果将所有属性放入一个表中,那么其产生的数据表往往也就包含很多信息。当这个数据表中的数据量很大的时候,其缺陷就非常明显:首先是数据冗余,其次是维护(比如编辑)困难。因此庞大的数据表要分表存储,该理念和第二范式的思想是一致的。

例如有一个描述用户发布消息的表,每当用户发表一条消息,就需要把他的昵称、性别、姓名、消息等数据都插入到表中,这样一条一条数据累积下去,如果在未来的某一天里,用户突然修改自己的昵称,那么我们要遍历整张表,去更新他的每条数据中的昵称。在这种情况下,修改是不现实的,所以就需要把原来的表中的用户信息和消息信息分别存储。

拆表之后,通过姓名就可以查到用户的个人信息,又可以通过用户的 ID 查到他发出的所有消息。

4.数据表

(1)数据表的基本信息

数据存储于数据表中,数据表中每一条基本的数据都由数据类型、字段(也叫变量或者参数)、字段值等组成。以下面的数据表结构信息(局部)为例。

该部分内容表达的主要信息如下。

①表名是“s_rule”。

②各个字段都有默认值,比如“rule_type_id”的默认值为“0”。

③各个字段都不允许为空值。

④规定了各个字段的数据类型,比如“rule_id”的数据类型为11位整数。

⑤各字段带有注释,比如“rule_id”的注释为“主键ID”。

(2)数据表的主键和外键

①主键

MySQL的每张表只能有一个主键(前面谈范式的时候提到过)。主键即主关键字,可以由一个或多个字段组成,并且主关键字的列不能包含空值。一般使用该表的 ID做主键。主键的最大特征是其具有唯一性,即由主键标示的各行数据不重复。

主键主要用于和其他表进行外键关联,以及对本表的修改与删除。当两个表需要进行关联时,主关键字用于在一个表中引用来自另一个表中的特定记录。

②外键

如果表A的主关键字也是表B中的字段,则该字段称为表B的外键。表A称为主表,表B称为从表。外键可以保持数据一致性、完整性,使两张表形成关联。关于主键、外键的例子如图2-17所示。

图2-17 关于主键、外键的例子

(3)数据表的索引

①索引的概念

在讲解数据结构的树结构时,笔者曾提到过索引。索引是由开发人员用代码创建的,对数据库表中的一个或多个字段值进行排序的一种结构。数据库索引好比是一本书的目录,能提升数据库的查询速度。例子如下所示。

如果“id”没有做索引,这个查询操作就必须遍历整个表,直到找到“id”等于“44”的这一行为止;如果“id”做了索引,则直接在索引表里找出“id”等于“44”,就可以直接得知这一行的位置,更快找到这一行。

②索引不能太多

索引有助于提高查询速度,但不是越多越好,原因如下。

第一,创建和维护索引需要开发人员写代码,其耗费的时间随着数据量的增加而增加。

第二,当对表中的数据进行增加、删除和修改的时候,索引也要进行动态的维护,这样就增加了维护的成本。

第三,索引需要占用物理存储空间。

因此,一个数据表的索引不宜过多,建议最多5个。索引不可能满足所有的场景,但是可以满足绝大部分的场景。

5.数据库相关需求方案的注意事项

后端产品的很多产品需求方案都会涉及数据表的创建、联表查询等,因此在需求方案设计的过程中要注意如下一些细节。

(1)建表的时候可以增加预留字段。因为当数据量大的时候很难再增加新字段,所以数据增长较快的表一定要预留几个字段的空位,便于日后数据表的扩展。

(2)当一个表无法再加字段的时候,可以增加扩展表。一般以原表的表名加上后缀“_ext”作为扩展表的表名,两个表通过原表 ID 进行关联。比如原表的表名为“order_goods_shipping”,其扩展表的表名就可以用“order_goods_shipping_ext”。

(3)对数据表新增字段的时候,要考虑该表已有数据的初始化处理。比如,将历史数据对应该新字段的值,全部初始化为空字符串或某一个默认值。

(4)统一规范数据表的表名前缀,举例如表2-9所示。

表2-9 数据表名前缀举例

(5)命名要规范,具体的规范举例如下。

①库名、表名、字段名、索引名,统一使用小写字母、数字,必要的时候,以下画线连接,比如“订单商品数据表”可以命名为“order_goods_table”。

②库名、表名、字段名加起来不要超过30个字符。

③库名、表名、字段名不要单独使用数据库的常用关键字,像“lock”“time”“date”“return”“user”等,可以加前、后缀,比如“sale_date”。

④命名不能使用特殊字符,如“%”“-”等。

(6)产品经理在了解数据库之后,设计方案的思路会清晰许多,但是最终的方案还是由开发人员综合评定的。如果产品经理将一些字段、表名等内容写进方案的话,要谨慎核实,并和开发人员做好沟通。

2.2.6 使用基本的SQL语言进行数据库查询

1.数据库查询介绍

SQL是结构化查询语言(Structured Query Language)的缩写,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统,同时也是数据库脚本文件的扩展名。

SQL 是数据库通用的操作语言(不同版本存在着细微差异),语句很简单,运算速度很快,是最重要的关系型数据库操作语言,并且它的影响已经超出数据库领域,在其他领域(比如人工智能领域的数据检索)也受到重视和采用。

2.基础SQL语句举例

(1)数据查询语句

①基础的查询语句

对产品经理来说,数据查询语句是比较简单的,也是使用次数最多的。最基本的查询语句是“SELECT+目标字段+FROM+表名”,表示从表中查询数据的目标字段。例子如下。

如果同时查询多个字段,则目标字段之间用“,”隔开。例子如下。

如果查询全部字段,则用“*”代替具体的字段。

②配合函数查询

SELECT语句配合函数可以满足更多需求。常用的函数包括但不限于如下。

COUNT():统计记录数。例子如下。

AVG():计算字段值的平均值。例子如下。

SUM():计算字段值的总和。例子如下。

MAX():查询字段的最大值;MIN():查询字段的最小值。例子如下。

③配合筛选条件查询

基本的筛选条件用“WHERE”连接,句式为“SELECT+目标字段+FROM+表名+WHERE+条件”。例如,我们要从“学生表”中查询年龄为14岁的学生的姓名,代码如下。

④对查出的结果排序

基本的排序用“ORDER BY”表示,句式为“SELECT+目标字段+FROM+表名+ORDER BY+排序字段+DESC/ASC”。例如,我们要从“学生表”中查询学生的全部信息,并按照年龄降序排列,代码如下。

⑤对结果分组

用“GROUP BY”语句进行分组,例子如下。

⑥字段拼接输出

用“CONCAT”可以拼接多个字符串。例如,我们要将employee_tbl表中的用户年龄、姓名、工作日等连接在一起,代码如下。

⑦联表查询

联表查询的句式为“左表+JOIN+右表+ON+关系字段”。在具体应用中,JOIN往往与前缀结合,比如“INNER JOIN”表示内联接,即查找两张表共同拥有的字段;“LEFT JOIN”叫左联接,以左表(“JOIN”前的那张表)为主,如果右表有共同字段,则一并返回,如果没有,则为空;另外还有“FULL JOIN”“RIGHT JOIN”等。例子如下。

注意,在该例句中,“order_table a”意为:用“a”来代表“order_table”。

⑧其他常用的SQL查询语句,如表2-10所示。

表2-10 其他常用的SQL查询语句

(2)数据表的更改

产品经理一般不会更改正式数据库的数据,但是可以了解相关的知识点。数据的更改主要包括插入(新增)、删除、更新、创建等。

①插入记录

句式为“INSERT INTO+表+VALUES”,用于在表中插入记录,例如我们要在表中添加一行张三的记录,代码如下。

②新增一列

用“ALTER ADD”来增加表的列(即字段)。例如,我们要在“student_table”表中添加一列“title(职位)”,代码如下。

注意:“varchar(10)”是对插入的字段“title”的数据类型的定义。

③更新数据

句式“UPDATE+表+SET”用于更新表的数据。例如,我们要让table1表中的所有人的工资都增长20%,代码如下。

④数据表的创建、回收

创建表的句式:“CREATE TABLE+表名”。例子如下。

回收表的句式:“DROP TABLE+表名”。注意,执行“DROP TABLE”语句后,表被放在回收站中,并不是被直接删除。如果想要直接删除表(不进回收站),则使用句式“DROP TABLE+表名+PURGE”。

3.SQL使用注意事项

(1)提升查询速度

①查询时,尽量只列出需要查询的字段,不建议查询全部,以避免影响查询速度。例如下面的代码,会影响查询速度。

建议将其优化为如下代码。

②尽量避免进行全表扫描。如果我们只需要返回一条结果,可以使用“LIMIT 1”指令,能够提高效率。

(2)在某些情况下索引无法被使用

①SQL 中的“OR”指令表示并列关系,比如“WHERE customer_id='250'or amount=3.96”。

用“OR”分割开的条件,若其前面的条件有索引,后面的条件没有索引,那么前面的索引也不会被用到,该查询仍是要进行全表扫描的。

②负向查询不会使用索引,比如“NOT”“NOT IN”“NOT LIKE”“<>”“!=”“!=”“!<”等。例如,下面的代码不会使用索引。

(3)MySQL中的NULL和空字符串

在SQL语句中,NULL通常指的是不适用的、无意义的、无效的、不存在或之后将要加入的数据,而空字符串('')表示该字符串的值就是空(注意空字符串的单引号之间是没有空格的)。比如,电话号码字段是NULL的时候,可理解为“该人员是否有电话号码是未知的”;而用空字符串表示的话,就可理解为“该人员没有电话号码”。

在SQL语句中,判断NULL的SQL语句应该使用is NULL或者is not NULL,但判断空字符串则应使用“=”或者“<>”。比如一条数据的A字段值为NULL,此时使用关键查询条件“A is NULL”,是可以查出该条数据的;但是关键查询条件使用“A='NULL'”,就查不到该数据。