![数据准备和特征工程:数据工程师必知必会技能](https://wfqqreader-1252317822.image.myqcloud.com/cover/857/31391857/b_31391857.jpg)
1.2 数据库中的数据
目前,常见的数据库可以分为如下两类。
●关系型数据库,如MySQL、PostgreSQL、Microsoft SQL Server、Oracle等。
●非关系型数据库,如BigTable(Google)、Cassandra、MongoDB等。
随着技术的发展,其他类型的数据库也在涌现,如键值数据库等。
MySQL是常用的关系型数据库,它有着比较悠久的历史,曾经是开源的,后来被转手到甲骨文公司,目前仅有社区版开源。尽管如此,因为种种原因,它的使用量仍然比较大。因此,下面就以它为例说明如何从关系型数据库中读取数据。
如果读者尚未在本地计算机安装此数据,可以参阅“扩展探究”中的相关内容。
作为未来的数据科学行业从业者,我们必须掌握数据库有关知识。
基础知识
从MySQL数据库中读取数据的最基本方法是使用SQL语句。下面以本地所创建的数据库为例,演示常用的查询语句。
(1)显示数据库名称。
SQL的全称为Structured Query Language,译为结构化查询语言。SQL是用于访问和处理数据库的标准计算机语言。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_51.jpg?sign=1739313537-DHc4ToTOIcUzWtPDKwdmxZawzkzZgl7s-0-b160db3f2ee7bb348b55fde888a961ba)
查询已有的数据库,其中名为books的数据库是专为本操作示例而创建的。
(2)显示某数据库中的表名称。
首先,指定要操作的数据库。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_52.jpg?sign=1739313537-L57GmSsew2LW0wMK3xis1xih6CPZCPIM-0-4d567f0bae0f4d3d4e3e5c4383deb7e3)
然后,显示此数据库中的表名称:
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_53.jpg?sign=1739313537-lVGHvaAcK7r8eUHdkkvrdk2TwxTM9sjT-0-427ec4902086c42c5319cfa2e41a4648)
也可以使用如下SQL语句实现表名称的查询。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_54.jpg?sign=1739313537-LRhnivrAang00oRg1fxj31e89ZrM27Zb-0-493285f142d182ba23c3a2a9146b5220)
(3)显示数据库表的结构。
显示表结构的常用SQL语句,例如:
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_56.jpg?sign=1739313537-XlkVYJ37EadF8c9w95ADzcAZga4PME8Z-0-ab4dabbed994a5bd89338b45c65a04e6)
SQL语句中的命令不区分大小写,通常习惯用大写。
或者
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_57.jpg?sign=1739313537-vcxpyEL4wrVqrAF80vxVTiIQ2cJlk3vw-0-aa5d8e9feda727f29aa183a54e6a153c)
(4)查询表的记录条数。
在查询数据库表的具体内容之前,先了解记录数量的大小。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_58.jpg?sign=1739313537-0B0eKcWa7I6c0nlqaIc31XpdEM6fXCAG-0-cff6a2812d30dad26f496545fc2b5bdc)
查询显示mybooks表中共有6条记录。也可以分组查询。其中COUNT(1)也可以写成COUNT(*),结果一样。
关于COUNT(1)和COUNT(*)的区别,有不同解释,读者可以在网上查阅。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_59.jpg?sign=1739313537-g7CDob3lG82J35nGHxDcyQ32I25TtZlL-0-895607563516402837729853b0839c5a)
此处的查询结果显示,mybooks表中的记录根据字段PUB的值可以分为两组:其中一组有4条,另一组有2条。
在上述查询记录数量的SQL语句中,使用了COUNT(1),其实也可以更换为其他整数或者字段名称。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_61.jpg?sign=1739313537-yTuLfxUCUUzhFbdiIzo9Txif2ONvPVw0-0-b65dcad7bc1062643b3b78b21341e87d)
上面语句的含义是针对某个字段的记录进行查询。如果使用COUNT(1),则意味着根据主键进行记录数量查询。
(5)查询记录详情。
查询记录详情的SQL语句关键词是SELECT。下面列举几种常见的查询方法,更多的查询方法请参阅数据库的文献资料。
●查询所有记录
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_62.jpg?sign=1739313537-Dy9dXATneqBmOCBsFnCnZjibMJDdcgYJ-0-404e2bedbb901eb5f227dd24df741fe6)
显示出数据库表中的所有记录的所有字段值。
●查询指定字段值
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_63.jpg?sign=1739313537-emJKFFgVd5xfxopXfNTj8cX1JM2ezJpA-0-e7efc0c419ad44b7162c277d10eee816)
●查询结果按照指定字段值的倒序排列
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_65.jpg?sign=1739313537-PYqThTdadD0rugBPVcg98JnEQz55c4H0-0-88f56e30e20a780230cfc6a968c5e3af)
●依据条件查询
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_66.jpg?sign=1739313537-NFELzcwsru7CGtsll8ub6jIFiGDyF9at-0-4733052dc4c8438cfdd38a0fbecc3011)
查询到了字段pub的值为“phei”的所有记录。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_67.jpg?sign=1739313537-d1VxbmMCBSDpaK3LyBlpmp4J6JocF93M-0-5e11a3bd4e99b258226966e5aa82b176)
查询到了字段id的值为2和5的记录。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_68.jpg?sign=1739313537-G0FuQsCujyHMXA147U6MlfE5Iw9eecXz-0-29e481dc48eb944f7cc98ae7653664f7)
查询到了字段id的值在2~5之间的所有记录。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_69.jpg?sign=1739313537-r0zUjN7fNdQmQUKQfNqqZV9L5NRZTfb0-0-72c5a3104bd027a8732771d66bdcf5ed)
查询到了字段id的值中含有“Python”字样的记录。
依据条件查询的方式还很多,此处不一一列举,请读者在应用的时候查阅有关资料。
除了使用SQL语句,还可以利用高级语言实现对数据库内容的读写操作。例如,Python语言针对MySQL数据库的接口模块就有多种,此处以其中一个名为PyMySQL的模块为例进行说明(官方网站:https://pymysql.readthedocs.io/en/latest/)。
首先安装此模块:
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_70.jpg?sign=1739313537-6gMa1JK76YpD8AWb4GMrn0Ar7ytNa7Pc-0-7c7b2c819979b5dc5fa20b6b1fdb4ddc)
安装完毕后,用如下方式连接数据库,并读取表中的记录。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_71.jpg?sign=1739313537-Hep7ss0AJeXjdGfYHAEIibGEoCkWXo02-0-79b238179d3402692b57b76667219614)
此处演示的是连接本地数据库,host也可以用于指定远程地址。
为了实现Python与MySQL数据库的连接,In[1]的代码中使用了pymysql模块,并且用①的方式实现连接,即建立了连接对象(变量mydb引用的pymysql.connect函数返回对象)。读者可以通过帮助文档查看pymysql.connect函数的各参数的具体含义。
②创建一个游标对象,后续的各种关于数据库的操作都是利用此游标对象的方法进行的。
③是一个字符串,是从数据库表中读取所有记录的SQL语句。
④使用游标对象的execute方法执行SQL语句,再用⑤得到所有的记录,为了显示出来,执行其后的循环语句。
项目案例
1.项目描述
在MySQL环境中,创建如下结构的数据库表(名字为cities)。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_72.jpg?sign=1739313537-hnhfGxYup7MR4zuNJ9k5w7fyuAeGCXy8-0-f2a7e322772b2396a6c15ea94c9e9e7d)
将1.1.1节的In[2]数据写入此数据表中。然后,用Python完成如下查询。
●查询表中的记录总数。
●只查询name和area两个字段的记录。
●查询population字段中最大和最小的记录。
●查询全部记录,并将查询结果按照area字段从大到小地排序。
2.实现过程
(1)根据要求,用SQL语句创建数据库表结构(也可以用Python完成创建数据库表结构的操作,请读者自行仿照In[1]的方式完成)。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_73.jpg?sign=1739313537-xzrq45wD1SOMlFEjh8VYNLLQZaecrw9F-0-6a8777d6e2fa057e1ff8066228748065)
注意,在此处使用的是“utf8”,不是“utf-8”。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_74.jpg?sign=1739313537-vJval3dn5IZbR5CmyXPBtvWfyWXtyFm2-0-4a90c7e4e0fa8b2cd3c0b8f5bca671fb)
(2)从CSV文档中读入数据,并写入数据库表city中。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_75.jpg?sign=1739313537-hrR9epoAfww8kEhjuKaoK8GHiS8UxPHO-0-4bdd5ea4ea481b5c573240eef7a8081f)
Pandas中也提供了针对读写数据库的函数pd.read_sql()和pd.to_sql(),详细内容请扫描二维码阅读《Pandas读写文件》。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_76.jpg?sign=1739313537-lJPWxbJf6nTxprNMUfRPAIqQylwnKFjx-0-230fec926e94b27bcbff4a7519b71db5)
执行In[2]的代码之后,将原来CSV文件的数据插入数据库表city中。如果使用SQL语句查看此表的结果,可以进行如下操作:
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_77.jpg?sign=1739313537-121XpefqZbEZiKiJNckTHbzFIdZbELKy-0-1d1531c47ab9515cc6abcd438ac83de9)
(3)利用Python语言完成查询要求。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_78.jpg?sign=1739313537-Ix8ykWBUJFDzH7qFsZY79hBO6uRXjV29-0-702d808a4672ab0e2ce3c05d8e14b9c6)
动手练习
注:以下操作可以基于本节已经创建的数据库进行,也可以自己新建数据库。
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的函数,读取数据库中的记录。
![](https://epubservercos.yuewen.com/EE4FD6/16992237305826006/epubprivate/OEBPS/Images/txt001_80.jpg?sign=1739313537-dpMeJKqWAkDVuCqkdOWkB4BPoEUylFw6-0-ef41980a233bf0b89eb7fa8def4d7286)
再次体现了Pandas的强大功能。
建议读者在上述基础上,用Pandas的函数完成“动手练习”中的各题的操作。
4.建议读者了解非关系型数据库,如比较常用的MongoDB,其官网是https://www.mongodb.com/。