- 一、关系数据库
- (一)数据模型
- 1、层次模型
- 2、网状模型
- 3、关系模型
- 4、面向对象模型
- (二)关系数据库的概念和特点
- 1、基本概念
- (1)关系
- (2)二维表
- (3)记录与字段
- (4)关键字
- (5)外部关键字
- 2、关系数据库的基本特点
- (三)关系数据库语言SQL
- 1、创建和删除数据库
- (1)创建数据库:使用create database语句
- (2)删除数据库:使用drop database语句
- 2、创建表
- (1)创建表语句
- (2)常用字段数据类型
- (3)sql约束
- 3、修改表
- 4、删除表
- 5、删除表中全部记录
- 6、创建表索引
- 7、创建视图
- 8、执行查询
- 二、访问SQLite数据库
- (一)了解Python的SQL接口
- 1、连接对象
- 2、游标对象
- 3、SQL查询结果
- (二)连接和创建SQLite数据库
- 1、创建数据库
- 2、创建内存数据库
- 3、创建临时数据库
- 4、关闭数据库连接
- (三)创建表
- 1、通过连接对象创建表
- 2、通过游标对象创建表
- (四)添加记录
- (五)执行查询
- 1、使用游标对象的fetchall()方法提取全部查询结果
- 2、使用游标对象来执行select语句
- 3、使用循环来迭代fetchall()方法取回的数据
- 4、使用fetchone()方法提取一条记录
- 5、使用游标对象的fetchmany(n)方法提取记录
- 6、获取字段名列表
- (六)使用Row对象
- 1、设置在查询结果生成Row对象
- 2、将一个Row对象转换成列表、元组、字典
- 3、返回字段列表
- 4、按索引或字段名获取行对象的值
- 5、通过循环输出Row对象
一、关系数据库 (一)数据模型 1、层次模型数据库通常用于存储和处理程序中的大量数据,数据库中的数据按照一定的模型进行组织和存储。常用的一些数据库,如Microsoft SQL Server、Microsoft Access、Microsoft
FoxPro、Oracle、MySQL、SQLite等,都属于关系数据库。关系数据库中的数据按照关系模型进行存储。Python3.8内置的sqlite3提供了SQLite数据库访问功能。借助于其他的扩展模块,Python也可访问Microsoft SQL Server、Oracle、MySQL或其他的各种数据库。
- 层次模型采用树状结构表示数据之间的联系,树的节点称为记录,记录之间只有简单的层次关系。有且只有一个节点没有父节点,该节点称为根节点;其他节点有且只有一个父节点。
- 可以有任意多个节点没有父节点。一个节点允许有多个父节点。两个节点之间可以有两种或两种以上联系。
- 关系模型用二维表格表示数据及数据联系,是应用最为广泛的数据模型。目前,各种常用的数据库,如Microsoft SQL Server、Microsoft Access、Microsoft FoxPro、Oracle、MySQL、SQLite等,都属于关系模型数据库管理系统。
- 面向对象模型是在面向对象技术基础上发展起来一种的数据模型,它采用面向对象的方法来设计数据库。面向对象模型的数据库种存储对象以对象为单位,每个对象包含对象的属性和方法,具有类和继承等特点。
数据和数据之间的联系称为关系。
(2)二维表关系数据库使用二维表来表示和存储关系,一个关系就是一个二维表。表中的行称为记录,列称为字段。一个数据库可以包含多个表。
(3)记录与字段表中的一行称为一个记录。表中的列为记录中的数据项,称为字段。字段也称为属性或者列。每个记录可以包含多个字段,不同记录包含相同的字段(字段的值不同)。例如,用户表中的每个记录包含用户名、登录密码等字段。
关系数据库不允许在一个表中出现重复的记录。
可以唯一标识一个记录的字段或字段组合称为关键字。一个表可有多个关键字,其中用于标识记录的关键字称为主关键字,其他的关键字可称为候选关键字。一个表只允许有一个主关键字。例如,用户表中的用户名可定义为主关键字,在添加记录时,主关键字不允许重复。
(5)外部关键字如果一个表中的字段或字段组合作为其他表的主关键字,这样的字段或字段组合称为外部关键字。
2、关系数据库的基本特点- 关系数据库中的表是二维表,表中的字段必须是不可再分的,即不允许表中表。
- 在同一个表中不允许出现重复的记录。
- 在同一个记录中不允许出现重复的字段。
- 表中记录先后顺序不影响数据的性质,可以交换记录顺序。
- 记录中字段的顺序不影响数据,可以交换字段的顺序。
SQL是Structured Query Language的缩写,即结构化查询语言,它是关系数据库的标准语言。Microsoft SQL Server、Microsoft Access、Microsoft FoxPro、Oracle、MySQL、SQLite等各种关系数据库均支持标准的SQL语言,但各种关系数据库具体在实现SQL时可能有所差别。
1、创建和删除数据库 (1)创建数据库:使用create database语句create database testdb
testdb为创建的数据库名称。
(2)删除数据库:使用drop database语句drop database testdb2、创建表 (1)创建表语句
-
在数据库中创建表使用create table语句,其基本格式为:create table 数据库名.表名(字段名1 字段数据类型(长度) sql约束,…..)
-
在指定了“数据库名”时,创建的新表属于指定数据库,否则新表属于当前数据库。
| 数据类型 | 说明 |
|---|---|
| integer(size) int(size) smallint(size) tinyint(size) | 保存整数,size指定数字的最大位数 |
| decimal(size, d) numeric(size, d) | 保存小数,size指定数字的最大位数,d指定小数的最大位数 |
| char(size) | 保存固定长度的字符串(字母、数字以及特殊字符),size指定字符串的长度 |
| varchar(size) | 保存可变长度的字符串(字母、数字以及特殊字符),size指定字符串的长度 |
| date | 保存日期 |
- 最简单的create table命令只指明表名、字段名和数据类型。例如:create table users(name varchar(10), birth date)
- 用于为表或字段定义约束条件,常用的约束有:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT(不区分大小写,习惯在SQL语句中将SQL的关键字用大写)。可同时使用为字段定义多个约束。
- 修改表使用alter table语句,前面已在修改或删除约束时使用到了该语句。修改表的其他操作通常包括修改表名称、添加字段、修改字段名、修改字段数据类型和删除字段等。
- 删除表使用drop table语句:drop table users
- 删除表中全部记录使用truncate table语句:truncate table users
- 表索引可以按索引字段对记录进行排序,查询索引字段比非索引字段的速度更快。
- create index语句用于创建索引。
create index index_on_name on users(name)7、创建视图
- 视图是数据库中预定义的查询,创建视图使用create view语句。
create view user_age as select name, age from users8、执行查询
- select语句用于执行查询,查询结果存储在一个表中(称为查询结果集)。
SELECT 输出字段列表 FROM 表名称 [GROUP BY 用于分组的字段列表] [WHERe 筛选条件表达式] [ORDER BY 排序字段列表 [DESC|ASC]]
| 功能 | 实现 |
|---|---|
| 返回表中的全部字段 | 用星号可表示返回表中的全部字段。select * from users |
| 返回表中的指定字段 | 在需要返回个别字段时,在输出字段列表中包含这些字段,用逗号分隔。select name, age from users |
| 为字段指定输出名称 | 默认情况下,查询结果集中字段名与输出字段同名,可以用as为输出字段命名。select name as “用户名”, age as “年龄” from users |
| 返回唯一值 | 使用关键词DISTINCT可去掉返回记录中的重复值。select DISTINC Tname from users |
| 使用where子句 | where子句用于指定筛选条件,满足条件的记录才会出现在查询结果集中。select * from users where age<20 |
| 运算符或函数 | ==, >, <, >=, <=, != between…and… in (…) like, not like isnull() not, and, or sum(), avg(), max(), min(), count() |
| 对查询结果排序 | order by子句用于指定排序字段,查询结果默认按升序(ASC)排序,使用DESC表示降序。 例如:select * from users oder by age select * from users oder by age DESC 可以使用多个排序字段,并分别指明排序方式。 例如,下面的语句按name升序,age降序对查询结果排序: select * from users oder by name ASC, age DESC |
SQLite是Python自带的唯一的关系数据库包,其他的关系数据库则需要通过第三方扩展来访问。Python的API规范定义了底层Python脚本和数据库的访问SQL接口,各种关系数据库在实现Python的SQL接口可能不会遵循Python规范,但与差异很小。
(一)了解Python的SQL接口 1、连接对象连接对象用于创建数据库连接,所有的数据库操作均通过连接对象与数据库完成交互。连接对象生成游标对象。
2、游标对象游标对象用于执行各种SQL语句:create table、update、insert、delete、select等。通常连接对象也可执行各种SQL语句。一般返回select语句都使用游标对象来执行,查询结果保存在游标对象中。
3、SQL查询结果从游标对象中提取的查询结果时,单个记录表示为元组,多个记录则用包含元组的列表表示。在Python脚本中,进一步使用元组或列表操作来处理从数据库返回的查询结果。
(二)连接和创建SQLite数据库 1、创建数据库- 访问SQLite数据库时,需要先导入sqlite3模块,然后调用connect()方法建立数据库连接。
- 如果使用“:memory:”表示文件名,Python会创建一个内存数据库。内存数据库中的所有数据均保存在内存中,关闭连接对象时,所有数据自动删除。
- 如果使用空字符串作为文件名,Python会创建一个临时数据库。临时数据库有一个临时文件,所有数据保存在临时文件中。连接对象关闭时,临时文件和数据也会自动删除。
- 执行完所有操作后,应执行close()方法关闭连接对象,释放占用的资源。
通过连接对象或游标对象的execute()方法执行create table语句创建表。
1、通过连接对象创建表conn.execute('create table user(name varchar(10), gender varchar(2), age int(2))')
2、通过游标对象创建表
(四)添加记录
- 通过连接对象或游标对象的execute()方法执行insert into语句创建表
- 添加记录后,可使用游标对象的rowcount属性查看影响的记录行数
- SQLite允许在insert into语句中使用问号表示参数,在execute()方法中用元组提供参数数据
- 使用参数时,可以使用executemany()方法一次添加多条记录,记录数据用元组列表表示
- 执行记录相关的修改操作(添加、删除或更新)时,应执行连接对象的commit()方法提交修改。如果没有执行commit()方法,关闭连接对象后,所有修改都会失效。
- 连接对象的另一个方法rollback()可用于撤销最后一次调用commit()方法后所做的修改。
- 执行select语句可返回数据库中的数据。使用连接对象执行select语句时,返回包含查询结果的游标对象。游标对象的fetchall()方法提取全部查询结果。提取出的查询结果中,每条记录为一个元组,所有记录的元组组成一个列表。
- 使用连接对象的execute()方法执行SQL语句
- fetchone()方法可以每次提取一条记录,返回的记录为一个元组。在达到表位时,返回None。
- fetchmany(n)方法可以每次提取n条记录。不指定参数时,返回一条记录。
Row对象可存储数据表中每行记录的字段名和数据。要在查询结果中返回Row对象,需要将连接对象的row_factory属性设置为“sqlite3.Row”,设置后,在游标对象的fetchX方法返回的数据中,每个记录为一个Row对象。可将Row对象转换为列表、元组、字典等序列对象。可对Row对象使用位置或字段名索引字段的值。Row对象的keys()方法可返回字段名列表。
1、设置在查询结果生成Row对象 2、将一个Row对象转换成列表、元组、字典



