1.数据库提供了一种特殊的方式来存储数据,即将较小的信息片段保存起来以备日后恢复使用。
数据库允许你操作数据而无需要将整个数据集加载到内存中。
数据库使得复用数据更容易。
结构化查询语言(SQL)是用于和数据库交互的语言。
SQLite网站的下载页面(http://www.sqlite.org/download.html).我们需要选择“Precompiled Binaries for Windows”下的第一项,这是针对命令行Shell的文件,而不是包含DLL的文件或是分析器文件。
想要与数据库交互,尝试Firefox的插件SQLite Manager。
SQLite中所允许的数据类型
数据类型 | 说明 | 示例 |
Null | 空值,就像Python中的none | NULL |
Integer | 整数,和Python中的一样 | 1,-20,45 |
Real | 浮点数 | 1.2 |
Text | 字符串 | "","he" |
Blob | “blob”数据,如一个文件 | 一个图片、一首歌曲、一个Zip文件 |
2.创建一个表
>>> import sqlite3#导入库
>>> conn=sqlite3.connect('mytext.db')#创建一个数据库的连接
>>> cursor=conn.cursor()#创建一个游标
>>> sql='''create table students(name text,username text,id int)'''
#告诉我们创建一个名为students的表,它的列有name、username、id这些列分别包括文本、文本、整数
>>> cursor.execute(sql)#生成包含SQL语句的一个字符串,并不会创建一个表
<sqlite3.Cursor object at 0x0310AF60>
>>> cursor.close()#使用游标来关闭到数据库的连接
这时你可以在你保存这个脚本的目录,看到一个新的文件:mytext.db
3.添加数据到表中,需要使用insert命令和一些特殊的格式。
insert语句需要3项内容:想要把数据插入到哪张表、哪些列会得到数据,还有数据本身。
insert的格式:一个冒号,后边跟着一个字符串。这叫做具名参数,它告诉SQLite库,这里有我们想要插入的一个项。
使用insert以后,必须执行另外一步,即提交,如果没有提交,用户给我们的数据就会丢失。
import sqlite3
conn=sqlite3.connect('mytext.db')
cursor=conn.cursor()
name=input('name')
username=input('username')
num_id=input('number')
sql='''insert into students
(name,username,id)
values
(:st_name,:st_username,:num_id)'''
cursor.execute(sql,{'st_name':name,'st_username':username,'num_id':num_id})
#添加一个字典,包含了具名参数以及想要插入的项
conn.commit()#提交
cursor.close()
4.查询数据库
查询至少需要两项内容:想要查询哪张表,以及想要查询什么。
最基础的查询语句:select * from tablename 告诉我们从表中查询所有内容,(*)代表的就是所有内容。
fetchall()函数,把所有结果保存到一个新的变量all_students中,然后打印出学生。会返回元组的一个列表,每个元组包含数据库中的一行。
import sqlite3
conn=sqlite3.connect('mytext.db')
cursor=conn.cursor()
sql='select * from students'
results=cursor.execute(sql)
all_students=results.fetchall()
for student in all_students:
print(student)
#('dfs', 'sdfs', 123)
如果想只得到某些数据,应该放置列的名称,而不是使用星号。
游标是在数据库中用来移动和执行查询的对象。
数据库进阶
1.用WHERE进行过滤
WHERE子句是可以附加在SQL语句末尾的一种特殊语句,调用数据库时,允许我们过滤数据库,从而只返回一个子集。
eg:FROM tablename SELECT [column/*]WHERE Boolean statement
当执行一条WHERE子句查询时,只有Boolean语句为真的情况下,结果才会返回。
WHERE可以用来判断相等或不等,找到类似的项,找到不符合特定条件的项以及判断大于或小于等。
1>判断相等性
SELECT * FROM games WHERE rating='E'
获取games表中,rating值为‘E‘的内容。
注意:这里只使用一个等号而不是在Python表达式中所用的两个等号。
2>判断不等性,将上述语句中的(=)等于符号改为(!=)符号即可
3>用LIKE查找相似的项
当你想要查找包含了另一个字符串的项,可以使用LIKE。
LIKE允许你查找以一个字符串开始、以一个字符串结束或包含一个字符串的项。
eg:SELECT * FROM table WHERE column LIKE '%String'.
LIKE语句使用百分号(%)来创建一个数据库试图匹配的模式。%表示允许SQLite填充任意的其他字符的地方,可以没有任何字符也可以有很多字符。百分号可放在子字符串的开头、结尾或两处都有。
LIKE语句的示例以及选取的结果
语句 | 选取 | 不选取 |
LIKE "red%" | red rover red reddish | Red Ligh red credo |
LIKE"%red" | red Ligh red | red rover credo reddish |
LIKE "%red%" | red rover red reddish credo | Red |
SELECT * FROM games WHERE rating LIKE 'E%'.表示查找games表中rating以E开头的所有内容。
4>使用NOT LIKE去查找不相似的项
eg:SELECT * FROM games WHERE rating NOT LIKE 'E%'.表示查找games表中rating不以E开头的所有内容。
5>带大于和小于的查询
SELECT * FROM games WHERE year>2011.表示查找games表中year>2011的所有内容。
也可以使用小于,大于等于,小于等于号来进行过滤
2.用ORDER BY排序
添加ORDER BY子句,以告知数据库按照某种顺序来返回结果。
假设想在数据库中得到所有游戏的名称,并且按照名称来排序
SELECT title FROM games ORDER BY title
这里会按照字母排序返回所有的游戏名称,如果要以字母的逆序来排序,要使用DESC运算符。DESC是跟在想要排序的项后面
SELECT title FROM games ORDER BY title DESC
3.用DISTINCT获取唯一的项
使用DISTINCT时,数据库只返回该列中内容具有唯一性的记录。
eg:SELECT DISTINCT column FROM table
4.用UPDATE修改记录
UPDATE table SET column="some value" WHERE column="some value"
是将WHERE后面的内容改成WHERE前面的内容。也就是该列原本的值是在WHERE后面的column里面的。
使用UPDATE之后,必须用conn.commit()提交修改,否则所做出的修改不会保存。
5.用DELETE删除记录
DELETE FROM table WHERE column=value
DELETE会删除所有与模式匹配的记录。
想学习更多关于SQL的知识,可以通过W3Schools网站(http://www.w3schools.com/sql/default.asp)有一个很好的初学者教程