
1.2 数据库中的数据
目前,常见的数据库可以分为如下两类。
●关系型数据库,如MySQL、PostgreSQL、Microsoft SQL Server、Oracle等。
●非关系型数据库,如BigTable(Google)、Cassandra、MongoDB等。
随着技术的发展,其他类型的数据库也在涌现,如键值数据库等。
MySQL是常用的关系型数据库,它有着比较悠久的历史,曾经是开源的,后来被转手到甲骨文公司,目前仅有社区版开源。尽管如此,因为种种原因,它的使用量仍然比较大。因此,下面就以它为例说明如何从关系型数据库中读取数据。
如果读者尚未在本地计算机安装此数据,可以参阅“扩展探究”中的相关内容。
作为未来的数据科学行业从业者,我们必须掌握数据库有关知识。
基础知识
从MySQL数据库中读取数据的最基本方法是使用SQL语句。下面以本地所创建的数据库为例,演示常用的查询语句。
(1)显示数据库名称。
SQL的全称为Structured Query Language,译为结构化查询语言。SQL是用于访问和处理数据库的标准计算机语言。

查询已有的数据库,其中名为books的数据库是专为本操作示例而创建的。
(2)显示某数据库中的表名称。
首先,指定要操作的数据库。

然后,显示此数据库中的表名称:

也可以使用如下SQL语句实现表名称的查询。

(3)显示数据库表的结构。
显示表结构的常用SQL语句,例如:

SQL语句中的命令不区分大小写,通常习惯用大写。
或者

(4)查询表的记录条数。
在查询数据库表的具体内容之前,先了解记录数量的大小。

查询显示mybooks表中共有6条记录。也可以分组查询。其中COUNT(1)也可以写成COUNT(*),结果一样。
关于COUNT(1)和COUNT(*)的区别,有不同解释,读者可以在网上查阅。

此处的查询结果显示,mybooks表中的记录根据字段PUB的值可以分为两组:其中一组有4条,另一组有2条。
在上述查询记录数量的SQL语句中,使用了COUNT(1),其实也可以更换为其他整数或者字段名称。

上面语句的含义是针对某个字段的记录进行查询。如果使用COUNT(1),则意味着根据主键进行记录数量查询。
(5)查询记录详情。
查询记录详情的SQL语句关键词是SELECT。下面列举几种常见的查询方法,更多的查询方法请参阅数据库的文献资料。
●查询所有记录

显示出数据库表中的所有记录的所有字段值。
●查询指定字段值

●查询结果按照指定字段值的倒序排列

●依据条件查询

查询到了字段pub的值为“phei”的所有记录。

查询到了字段id的值为2和5的记录。

查询到了字段id的值在2~5之间的所有记录。

查询到了字段id的值中含有“Python”字样的记录。
依据条件查询的方式还很多,此处不一一列举,请读者在应用的时候查阅有关资料。
除了使用SQL语句,还可以利用高级语言实现对数据库内容的读写操作。例如,Python语言针对MySQL数据库的接口模块就有多种,此处以其中一个名为PyMySQL的模块为例进行说明(官方网站:https://pymysql.readthedocs.io/en/latest/)。
首先安装此模块:

安装完毕后,用如下方式连接数据库,并读取表中的记录。

此处演示的是连接本地数据库,host也可以用于指定远程地址。
为了实现Python与MySQL数据库的连接,In[1]的代码中使用了pymysql模块,并且用①的方式实现连接,即建立了连接对象(变量mydb引用的pymysql.connect函数返回对象)。读者可以通过帮助文档查看pymysql.connect函数的各参数的具体含义。
②创建一个游标对象,后续的各种关于数据库的操作都是利用此游标对象的方法进行的。
③是一个字符串,是从数据库表中读取所有记录的SQL语句。
④使用游标对象的execute方法执行SQL语句,再用⑤得到所有的记录,为了显示出来,执行其后的循环语句。
项目案例
1.项目描述
在MySQL环境中,创建如下结构的数据库表(名字为cities)。

将1.1.1节的In[2]数据写入此数据表中。然后,用Python完成如下查询。
●查询表中的记录总数。
●只查询name和area两个字段的记录。
●查询population字段中最大和最小的记录。
●查询全部记录,并将查询结果按照area字段从大到小地排序。
2.实现过程
(1)根据要求,用SQL语句创建数据库表结构(也可以用Python完成创建数据库表结构的操作,请读者自行仿照In[1]的方式完成)。

注意,在此处使用的是“utf8”,不是“utf-8”。

(2)从CSV文档中读入数据,并写入数据库表city中。

Pandas中也提供了针对读写数据库的函数pd.read_sql()和pd.to_sql(),详细内容请扫描二维码阅读《Pandas读写文件》。

执行In[2]的代码之后,将原来CSV文件的数据插入数据库表city中。如果使用SQL语句查看此表的结果,可以进行如下操作:

(3)利用Python语言完成查询要求。

动手练习
注:以下操作可以基于本节已经创建的数据库进行,也可以自己新建数据库。
1.查询数据库表中的所有记录。
2.根据指定字段查询。
3.按照指定字段排序,并查询指定数量的记录,如倒序排列之后的前三条记录。
4.根据某个字段值查询。
5.根据某个字段值在某范围内查询。
6.根据某个字段值的字符匹配条件查询。
7.指定字段,练习带AND或者OR的多条件查询。
扩展探究
1.在本地计算机上安装MySQL数据库,并熟悉有关操作。
●安装:https://dev.mysql.com/doc/refman/8.0/en/installing.html。
●SQL语句:https://www.w3schools.com/sql/。
2.可以进一步了解其他关系型数据库,如PostgreSQL(网站:https://www.postgresql.org/)。
3.利用Pandas的函数,读取数据库中的记录。

再次体现了Pandas的强大功能。
建议读者在上述基础上,用Pandas的函数完成“动手练习”中的各题的操作。
4.建议读者了解非关系型数据库,如比较常用的MongoDB,其官网是https://www.mongodb.com/。