数据库
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,
原子性(Atomicity)、 一致性(Consistency)、
隔离性(Isolation)、 持久性(Durability)
它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它, 它占用资源非常的低,它能够支持Windows/Linux/Unix等等主流的操作系 统, 同时能够跟很多程序语言相结合。
SQL 结构化查询语言 ==》数据库脚本语言
sqlite3 下载地址:
https://www.sqlite.org/download.html
win选择:
sqlite-dll-win64-x64-3320300.zip
sqlite-tools-win32-x86-3320300.zip
Mac选择:
sqlite-tools-osx-x86-3320300.zip
安装过程:
1、首先将下载的两个压缩包解压在同一个目录下,例如 D:\SQLite;
2、将该路径添加到系统的Path环境变量里;
3、在cmd中输入sqlite3 --version,若显示版本号,则安装成功;
4、退出系统用 .quit
存储类型:
NULL NULL值(不是空值)
INTEGER 带符号的整数
REAL 浮点值(8字节)
TEXT 文本字符串(UTF-8,UTF-16BE,UTF-16LE)
BLOB BLOB数据类型
(Sqlite 没有单独的Boolean类型,在数据库中存储为整数0(false), 1(true))
(Sqlite 没有单独的Date类,存储时会变成TEXT,INTEGER,REAL类型)
DOS命令:
D:\ dir 查看目录下的文件信息
D:\ cls 清理屏幕显示
D:\ cd C:\Users\Administrator\Desktop\pythonCode\07 进入到目标代 码目录
D:\sqlite3 回车 命令行会自动进入该目录下
sqlite> 表示正常进入到dbms系统中
退出系统用 .quit
先有数据库 ==》创建数据表 ==》增加数据 ==》维护(增加,删除, 修改,查询)
基本操作:
1、创建数据库文件并登录;
Sqlite3 test.db ===》.db 后缀的是数据库文件,其中允许创建多个表 格。
手工创建 xxx.db 也可以,只要保证文件后缀是 .db 即可。
2、在数据库中新建表; SQL 语句
create table user (id int ,name text,pass text);
create table test (id integer primary key autoincrement not null,name text);
id integer primary key autoincrement not null
整形 主键 自动增长 非空
create table test(id int , name text, pass text);
注意:表名 可以自由定义,表的字段名称也可以自由定义 但是类型要正 确。
如果出现 syntax error 表示SQL 语句有语法错误。
.tables 查看创建的表是否成功
以下操作都是基于SQL 语句执行,与平台无关都可以正常执行。
3、向数据库中插入一条记录:
insert into test (name) values (''OpenLab"); #指定值插入
inser into 是插入关键字
test 是表名称
name是表中的列名称
values是关键字
"OpenLab"是插入的列对应的数据值。
insert into test(id,name,pass) values (1, 'zhang', '123345'); #全列匹 配插入
insert into test values (2, 'asd"','2345'); #全列默认匹配插入,必须值 一一匹配
insert into test (id,name) values (3, 'afasdf'); #指定值插入
4、查询所有表中数据:
select * from test; #查询所有表中记录并打印输出
select 是查询关键字
* 是通配符,表示所有列都输出
from 是关键字
test 是表名字
select * from test where id = 1; # where 辅助查询关键字,限定范 围
select * from test where pass = 123 and name = "张三";
select * from test where id = 1 or id = 2;
select * from test where id > 1;
select id,name from test; #指定列的时候可以间隔列名
select id,name from test where id = 1 ; #列名和限定词一起组合查询
思考题: 首先创建一个数据库并设计相关的表,然后
Sqlite3 test.db
create table test(id int , name text, pass text);
insert into test(id,name,pass) values (1, "zhang" , "123345");
create table stu(id int ,name text,score real);
insert into stu(id,name,score) values (1, "wangwu" ,99.9);
1、编写一条sql语句可以在数据库表中找到指定用户的密码信息。
select pass from test where name = "xxx";
2、编写一条sql语句可以在数据库表中查询成绩是60分上的学生学号 信息。
select id from stu where score >= 60;
5、修改指定表中数据
update test set name = 'caoqb' ; #会修改表中所有记录,慎用
update 是修改关键字
test 是修改的表名字
set 是设置关键字
name 是列名字
= "xxx" 是修改后的值
update test set name = "xxx" where id = 5;
update test set name = "xxx" , pass = "yyy" where id = 3;
update test set name = "xxx" where id >1 and pass = 2345;
6、删除表中指定数据:
delete from test where id = 1;
delete from 是删除关键字
test 是要删除信息的表名字
where 限定词
id=1 限定条件
delete from test where id >1 and pass = 2345;
delete from test where id =1 or id = 2;
delete from test ; ///删除表test中所有数据,直接删除无法恢复。慎用
7、退出数据库
以下不属于sql语句,属于数据库sqltie3自己的命令
.exit .q
7.1 .tables //显示当前数据库的表格
7.2 .schema tablename; //显示表格结构
7.3 .help #显示DBMS中所有相关的内部指令
练习题:
使用以上常规操作命令在各自机器上搭建操作环境 完成基本的增加 删除 修改 查询 功能sql语句同时 考虑如何将以上操作能简化处理 ?
==》可视化 ==》sqlite administor
http://sqliteadmin.orbmu2k.de/
其他的数据库操作:
1、 删除表
drop table test1;
2、 排序 默认是 ASC:升序,DESC:降序 不区分大小写
select * from test where price < 103 order by price desc limit 5 ;
order by xxx 按照xxx所在的列排序
limit num 只需要查询指定的前num个数据
3、去重
select distinct name from test;
4、分组 GROUP BY 子句必须放在 WHERE 子句中的条件之后,必须放在ORDER BY 子句之前。
select * from test where price > 102
group by name having count(name) < 2
order by name limit 4;
5、模糊查询
WHERE SALARY LIKE '200%' 查找以 200 开头的任意值
WHERE SALARY LIKE '%200%' 查找任意位置包含 200 的任意值
WHERE SALARY LIKE '_00%' 查找第二位和第三位为 00 的任意值
WHERE SALARY LIKE '2_%_%' 查找以 2 开头,且长度至少为 3 个字 符的任意值
WHERE SALARY LIKE '%2' 查找以 2 结尾的任意值
WHERE SALARY LIKE '_2%3' 查找第二位为 2,且以 3 结尾的任意 值
WHERE SALARY LIKE '2___3' 查找长度为 5 位数,且以 2 开头以 3结尾的任意值
_ 是一个占位符, %是任意长度占位 。
6、where 子句:
and : 在where中可以连接多个条件
sqlite> select * from test where age > 13 and price >= 105;
or : 或
sqlite> select * from test where age > 13 or price < 200;
not != : 否定,一般和not in / not between 等合用
select * from test where name != "aaa"
between : 在两个值之间进行搜索
sqlite> select * from test where age between 12 and 17;
not in : 和in相反
sqlite> select * from test where age not in (12,15);
in : 返回值等于匹配值的数据
sqlite> select * from test where age in (12,15);
like : 相似匹配,后面字符不检查用 % ,大小写不敏感
sqlite> select * from test where name glob 'y*';
sqlite> select * from test where name
like 'Y%'; glob : 相似匹配,后面字符不检查用 % ,大小写不敏感
sqlite> select * from test where name glob 'y*';
is null : 用于把某个值和NULL进行比对
sqlite> select * from test where name is null;
is : 类似于 =
is not : 类似于 !=
7、导入导出
导出命令:
sqlite3 data.db
>.output dd.sql 导出的数据库脚本名称为 dd.sql
>.dump 导出所有数据
>.q 退出数据库
另一种:
sqltie3 xxx.db .dump
> yyy.sql 在数据库尚未登录时候操作
> 符号在这里表示输出到某个 文件 删除原有的数据库
导入命令:
sqlite3 新数据库.db
>.read dd.sql
>.tables 查看导入效果
另一种:
sqlite3 xxx.db < xxx.sql
< 符号在这里表示从某个脚本导入文件内容
练习:
1、将创建数据库表的sql语句和 删除数据表内容的sql语句写成sql脚本并在数据库中执行,查看效果。
2、编写代码完成一个脚本文件的读写,并通过执行该脚本能向指定的数据库中依次添加100条不同记录的消息。
python 与 sqlite3 的接口:
1、首先需要导入模块:
import sqlite3
2、连接数据库(如果数据库不存在就会创建新的数据库)
con = sqlite3.connect("test.db")
3、创建游标
cur = con.cursor()
4、常规的增加 删除 修改 查询 等SQL操作
sql = "CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY,name TEXT,age INTEGER)" #组织SQL命令串
#str = "insert into user values (7, 'wo' , '8888');"
#str = "delete from user where id = 7;"
#str = "update user set pass = '123456' where id = 6;"
cur.execute(sql) #执行SQL命令串
查询:
cur.execute('SELECT * FROM user')
#print(cur.fetchone()) #取游标第一行数据形成元组
res = cur.fetchmany(3) #取多行指定数据形成列表
print(res) #结果是列表中存储的三行元组信息
res = cur.fetchall() #取表中所有数据记录
for line in res: #遍历所有的查询记录
print(line) #以元组形式输出所有select的结果数据
5、事务的提交和回滚 con.commit() #提交 正式生效到数据库文件
con.rollback() #回滚 撤销刚才的内存操作
6、断开会话连接,释放资源 cur.close() # 关闭游标
con.close() # 断开数据库连接
练习题:
根据以上流程编写数据库操作模块,可以将用户输入的信息,写入 到数据库表中。增加,修改,删除都是用户输入的数据而不是固定 值。
print("请输入要插入数据库的id,name,pass的数据")
id= input()
name=input()
pasd=input()
#1 字符串的拼装
str = "insert into user values ("+str(id)+" , '"+name+"' , '"+pasd+"');"
#2 用元组占位拼装
cur.execute("insert into user values (%d, '%s' , '%s');"% (id,name,pasd))
#3 用问号占位拼装
cur.execute("insert into user values (?,?,?);" ,(id,name,pasd))
注意:关于数据库句柄和游标还有如下属性说明
connect方法返回con对象,即是数据库链接对象,它提供了以下方法:
.cursor() 方法来创建一个游标对象
.commit() 方法来处理事务提交
.rollback() 方法来处理事务回滚
.close() 方法来关闭一个数据库连接
对数据库的查询需要使用到游标对象,首先通过cursor()创建一个游标对 象:
游标对象有以下方法支持数据库操作:
.execute() 用来执行sql语句
.executemany() 用来执行多条sql语句
.close() 用来关闭游标
.fetchone() 用来从结果中取一条记录,并将游标指向下一条记录
.fetchmany() 用来从结果中取多条记录。
.fetchall() 用来从结果中取出所以记录
.scroll() 用于游标滚动